如何构造“Thought→Action→Observation”循环的JSON Schema?

解读

在国内大模型 Agent 面试中,这道题表面问“写 JSON”,实则考察三点:

  1. 是否真正理解 ReAct 推理范式 的时序与闭环;
  2. 能否把 国产大模型特有的工具调用协议(如阿里云百炼、百度千帆、清华 ChatGLM3-Tool)无缝嵌入 Schema;
  3. 是否具备 工程级防御性设计——字段不可多、不可少、不可歧义,且能抗 Prompt 注入与字段溢出。
    面试官通常会追问:“如果 Observation 超过 8k token 怎么办?”“Action 失败如何回滚?”因此 Schema 必须一次到位,同时给后续 重试、缓存、审计 留好扩展槽。

知识点

  1. ReAct 三元组语义
    Thought:模型内部推理,禁止携带外部状态;
    Action:可执行单元,必须包含 tool_name、parameters、id 三个子字段,且 parameters 需与国产工具平台 OpenAPI 3.0 描述对齐;
    Observation:外部系统返回,强制为字符串,若返回二进制需 base64 编码并声明 _encoding=base64。

  2. 国产合规字段
    所有对外字段必须 小写+下划线,符合《GB/T 35273-2020 个人信息安全规范》命名习惯;
    若 Thought 里出现个人隐私,需加 "sensitive": true 并在审计侧脱敏。

  3. 循环控制元数据
    必须预留 "loop_id"(UUID4)与 "parent_loop_id" 形成 DAG,方便后续做 有向无环图回放
    "max_loop" 默认 5,超限抛 LoopOverflowError,与国内监管“单次会话不超过 5 轮自动决策”要求一致。

  4. 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 回放。

拓展思考

  1. 流式压缩:当 Observation > 8k token 时,可启用 "compression": "gzip+base64",并在 Schema 增加 enum 字段,确保下游解析无歧义。
  2. 失败回滚:在 Action 同级增加 "rollback_action" 可选对象,一旦工具返回 "code": 500 自动触发补偿事务,满足金融场景 T+0 冲正 要求。
  3. 多模态扩展:若 Action 调用文生图模型,可在 Observation 里增加 "media_type": "image/png""url_expire": 3600,兼顾 CDN 预签名 时效与合规审计。
  4. 国产可信执行:Schema 校验应放入 华为鲲鹏 TEE阿里云 enclave,防止恶意篡改 loop_id 造成 会话重放攻击;同时把 敏感字段 做 SM4 加密后再落盘,符合 国密 要求。