
把字段名缩成一个字母,输出确实可能更短,但调用方更容易接错字段,故障排查也更难。结构化输出的目标应是减少无用内容,同时保住可解析、可验证和可解释的契约。没有固定模型、分词器和样本,就不应该先宣布节省60%。
三层检查各有作用
JSON语法只说明解析器能读懂;Schema检查必填字段、类型和约束;业务检查决定证据是否存在、动作是否被允许。语法正确的“批准付款”仍可能是越权动作。任何一层都不能包办后两层。

图中字段样例和类型清单是示意,不能当成可执行的完整Schema。JSON Schema的properties本身不强制字段出现,必填项需要required;默认也允许额外属性,需要按契约决定additionalProperties。官方对象文档
缩短前先删除真正的冗余
把重复的风格说明、与本任务无关的可选字段、每次都相同的固定展示文案移到应用层,通常比把evidence_ids改成e更容易维护。嵌套结构是否合并,要看消费者是否需要那些边界;不能为了长度破坏对象关系。
下面用标准库写一个特定契约的检查器,不冒充通用JSON Schema实现。它拒绝额外字段、类型错误和未登记证据。只允许摘要,不开放审批动作。
import json
known_evidence = {"doc-a"}
def validate(raw):
x = json.loads(raw)
if type(x) is not dict or set(x) != {"summary", "evidence_ids"}:
raise ValueError("wrong fields")
if type(x["summary"]) is not str or not x["summary"].strip():
raise ValueError("missing summary")
ids = x["evidence_ids"]
if type(ids) is not list or not ids or any(type(v) is not str for v in ids):
raise ValueError("invalid evidence list")
if not set(ids) <= known_evidence:
raise ValueError("unknown evidence")
return x
assert validate('{"summary":"sample","evidence_ids":["doc-a"]}')["summary"] == "sample"
for bad in ['{}', '{"summary":"x","evidence_ids":["absent"]}',
'{"summary":"x","evidence_ids":["doc-a"],"approve":true}']:
try:
validate(bad)
except ValueError:
pass
else:
raise AssertionError("invalid contract accepted")
print("three contract failure paths rejected")
代码中的布尔值不应被误当作整型,因此需要数字字段时要特别检查Python的bool/int关系。本例只有字符串与字符串列表,仍要对每个列表元素验证。服务端结构化输出功能支持哪些Schema子集,应按实际供应商文档核对;本例没有调用它。
一个可比较的Token实验怎么设计
| 固定项 | 记录项 |
|---|---|
| 相同输入样本与模型快照 | 输入/输出Token与总费用 |
| 相同业务字段和判定规则 | 解析、Schema、业务错误各自数量 |
| 相同重试策略 | 第一次成功率与含重试成本 |
| 相同输出含义 | 丢字段、截断、错误引用样本 |
JSON字节数不是Token数,Token数也不是完整成本;缓存、推理和重试价格可能不同。模型快照停用后还要重做契约回归,不能默认换型号后字段可靠性保持不变。供应商停用清单
先用有名称的字段把业务边界讲清楚,再测哪些说明可以去掉。节省的数字应该来自实验结果,不能来自标题里预先写好的目标。
本文探讨LLM结构化输出中Token优化的核心原则:优先保障JSON Schema合规性与业务校验能力,而非盲目缩字段名;强调语法、Schema、业务三层检查缺一不可;指出冗余应从固定文案、重复说明和无关字段中清除,而非破坏语义可读性;并提出科学设计Token对比实验的方法,包括契约回归、供应商Schema子集验证及避免bool/int类型误判等关键实践。

430

被折叠的 条评论
为什么被折叠?



