如何构造“Thought→Action→Observation”循环的JSON Schema?
解读
在国内大模型 Agent 面试中,这道题表面问“写 JSON”,实则考察三点:
- 是否真正理解 ReAct 推理范式 的时序与闭环;
- 能否把 国产大模型特有的工具调用协议(如阿里云百炼、百度千帆、清华 ChatGLM3-Tool)无缝嵌入 Schema;
- 是否具备 工程级防御性设计——字段不可多、不可少、不可歧义,且能抗 Prompt 注入与字段溢出。
面试官通常会追问:“如果 Observation 超过 8k token 怎么办?”“Action 失败如何回滚?”因此 Schema 必须一次到位,同时给后续 重试、缓存、审计 留好扩展槽。
知识点
-
ReAct 三元组语义
Thought:模型内部推理,禁止携带外部状态;
Action:可执行单元,必须包含 tool_name、parameters、id 三个子字段,且 parameters 需与国产工具平台 OpenAPI 3.0 描述对齐;
Observation:外部系统返回,强制为字符串,若返回二进制需 base64 编码并声明 _encoding=base64。 -
国产合规字段
所有对外字段必须 小写+下划线,符合《GB/T 35273-2020 个人信息安全规范》命名习惯;
若 Thought 里出现个人隐私,需加 "sensitive": true 并在审计侧脱敏。 -
循环控制元数据
必须预留 "loop_id"(UUID4)与 "parent_loop_id" 形成 DAG,方便后续做 有向无环图回放;
"max_loop" 默认 5,超限抛 LoopOverflowError,与国内监管“单次会话不超过 5 轮自动决策”要求一致。 -
Schema 版本号
采用 "schema_version": "1.0.0-cn",便于灰度升级;
拒绝使用 draft-04,统一 JSON Schema 2020-12,因国内云厂商 validator 内核已同步该版本。
答案
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/agent/react-cn-1.0.0.json",
"title": "国产ReAct循环单元",
"description": "符合国内合规要求的Thought→Action→Observation单轮描述",
"type": "object",
"required": ["loop_id", "thought", "action", "observation"],
"additionalProperties": false,
"properties": {
"schema_version": {
"type": "string",
"const": "1.0.0-cn"
},
"loop_id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"parent_loop_id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"thought": {
"type": "object",
"required": ["content", "sensitive"],
"additionalProperties": false,
"properties": {
"content": {
"type": "string",
"maxLength": 2048,
"description": "模型自我推理,禁止出现用户隐私明文"
},
"sensitive": {
"type": "boolean",
"description": "true时需审计脱敏"
}
}
},
"action": {
"type": "object",
"required": ["tool_name", "parameters", "id"],
"additionalProperties": false,
"properties": {
"tool_name": {
"type": "string",
"pattern": "^[a-z0-9_]+$"
},
"parameters": {
"type": "object",
"description": "与国产工具平台OpenAPI描述完全一致"
},
"id": {
"type": "string",
"pattern": "^[a-z0-9_]{1,64}$"
}
}
},
"observation": {
"type": "string",
"maxLength": 8192,
"description": "外部系统返回,二进制需base64并标注_encoding=base64"
},
"max_loop": {
"type": "integer",
"minimum": 1,
"maximum": 5,
"default": 5,
"description": "与国内监管要求一致,超限抛LoopOverflowError"
}
}
}
使用示例(单轮):
{
"schema_version": "1.0.0-cn",
"loop_id": "a1234567-1234-5678-9abc-123456789abc",
"parent_loop_id": "00000000-0000-0000-0000-000000000000",
"thought": {
"content": "用户想查询北京今日限行尾号,需调用traffic_limit工具",
"sensitive": false
},
"action": {
"tool_name": "traffic_limit",
"parameters": {"city": "beijing", "date": "2024-07-30"},
"id": "traffic_limit_0"
},
"observation": "{\"尾号\": \"3和8\", \"更新时间\": \"2024-07-30 06:00\"}",
"max_loop": 5
}
该片段可直接写入 MongoDB 4.4+ 集合,并创建 复合索引 {loop_id: 1, parent_loop_id: 1},实现毫秒级 DAG 回放。
拓展思考
- 流式压缩:当 Observation > 8k token 时,可启用 "compression": "gzip+base64",并在 Schema 增加 enum 字段,确保下游解析无歧义。
- 失败回滚:在 Action 同级增加 "rollback_action" 可选对象,一旦工具返回 "code": 500 自动触发补偿事务,满足金融场景 T+0 冲正 要求。
- 多模态扩展:若 Action 调用文生图模型,可在 Observation 里增加 "media_type": "image/png" 与 "url_expire": 3600,兼顾 CDN 预签名 时效与合规审计。
- 国产可信执行:Schema 校验应放入 华为鲲鹏 TEE 或 阿里云 enclave,防止恶意篡改 loop_id 造成 会话重放攻击;同时把 敏感字段 做 SM4 加密后再落盘,符合 国密 要求。