支持私有云部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


为什么RAG系统"一看就会,一做就废"?

发布日期:2025-03-27 07:46:24 浏览次数: 1748 来源:24KTech
推荐语

RAG系统在结合外部知识库和生成模型方面表现出色,但在工程实践中面临诸多挑战。

核心内容:
1. RAG系统的原理与应用场景
2. RAG系统在工程实践中的7个常见问题
3. RAG系统的另外5个问题及潜在解决方案

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

 

随着大语言模型(LLM)的广泛应用,检索增强生成(RAG)技术作为一种结合检索技术和LLM提示的创新架构,因其在结合外部知识库和生成模型方面的卓越表现而备受关注。RAG系统通过将LLM与结构化或非结构化的外部数据源相结合,显著提升了生成内容的准确性、相关性和可信度。

RAG在聊天机器人、知识密集型任务和企业应用中表现出色。然而从理论到工程实践,开发和优化一个高效的RAG系统并非易事,RAG系统面临着诸多挑战。尽可能的系统性地分析RAG系统的开发难点与优化路径。

RAG系统的12个问题

首先看下澳大利亚吉朗应用人工智能研究所 Scott Barnett等人撰写的论文 《Seven Failure Points When Engineering a Retrieval Augmented Generation System》, 探讨了RAG系统在工程实践中的问题,论文中总结了7个常见的问题:

1. 缺失内容(Missing Content)

当用户的问题无法从文档库中检索到时,可能会导致大模型的幻觉现象。理想情况下,RAG 系统可以简单地回复一句 “抱歉,我不知道”,然而,如果用户问题能检索到文档,但是文档内容和用户问题无关时,大模型还是可能会被误导。

2. 错过超出排名范围的文档(Missed Top Ranked)

由于大模型的上下文长度限制,我们从文档库中检索时,一般只返回排名靠前的K个段落,如果问题答案所在的段落超出了排名范围,就会出现问题。

3. 不在上下文中(Not In Context)

包含答案的文档已经成功检索出来,但却没有包含在大模型所使用的上下文中。当从数据库中检索到多个文档,并且使用合并过程提取答案时,就会出现这种情况。

4. 未提取(Not Extracted)

答案在提供的上下文中,但是大模型未能准确地提取出来,这通常发生在上下文中存在过多的噪音或冲突信息时。

5. 错误的格式(Wrong Format)

问题要求以特定格式提取信息,例如表格或列表,然而大模型忽略了这个指示。

6. 不正确的具体性(Incorrect Specificity)

尽管大模型正常回答了用户的提问,但不够具体或者过于具体,都不能满足用户的需求。不正确的具体性也可能发生在用户不确定如何提问,或提问过于笼统时。

7. 不完整的回答(Incomplete Answers)

考虑一个问题,“文件 A、B、C 包含哪些关键点?”,直接使用这个问题检索得到的可能只是每个文件的部分信息,导致大模型的回答不完整。一个更有效的方法是分别针对每个文件提出这些问题,以确保全面覆盖。

Wenqi Glantz撰文《12 RAG Pain Points and Proposed Solutions》,又提了另外5个问题:

8. 数据摄取的可扩展性问题(Data Ingestion Scalability)

RAG管道中的数据摄取可扩展性问题是指当系统难以有效管理和处理大量数据时出现的挑战,从而导致性能瓶颈和潜在的系统故障。此类数据摄取可扩展性问题可能会导致摄取时间延长、系统过载、数据质量问题和可用性受限等问题。

9. 结构化数据的问答(Structured Data QA)

根据用户的问题准确检索出所需的结构化数据可能很困难,尤其是当用户的问题比较复杂或比较模糊时,由于文本到 SQL 的转换不够灵活及当前大模型在有效处理这类任务方面仍然存在一定的局限性。

10. 从复杂PDF文档提取数据(Data Extraction from Complex PDFs)

复杂的PDF文档中可能包含有表格、图片等嵌入内容,在对这种文档进行问答时,传统的检索方法往往无法达到很好的效果。我们需要一个更高效的方法来处理这种复杂的PDF数据提取需求。

11. 备用模型(Fallback Model(s))

在使用单一大模型时,我们可能会担心模型遇到问题,比如遇到 OpenAI 模型的访问频率限制错误。这时候,我们需要一个或多个模型作为备用,以防主模型出现故障。

12. 大语言模型的安全性(LLM Security)

如何有效地防止恶意输入、确保输出安全、保护敏感信息不被泄露等问题,都是每个AI架构师和工程师需要面对的重要挑战。

RAG系统的12个优化策略

从RAG的工作流程来看,其中的各个环节均有着极大的优化空间。我们将从工作流程5个环节中,结合上述12个问题详细了解具体优化策略。

1. 数据清洗(Clean your data)

高性能RAG系统依赖于准确且清洁的原始知识数据。
一方面为了保证数据的准确性,需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。
另一方面也需要对知识文档做一些基本数据清洗,其中可以包括:

  • • 1.1 文本清理
    规范文本格式,去除特殊字符、干扰和不相关信息;删除可能使检索过程产生偏差的重复文档或冗余信息;识别并更正拼写错误和语法错误,拼写检查器和语言模型等工具可以帮助解决这个问题。
  • • 1.2 实体解析
    消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。
  • • 1.3 文档划分
    合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。
  • • 1.4 数据增强
    使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。
  • • 1.5 用户反馈循环
    基于现实世界用户的反馈不断更新数据库,标记它们的真实性。
  • • 1.6 时间敏感数据
    对于经常更新的主题,实施一种机制来使过时的文档失效或更新。

2. 分块处理

在RAG系统中,文档需要分割成多个文本块再进行向量嵌入。在不考虑大模型输入长度限制和成本问题情况下,其目的是在保持语义上的连贯性的同时,尽可能减少嵌入内容中的噪声,从而更有效地找到与用户查询最相关的文档部分。如果分块太大,可能包含太多不相关的信息,从而降低了检索的准确性。相反,分块太小可能会丢失必要的上下文信息,导致生成的回应缺乏连贯性或深度
在RAG系统中实施合适的文档分块策略,旨在找到这种平衡,确保信息的完整性和相关性。一般来说,理想的文本块应当在没有周围上下文的情况下对人类来说仍然有意义,这样对语言模型来说也是有意义的。

  • • 2.1 分块方法的选择
    固定大小的分块:这是最简单和直接的方法,我们直接设定块中的字数,并选择块之间是否重复内容。通常,会保持块之间的一些重叠,以确保语义上下文不会在块之间丢失。与其他形式的分块相比,固定大小分块简单易用且不需要很多计算资源。
  • • 2.2 内容分块
    顾名思义,根据文档的具体内容进行分块,例如根据标点符号(如句号)分割。或者直接使用更高级的NLTK或者spaCy库提供的句子分割功能。
  • • 2.3 递归分块
    在大多数情况下推荐的方法。其通过重复地应用分块规则来递归地分解文本。例如,在langchain中会先通过段落换行符(\n\n)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(\n)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。这种方法可以灵活地调整块的大小。例如,对于文本中的密集信息部分,可能需要更细的分割来捕捉细节;而对于信息较少的部分,则可以使用更大的块。而它的挑战在于,需要制定精细的规则来决定何时和如何分割文本
  • • 2.4 从小到大分块
    既然小的分块和大的分块各有各的优势,一种更为直接的解决方案是把同一文档进行从大到小所有尺寸的分割,然后把不同大小的分块全部存进向量数据库,并保存每个分块的上下级关系,进行递归搜索。但可想而知,因为我们要存储大量重复的内容,这种方案的缺点就是需要更大的储存空间。
  • • 2.5 特殊结构分块
    针对特定结构化内容的专门分割器。这些分割器特别设计来处理这些类型的文档,以确保正确地保留和理解其结构。langchain提供的特殊分割器包括:Markdown文件,Latex文件,以及各种主流代码语言分割器。
  • • 2.6 分块大小的选择
    上述方法中无一例外最终都需要设定一个参数——块的大小,那么我们如何选择呢?
    首先不同的嵌入模型有其最佳输入大小。比如Openai的text-embedding-ada-002的模型在256 或 512大小的块上效果更好。
    其次,文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。
    处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。
    实际场景中,我们可能还是需要不断实验调整,在一些测试中,128大小的分块往往是最佳选择,在无从下手时,可以从这个大小作为起点进行测试

3. 嵌入模型

过嵌入模型能够将文本转换成向量,显然不同的嵌入模型带来的效果也不尽相同,例如Word2Vec模型,尽管功能强大,但存在一个重要的局限性:其生成的词向量是静态的。一旦模型训练完成,每个词的向量表示就固定不变,这在处理一词多义的情况时可能导致问题。

比如, “我买了一张光盘”,这里“光盘”指的是具体的圆形盘片,而在“光盘行动”中,“光盘”则指的是把餐盘里的食物吃光,是一种倡导节约的行为。语义完全不一样的词向量却是固定的。 相比之下,引入自注意力机制的模型,如BERT,能够提供动态的词义理解。这意味着它可以根据上下文动态地调整词义,使得同一个词在不同语境下有不同的向量表示。“光盘”这个词在两个句子中会有不同的向量,从而更准确地捕捉其语义。

有些项目为了让模型对特定垂直领域的词汇有更好的理解,会嵌入模型进行微调。但在这里我们并不推荐这种方法:
一方面其对训练数据的质量有较高要求,
另一方面也需要较多的人力物力投入,且效果未必理想,最终得不偿失。
在这种情况下,对于具体应该如何选择嵌入模型,我们推荐参考Hugging Face推出的嵌入模型排行榜MTEB。这个排行榜提供了多种模型的性能比较,能帮助我们做出更明智的选择。同时,要注意并非所有嵌入模型都支持中文,因此在选择时应查阅模型说明。

4. 元数据

当在向量数据库中存储向量数据时,某些数据库支持将向量与元数据(即非向量化的数据)一同存储。为向量添加元数据标注是一种提高检索效率的有效策略,它在处理搜索结果时发挥着重要作用

例如,日期就是一种常见的元数据标签。它能够帮助我们根据时间顺序进行筛选。设想一下,如果我们正在开发一款允许用户查询他们电子邮件历史记录的应用程序。在这种情况下,日期最近的电子邮件可能与用户的查询更相关。然而,从嵌入的角度来看,我们无法直接判断这些邮件与用户查询的相似度。通过将每封电子邮件的日期作为元数据附加到其嵌入中,我们可以在检索过程中优先考虑最近日期的邮件,从而提高搜索结果的相关性。

此外,我们还可以添加诸如章节或小节的引用,文本的关键信息、小节标题或关键词等作为元数据。这些元数据不仅有助于改进知识检索的准确性,还能为最终用户提供更加丰富和精确的搜索体验。

5. 多级索引

元数据无法充分区分不同上下文类型的情况下,我们可以考虑进一步尝试多重索引技术。多重索引技术的核心思想是将庞大的数据和信息需求按类别划分,并在不同层级中组织,以实现更有效的管理和检索
这意味着系统不仅依赖于单一索引,而是建立了多个针对不同数据类型和查询需求的索引。例如,可能有一个索引专门处理摘要类问题,另一个专门应对直接寻求具体答案的问题,还有一个专门针对需要考虑时间因素的问题。这种多重索引策略使RAG系统能够根据查询的性质和上下文,选择最合适的索引进行数据检索,从而提升检索质量和响应速度。但为了引入多重索引技术,我们还需配套加入多级路由机制。

多级路由机制确保每个查询被高效引导至最合适的索引。查询根据其特点(如复杂性、所需信息类型等)被路由至一个或多个特定索引。这不仅提升了处理效率,还优化了资源分配和使用,确保了对各类查询的精确匹配。

例如,对于查询“最新上映的科幻电影推荐”,RAG系统可能首先将其路由至专门处理当前热点话题的索引,然后利用专注于娱乐和影视内容的索引来生成相关推荐。

总的来说,多级索引和路由技术可以进一步帮助我们对大规模数据进行高效处理和精准信息提取,从而提升用户体验和系统的整体性能。

6.索引/查询算法

可以利用索引筛选数据,但说到底还是要从筛选后的数据中检索出相关的文本向量。由于向量数据量庞大且复杂,寻找绝对的最优解变得计算成本极高,有时甚至是不可行的。加之,大模型本质上并不是完全确定性的系统,这些模型在搜索时追求的是语义上的相似性——一种合理的匹配即可。从应用的角度来看,这种方法是合理的
例如,在推荐系统中,用户不太可能察觉到或关心是否每个推荐的项目都是绝对的最佳匹配;他们更关心的是推荐是否总体上与他们的兴趣相符。因此查找与查询向量完全相同的项通常不是目标,而是要找到“足够接近”或“相似”的项,这便是最近邻搜索(Approximate Nearest Neighbor Search,ANNS)。这样做不仅能满足需求,还为检索优化提供了巨大的优化潜力。
但是在”法律“、”医疗“、”金融“等垂直领域,大模型的这种不确定性,会带来致命的结果,因此LLM+RAG结合互补,以期望解决LLM在某些场景的短板。

7. 查询转换

在RAG系统中,用户的查询问题被转化为向量,然后在向量数据库中进行匹配。不难想象,查询的措辞会直接影响搜索结果。如果搜索结果不理想,可以尝试以下几种方法对问题进行重写,以提升召回效果:

  • • 7.1 结合历史对话的重新表述
    在向量空间中,对人类来说看似相同的两个问题其向量大小并不一定很相似。我们可以直接利用LLM 重新表述问题来进行尝试。此外,在进行多轮对话时,用户的提问中的某个词可能会指代上文中的部分信息,因此可以将历史信息和用户提问一并交给LLM重新表述。
  • • 7.2 假设文档嵌入(HyDE)
    HyDE的核心思想是接收用户提问后,先让LLM在没有外部知识的情况下生成一个假设性的回复。然后,将这个假设性回复和原始查询一起用于向量检索。假设回复可能包含虚假信息,但蕴含着LLM认为相关的信息和文档模式,有助于在知识库中寻找类似的文档。
  • • 7.3 退后提示(Step Back Prompting)
    如果果原始查询太复杂或返回的信息太广泛,我们可以选择生成一个抽象层次更高的“退后”问题,与原始问题一起用于检索,以增加返回结果的数量。例如,原问题是“桌子君在特定时期去了哪所学校”,而退后问题可能是关于他的“教育历史”。这种更高层次的问题可能更容易找到答案。
  • • 7.4 多查询检索/多路召回(Multi Query Retrieval)
    使用LLM生成多个搜索查询,特别适用于一个问题可能需要依赖多个子问题的情况。

通过这些方法,RAG系统能够更精准地处理和响应复杂的用户查询,从而提升整体的搜索效率和准确性。

8. 检索参数

把查询问题准备好,可以进入向量数据库进行检索。在具体的检索过程中,可以根据向量数据库的特定设置来优化一些检索参数,以下是一些常见的可设定参数:

  • • 8.1 稀疏和稠密搜索权重
    稠密搜索即通过向量进行搜索。然而,在某些场景下可能存在限制,此时可以尝试使用原始字符串进行关键字匹配的稀疏搜索。一种有效的稀疏搜索算法是最佳匹配25(BM25),它基于统计输入短语中的单词频率,频繁出现的单词得分较低,而稀有的词被视为关键词,得分会较高。我们可以结合稀疏和稠密搜索得出最终结果。向量数据库通常允许设定两者对最终结果评分的权重比例,如0.6表示40%的得分来自稀疏搜索,60%来自稠密搜索。
  • • 8.2 结果数量(topK)
    检索结果的数量是另一个关键因素。足够的检索结果可以确保系统覆盖到用户查询的各个方面。在回答多方面或复杂问题时,更多的结果提供了丰富的语境,有助于RAG系统更好地理解问题的上下文和隐含细节。但需注意,结果数量过多可能导致信息过载,降低回答准确性并增加系统的时间和资源成
  • • 8.3 相似度度量方法
    计算两个向量相似度的方法也是一个可选参数。这包括使用欧式距离和Jaccard距离计算两个向量的差异,以及利用余弦相似度衡量夹角的相似性。通常,余弦相似度更受青睐,因为它不受向量长度的影响,只反映方向上的相似度。这使得模型能够忽略文本长度差异,专注于内容的语义相似性。需要注意的是,并非所有嵌入模型都支持所有度量方法,具体可参考所用嵌入模型的说明。

9. 高级检索策略

最为关键和复杂的步骤是在向量数据库检索之上如何具体开发或改进整个系统的策略。这部分的内容足够写成一篇独立文章。为了保持简洁,我们只讨论一些常用或者新提出的策略。

  • • 9.1 上下文压缩
    我们提到过当文档文块过大时,可能包含太多不相关的信息,传递这样的整个文档可能导致更昂贵的LLM调用和更差的响应。上下文压缩的思想就是通过LLM的帮助根据上下文对单个文档内容进行压缩,或者对返回结果进行一定程度的过滤仅返回相关信息。
  • • 9.2 句子窗口搜索
    相反,文档文块太小会导致上下文的缺失。其中一种解决方案就是窗口搜索,该方法的核心思想是当提问匹配好分块后,将该分块周围的块作为上下文一并交给LLM进行输出,来增加LLM对文档上下文的理解。
  • • 9.3 父文档搜索
    无独有偶,父文档搜索也是一种很相似的解决方案,父文档搜索先将文档分为尺寸更大的主文档,再把主文档分割为更短的子文档两个层级,用户问题会与子文档匹配,然后将该子文档所属的主文档和用户提问发送给LLM。
  • • 9.4 自动合并
    自动合并是在父文档搜索上更进一步的复杂解决方案。同样地,我们先对文档进行结构切割,比如将文档按三层树状结构进行切割,顶层节点的块大小为1024,中间层的块大小为512,底层的叶子节点的块大小为128。而在检索时只拿叶子节点和问题进行匹配,当某个父节点下的多数叶子节点都与问题匹配上则将该父节点作为结果返回。
  • • 9.5 多向量检索
    多向量检索同样会给一个知识文档转化成多个向量存入数据库,不同的是,这些向量不仅包括文档在不同大小下的分块,还可以包括该文档的摘要,用户可能提出的问题等等有助于检索的信息。在使用多向量查询的情况下,每个向量可能代表了文档的不同方面,使得系统能够更全面地考虑文档内容,并在回答复杂或多方面的查询时提供更精确的结果。例如,如果查询与文档的某个具体部分或摘要更相关,那么相应的向量就可以帮助提高这部分内容的检索排名。
  • • 9.6 多代理检索
    多代理检索,简而言之就是选取我们提及的12大优化策略中的部分交给一个智能代理合并使用。就比如使用子问题查询,多级索引和多向量查询结合,先让子问题查询代理把用户提问拆解为多个小问题,再让文档代理对每个字问题进行多向量或多索引检索,最后排名代理将所有检索的文档总结再交给LLM。这样做的好处是可以取长补短,比如,子问题查询引擎在探索每个子查询时可能会缺乏深度,尤其是在相互关联或关系数据中。相反,文档代理递归检索在深入研究特定文档和检索详细答案方面表现出色,以此来综合多种方法解决问题。需要注意的是现在网络上存在不同结构的多代理检索,具体在多代理选取哪些优化步骤尚未有确切定论,我们可以结合使用场景进行探索。
  • • 9.7 Self-RAG
    自反思搜索增强是一个全新RAG框架,其与传统RAG最大的区别在于通过检索评分(令牌)和反思评分(令牌)来提高质量。它主要分为三个步骤:检索、生成和批评。Self-RAG首先用检索评分来评估用户提问是否需要检索,如果需要检索,LLM将调用外部检索模块查找相关文档。接着,LLM分别为每个检索到的知识块生成答案,然后为每个答案生成反思评分来评估检索到的文档是否相关,最后将评分高的文档当作最终结果一并交给LLM。

10.重排模型(Re-ranking)

在完成语义搜索的优化步骤后,能够检索到语义上最相似的文档,但不知你是否注意到一个关键问题:语义最相似是否总代表最相关?答案是不一定。例如,当用户查询“最新上映的科幻电影推荐”时,可能得到的结果是“科幻电影的历史演变”,虽然从语义上这与科幻电影相关,但并未直接回应用户关于最新电影的查询。

重排模型可以帮助我们缓解这个问题,重排模型通过对初始检索结果进行更深入的相关性评估和排序,确保最终展示给用户的结果更加符合其查询意图。这一过程通常由深度学习模型实现,如Cohere模型。这些模型会考虑更多的特征,如查询意图、词汇的多重语义、用户的历史行为和上下文信息等。

举个例子,对于查询“最新上映的科幻电影推荐”,在首次检索阶段,系统可能基于关键词返回包括科幻电影的历史文章、科幻小说介绍、最新电影的新闻等结果。然后,在重排阶段,模型会对这些结果进行深入分析,并将最相关、最符合用户查询意图的结果(如最新上映的科幻电影列表、评论或推荐)排在前面,同时将那些关于科幻电影历史或不太相关的内容排在后面。这样,重排模型就能有效提升检索结果的相关性和准确性,更好地满足用户的需求。

在实践中,使用RAG构建系统时都应考虑尝试重排方法,以评估其是否能够提高系统性能。

11. 提示词

大型语言模型的解码器部分通常基于给定输入来预测下一个词。这意味着设计提示词或问题的方式将直接影响模型预测下一个词的概率。这也给了我们一些启示:通过改变提示词的形式,可以有效地影响模型对不同类型问题的接受程度和回答方式,比如修改提示语,让LLM知道它在做什么工作,是十分有帮助的。

为了减少模型产生主观回答和幻觉的概率,一般情况下,RAG系统中的提示词中应明确指出回答仅基于搜索结果,不要添加任何其他信息。例如,可以设置提示词如:
“你是一名智能客服。你的目标是提供准确的信息,并尽可能帮助提问者解决问题。你应保持友善,但不要过于啰嗦。请根据提供的上下文信息,在不考虑已有知识的情况下,回答相关查询。”

当然你也可以根据场景需要,也可以适当让模型的回答融入一些主观性或其对知识的理解。此外,使用少量样本(few-shot)的方法,将想要的问答例子加入提示词中,指导LLM如何利用检索到的知识,也是提升LLM生成内容质量的有效方法。这种方法不仅使模型的回答更加精准,也提高了其在特定情境下的实用性。

12. 大语言模型

最后一步——LLM生成回答。LLM是生成响应的核心组件。与嵌入模型类似,可以根据自己的需求选择LLM,例如开放模型与专有模型、推理成本、上下文长度等。此外,可以使用一些LLM开发框架来搭建RAG系统,比如,LlamaIndex或LangChain。这两个框架都拥有比较好用的debugging工具,可以让我们定义回调函数,查看使用了哪些上下文,检查检索结果来自哪个文档等等。

小结

建设RAG系统需要兼顾技术深度与工程实践,从检索精度、生成质量到系统稳定性均需精心设计。通过结合最新的优化策略与工具链(如Cursor、MCP技术),能够有效解决开发中的核心问题,构建高效、可靠且适应性强的RAG系统。随着多模态技术、大模型上下文理解、动态学习机制和隐私保护技术的不断成熟,RAG系统将在更多垂直领域场景释放其潜力,成为下一代智能应用的核心技术之一,同时为用户提供更加智能、可靠的服务。


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询