本文是 《Improving Retrieval for RAG based Question Answering Models on Financial Documents》 的笔记。
Limitations of Current RAG Pipelines
传统的 RAG 架构在知识密集型和领域特定的自然语言处理任务中面临许多限制,影响了其有效性。大多数 RAG 流程将文档均匀分成文本块,而不考虑文档的结构和内容。每个文本块由相同数量的单词或 token 组成,文本块之间可能存在一些重叠以提供上下文。检索器通常会返回最相似的前 k 个文本块,而每个文本块的大小大致相等。然而,这种方法完全不考虑文档的性质,可能在某些情况下导致重要的疏漏和信息丢失。例如,如果问题的答案跨越了几个不一定是语义上最相似的文本块,传统的 RAG 流程可能无法返回最理想的文本块。
通过余弦相似度进行语义搜索,这是 RAG 的核心组成部分,也存在一些挑战,比如检索到不相关或相反的信息,这表明模型对语言细微差别很敏感,并可能产生意想不到的结果。最相似的文本块不一定是最相关的文本块,然而许多 RAG 流程都做出了这种假设。此外,大多数情况下,标准的嵌入算法没有任何领域特定的知识,因此它们忽视了特定领域中某些词语或短语的细微差别。
基本的分块策略和相似性搜索在处理单个长文本作为知识库(如书籍或文章)时可能会有良好的结果。然而,在大多数情况下,我们希望能够与多种不同类型的文档进行对话,这些文档往往具有更复杂的结构,如标题和表格。当所有的文本块被平等对待并放入单个向量数据库时,关键信息就会丢失。例如,文档集合可能是不同公司或横跨多年的财务报告。每个文本文本块可能不包含所属公司或年份等信息。这可能导致提供错误和过时的信息,相似性搜索可能返回过时或不相关的文本块,因为忽略了文本和文档的额外数据。
传统的检索算法缺乏对多个不同文档进行高层次问答所需的细微差别理解和推理能力。由于通常只是基于原始问题进行相似性搜索,算法不会经过像人类那样的逻辑步骤来找到相关部分。查询本身可能不包含所有需要的信息来指示模型最相关的文本块在哪里,而是需要额外的信息和逻辑步骤。
Techniques to Improve Retrieval
鉴于当前和标准 RAG 流程的各种限制,显然需要开发和实施不同的策略来解决这些问题。在本节中,我们将探索各种不同的技术,旨在优化 RAG 在回答问题的性能。
Chunking Techniques
Chunking 方法是检索过程中的关键因素,它决定了算法返回的上下文的性质。无效的分块策略可能导致文本块中上下文不完整,或者在另一个极端情况下,每个文本块中包含太多不相关和不必要的信息。当选择固定的分块大小时,就像大多数 RAG 流程所做的那样,会存在包含过多或过少信息的风险。理想的方法取决于知识库中文档的性质,以及模型期望的查询长度和回答这些查询所需的上下文量。
递归分块是一种更灵活的分块策略,它使用其他指标和规则(如标点符号)使分块更具动态性。虽然文本块的大小仍然相对均等,但确保文本块不会在句子中间被切断。通过使用 Python 库如 Spacy 和 NLTK,我们可以使用更复杂的句子分割技术,利用自然语言处理方法更好地理解文档的上下文。
对于财务报告这类文档,它们通常非常长,且包含了更复杂的结构,比如表格。由于这些财务报告的特殊性质,基于元素的分块方法可以进一步改善检索。Unstructured 的一篇论文提出了一种基于元素分块,将文档分解为可管理大小的新方法-如果找到标题元素,将开始一个新的文本块;如果找到表格元素,也将开始一个新的文本块,保留整个表格。这样的策略将有助于确保每个上下文返回足够的上下文以有效回答用户的问题。
其他分块方法包括利用自然语言处理技术实现递归、基于字符或语义的分块。语义或递归分块的性质比基于字符或均匀分块方法更好地保留了文档的上下文,但实施起来更加复杂。其中一种方法是使用称为 “agentic chunking” 的方法,通过提示另一个语言模型来以最佳方式分割文本。虽然这种方法似乎具有最好的上下文理解能力,但它是计算上最昂贵的,并且经常遇到超过嵌入模型的 token 大小限制的问题。
Query Expansion
查询扩展或查询转换是指改写输入到 RAG 流程中的问题,以便根据用户原始问题以外的信息找到相关的文本块。这个想法的背后是,用户的问题通常可能没有明确包含所有信息,以指示算法在文档中应该查找哪个上下文,特别是在通过余弦相似性搜索时。有时,仅凭用户的问题可能会误导算法在错误的区域进行查找,从而返回一个不相关的文本块。对于更复杂的问题和文档,需要更多的推理步骤来确定查找的位置,而基本的 RAG 流程完全缺乏这方面的能力。
一种模拟人类分析师在检索时可能进行的逻辑的技术是利用假设性文档嵌入(Hypothetical Document Embeddings,HyDE)。在回答查询时使用一个语言模型生成一个理论文档,然后同时使用原始问题和假设的答案进行相似性搜索。这种技术已被证明优于标准的检索器,并消除了对自定义嵌入算法的需求,但有时可能会导致错误的结果,因为它依赖于另一个语言模型提供额外的上下文。
Metadata Annotations and Indexing
当与多个不同的文档进行交互时,标准检索算法可能完全忽略元数据中的关键数据点。我们之前在尝试与多个文档进行对话时遇到的问题是,原始的 RAG 流程会混淆来自不同文档的文本块。
在使用分块策略时应考虑元数据注释的性质。例如,由于我们将根据元素对文档进行分块,可以在注释中包含有关每个元素的详细信息。例如,如果在单独的文本块中创建了一个表格,元数据可以包含该表格的类型(例如,利润表、现金流量表等)。此外,通常还会在元数据注释中添加摘要和代表性关键词以提供额外的上下文信息。
Re-ranking Algorithms
在标准的 RAG 流程中,可以指定算法应返回的文档或文本块数量,以及应将多少个文本块作为上下文提供给输入查询。通常,将排名前 1 或 2 的文本块作为上下文,这些文本块是通过余弦相似性或 k 最近邻搜索得到的最佳结果。这样的算法将给出最相似的文本块,但这些文本块可能并不是上下文中最相关的内容。
重新排序算法是一种根据相关性对文本块进行重新排序的方法。余弦相似性等方法可能会对前 10 个文本块进行排名,另一个独立的算法将根据相关性对这些文本块进行重新排序,然后在重新排序后的前 1 或 2 个文本块将作为上下文补充到输入查询中。Cohere 的重新排序算法是一种常用的方法,它以及其他方法使用了额外的机器学习和自然语言处理技术,以进一步评估相关性。在本文中,我们使用了一个交叉编码器(cross-encoder)模型来对每个检索到的文本块与问题的相关性进行评分,并根据得分对文本块进行重新排序。从架构设计的角度看,对于这个特定的用例,交叉编码器模型的准确性更高于双编码器(bi-encoder)模型。
Fine-tuning Embedding Algorithms
嵌入算法负责将文本转换为数值表示,在 RAG 流程中发挥着关键作用。可以基于特定领域的知识对嵌入算法进行微调,以增强该领域的检索效果。嵌入也可以是动态的,即根据上下文中词语的不同含义进行调整。OpenAI 的嵌入就是一个基于上下文变化的动态嵌入的例子。领域特定的微调则需要访问包含查询、文本语料库以及该特定领域相关文档的数据集。在本文中,我们专注于 zero-shot 方法来改进检索,这种方法不需要额外的训练数据。
Evaluation
在评估 RAG 系统时,主要有两个组成部分:评估模型检索上下文的能力,以及评估模型基于上下文回答问题的能力。在数据集中,我们可以获取由金融分析师制定的标准上下文和答案。将模型的响应与这些标准答案进行对比分析被称为结构化评估,而在没有这些标准答案的情况下进行的评估则是非结构化评估。结构化评估在衡量模型准确性方面更为可靠,然而,非结构化评估对于判断文本块和答案的质量也很有用,而且在大多数情况下,当我们无法获取标准答案数据时,非结构化评估是必需的。
Retrieval Quality
使用结构化数据测试检索质量的主要方法是通过页面级和段落级准确率。由于在数据中,我们可以访问完整文档和分析师引用的章节,我们将该章节与检索算法返回的文本块进行比较。如果参考上下文和算法返回的上下文在同一页面上,就会获得较高的检索准确率,段落级准确率也遵循类似的思路。
对于非结构化数据,我们可以使用 RAGAS 框架定义的上下文相关性来评估检索到的文本块。在这个指标中,会要求大语言模型计算上下文中与回答问题相关的句子数量。相关句子数量与上下文总句子数量的比率被定义为上下文相关性分数。这个分数会惩罚冗余信息,同时奖励那些大部分句子都能为回答问题提供有用信息的文本块。
Answer Accuracy
对于问答的结构化评估,我们将模型的答案与数据集中的标准答案进行准确性评估。我们使用包括 BLEU 和 Rouge-L 分数以及余弦相似度在内的标准指标。然而,这些分数在比较两个不同答案的语义含义时并不理想,可能会产生误导。因此,我们还使用了 LLM 进行评估,即使用特定提示让像 GPT 这样的模型在给定标准答案的情况下评估候选答案的准确性。
我们还可以通过非结构化方式进一步评估生成器的答案相对于检索上下文的质量。这些指标衡量了模型在给定上下文下的响应质量。答案忠实度(faithfulness)是 RAGAS 框架提出的另一个可用指标,它衡量模型的答案在多大程度上基于给定的上下文。它通过将答案中被上下文支持的陈述数量除以答案中的总句子数来计算。这个分数也可以被视为一种评估模型是否在产生幻觉信息的方法,而且不需要标准答案。高忠实度分数意味着生成答案中几乎所有句子都得到了上下文的支持,表明模型没有编造任何文档之外的额外信息。
Results
为了评估结合 RAG 的模型性能,我们使用了 Patronus AI 开发的 FinanceBench 基准测试集用于问答模型评估。这个基准测试集包含了 10,231 个关于美国上市公司的问题,涵盖了 2015 年至 2023 年间发布的各类财务文件,如 10-K 表、10-Q 表、8-K 表和收益报告。然而,由于只有 150 行数据是公开可用的,因此本研究仅使用了这部分数据。FinanceBench 数据集的每个条目都包含一个问题、答案、验证文本(包含验证答案所需的信息),以及相关文档的页码。
Base RAG 没有被提供额外的上下文,模型必须自行检索上下文信息。相对地,Fake RAG 使用相同的大语言模型,但会被提供正确的上下文来回答原始问题,具体使用的是来自 FinanceBench 的上下文信息。我们还对整个数据集使用了查询扩展技术和使用交叉编码器的重新排序方法进行了测试。
实验结果表明,Fake RAG 方法表现最好,平均 LLM 评估得分为 0.573。这是预期的,因为 LLM 获得了正确回答问题所需的上下文。然而,从表格中可以看出,该方法的得分具有最高的标准差。在查看数据时,似乎当给出正确的上下文时,LLM 能够正确回答问题,或者完全答错。因此,虽然提供正确的上下文显著提高了模型的准确性,但即使在使用像 GPT-4o 这样的最先进生成器回答高度复杂和领域特定的问题时,LLM 本身仍存在一些限制。
准确率最低的方法是 Base RAG,平均 LLM 评估得分为 0.204。每种方法都使用相同的 LLM 和提示模板,只是上下文的获取方式不同。这意味着输入模型的上下文差异导致了超过 35% 的准确性差距,凸显了获取正确文本的重要性,特别是对于更长、更复杂的文档。Zero-shot 方法的查询扩展和重新排序似乎对准确性有一定改进,分别具有 0.24 和 0.256 的LLM评估得分。虽然这与 fake RAG 相比仍有差距,但相较于 base RAG 情况,它的改进并不可忽视。因此,我们可以得出结论,zero-shot 方法用于增强检索可能是提高准确性的正确方向,但远远不足以构建具有非常高准确性的稳健系统。