Claude 输出格式控制:Markdown、JSON、XML 与纯文本
按阅读或机器解析目的选择格式,使用受支持的 schema,并检查拒绝、截断与语义错误。
先确定下游怎么使用
读者阅读的报告可选 Markdown,系统交换的数据优先选明确的 JSON schema;已有 XML 系统就沿用其规范,短信或纯文本字段则限制长度和换行。格式要求应描述允许的结构,而不只是说“规范一点”。渲染器和解析器是应用职责,模型生成内容不是可信 HTML。
Markdown 和纯文本:写清展示契约
Markdown 提示示例:“写变更说明,固定为新增、修复、已知限制三节;每条写影响和迁移步骤;没有变化的节写无,不生成 HTML。”前端应使用安全渲染策略,限制链接与图片来源。
纯文本示例:“生成订单通知,三行分别为订单号、当前状态、下一步;不加标题、列表符号或表情;缺失字段写待确认。”提交前检查真实字符数与换行,不用删除所有标点的方法清洗,否则会损坏日期、负数和网址。
JSON:结构化输出优于事后猜测
在支持的模型上,官方结构化输出通过 output_config.format 声明 JSON schema。下面的提取请求只含演示文本,调用函数才会发请求;代码已语法检查,未连接 API。即使 schema 合法,提取内容也可能错,需要业务校验。
import json
def extract_issue(client, model, text):
schema = {"type":"object", "properties":{
"topic":{"type":"string"},
"needs_review":{"type":"boolean"}},
"required":["topic","needs_review"], "additionalProperties":False}
msg = client.messages.create(
model=model, max_tokens=300,
messages=[{"role":"user", "content":"提取问题主题;信息不明确则需要复核:"+text}],
output_config={"format":{"type":"json_schema","schema":schema}})
if msg.stop_reason != "end_turn":
raise ValueError("response_not_complete")
raw = "".join(b.text for b in msg.content if b.type == "text")
value = json.loads(raw)
if not isinstance(value, dict) or set(value) != {"topic","needs_review"} or not isinstance(value["topic"],str) or type(value["needs_review"]) is not bool:
raise ValueError("invalid_result")
return valueXML:标签帮助组织,但不是安全边界
若下游要求 XML,指定根元素、允许子元素、属性和缺失值表示,例如根 report,包含 summary 与 items/item。正文中的 &、< 等字符必须按 XML 规则处理,不能简单用正则截取第一个尖括号片段。使用安全 XML 解析器并禁用外部实体及外部资源读取,拒绝超大或过深结构。
用 XML 标签区分提示词中的资料和指令,有助于表达层次,但不会自动防止提示注入。标签内的网页、邮件或用户文本仍是不可信资料,不能授权访问新数据或执行动作。
失败处理与混合格式
先读 stop_reason:拒绝或截断时,结构化结果可能不符合 schema。不要把缺失字段默认为成功,也不要把单引号全局替换成双引号来“修好”JSON,这会损坏正文。保存脱敏失败原因,按预算重新生成完整小对象或转人工。
报告同时需要数据时,优先分成稳定数据对象和独立展示层,不从长篇 Markdown 里贪婪抓取第一个大括号。例:先产出经过校验的版本变更数组,再由代码渲染三节报告;验收包括类型、必填字段、数量、来源与事实,而不只是能否解析。
参考来源
资料核对日期:2026-10-04。涉及产品与账户条件时,请以当前官方说明为准。