在基于大模型的智能体系统中,JSON 是最常见的数据交换格式。但在实际落地中,常见问题包括:

  • JSON 格式错误(多余逗号、缺括号、单双引号混用)
  • 字段缺失或多余
  • 类型错误(字符串/数字混乱)
  • 枚举值不符合规范
  • 输出夹杂解释性文本

这些问题如果不做防护,会直接影响系统稳定性。

本文给出一套简洁可落地的 JSON 防护方案,核心思路是:

“约束生成 → 严格校验 → 有限修复 → 可控重试”


一、总体架构

推荐的处理链路如下:
在这里插入图片描述

二、生成阶段:减少错误的关键

1. 使用 Schema 强约束

为所有 JSON 定义结构:

{
  "type": "object",
  "properties": {
    "task": { "type": "string" },
    "priority": {
      "type": "string",
      "enum": ["low", "medium", "high"]
    },
    "deadline": {
      "type": "string",
      "format": "date"
    }
  },
  "required": ["task", "priority"],
  "additionalProperties": false
}

关键点:

  • 必填字段(required)
  • 类型约束
  • 枚举限制(enum)
  • 禁止额外字段(additionalProperties: false)

2. Prompt 强约束输出

请严格输出合法 JSON:
1. 仅输出一个 JSON 对象
2. 不要使用 ```json
3. 不要添加任何解释或注释
4. 所有字段必须符合 schema

3. 提供标准示例

正确示例:

{
  "task": "整理日报",
  "priority": "high",
  "deadline": "2026-04-10"
}

错误示例:

下面是结果:
{
  "task": "整理日报",
  "priority": "urgent"
}

三、解析与校验阶段(必须做)

1. 解析 + 校验,而不是只解析

data = json.loads(text)
validate(data, schema)

说明:

  • 能解析合法
  • 必须做 schema 校验

2. 标准错误结构

{
  "error": "SCHEMA_VALIDATION_FAILED",
  "details": [
    {
      "field": "priority",
      "message": "must be one of [low, medium, high]"
    }
  ]
}

四、自动修复(有限度)

1. 可自动修复的问题

  • 单引号 → 双引号
  • 去除尾随逗号
  • 去掉 markdown ```json
  • 剥离前后解释文本
  • Python 值转 JSON(True → true)

2. 不要修复语义错误

❌ 错误示例:

"priority": "urgent"

不要自动改为:

"priority": "high"

原因:这是业务语义,不是格式问题。


五、重试机制(关键稳定器)

1. 带错误信息重试

你的 JSON 不合法,问题如下:
1. priority 不在枚举范围
2. deadline 格式错误

请修复并重新输出完整 JSON。

2. 控制重试次数

建议策略:

  • 自动修复:1 次
  • 带反馈重试:1~2 次
  • 超过次数 → 降级处理

六、字段设计优化(减少模型出错)

1. 简化字段名

推荐:

{
  "task": "xxx",
  "priority": "high"
}

避免:

{
  "taskPriorityLevel": "high"
}

2. 使用枚举替代自由文本

"priority": ["low", "medium", "high"]

3. 统一数据格式

类型 规范
日期 YYYY-MM-DD
时间 ISO 8601
布尔 true / false
金额 数字,不带单位
空值 null

七、复杂 JSON 的处理策略

1. 两阶段生成

  • 第一步:生成内容(自然语言/结构草稿)
  • 第二步:转换为 JSON

2. 拆分大对象

不要一次生成超大 JSON:

  • 基础信息
  • 配置
  • 元数据

最后由程序合并。

优先使用结构化输出能力

如:

  • function calling
  • JSON mode
  • response schema

比纯 prompt 更稳定。


八、参考实现

raw = llm_output()

cleaned = clean_text(raw)

try:
    data = json.loads(cleaned)
except:
    cleaned = repair_json(cleaned)
    data = json.loads(cleaned)

errors = validate(data, schema)

if errors:
    retry_prompt = build_retry_prompt(errors)
    raw2 = llm_output(retry_prompt)
    cleaned2 = clean_text(raw2)
    data2 = json.loads(cleaned2)

    errors2 = validate(data2, schema)
    if errors2:
        raise Exception("final validation failed")

return data2 if errors else data

总结

让智能体稳定处理 JSON 的关键不是“让模型一次就对”,而是构建一个可靠的数据处理链路

✅ 前端约束生成
✅ 中间严格校验
✅ 后端有限修复
✅ 异常可控重试

最终目标是:

即使模型不完美,系统仍然稳定

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐