问题出现得很突然,日志倒是留得挺全。检索参数全靠感觉,top_k 从 3 调到 20,回答质量时好时坏,上下文还经常超出预算。
刚开始盯着「固定的 k 不适应问题难度差异」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。top_k 过大引入大量噪声片段。另一种情况是阈值按其他模型的经验值照搬。
少数情况下是去重前统计条数,实际有效片段很少。
先统计不同 k 下的命中率与噪声比例
python eval_k.py --k 3,5,10,20 --cases 100
然后按相似度分布设定阈值
python -c "import numpy as np;print(np.percentile(scores,[50,70,90]))"
再往下按问题类型动态调整 k
k = 10 if is_multi_hop(q) else 4
末了对结果按文档去重后再截断
docs = dedup(hits)[:k]
改完先别撤,确认这几项。在测试集上准确率提升,平均上下文长度下降,超出预算的请求明显减少。
提醒一点。阈值和具体嵌入模型强相关,换个模型整套数值都要重标,别把某一组参数当成通用结论抄来抄去。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。