Claude 3.5 Sonnet,用 doc 标签包了 20 篇参考材料,其中一篇少了闭合标签,输出停在 analysis 后面半句,max_tokens 还有余量。

一开始怀疑是「提示词没有要求先闭合结构再回答」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。标签嵌套错误,模型把后文当成标签内容。少数情况下是材料正文自带尖括号,提前终止了标签。

不容易想到的是,输出被 stop_sequences 里的标记截断。

第一件事是统计标签开闭数量

python -c "s=open('prompt.txt',encoding='utf-8').read();print(s.count('<doc>'),s.count('</doc>'))"

随后把正文尖括号统一转义

python -c "s=open('prompt.txt',encoding='utf-8').read();open('p2.txt','w',encoding='utf-8').write(s.replace('<','&lt;').replace('>','&gt;'))"

去掉 stop_sequences 再请求

python ask.py --model claude-3-5-sonnet --no-stop

等前面都确认过,再对比两次输出结尾

python -c "print(open('out2.txt',encoding='utf-8').read()[-80:])"

这台环境是别人交接的,不少默认值被动过,只能一项项核。

恢复的判定其实很直接。输出能完整闭合 analysis 段并给出结论,20 篇材料都被引用到,长度不再卡在同一位置。

提醒一点。XML 标签是软约束,材料里的尖括号会破坏结构,进模板前统一转义比事后修补有效。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189