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. 更个性化的回答

当前是统一的回答格式,未来可以:

  • 根据用户角色调整回答详细程度
  • 支持多语言回答
  • 提供图文并茂的回答

总结

通过三层优化策略,我们实现了一个能够处理多种信息类型的智能问答系统:

  1. 数据层面:通过分类标注,让LLM理解信息的性质
  2. 意图识别:通过关键词匹配,快速识别用户意图
  3. 提示工程:通过精心设计的Prompt,引导LLM生成合适的回答

这三层策略相互配合,形成了一个完整的RAG优化方案。在实际项目中,这种分层设计不仅提高了系统的准确性,还增强了系统的可维护性和可扩展性。


项目信息

  • 项目名称:现场工作知识库系统
  • 技术栈:Python + Flask + LlamaIndex + Ollama
  • 核心功能:智能问答、文档提取、知识管理

本文基于实际项目经验总结,如有问题欢迎交流讨论。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐