大多数 RAG 教程都止步于 Demo。你按 Token 数量进行分块,把所有内容塞进向量数据库,然后就完事了。如果用户只是在整洁的 FAQ 中询问“退货政策是什么?”,这种方法确实可行。但当有人粘贴了半份合同并询问第三条款,或者开发者在文档搜索中输入一个晦涩的错误代码时,这种方法就会失效。
固定的 Token 窗口会将法律协议从中途切断。过大的分块会将 API 参考信息埋没在大量的噪声段落中。最糟糕的是,缓慢的检索会导致用户在模型开始生成之前就放弃了查询。我们曾通过惨痛的教训学到了这一点。当我们把检索层从“凭感觉”转向“凭测量”时,我们将延迟降低了 40%,并将召回率提升到了 95%。以下是具体的改进方案。
智能分块 (Smart Chunking)
不要再把分块大小视为一个“魔法数字”了。对于单个条款跨越多个段落的法律文件,512 Token 的窗口毫无意义;对于 API 文档,如果函数签名及其两行描述不能保持在一起,它同样毫无用处。我们转向了结构感知切分 (structure-aware splitting)。
对于法律文本,递归分块 (recursive chunking) 能够尊重文档层级,使条款保持完整。对于 API 文档,我们使用函数感知切分 (function-aware splitting),将签名、参数和示例作为原子单元保留在一起。支持工单和对话数据则需要语义边界,即在话题转换处进行切分,而不是在任意字符计数处切分。结果是,每个分块都携带了足够的上下文以发挥作用,又不至于因为信息过多而稀释信号。你的嵌入模型注意力预算有限,请明智地使用它。
混合检索 (Hybrid Retrieval)
向量搜索擅长寻找概念相似的内容。如果你询问关于数据库查询缓慢的问题,它会呈现性能调优指南。但如果你搜索“Error 0x80070057”,语义搜索就会漂移到无关领域,因为稠密嵌入 (dense embeddings) 处理精确匹配的能力较弱。另一方面,BM25 能够精准匹配字符串和稀有术语,但它并不知道“latency”和“slow response time”意思相同。
我们并行运行这两种方法,并使用倒数排名融合 (Reciprocal Rank Fusion, RRF) 进行合并。RRF 简单且有效。它获取每种方法的排名列表,并根据文档的位置进行评分,从而让来自任何系统的强候选者都有公平的机会。融合后,我们对合并结果运行 Cross-encoder 重排序器 (reranker),并仅返回前五个结果。重排序器增加了约 50 毫秒的延迟,但将我们的召回率提高了 15%。这种权衡在生成质量方面带来了数倍的回报。
查询扩展 (Query Expansion)
用户并不擅长提问。他们会使用缩写、拼错单词,或者将三个问题塞进一段冗长的胡言乱语中。如果你完全按照他们输入的文字进行搜索,你就会错过他们真正需要的文档。
我们现在会在查询进入索引之前对其进行转换。首先,我们会针对原始问题生成多个改写版本,以覆盖同义词和不同的表达方式。其次,我们将复杂的问题分解为更小的子问题。例如,“为什么国际客户的退款会失败,我该如何修复?”这样的查询会被分解为两次独立的搜索:一次关于国际退款失败,另一次关于修复步骤。仅查询扩展一项,就将我们的召回率从 78% 提升到了 94%。教训很简单:不要相信用户的初稿,要帮助他们。
停止猜测,开始搜索
分块大小、重叠百分比、top-k 截断和重排序器深度之间的相互作用极其复杂,无法通过手动调优。我们曾浪费了太多精力在争论 256 Token 是否比 512 Token 更好,却忽略了实际上正在破坏连贯性的重叠设置 (overlap setting)。
我们用贝叶斯优化 (Bayesian optimization) 取代了直觉。网格搜索 (grid search) 会在显而易见的错误区域浪费计算资源,而贝叶斯方法会构建一个关于有效方案的概率模型,并主动寻找能够最大化召回率同时最小化延迟的帕累托前沿 (Pareto frontier)。对于我们的技术栈,这意味着找到分块大小、重叠度和 top-k 的特定组合,在不超出延迟预算的情况下实现 95% 的召回率。不同的用例会落在该前沿的不同点上。面向客户的聊天机器人优先考虑速度,而内部法律研究则优先考虑召回率。自动化优化让我们无需手动复制粘贴配置文件,就能同时满足这两者的需求。
结果
数据说明了一切。我们的 Recall@10 从 78% 提升到了 95%。p95 延迟从 850 毫秒降至 320 毫秒。由于模型终于接收到的是相关上下文而非噪声,幻觉率从 12% 降至 3%。更优的检索不仅能让回答更快,还能让回答更准确。
下一步该做什么
如果你正在重建检索层,请从这里开始:
- 按文档结构进行分块,而非按 Token 数量。 让你的切分策略与数据的形态相匹配。
- 使用混合检索。 结合向量搜索与 BM25,使用倒数排名融合 (Reciprocal Rank Fusion) 进行合并,并在生成前进行重排序 (rerank)。
- 扩展查询以获得更好的覆盖率。 在执行搜索之前,先进行改写和分解。
- 构建用于测试的金标数据集 (golden dataset)。 无法衡量,就无法优化。
- 使用自动化工具优化参数。 贝叶斯搜索 (Bayesian search) 找到的设置会比你的直觉更精准。
检索不是一个设置一次就可以置之不理的配置文件。它是一种基础设施,而基础设施应当像生产级代码一样严谨:需要测试、测量和持续优化。像对待代码那样对待它,你的 RAG 系统才会从一个 Demo 变成一个真正的产品。
可选学习社区:GyaanSetu AI
