什么是RAG?
RAG由Retrieval(检索)、Augmentation(增强)、Generation(生成)组成。
-
Retrieval检索:根据用户问题检索知识库相关资料。
-
Augmentation增强:资料 + 用户问题拼接发送给大模型。
-
Generation生成:大模型编辑资料生成答案。
使用场景:大模型本身不知道这个知识,需要我们知识给到,但前提是给的知识是大模型能理解的(RAG的技术边界)。
RAG技术本质:降低大模型“知识”的不准确性,防止大模型产生幻觉。
RAG运行原理和工程策略
工程优化策略
-
文档处理阶段:资料预处理(切片策略、图片处理策略等)
-
检索阶段:
-
用户提问重构:关键词提取、知识图谱检索的查询重写(根据检索方式和配置参数触发)
-
检索方式选择:关键词检索、语义检索、混合检索、知识图谱检索(可选)
-
-
答案召回阶段:使用Rerank模型排序(传统技术)、更精确的相似度计算
-
大模型生成阶段:提示词优化策略
RAGFlow工程优化策略拆解
RAGFlow是目前开源RAG项目中工程优化细节最好的项目之一。下面我会以RAGFlow为例,说明前面提到的不同阶段下可采用的工程优化策略,让我们更好的理解学习RAG技术~
为方便我们快速理解,我把项目中的原版英文提示词翻译成了中文。
一、文档预处理阶段
文档分段策略(手动操作)
-
文本处理为markdown格式:使用文档解析工具,将知识库内容处理冲markdown格式文档。
-
处理图片内容:将文档中的图片上传至图床,转换成markdown图片格式。
-
增加特殊分隔符进行分段:确保分段知识的字符数在合理范围内,方便使用自定义分段,可控性更好。
-
使用python脚本对文档进行批处理,拆分清洗文档内容。
分段内容优化策略
使用场景:当分段的知识不是QA对,没有明确的检索指向,属于“纯答案”的内容。
采用了关键词提取和问题提取两种工程策略,用于提升检索效果,提示词位于rag/prompt.py
关键词提取提示词:
用于提取文本分段的关键词,通过keyword_extraction函数实现。
## 角色
你是文本分析器。
## 任务
提取给定文本内容中最重要的关键词/短语。
## 要求
- 总结文本内容,并给出前 {{ topn }} 个重要的关键词/短语。
- 关键词必须与给定文本内容的语言相同。
- 关键词用英文逗号分隔。
- 仅输出关键词。
---
## 文本内容
{{ content }}
问题提取提示词:
用于提取文本分段对应的重要问题,通过question_proposal函数实现。
## 角色
你是一个文本分析器。
## 任务
对给定的文本内容提出 {{ topn }} 个问题。
## 要求
- 理解并总结文本内容,提出前 {{ topn }} 个重要问题。
- 问题不应有重叠的含义。
- 问题应尽可能涵盖文本的主要内容。
- 问题必须与给定文本内容的语言相同。
- 每行一个问题。
- 仅输出问题。
---
## 文本内容
{{ content }}
二、问题检索阶段
用户问题分析重构
注意这个重构的用户问题仅用于检索阶段的查询增强,不会发送给大模型,最终发送给大模型的是 原始用户问题 + 通过增强查询检索到的知识内容。
1. minirag_query2kwd 提示词
用途:知识图谱检索的查询重写,提取实体和类型信息。(用户可以在前端选择开启或者关闭,但可用的前提是在文档处理阶段配置了提取知识图谱!!否则知识图谱检索无效 ❌)
提示词内容:
--- 角色 ---
你是一个帮助识别用户查询中答案类型关键词和低级关键词的助手。
--- 目标 ---
给定查询,列出答案类型关键词和低级关键词。
答案类型关键词关注回答特定查询的答案类型,而低级关键词关注具体实体、细节或具体术语。
答案类型关键词必须从"答案类型池"中选择。该池是一个字典形式,键代表你应该选择的类型,值代表示例样本。
--- 指令 ---
- 以 JSON 格式输出关键词
- JSON 应包含三个键:
- "answer_type_keywords": 答案类型关键词列表,可能性最高的类型应放在最前面,不超过 3 个
- "entities_from_query": 从查询中提取的具体实体或细节
2. keywords_extraction 提示词
用途:常规 RAG 检索的查询增强,提取关键词增强查询
提示词内容:
--- 角色 ---
你是一个帮助识别用户查询中高级和低级关键词的助手。
--- 目标 ---
给定查询,列出高级和低级关键词。高级关键词关注总体概念或主题,低级关键词关注具体实体、细节或具体术语。
--- 指令 ---
- 以 JSON 格式输出关键词
- JSON 应包含两个键:
- "high_level_keywords": 总体概念或主题
- "low_level_keywords": 具体实体、细节
##################
- 示例 -
##################
{示例}
##################
三、答案召回阶段
检索排序优化策略
通过专门的 Rerank 模型 提高检索结果的相关性排序。
原因:Rerank 模型属于传统模型技术(常用于搜索引擎的结果排序),相比大语言模型 Embedding 相似度计算后生成的排序更精准。
使用Rerank模型的好处
-
精度提升:通过专门的重排序模型提高检索结果的相关性排序
-
语义增强:更好地理解查询与文档间的复杂语义关系
-
灵活配置:可根据具体场景选择是否启用
-
混合优化:与关键词匹配形成互补,提供更全面的相关性评估
但需要注意的是,使用 Rerank 模型会显著增加响应时间,因此需要在精度和性能之间做出权衡。
知识图谱Graph技术
可根据情况选择开启,适合通过多个推理步骤(即多跳问答)才能回答的复杂问题。
开启知识图谱技术后的系统运行流程分为构建和检索两个阶段:
1. 构建阶段
知识图谱的构建是在文档嵌入完成后进行的独立任务,主要流程如下:
-
数据收集:系统从已处理的文档块中获取内容
-
实体关系提取:使用 AI 模型分析文档内容,识别其中的实体(人物、地点、组织等)和它们之间的关系
-
图谱合并:将各个文档的小图谱合并成完整的知识图谱
-
优化处理(可选)
-
实体去重:合并相似的实体,比如"2025"和"2025年"
-
社区发现:识别关系密切的实体群组并生成摘要报告
-
2. 检索阶段
在聊天或搜索时,如果启用了知识图谱检索,系统会执行以下步骤:
-
查询分析:AI 分析用户问题,提取相关的实体和实体类型(即用户问题重构中提到的
minirag_query2kwd提示词) -
多维度搜索:系统同时进行三种搜索:
-
根据重要性排名找到相关实体
-
基于相似度找到相关实体及其关系网络
-
直接搜索相关的关系描述
-
-
结果排序:综合考虑实体重要性和与问题的相似度进行排序
-
补充信息:获取包含最多相关实体的社区报告作为背景信息
知识图谱技术显著增强了多跳问答能力,但会消耗大量计算资源、内存和 token。在聊天配置中启用使用知识图谱选项后,检索时间会大幅增加,因为需要进行迭代搜索。
四、大模型生成答案阶段
提示词优化(兜底策略)
把检索召回知识库内容 + 用户问题发送给大模型之后,大模型充当一个答案编辑的角色,这时候为避免大模型的幻觉,让大模型有更好的输出效果,需要针对不同的答案召回情况,明确告知大模型应如何处理。
常见情况如下:
| 情况 | 处理方式 |
|---|---|
| 未召回答案 | 如果答案标签内容为空,请回复"这个答案暂未被收录,已提交至客服支持团队核查..." |
| 召回答案但答案有问题 | 仔细分析、辨识答案标签的内容,识别其中与用户问题相关内容,编辑后回答用户;如果内容与问题不相关,则回复对应兜底提示 |
| 召回答案不完整 | 仔细分析、辨识答案标签的内容,确保它们可以完整的回复,如果内容残缺则回复"信息不完整,请联系对应渠道"类提示用户 |
| 答案内容包含图片 | markdown 格式的图片语法为问题的支持资料,请保留你选取答案前(后)的图片表达式确保它们可以正常显示。 |