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 }}

二、问题检索阶段

用户问题分析重构

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

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模型的好处

  1. 精度提升:通过专门的重排序模型提高检索结果的相关性排序

  2. 语义增强:更好地理解查询与文档间的复杂语义关系

  3. 灵活配置:可根据具体场景选择是否启用

  4. 混合优化:与关键词匹配形成互补,提供更全面的相关性评估

但需要注意的是,使用 Rerank 模型会显著增加响应时间,因此需要在精度和性能之间做出权衡。

知识图谱Graph技术

可根据情况选择开启,适合通过多个推理步骤(即多跳问答)才能回答的复杂问题。

开启知识图谱技术后的系统运行流程分为构建检索两个阶段:

1. 构建阶段

知识图谱的构建是在文档嵌入完成后进行的独立任务,主要流程如下:

  1. 数据收集:系统从已处理的文档块中获取内容

  2. 实体关系提取:使用 AI 模型分析文档内容,识别其中的实体(人物、地点、组织等)和它们之间的关系

  3. 图谱合并:将各个文档的小图谱合并成完整的知识图谱

  4. 优化处理(可选)

    • 实体去重:合并相似的实体,比如"2025"和"2025年"

    • 社区发现:识别关系密切的实体群组并生成摘要报告

2. 检索阶段

在聊天或搜索时,如果启用了知识图谱检索,系统会执行以下步骤:

  1. 查询分析:AI 分析用户问题,提取相关的实体和实体类型(即用户问题重构中提到的 minirag_query2kwd 提示词)

  2. 多维度搜索:系统同时进行三种搜索:

    • 根据重要性排名找到相关实体

    • 基于相似度找到相关实体及其关系网络

    • 直接搜索相关的关系描述

  3. 结果排序:综合考虑实体重要性和与问题的相似度进行排序

  4. 补充信息:获取包含最多相关实体的社区报告作为背景信息

知识图谱技术显著增强了多跳问答能力,但会消耗大量计算资源、内存和 token。在聊天配置中启用使用知识图谱选项后,检索时间会大幅增加,因为需要进行迭代搜索。

四、大模型生成答案阶段

提示词优化(兜底策略)

把检索召回知识库内容 + 用户问题发送给大模型之后,大模型充当一个答案编辑的角色,这时候为避免大模型的幻觉,让大模型有更好的输出效果,需要针对不同的答案召回情况,明确告知大模型应如何处理。

常见情况如下:

情况处理方式
未召回答案如果答案标签内容为空,请回复"这个答案暂未被收录,已提交至客服支持团队核查..."
召回答案但答案有问题仔细分析、辨识答案标签的内容,识别其中与用户问题相关内容,编辑后回答用户;如果内容与问题不相关,则回复对应兜底提示
召回答案不完整仔细分析、辨识答案标签的内容,确保它们可以完整的回复,如果内容残缺则回复"信息不完整,请联系对应渠道"类提示用户
答案内容包含图片markdown 格式的图片语法为问题的支持资料,请保留你选取答案前(后)的图片表达式确保它们可以正常显示。
文章目录8 个章节