什么是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 }}
问题检索阶段:
用户问题分析重构(检索前):
注意这个重构的用户问题仅用于检索阶段的查询增强,不会发送给大模型;最终发送给大模型的是 原始用户问题 + 通过增强查询检索到的知识内容。
检查方式
检索方式分为:常规检索(关键词、语义)和知识图谱检索。
常规检索策略
提取关键词增强查询,通过keywords_extraction提示词实现
知识图谱检索策略
用于知识图谱检索的查询重写,提取实体和类型信息。通过miniraq_query2kwd提示词实现。
答案召回阶段:
检索排序优化策略:
- 通过专门的Rerank模型提高检索结果的相关性排序。
使用Rerank模型的好处:
-
精度提升
-
语义增强
-
灵活配置
-
混合优化。
知识图谱Graph技术:
构建阶段:
- 数据收集、实体关系提取、图谱合并、优化处理(实体去重、社区发现)。
检索阶段:
- 查询分析、多维度搜索、结果排序、补充信息。
大模型生成答案阶段:
-
提示词优化(兜底策略):
-
针对不同的答案召回情况(未召回答案、召回答案但有问题、召回答案不完整、答案内容包含图片),明确告知大模型应如何处理。