Claude 输出不完整怎么办:区分截断、遗漏与传输中断
按结束状态和内容验收定位输出缺失,采用明确补写、按章节生成和结构校验,避免盲目续写。
先判断缺的是什么
“只有半句话”和“句子完整但少了第三部分”不是同一种故障。API 先检查 stop_reason、流是否正常结束以及实际收到的内容块;网页聊天看工具/网络提示和具体缺失内容,不要凭外观断定一定碰到 token 上限。拒绝回答、工具等待、停止词命中和网络断线也会表现为短输出。
硬性上限:提高前先缩小任务
max_tokens 截断时,核对模型上限与上下文余量,再选择适度提高输出预算或拆分任务。若上下文已接近边界,继续堆历史只会加重问题。长代码按文件或函数组织,长报告按已确认目录生成;每段保存完成状态和依赖,不把多段直接拼成最终成品。
例:要生成十条 FAQ,每条含问题、回答和来源。先让模型输出十个问题 ID,再每次处理几个 ID;程序检查 ID 是否齐全、是否重复、来源是否存在。这样即使一段失败,也能仅重做缺失部分。
自然结束但遗漏:把验收条件说清楚
end_turn 只表示模型结束本轮,不能保证完成清单。提示可以写:“输出 q01 至 q10,每条包含 question、answer、source;缺少依据写未找到,不用‘其余同理’代替。”如果结果少了 q07,下一轮只要求 q07 的完整对象,不重新生成已确认的九条。
下面的本地验收器可检测缺项、未知项和重复 ID。它不检查事实质量,所以来源与语义仍需另行核验;相比数括号、数行数,这种任务级条件更直接。
from collections import Counter
def inspect_items(items, expected_ids):
ids = [row.get("id") for row in items if isinstance(row, dict)]
counts = Counter(ids)
return {
"missing":sorted(set(expected_ids) - set(ids)),
"unexpected":sorted(str(x) for x in set(ids) - set(expected_ids)),
"duplicates":sorted(str(x) for x,n in counts.items() if n > 1),
"invalid_rows":sum(not isinstance(row, dict) or
not {"id","question","answer","source"}.issubset(row)
for row in items)
}
sample = [{"id":"q01","question":"问","answer":"答","source":"doc-1"}]
assert inspect_items(sample, ["q01","q02"])["missing"] == ["q02"]不要用字符串拼接修复所有内容
JSON 在半个字符串或转义序列处中断时,盲拼两次输出容易得到合法但错误的对象。先保存原始片段为未完成,再按小对象重生成并用解析器/schema验证。代码则使用语言解析器、类型检查和测试;括号配对只是一条弱线索,不能证明代码可运行。
续写普通文章时保留已完成段落和明确锚点,设总次数与费用上限。模型若重复、换了结论或仍无进展,停止自动循环并报告缺失。不要要求披露隐藏推理来判断“是否真的写完”。
流中断和网页端的实际处理
API 的 HTTP 200 不代表流已完整;客户端要等待 done 或最终消息。中途断线保存未确认标记,再按任务 ID 和完成状态决定重试。涉及工具副作用时先查执行结果,不能重新跑整个流程。
网页端可明确说“请补齐目录中的第3节,只写该节,并列出仍缺的资料”。若材料本身不足,应补材料而不是反复要求更长。验收结果看所需内容和可验证事实,不看是否达到某个字数;本文示例只进行离线检查,没有保证所有缺失都能自动恢复。
参考来源
资料核对日期:2026-10-04。涉及产品与账户条件时,请以当前官方说明为准。