回答里写着“根据第三段”,可实际给模型的上下文只有两段,用户点开引用发现内容不符。

一开始怀疑是「多个片段被合并后编号错位」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。上下文没有编号,模型自行编造序号。另一种情况是提示词要求引用但没规定格式。

还有一种情况,模型在长上下文里记错了片段顺序。

给每个片段加显式编号再送模型

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')")

恢复的判定其实很直接。回答中的引用编号都落在给定范围内,点开能看到对应原文,内容与表述一致。

这里还有个坑。编号校验只能保证范围合法,不能保证语义正确,关键场景还要用规则或人工核对引用与结论是否匹配。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189