【AI】RAG智能问答的三层优化策略
本文介绍了RAG智能问答系统的三层优化策略,旨在解决工业现场工作人员查询各类信息的需求。第一层在数据层面通过分类标注信息类型(如故障处理、操作指南等);第二层通过关键词匹配识别用户意图;第三层通过精心设计的Prompt引导LLM生成符合问题类型的回答。这种分层优化方法使系统不仅能处理故障报警,还能有效回答操作指南、维护保养等各类现场工作问题,提高了问答的准确性和实用性。
RAG智能问答的三层优化策略:从数据到意图再到提示工程
如何让AI助手不仅能回答故障报警问题,还能处理操作指南、维护保养、注意事项等各类现场工作问题?本文通过一个实际项目案例,深入解析RAG(检索增强生成)系统的三层优化策略。
项目背景
在工业现场,工作人员经常需要查询各类信息:
- 故障处理:设备报警了怎么办?(如:E001故障怎么处理?)
- 操作指南:如何操作设备?(如:如何启动三坐标设备?)
- 维护保养:设备如何维护?(如:定期检查要点有哪些?)
- 注意事项:操作时需要注意什么?(如:安全规范有哪些?)
传统的知识库系统往往只关注报警代码查询,但实际工作中,操作指南、维护方法、注意事项等同样重要。
本文介绍的项目是一个现场工作知识库系统,通过三层优化策略,实现了对多种信息类型的智能问答支持。
三层优化策略概览
┌─────────────────────────────────────────┐
│ 第一层:检索结果的分类信息(数据层面) │
│ 根据知识库中信息的分类,标注信息类型 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第二层:用户问题的关键词匹配(意图识别)│
│ 通过关键词判断用户问题的类型 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第三层:LLM的提示工程(引导回答) │
│ 通过精心设计的Prompt引导LLM生成答案 │
└─────────────────────────────────────────┘
第一层:检索结果的分类信息(数据层面)
核心思想
在构建上下文时,根据知识库中信息的分类(category),动态标注信息类型,让LLM能够理解每条信息的性质。
实现代码
# 构建上下文(取前5条最相关的)
if retrieved_alarms:
context_parts = []
for i, alarm in enumerate(retrieved_alarms[:5], 1):
# 根据分类判断信息类型
category = alarm.get('category', '')
info_type = "信息"
if category == "故障处理":
info_type = "故障处理信息"
elif category == "操作指南":
info_type = "操作指南"
elif category == "注意事项":
info_type = "注意事项"
elif category == "维护保养":
info_type = "维护保养信息"
elif category == "参数设置":
info_type = "参数设置信息"
else:
info_type = "知识库信息"
alarm_code = alarm.get('alarm_code', '').strip()
code_line = f"- 信息代码: {alarm_code}" if alarm_code else "- 信息代码: (无代码)"
context_parts.append(f"""{info_type}{i}:
{code_line}
- 信息标题: {alarm.get('alarm_message', '')}
- 详细内容: {alarm.get('solution', '')}
- 分类: {alarm.get('category', '')}
- 重要程度: {alarm.get('severity', '')}
""")
context = "\n".join(context_parts)
实际效果
假设检索到3条信息:
操作指南1:
- 信息代码: (无代码)
- 信息标题: 三坐标设备操作步骤
- 详细内容: 1. 打开电源... 2. 校准设备...
- 分类: 操作指南
- 重要程度: 中
注意事项1:
- 信息代码: (无代码)
- 信息标题: 三坐标设备使用注意事项
- 详细内容: 使用前需检查...
- 分类: 注意事项
- 重要程度: 高
故障处理信息1:
- 信息代码: E001
- 信息标题: 温度传感器故障
- 详细内容: 1. 检查连接... 2. 更换传感器...
- 分类: 故障处理
- 重要程度: 高
关键点:
- 每条信息都标注了类型(操作指南、注意事项、故障处理信息)
- LLM能够清楚地知道每条信息的性质
- 即使没有报警代码,也能正确显示为"(无代码)"
第二层:用户问题的关键词匹配(意图识别)
核心思想
通过分析用户问题中的关键词,判断用户意图,识别问题类型。
实现代码
# 判断问题类型
query_lower = query.lower()
# 检查是否包含操作类关键词
is_operation_query = any(keyword in query_lower for keyword in
['如何', '怎么', '步骤', '操作', '使用', '教程', '方法', '流程'])
# 检查是否包含维护类关键词
is_maintenance_query = any(keyword in query_lower for keyword in
['维护', '保养', '检查', '清洁'])
# 检查是否包含故障类关键词
is_troubleshooting_query = any(keyword in query_lower for keyword in
['故障', '问题', '错误', '报警', '异常', '解决'])
# 根据匹配结果生成提示
query_type_hint = ""
if is_operation_query:
query_type_hint = "这是一个操作指南类问题,请提供详细的操作步骤。"
elif is_maintenance_query:
query_type_hint = "这是一个维护保养类问题,请提供维护方法和注意事项。"
elif is_troubleshooting_query:
query_type_hint = "这是一个故障处理类问题,请提供详细的解决方案。"
实际效果
| 用户问题 | 匹配关键词 | 判断结果 | 生成的提示 |
|---|---|---|---|
| “如何操作三坐标设备?” | “如何”、“操作” | 操作类 | “这是一个操作指南类问题,请提供详细的操作步骤。” |
| “设备故障了怎么办?” | “故障” | 故障类 | “这是一个故障处理类问题,请提供详细的解决方案。” |
| “如何维护设备?” | “如何”、“维护” | 维护类 | “这是一个维护保养类问题,请提供维护方法和注意事项。” |
关键点:
- 简单但有效的关键词匹配
- 能够快速识别用户意图
- 为后续的Prompt构建提供依据
第三层:LLM的提示工程(引导回答)
核心思想
通过精心设计的Prompt,将前两层的分析结果传递给LLM,引导它根据问题类型和检索结果生成合适的回答。
完整Prompt构建
prompt = f"""你是一个专业的现场工作知识库助手。用户正在查询现场工作相关信息,我已经在知识库中找到了相关内容。
知识库信息(已找到):
{context} # 第一层:已标注信息类型的上下文
{history_context} # 对话历史
用户当前问题:{query}
{code_hint} # 如果有报警代码的提示
{query_type_hint} # 第二层:问题类型提示
请根据以下规则回答:
1. 我已经在知识库中找到了相关信息,请直接基于这些信息回答用户的问题
2. 根据问题的类型(故障处理、操作指南、注意事项、维护保养等),提供相应的详细指导
3. 如果信息中有代码(如报警代码),请明确引用;如果没有代码,直接提供操作步骤或解决方案
4. 回答要:
- 简洁、专业、易懂
- 如果是操作类问题,提供清晰的步骤(1、2、3...)
- 如果是故障类问题,重点突出解决方法和注意事项
- 如果是维护类问题,说明维护周期和检查要点
5. 不要说"我的数据库中可能没有相关信息"、"可能没有"、"未找到"之类的话,因为已经找到了
6. 如果有对话历史,请结合上下文理解用户的意图
回答:"""
Prompt的关键组成部分
1. 角色定位
你是一个专业的现场工作知识库助手。
- 明确LLM的角色,不是"报警知识库助手",而是"现场工作知识库助手"
- 暗示可以处理各类现场工作问题
2. 上下文信息(第一层)
知识库信息(已找到):
操作指南1:
- 信息代码: (无代码)
- 信息标题: 三坐标设备操作步骤
...
- 包含检索到的信息,已标注类型
- LLM可以看到信息的分类和内容
3. 问题类型提示(第二层)
这是一个操作指南类问题,请提供详细的操作步骤。
- 明确告诉LLM问题的类型
- 指导LLM如何组织回答
4. 回答规则
- 如果是操作类问题,提供清晰的步骤(1、2、3...)
- 如果是故障类问题,重点突出解决方法和注意事项
- 如果是维护类问题,说明维护周期和检查要点
- 根据问题类型,给出不同的回答要求
- 确保回答格式符合用户期望
完整流程示例
让我们通过一个实际案例,看看三层优化是如何协同工作的:
用户问题
"如何操作三坐标设备?"
执行流程
Step 1: 检索阶段
向量搜索 → 检索到3条相关信息:
- 信息1:分类="操作指南",标题="三坐标设备操作步骤"
- 信息2:分类="注意事项",标题="三坐标设备使用注意事项"
- 信息3:分类="故障处理",标题="三坐标设备常见故障"
Step 2: 第一层 - 构建分类上下文
操作指南1:
- 信息代码: (无代码)
- 信息标题: 三坐标设备操作步骤
- 详细内容: 1. 打开电源... 2. 校准设备...
注意事项1:
- 信息代码: (无代码)
- 信息标题: 三坐标设备使用注意事项
- 详细内容: 使用前需检查...
Step 3: 第二层 - 意图识别
query_lower = "如何操作三坐标设备?".lower()
# 匹配到关键词:"如何"、"操作"
is_operation_query = True
query_type_hint = "这是一个操作指南类问题,请提供详细的操作步骤。"
Step 4: 第三层 - 构建Prompt
prompt = """你是一个专业的现场工作知识库助手...
知识库信息(已找到):
操作指南1:
- 信息标题: 三坐标设备操作步骤
- 详细内容: 1. 打开电源... 2. 校准设备...
用户当前问题:如何操作三坐标设备?
这是一个操作指南类问题,请提供详细的操作步骤。
请根据以下规则回答:
- 如果是操作类问题,提供清晰的步骤(1、2、3...)
...
"""
Step 5: LLM生成回答
根据知识库中的操作指南,三坐标设备的操作步骤如下:
1. 打开电源:确保设备电源连接正常,按下电源开关
2. 校准设备:按照屏幕提示进行设备校准
3. 选择测量程序:从程序列表中选择需要的测量程序
4. 放置工件:将待测工件放置在测量台上
5. 开始测量:按下启动按钮,设备开始自动测量
6. 查看结果:测量完成后,在屏幕上查看测量结果
注意事项:
- 使用前需检查设备状态
- 确保工件放置正确
- 测量过程中不要移动工件
三层优化的优势
1. 数据层面的优势
- ✅ 结构化信息:每条信息都有明确的分类
- ✅ 类型标注:LLM能够理解信息的性质
- ✅ 灵活扩展:可以轻松添加新的信息类型
2. 意图识别的优势
- ✅ 快速响应:关键词匹配速度快
- ✅ 准确识别:能够识别常见的问题类型
- ✅ 易于维护:关键词列表可以随时调整
3. 提示工程的优势
- ✅ 精准引导:Prompt明确告诉LLM如何回答
- ✅ 格式统一:确保回答格式符合用户期望
- ✅ 上下文感知:结合检索结果和问题类型生成答案
技术要点总结
1. 数据设计
- 知识库中的信息要有明确的分类字段
- 分类要覆盖实际业务场景(故障处理、操作指南、注意事项等)
- 代码字段要灵活,允许为空
2. 意图识别
- 使用关键词匹配,简单有效
- 关键词列表要覆盖常见问法
- 可以结合向量搜索提高准确性
3. Prompt设计
- 明确角色定位
- 提供清晰的上下文
- 给出具体的回答规则
- 根据问题类型调整回答要求
扩展思考
1. 更智能的意图识别
当前使用关键词匹配,未来可以考虑:
- 使用小模型进行意图分类
- 结合向量相似度判断意图
- 利用对话历史理解上下文
2. 更精细的分类
当前有12种分类,未来可以:
- 根据业务需求细分分类
- 支持多标签分类
- 动态调整分类体系
3. 更个性化的回答
当前是统一的回答格式,未来可以:
- 根据用户角色调整回答详细程度
- 支持多语言回答
- 提供图文并茂的回答
总结
通过三层优化策略,我们实现了一个能够处理多种信息类型的智能问答系统:
- 数据层面:通过分类标注,让LLM理解信息的性质
- 意图识别:通过关键词匹配,快速识别用户意图
- 提示工程:通过精心设计的Prompt,引导LLM生成合适的回答
这三层策略相互配合,形成了一个完整的RAG优化方案。在实际项目中,这种分层设计不仅提高了系统的准确性,还增强了系统的可维护性和可扩展性。
项目信息
- 项目名称:现场工作知识库系统
- 技术栈:Python + Flask + LlamaIndex + Ollama
- 核心功能:智能问答、文档提取、知识管理
本文基于实际项目经验总结,如有问题欢迎交流讨论。
更多推荐


所有评论(0)