报错是这么冒出来的。把产品手册同时写进 system 和检索上下文,模型输出里出现「根据上文所述的上文第 3 节」,还把自己前一段的结论当成证据再引一遍,答非所问的比例明显升高。
中间走过弯路,把「上下文没有去重 相似段落重复占位」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。同一文档两处出现 被模型当成两次独立证据。也可能是检索侧送进来的是摘要 与原文版本不一致。
不容易想到的是,提示词要求引用来源 模型只能引用自己。
先看两处文本的开头是不是同一份
python -c "print(open('sys.txt').read()[:80]);print(open('ctx.txt').read()[:80])"
随后按 simhash 对上下文段落去重
python dedup.py --by simhash --input ctx.txt --out ctx_u.txt
system 里只保留角色和格式要求 事实交给检索
python cut_sys.py --keep role,format
末了重跑二十条带引用的问题看编号
python ask.py --cases cite.jsonl --show-refs
恢复的判定其实很直接。回答里不再出现自引用,引用编号全部指向检索片段,抽检二十条无重复引用。
事实和指令分开放,同一段文字在两个位置出现时模型更倾向于相信自己上一轮的输出。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
