Chennl's Profile
RAG知识库工程优化

RAGFlow 工程优化策略拆解

围绕文档预处理、问题重构、检索策略、重排序和知识图谱,系统拆解 RAG 工程优化路径。

什么是RAG?

  • RAG由Retrieval(检索)、Augmentation(增强)、Generation(生成)组成。

  • Retrieval检索:根据用户问题检索知识库相关资料。

  • Augmentation增强:资料 + 用户问题拼接发送给大模型。

  • Generation生成:大模型编辑资料生成答案。

  • 使用场景:大模型本身不知道这个知识,需要我们知识给到,但前提是给的知识是大模型能理解的(RAG的技术边界)。

  • RAG技术本质:降低大模型“知识”的不准确性,防止大模型产生幻觉。

RAG运行原理和工程策略

工程优化策略

  • 文档处理阶段:资料预处理(切片策略、图片处理策略等)

  • 检索阶段:

    • 用户提问重构:关键词提取、知识图谱检索的查询重写(根据检索方式和配置参数触发)

    • 检索方式选择:

      • 关键词检索

      • 语义检索

      • 混合检索

      • 知识图谱检索(可选)

  • 答案召回阶段:使用Rerank模型排序(传统技术)、更精确的相似度计算

  • 大模型生成阶段:提示词优化策略

RAGFlow工程优化策略拆解

RAGFlow是目前开源RAG项目中工程优化细节最好的项目之一。下面我会以RAGFlow为例,说明前面提到的不同阶段下可采用的工程优化策略,让我们更好的理解学习RAG技术~

文档预处理阶段:

文档分段策略(手动操作):

  1. 文本处理为markdown格式:使用文档解析工具,将知识库内容处理冲markdown格式文档

  2. 处理图片内容:将文档中的图片上传至图床,转换成markdown图片格式

  3. 增加特殊分隔符进行分段:确保分段知识的字符数在合理范围内,方便使用自定义分段,可控性更好

  4. 使用python脚本对文档进行批处理,拆分清洗文档内容

分段内容优化策略:

使用场景:当分段的知识不是QA对,没有明确的检索指向,属于“纯答案”的内容。

采用了关键词提取问题提取两种工程策略,用于提升检索效果,提示词位于rag/prompt.py

关键词提取提示词:

用于提取文本分段的关键词,通过keyword_extraction函数实现。

## 角色
你是文本分析器。

## 任务
提取给定文本内容中最重要的关键词/短语。

## 要求
- 总结文本内容,并给出前 {{ topn }} 个重要的关键词/短语。
- 关键词必须与给定文本内容的语言相同。
- 关键词用英文逗号分隔。
- 仅输出关键词。

---

## 文本内容
{{ content }}

问题提取提示词:

用于提取文本分段对应的重要问题,通过question_proposal函数实现。

## 角色
你是一个文本分析器。

## 任务
对给定的文本内容提出 {{ topn }} 个问题。

## 要求
- 理解并总结文本内容,提出前 {{ topn }} 个重要问题。
- 问题不应有重叠的含义。
- 问题应尽可能涵盖文本的主要内容。
- 问题必须与给定文本内容的语言相同。
- 每行一个问题。
- 仅输出问题。

---

## 文本内容
{{ content }}

问题检索阶段:

用户问题分析重构(检索前):

注意这个重构的用户问题仅用于检索阶段的查询增强,不会发送给大模型;最终发送给大模型的是 原始用户问题 + 通过增强查询检索到的知识内容

检查方式

检索方式分为:常规检索(关键词、语义)和知识图谱检索。

常规检索策略

提取关键词增强查询,通过keywords_extraction提示词实现

知识图谱检索策略

用于知识图谱检索的查询重写,提取实体和类型信息。通过miniraq_query2kwd提示词实现。

答案召回阶段:

检索排序优化策略:

  • 通过专门的Rerank模型提高检索结果的相关性排序。

使用Rerank模型的好处:

  1. 精度提升

  2. 语义增强

  3. 灵活配置

  4. 混合优化。

知识图谱Graph技术:

构建阶段:

  • 数据收集、实体关系提取、图谱合并、优化处理(实体去重、社区发现)。

检索阶段:

  • 查询分析、多维度搜索、结果排序、补充信息。

大模型生成答案阶段:

  • 提示词优化(兜底策略):

  • 针对不同的答案召回情况(未召回答案、召回答案但有问题、召回答案不完整、答案内容包含图片),明确告知大模型应如何处理。

文章目录8 个章节