企业中对RAG的优化方案
- RAG优化:检索、语义和生成方面的提升
- RAG流程
- 一、数据处理优化
- 数据清洗
- 实际案例
- 二、检索方面优化
- 向量库检索
- 倒排索引数据库检索
- 三、生成方面优化
- 调整Prompt
- 四、架构优化
- RAG+Agent架构
- Self-RAG架构
- Agentic RAG架构
- 总结
RAG优化:检索、语义和生成方面的提升
在现代企业应用中,不同业务场景的需求多种多样,因此采用合适的检索模式和工具至关重要。本文将探讨RAG(Retrieval-Augmented Generation)在数据、检索、生成、架构四个方面的不同选择和优化。
RAG流程
一、数据处理优化
数据清洗
高性能RAG系统依赖于准确且清洁的原始知识数据。一方面为了保证数据的准确性,我们需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。另一方面我们也需要对知识文档做一些基本数据清洗其中可以包括:
a)基本文本清理:规范文本格式,去除特殊字符和不相关信息。除重复文档或冗余信息。
b)实体解析:消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。
c)文档划分:合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。
d)数据增强:使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。
e)用户反馈循环:基于现实世界用户的反馈不断更新数据库,标记它们的真实性。
f)时间敏感数据:对于经常更新的主题,实施一种机制来使过时的文档失效或更新。
实际案例
在处理录音转文字的项目中,由于录音环境嘈杂、人员众多,导致转文字效果不理想,常出现语义歧义、停顿词和重复词等问题。为解决这一问题,我们采用了大模型对转换后的文字内容进行重新整理,确保文字语义清晰、一致,然后再进行后续处理。
二、检索方面优化
在实际项目中,常见的检索方案有两种:
向量库检索
向量库检索适用于将各种数据类型转换为向量进行查询。此方法通过将不同数据表示为高维向量,使得在复杂、多样化的数据中能更快速、准确地找到相关内容。
倒排索引数据库检索
倒排索引数据库适合处理大量纯文本数据。此方法通过预先建立文本索引,提高检索效率和准确性,特别是在处理大规模文本数据时效果显著。
三、生成方面优化
调整Prompt
优化生成内容的关键在于调整prompt。市面上有许多prompt调优的教程,但我认为最实用的是OpenAI官方指南(OpenAI Prompt Engineering),中文文档说明OpenAI官方的Prompt工程指南:你可以这么玩ChatGPT。许多教程都是基于此指南,因此熟悉官方指南是提升生成效果的基础。
客户需求:他们有大量文档(比如10万份),希望模型只基于这些文档进行知识检索。
解决方案:
- 直接将PDF和docx文件嵌入,准确率是45%。
- 经过20次调优迭代,解决细节小Bug - 准确率到65%
- 基于规则进行优化,譬如先判断问题属于什么领域(退一步思考),然后再回答,效果提升到85%
- 发现数据里有一些是结构化数据(如表格),为此定制提取解决,准确率提升到98%
四、架构优化
RAG+Agent架构
1.RAG的局限性
RAG最初是为简单问题和小型文档集设计的,它通常包括数据解析、索引检索和简单的问答。然而,它在处理更复杂的问题时存在局限性,例如总结整个年度报告、比较问题、结构化分析和语义搜索等。
2.Agent的引入
为了解决RAG的局限性,文档提出了引入Agent的概念。Agent是一种更高级的系统,它能够执行多轮对话、查询/任务规划、工具使用、反思和记忆维护等更复杂的功能。
3.从RAG到Agent的转变
提到了从RAG到Agent的转变,这涉及到增加以下几个层次的功能:
-
多轮对话:与用户进行更深入的互动。
-
查询/任务规划层:能够理解并规划复杂的查询和任务。
-
工具接口:与外部环境进行交互,使用工具来辅助任务执行。
-
反思:能够自我评估并改进执行过程。
-
记忆:维护用户交互的历史,以提供个性化服务。
4.Agent的不同层次
从简单到高级Agent的不同层次,包括:
-
简单Agent:成本较低,延迟较低,但功能有限。
-
高级Agent:成本较高,延迟较高,但提供更复杂的功能,如动态规划和执行。
5.ReAct
ReAct(Reasoning + Acting with LLMs),这是一个结合了推理和行动的LLM系统,它利用查询规划、工具使用和记忆来执行更复杂的任务。
6.LLMCompiler
一个Agent编译器,用于并行多功能规划和执行,它通过生成步骤的有向无环图(DAG)来优化任务执行。
7.自我反思和可观察性
Agent能够通过自我反思和反馈来改进执行,同时提供可观察性,以便开发者能够追踪和理解Agent的行为。
8.多Agent系统
多Agent系统的概念,其中多个Agent可以同步或异步地交互,以执行更复杂的任务。
Self-RAG架构
在业务复杂或问题复杂的场景下,可以考虑引入Agent或使用Self-RAG架构。Self-RAG是一种引入反思机制的RAG,流程如下:
- 从知识库中检索出结果后,评估其与用户提问的相关性。
- 如果不相关,则改写查询并重复RAG流程,直到相关度评分达到要求。
实现Self-RAG需要以下两个组件:
- 基于Graph的任务编排系统。
- 在Graph内执行的必要算子。例如,在Self-RAG中,评分算子至关重要。可以通过训练一个打分模型来针对检索结果评分,或者采用LLM(Large Language Model)进行评分,以简化系统开发并减少对各类环节的依赖。
Self-RAG是相对初级的Agentic RAG,实践证明,Self-RAG对较复杂的多跳问答和多步推理可以明显提升性能。
Agentic RAG架构
它可以根据用户提问的不同意图采用对应的策略:
开放域问答:直接通过 LLM 产生答案而无需依赖 RAG 检索。
多跳问答:首先将多跳查询分解为更简单的单跳查询,重复访问 LLM 和 RAG 检索器来解决这些子查询,并合并它们的答案以形成完整答案。
自适应检索:适用于需要多步逻辑推理的复杂问题。复杂的问答往往需要从多个数据源综合信息并进行多步推理。自适应检索通过迭代地访问 RAG 检索器和 LLM,逐步构建起解决问题所需的信息链。
如下图所示,Adaptive-RAG 的工作流程与 Self-RAG 类似,只是在前面增加了一个查询分类器,就提供了更多种对话的策略选择。
总结
本文探讨了如何优化RAG系统在检索、语义和生成方面的性能。强调了数据清洗和增强的重要性,包括文本格式规范、实体解析、文档划分、数据多样性和用户反馈。检索优化包括向量库和倒排索引数据库两种方案。生成优化关键在于调整prompt,推荐使用OpenAI官方指南。针对客户需求,通过迭代调优和规则优化,提升了基于文档的知识检索准确率。介绍了RAG+Agent架构,Agent能执行复杂功能,如多轮对话和任务规划。Self-RAG架构引入反思机制,通过任务编排系统和必要算子提升性能。Agentic RAG架构根据不同意图采用策略,如开放域问答和自适应检索,以解决复杂问题。