Claude API 预填充(prefill)不能用了怎么办:替代写法改造提示词(结构化输出、直接指令、XML 标签、续写)
老代码里用「预填充 assistant 消息」来强制 JSON 开头、跳过开场白或续写被截断的回答,升级到 Claude 4.6 及之后的模型后请求报 400 时用:把调用代码贴给 Claude,让它判断每处预填充属于哪种用途,并按官方给的替代方案逐处改写。
Claude 对话模型通用
我的代码在调用 Claude API 时使用了预填充(在 messages 最后放一条 assistant 消息,让模型接着写)。升级模型后需要去掉这种用法。请帮我逐处改造。 <code> [粘贴调用代码] </code> 目标模型:[目标模型] 使用的 SDK 与语言:[SDK 与语言] 下游怎么用返回结果:[下游如何使用结果] 请按下面的对照关系处理每一处预填充: <migration_map> A. 用来强制输出格式(如以左花括号开头逼出 JSON、限定分类标签) → 优先改用结构化输出(给定 schema);分类任务可改用带枚举字段的工具或结构化输出;也可以先直接要求按指定结构输出,并在代码里加校验和重试。 B. 用来去掉开场白(如预填「以下是摘要:」) → 在 system 提示词里直接说明:直接给出结果,不要以「以下是」「根据」之类的话开头;或要求把结果放进指定的 XML 标签,由代码截取;偶尔漏网的开场白在后处理里去掉。 C. 用来接着写被截断的内容或续写 → 把续写要求放进 user 消息,并附上被截断回答的结尾原文,说明「上一次回答在这里中断,请从这里继续」;如果只是错误重试、对体验无影响,直接重新请求。 D. 用来在长对话里反复提醒角色或注入上下文 → 把提醒内容放进 user 消息,或通过工具、上下文整理机制提供。 E. 用来规避不必要的拒答 → 去掉预填充,在 user 消息里把任务背景和合理用途写清楚即可。 </migration_map> 输出: 一、清单:代码位置 | 原预填充内容 | 属于 A–E 哪一类 | 采用的替代方案 | 改动风险。 二、改造后的完整代码(保持原有业务逻辑,只改与预填充相关的部分),以及需要同步修改的 system 提示词。 三、下游解析代码需要相应调整的地方(例如原来靠拼接预填充的左花括号才能解析)。 四、建议的回归测试:用哪些输入验证改造前后输出一致。 不确定某处预填充的意图时,先问我,不要猜。
高亮处换成你自己的内容:[粘贴调用代码]、[目标模型]、[SDK 与语言]、[下游如何使用结果]
Claude Pro 充值
已被复制 0 次
使用说明
背景事实(据 Anthropic 官方提示词最佳实践页面,资料核对于 2026-10-10):从 Claude 4.6 系列模型开始,不再支持在最后一条 assistant 消息上做预填充,带这种预填充的请求会返回 400 错误;更早的模型仍然支持,对话中间位置的 assistant 消息不受影响。官方的解释是模型的指令遵循能力已经提高,多数预填充场景不再需要它,并给出了按用途分类的替代办法——提示词里 <migration_map> 的五类就是据此整理的。
怎么填变量:[下游如何使用结果] 很关键。很多老代码会把预填充的 { 和模型输出拼起来再解析,去掉预填充后这段拼接也得删,否则会多出一个括号。[目标模型] 写你要升级到的型号名,结构化输出等功能的可用范围以官方文档对该型号的说明为准。
常见问题与调整:
- 改成直接指令后偶尔还有一句开场白 → 这是官方也提到的情况,稳妥的做法是让结果进 XML 标签或用结构化输出,再加一层后处理。
- 分类任务输出了标签以外的词 → 改用带枚举的工具定义或结构化输出,比提示词约束可靠。
- 只是想快速确认问题 → 先搜索代码里 messages 数组末尾
role为assistant的地方,这些就是需要改的位置。
示例输出
示例,仅供参考(Python,原代码用预填充左花括号强制 JSON)
| 代码位置 | 原预填充 | 类别 | 替代方案 | 风险 |
|---|---|---|---|---|
| extract.py 第 41 行 | {"role": "assistant", "content": "{"} | A | 改用结构化输出并提供 schema;删除末尾 assistant 消息 | 低;需同步改解析 |
下游调整:第 47 行 json.loads("{" + resp_text) 改为直接解析返回内容,不再手动补左花括号。
回归测试:取 30 条历史输入,比较改造前后各字段的取值是否一致,重点看缺失字段的表示方式有没有变化。
同款作品
用这条提示词做出来的作品;原作者会因此获得积分
还没有同款,来做第一个。



0 条评论
还没有评论,来抢沙发~