这个坑值得记一笔。RAG 用 gpt-4o-mini 做 query rewrite,用户问不含酒精的饮料有哪些,改写结果变成饮料推荐,bge-m3 按改写后的句子召回的全是含酒精产品,答案与问题完全相反。
刚开始盯着「同义改写时把约束条件一起丢了」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。改写提示词要求把问题简化成关键词;否定词被当成停用词过滤掉;检索只用了改写后的 query,没保留原句。
先把改写前后的 query 成对打日志
python -c "print('orig -> rewritten')"
再往下在提示词里明确要求保留否定和时间约束
python rewrite_query.py --keep-negation true
原句和改写句各自召回后再合并
python hybrid_recall.py --queries orig.txt,rewritten.txt --topk 20
剩下的就是抽查 50 条带否定的样本看召回是否正确
python eval_recall.py --filter negation --sample 50
怎么算真的好了,看的是同一批现象。带否定的样本召回结果里不再出现被排除的对象,答案与问题方向一致,改写日志能追到原因。
提醒一点。query 改写对短问句收益明显,对带约束的问句反而有害,涉及否定、范围、时间的查询最好双路召回,再在排序阶段合并。这类问题最好一次改到位,反复小改反而容易把原因搅混。
