结构化输出
JSON Schema、解析与校验。
30 分钟
结构化输出
Agent 不能只返回散文: 规划步骤、工具参数、最终答案 往往需要 JSON 等可解析格式。结构化输出把 LLM 从「聊天」变成 可对接程序的接口——前提是你要 校验、重试、降级。
学习目标
- 会用 JSON Schema 描述 Agent 中间产物与终态
- 掌握解析失败时的重试与 fallback 策略
- 理解结构化输出与 function calling 的分工
为什么需要 Schema
| 无结构 | 有结构 |
|---|---|
| 「我去查一下…」 | {"action":"search","query":"RAG 分块"} |
| 参数漏字段 | schema 必填项触发校验错误 |
| 下游难自动化 | 直接 ObjectMapper / json.loads |
常见 Agent 产物:
- Plan:
steps[]与tools[] - Tool args:与 OpenAPI / 自建 registry 一致
- Answer:
text+citations[]
JSON Schema 要点
{
"type": "object",
"required": ["answer", "citations"],
"properties": {
"answer": { "type": "string" },
"citations": {
"type": "array",
"items": { "type": "object", "required": ["source", "chunk_id"] }
}
},
"additionalProperties": false
}
additionalProperties: false 可减少模型「多加字段」;服务端仍要做 二次校验,不能盲信。
解析与校验流程
LLM 输出 → JSON 解析 → Schema 校验 → 失败则带错误信息重试(≤N 次)
↓ 仍失败
降级:纯文本 + 人工审核队列
- 记录 原始输出 便于调试(勿含用户 PII 进生产日志)
- temperature 偏低可提高格式稳定度
- 与 agt-tools 配合:function calling 由 API 约束参数;structured output 约束 非工具 的终态 JSON
与 Java 后端
Spring 服务可定义 DTO + @Valid,Agent 网关把 LLM JSON 反序列化后再业务校验——思路同 REST API,别把 LLM 当可信输入源。
练习
- 为「带引用的问答」设计 Answer JSON Schema(含 citations)
- 故意给模型缺字段样例,写一条「校验失败重试」的 user 消息模板
- 说明 structured output 与 function calling 各适合哪一步