提示词里写的是引用用方括号数字标注,代码把检索结果按索引 0 到 4 传给模型,输出里出现编号 0,前端正则只认从 1 开始,整段引用都渲染不出来。

原因不止一个,得分开看。提示词示例从 1 起,拼上下文时从 0 起,两边没对齐;模型看到 0 之后自行补了上下文里不存在的编号;前端正则只匹配一位数,两位编号被截成前一位;引用编号与文档主键混用,回答里标的是数据库 id。

拼上下文时显式从 1 编号并写进提示

python -c "docs=['a','b'];print(chr(10).join(f'[{i+1}] {d}' for i,d in enumerate(docs)))"

只允许引用给定编号并给出反例

python -c "print('只能引用 [1] 到 [2],不要输出 [0]')"

解析时用宽松正则兼容两位编号

python -c "import re;print(re.findall(r'\[(\d+)\]','结论见 [1] 与 [10]'))"

校验回答里的编号都能在上下文找到

python -c "import re;ctx=[1,2,3];print([i for i in re.findall(r'\[(\d+)\]','见 [2] 与 [9]') if int(i) not in ctx])"

别只看报错消失,验证要多做一步。回答里不再出现编号 0,所有编号都能在上下文找到对应文档,前端渲染的角标数量与解析结果一致。

编号最好由代码生成而不是让模型数,模型对序号的稳定性远不如对文本的稳定性。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189