事情本身不复杂,线索都在日志里。知识库两千多份文档,一次检索回来 800 条候选,人工看六成和问题无关,模型照样输出「根据资料,置信度较高」,前端把这个分数直接展示成了准确率。
第一反应是「模型对自己引用的内容没有校验环节」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。召回阶段只看向量相似度,没有相关性下限。另一种情况是top_k 设得过大,噪声挤进上下文。
另外,前端把相似度分数当成答案可信度展示。
动手时先统计命中条数与人工判定的相关比例
python eval_recall.py --db rag --n 200 --report
然后加相似度阈值并统计被过滤掉的比例
python -c "import json;rs=[json.loads(l) for l in open('hits.jsonl')];print(sum(1 for r in rs if r['score']<0.55)/len(rs))"
再往下用重排模型对前 50 条重新打分
python rerank.py --input hits.jsonl --topk 8 --model bge-reranker-v2-m3
末了把 top_k 压到 8 并只保留重排高分
python retrieve.py --topk 8 --min-score 0.5
改完先别撤,确认这几项。候选条数降到 10 条以内,人工判定相关比例超过八成,答案里的引用编号都能对应到原文段落。
补一句。相似度高只说明表述接近,不代表内容能回答,展示给用户的置信度应当来自重排分而不是检索分。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
