RAG 的 12 种核心调优策略
数据科学是一门实验性科学。它始于'无免费午餐定理',即不存在适用于每个问题的通用算法。因此,数据科学家们使用实验跟踪系统来帮助调整他们机器学习项目的超参数,以实现最佳性能。
01、整体优化方案说明
检索增强生成(Retrieval-Augmented Generation,以下简称 RAG)是一种比较有效的大模型使用场景中的补充模型能力的机制,在实践中可以通过调整其各种参数提高 RAG 流程的性能。类似于深度学习中的实验,数据增强技术不是超参数,而是可以调整和实验的旋钮。
本文从数据索引阶段和推理阶段分别阐述 RAG 流程的'超参数'和调优建议。
数据索引阶段可优化点:
- 数据清洗
- 分块
- 嵌入模型
- 元数据
- 多索引
- 索引算法
推理阶段可优化点:
- 查询转换
- 检索参数
- 高级检索策略
- 重新排序模型
- 语言模型微调
- 提示工程
请注意,本文的用例是基于文本类的 RAG 应用。对于多模态的 RAG 应用,可能需要考虑其他不同的因素。
02、索引阶段 - 优化方案
数据索引阶段是构建 RAG 的准备步骤,类似于机器学习中的数据清洗和预处理。数据索引阶段通常包括以下步骤:
- 数据收集:整合内部知识库、外部文档等。
- 分块:将大量数据分割成较小的块,以便更有效地处理和管理数据。
- 向量化:使用嵌入模型将每个数据块转换为向量表示这有助于在后续的检索和生成阶段中处理和分析文本。
- 存储:将生成的向量和相应的数据块存储在向量数据库中。
2.1、数据清洗
数据质量在 RAG 中起着至关重要的作用,因此在进行以下任何步骤之前,需确保数据集符合以下标准:
- 整洁:请应用一些在自然语言处理中常用的数据清洗方法。例如确保所有特殊字符被正确编码,去除 HTML 标签,统一换行符。
- 正确:确保信息的一致性与准确性,避免可能混淆语言模型的冲突信息。若原始数据集不符合这样的标准,首先要做的就是将数据集清洗为符合这两条标准的数据格式,然后再进行下面的步骤。
2.2、分块
在 RAG 中,对文档进行切块是处理外部知识源的一项重要步骤,会直接影响性能。分块是一种生成有逻辑关联的信息片段的技巧,通常做法是通过将长文档分割成小节(也可以将小片段组合成段落)。
分块技术是影响分块效果的一个因素。如在 LangChain 中,不同的文本拆分器根据不同的逻辑拆分文档,比如按字符、标记等。这要根据你的数据类型来决定。常见的策略包括:
- 固定大小分块:简单直接,但可能切断语义。
- 递归字符分块:优先按段落、句子分割,保留结构。
- 语义分块:基于内容相似度进行分割。
分块长度(chunk_size)也要具体情况具体分析:若使用场景是问答,可能需要更短的、更具体的切块;但如果是摘要,可能需要更长的切块。此外,如果一个切块太短,可能不包含足够的上下文。另一方面,如果切块太长,可能包含太多不相关的信息。
另外,还需要考虑在切块之间引入一些额外上下文的'滚动窗口'(overlap),来提高信息连贯性。通常建议重叠部分占 chunk_size 的 10%-20%。
# 示例:LangChain 中的递归字符分块配置
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=,
chunk_overlap=,
length_function=,
)
chunks = text_splitter.split_text(text)


