检索阶段有两个相互拉扯的目标:召回尽量不要漏掉正确片段,精度尽量不要混入无关内容。一次取回很多片段可能提高召回,却会增加成本并干扰模型;只取一两个片段又可能缺少完整依据。

先召回候选,再重排

第一阶段使用向量、关键词或混合检索快速找到一批候选。第二阶段使用 rerank 模型或更精细的相关性评分,重新判断问题与每个片段的匹配程度,再选择最有用的少量内容进入上下文。

Top K 和相关性阈值应由测试集决定。固定取五条并不是通用答案;简单事实可能一条就够,跨文档比较可能需要多条。阈值过高会导致无结果,过低会把边缘相关内容带入生成。

查询改写解决表达差异

用户问题可能省略上下文、包含代词或一次询问多个主题。可以先把多轮对话改写成独立问题,再进行检索。例如把“那华东地区呢”结合上一轮改写为“华东地区的差旅住宿标准是什么”。

复杂问题可以拆成多个子问题分别检索,再合并证据。也可以生成关键词和语义查询并行检索。但改写模型可能改变原意,因此应保留原问题,并在评估中检查改写是否遗漏限定条件。

使用元数据过滤

在向量相似度之前,先按权限、产品、地区、语言或生效时间过滤候选,可以显著减少噪声。过滤条件应来自已验证的用户身份和业务上下文,不能完全依赖模型从一句话中猜测。

处理没有答案的情况

检索系统必须允许返回“没有足够依据”。不要为了每次都有回答而降低阈值。可以根据最高相关性、结果数量和关键字段判断是否进入生成;证据不足时询问澄清问题或转人工。

分开评估召回与排序

对每个测试问题标记至少一个正确片段,统计它是否出现在候选集合中,以及最终是否排进发送给模型的前几条。前者发现召回问题,后者发现排序问题。

检索优化的目的不是让相似度分数更漂亮,而是让有限上下文中出现完成当前回答所需的全部证据,并尽量减少会误导模型的内容。