数据科学是一门实验科学。它从“没有免费的午餐定理”开始,该定理指出没有一种万能算法适用于所有问题。这导致数据科学家使用实验跟踪系统来帮助他们调整机器学习(ML)项目的超参数,以实现最佳性能。
本文通过数据科学家的视角来看待检索增强生成(RAG)管道。它讨论了你可以尝试的潜在“超参数”,以改善你的RAG管道性能。类似于深度学习中的实验,例如,数据增强技术并不是一个超参数,而是可以调整和试验的旋钮,本文还将讨论不同的策略,这些策略本身并不严格意义上是超参数。
摄取阶段
摄取阶段是构建 RAG 管道的准备步骤,与 ML 管道中的数据清洗和预处理步骤类似。通常,摄取阶段包含以下步骤:
本节讨论了你可以应用和调整的影响性技术和超参数,以提高推理阶段检索到的上下文的相关性。
数据清洗
与任何数据科学管道一样,数据的质量极大地影响你的 RAG 管道中的结果。在进行以下任何步骤之前,请确保你的数据符合以下标准:
文档分块
分块处理你的文档是 RAG 管道中外部知识来源准备步骤的一个关键,它可以影响性能 。这是一种生成逻辑上连贯的信息片断的技术,通常是通过将长文档分割成较小的部分来实现(但它也可以将较小的片断组合成连贯的段落)。
你需要考虑是选择分块技术的选择。例如,在 LangChain 中,不同的文本分割器按不同的逻辑拆分文档,例如按字符,令牌等。这取决于你拥有的数据类型。例如,如果你的输入数据是代码,则需要使用不同的分块技术,而如果是 Markdown 文件,则不同。
你分块的理想长度(chunk_size)取决于你的用例:如果你的用例是问答,你可能需要更短更具体的块,但如果你的用例是总结,你可能需要更长的块。此外,如果分块太短,可能不包含足够的上下文。另一方面,如果分块太长,它可能包含太多不相关的信息。
此外,你需要考虑分块之间的“滚动窗口”(overlap),以引入一些附加上下文。
嵌入模型
嵌入模型是你检索的核心。嵌入的质量极大地影响你的检索结果。通常,生成的嵌入的维度越高,嵌入的精度越高。
虽然你可以直接使用通用的嵌入模型,但在某些情况下,为了避免后期出现领域外问题,你可能需要将嵌入模型微调至特定用例。根据LlamaIndex进行的实验,微调你的嵌入模型可以在检索评价指标中提高5-10%的性能。
请注意,并不是所有的嵌入模型都可以进行微调(例如,OpenAI的text-embedding-ada-002目前就不能进行微调)。
元数据
当你在向量数据库中存储向量嵌入时,有些向量数据库允许你将这些向量嵌入与元数据(或未向量化的数据)一起存储。通过元数据注释向量嵌入,可以帮助你在搜索结果的后期处理中,例如元数据过滤。举个例子,你可以添加日期、章节或小节参考等元数据。
多重索引
如果元数据不足以提供额外的信息来逻辑上区分不同类型的上下文,你可能想尝试多重索引。比如,你可以为不同类型的文档使用不同的索引。请注意,你在检索时必须要加入一些索引路由。
索引算法
为了实现大规模的闪电般快速的相似性搜索,向量数据库和向量索引库使用近似最近邻(ANN)搜索而不是k最近邻(kNN)搜索。顾名思义,ANN算法是近似求解最近邻,因此与kNN算法相比可能会有较少的精确性。
你可以尝试不同的ANN算法,比如Facebook的Faiss(聚类)、Spotify的Annoy(树)、Google的ScaNN(向量压缩)以及HNSWLIB(邻近图)。同样地,这些ANN算法中有一些参数你可以调整,例如HNSW的ef、efConstruction和maxConnections。
此外,你还可以为这些索引算法启用向量压缩。与ANN算法类似,向量压缩将失去一些精度。但是,根据向量压缩算法的选择及其调整,你也可以对此进行优化。
然而,在实践中,这些参数已由向量数据库和向量索引库的研究团队在基准实验中调整,而非RAG系统的开发者。
推理阶段(检索与生成)
RAG(检索增强的生成器)流水线的主要组成部分是检索和生成组件。本节主要讨论提升检索性能的策略(查询转换、检索参数、高级检索策略以及重新排序模型),因为这是两者中更有影响力的组件。但它也简要地提到了一些提升生成性能的策略(大型语言模型和提示工程)。
查询转换
由于在RAG (可重复利用注意力生成器)流程中,用以检索额外上下文的搜索查询也被嵌入到向量空间中,它的表述方式同样可以影响搜索结果。因此,如果你的搜索查询没有得到满意的结果,你可以试验不同的查询转换技术,例如:
检索参数
检索是RAG流程的一个关键组成部分。首先要考虑的是语义搜索对于你的用例是否足够,或者你是否想要尝试混合搜索。
在后一种情况下,你需要试验在混合搜索中对稀疏和密集检索方法的聚合加权。因此,调整参数alpha将变得必要,这个参数控制语义搜索(alpha = 1)与基于关键字的搜索(alpha = 0)之间的权重。
检索结果的数量将起到至关重要的作用。检索到的上下文数量将影响所使用的上下文窗口长度。此外,如果你正在使用重新排序模型,你需要考虑向模型输入多少上下文。
高级检索策略
本节的基本思想是,用于检索的信息块不必然是用于生成的信息块。理想情况下,你会嵌入较小的检索块,但会检索更大的上下文。
重新排名模型
尽管语义搜索基于其与搜索查询的语义相似性来检索上下文,“最相似的”不必然意味着“最相关的”。重新排名模型,例如Cohere的Rerank模型,可以通过计算检索到的上下文对于每个查询的相关性得分来帮助排除不相关的搜索结果。
“最相似的”不必然意味着“最相关的”。
如果你正在使用重新排名模型,你可能需要重新调整重新排名模型的搜索结果数量以及你想要输入到大型语言模型(LLM)的重新排序结果的数量。
与嵌入模型一样,你可能想要尝试针对你的特定用例对重新排名模型进行微调。
大型语言模型(LLM)
LLM是生成响应的核心组成部分。与嵌入模型类似,你可以根据你的需求选择各种LLM,比如开放与专有模型、推理成本、上下文长度等。
与嵌入模型或重新排名模型一样,你可能想要对LLM进行微调以适应你的特定用例,以纳入特定的措辞或语调。
提示工程
你是如何构建或设计你的提示将显著影响LLM的完成情况。
Please base your answer only on the search results and nothing else!
Very important! Your answer MUST be grounded in the search results provided.
Please explain why your answer is grounded in the search results!
另外,使用少量示例对你的提示进行改进可以提高完成任务的质量。
正如在检索参数中所提及的,输入提示中的上下文数量是你应该进行实验的一个参数。虽然随着与任务相关的上下文的增加,你的RAG管线的性能可以得到提升,但如果将相关上下文放置在许多上下文的中间,你也可能会遇到“丢失在中间”、的效应,即LLM无法将其识别为相关上下文。
总结
随着越来越多的开发者在原型RAG管线方面获得经验,讨论策略以将RAG管线带到生产就绪的性能变得越来越重要。