回答里写着“根据第三段”,可实际给模型的上下文只有两段,用户点开引用发现内容不符。
一开始怀疑是「多个片段被合并后编号错位」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。上下文没有编号,模型自行编造序号。另一种情况是提示词要求引用但没规定格式。
还有一种情况,模型在长上下文里记错了片段顺序。
给每个片段加显式编号再送模型
ctx = '\n'.join(f'[{i+1}] {d}' for i, d in enumerate(docs))
提示词里规定只允许引用给定编号
prompt = '只使用 [1] 到 [%d] 的编号,不得编造' % len(docs)
解析回答后校验编号范围
python -c "import re;print(set(re.findall(r'\\[(\\d+)\\]', ans)))"
剩下的就是对越界引用做兜底替换
python -c "print('replace invalid cites')")
恢复的判定其实很直接。回答中的引用编号都落在给定范围内,点开能看到对应原文,内容与表述一致。
这里还有个坑。编号校验只能保证范围合法,不能保证语义正确,关键场景还要用规则或人工核对引用与结论是否匹配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。