跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

大模型返回 JSON 结构数据的技术方案对比与选择

探讨了大模型返回 JSON 结构数据的多种技术方案。首先分析了 JSON 格式在轻量级、易解析等方面的优势。接着对比了四种主要实现路径:纯提示词方案稳定性较差;JSON Mode 方案利用模型原生能力,可靠性高但性能略有损耗;JSON Schema 方案通过定义严格结构增强准确性,适合复杂校验;TypeScript DSL 方案则凭借更紧凑的语法提升效率。针对流式输出场景,文章建议采用 YAML 或 Markdown 等替代格式,并提出了生产环境下的验证、重试及成本优化最佳实践。最终结论推荐优先使用 JSON Mode 配合 Schema 或 TS 约束,特殊流式场景可降级处理。

黑客帝国发布于 2025/2/7更新于 2026/7/2543 浏览
大模型返回 JSON 结构数据的技术方案对比与选择

JSON 格式的优势

在应用开发过程中,JSON 是最常用的数据结构格式,具有显著优势:

  • 轻量级:格式紧凑,比 XML 等其他数据交换格式更轻便,传输速度快,占用带宽少。
  • 易于解析:基于文本,在各种编程语言中流行,可轻松解析和生成。
  • 平台无关性:语言无关,可在不同系统和编程语言之间无缝交换数据。
  • 支持复杂数据结构:表示复杂的对象和数组结构,适合层次化数据。
  • 易于人类阅读:键值对格式,直观易懂。
  • 自描述性:有意义的键名,有助于理解数据结构的目的。

因此,在 AI 应用开发中,希望大模型返回 JSON 结构数据,便于与现有系统集成及结果解析。

技术方案

1. 纯提示词方案

早期大模型不支持 JSON 结构返回,目前部分模型仍不支持。前期只能通过 Prompt(提示词)实现。

Prompt 示例:查询某个导演最受欢迎的电影,包括:电影名称、描述、发行时间、演员列表(姓名、年龄、参演过的最受欢迎电影),请以 JSON 格式返回。

期望返回的 JSON 结构如下:

{
    "name": "电影名称",
    "description": "电影描述",
    "publishDate": "2023-01-01",
    "performers": [
        {
            "name": "演员姓名",
            "age": 30,
            "films": ["电影 A", "电影 B"]
        }
    ]
}

通过提示词让大模型返回 JSON 结构不够稳定,可能出现 JSON 结构错误、缺失符号等情况。除非选择的大模型不支持 JSON Mode 方式,否则不推荐此方案。

2. JSON Mode 方案

JSON Mode 使用简单,直接在请求时开启即可。该方式可靠性高,但返回性能略低于普通模式,因为模型需额外处理 JSON 约束。

各平台配置示例:

  • OpenAI
    OpenAiChatModel.builder()
        .responseFormat("json_object")
        .build();
    
  • Azure OpenAI
    AzureOpenAiChatModel.builder()
        .responseFormat(new ChatCompletionsJsonResponseFormat())
        .build();
    
  • Vertex AI Gemini
    VertexAiGeminiChatModel.builder()
        .responseMimeType("application/json")
        .build();
    
  • Mistral AI
    MistralAiChatModel.builder()
        .responseFormat(MistralAiResponseFormatType.JSON_OBJECT)
        .build();
    
  • Ollama
    OllamaChatModel.builder()
        .format("json")
        .build();
    

注意:该方式仍需写好提示词。虽然可靠性无问题,但在流式输出场景下,若中间截断可能导致 JSON 不完整。

3. JSON Schema 方案

当 JSON 结构或校验逻辑足够复杂时,自然语言描述显得力不从心。JSON Schema 能约定结构、数据类型、文本规则等,是大模型支持较好的方式。Spring AI 框架的结构化输出源码分析显示其使用了 JSON Schema 方案。

Schema 生成逻辑(Java/Spring AI):

private void generateSchema() {
    JacksonModule jacksonModule = new JacksonModule();
    SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(DRAFT_2020_12, PLAIN_JSON)
       .with(jacksonModule);
    SchemaGeneratorConfig config = configBuilder.build();
    SchemaGenerator generator = new SchemaGenerator(config);
    JsonNode jsonNode = generator.generateSchema(this.typeRef.getType());
    ObjectWriter objectWriter = new ObjectMapper().writer(new DefaultPrettyPrinter()
       .withObjectIndenter(new DefaultIndenter().withLinefeed(System.lineSeparator())));
    try {
       this.jsonSchema = objectWriter.writeValueAsString(jsonNode);
    } catch (JsonProcessingException e) {
       logger.error("Could not pretty print json schema for jsonNode: " + jsonNode);
       throw new RuntimeException("Could not pretty print json schema for " + this.typeRef, e);
    }
}

拼接提示词:

public String getFormat() {
    String template = """
          Your response should be in JSON format.
          Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
          Do not include markdown code blocks in your response.
          Remove the ```json markdown from the output.
          Here is the JSON Schema instance your output must adhere to:
          ```%s```
          """;
    return String.format(template, this.jsonSchema);
}

JSON Schema 示例:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "description": { "type": "string" },
    "publishDate": { "type": "string" },
    "performers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "age": { "type": "integer" },
          "films": { "type": "array", "items": { "type": "string" } }
        }
      }
    }
  }
}

每个字段可加上 description 加强大模型理解。内容虽不够紧凑,可能增加 Token 消耗,但对 Java 开发者是较好选择。

4. TypeScript DSL 方案

使用 TypeScript 语法约束 DSL,AI 的理解能力和生成效果非常稳定。TS 定义的 DSL 体积通常比 JSON Schema 更小。

export interface Film {
    name: string; // "电影名字"
    description: string; // "请用 50 字以内概括电影的内容"
    publishDate: date; // "电影发行时间"
    performers: {
        name: string;
        sex: '男' | '女';
    }[];
}

Prompt 示例:请返回 xxx 导演最受欢迎的电影,请严格按照 TypeScript DSL 返回。

5. 流式输出与替代格式

在 Web 交互式场景中,需要流式返回时,JSON 结构容易被破坏导致无法完成展示。此时可考虑其他格式。

  • YAML / Markdown:拥有更小的体积,且支持流式解析。对于非严格结构化需求,YAML 或 Markdown 表格形式可作为备选。
  • 流式处理策略:
    1. Buffering:接收完整流后再解析,避免中间状态错误。
    2. Partial Parsing:使用支持增量解析的库(如 Streaming JSON Parser)。
    3. Fallback:若 JSON 解析失败,降级为文本摘要或 YAML 格式。

6. 生产环境最佳实践

在实际工程中,仅靠模型输出是不够的,还需增加以下保障:

  1. 响应验证:使用强类型库(如 Java 的 Jackson/Bean Validation)对返回结果进行二次校验,确保符合预期 Schema。
  2. 重试机制:当解析失败或格式错误时,自动触发重试,并记录错误日志以便分析。
  3. 超时控制:设置合理的调用超时时间,防止长尾延迟影响用户体验。
  4. 成本优化:对于不需要复杂结构的场景,减少 System Prompt 中的冗余信息,降低 Token 消耗。

总结

一般推荐使用:JSON Mode + Prompt + TypeScript/Schema 方式。因为 JSON Mode 是大模型原生支持的,最可靠。

如果有特殊需求,如流式输出且对结构要求不严,可采用:YAML + Prompt + TypeScript 方式。

在思考技术方案时,思维要发散,多种技术结合,才能有创新。根据具体业务场景(同步/异步、流式/非流式、成本敏感度)灵活选择最适合的数据返回格式。

目录

  1. JSON 格式的优势
  2. 技术方案
  3. 1. 纯提示词方案
  4. 2. JSON Mode 方案
  5. 3. JSON Schema 方案
  6. 4. TypeScript DSL 方案
  7. 5. 流式输出与替代格式
  8. 6. 生产环境最佳实践
  9. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • DAMO-YOLO 目标检测部署:深色模式与异步渲染的工业 Web 方案
  • Dreamify 免费 AI 绘画工具的功能与实现
  • AIGC 工具全解析:文本、图像、代码、视频及音频生成指南
  • TensorFlow 安装教程
  • 多设备共用键盘鼠标的 Synergy 配置指南(Windows + Ubuntu)
  • Ubuntu 22.04 安装向日葵远程控制
  • 轻量级前端框架对比:Lit 与 Alpine.js 的优势与应用场景
  • Coze 基于行业文章生成思维导图工作流详解
  • Vivado 2019.2 开发环境搭建与配置指南
  • 利用 Blob 对象和 iframe 实现 PDF 跨域打印的 JavaScript 方案
  • Windows 系统安装 Microsoft Visual C++ Build Tools 完整指南
  • 鸿蒙 ArkTS 与 Java 跨平台 TCP 通信实战
  • 飞书机器人搭建指南:基于 Webhook 实现高效消息推送
  • 2026 年主流免费 AI 写作工具测评与避坑指南
  • 基于大疆 MSDK 的无人机视觉引导自适应降落实现
  • 使用 LLaMA-Factory 微调 Qwen2.5 并转换为 GGUF 格式部署
  • Pi0 机器人大模型在昇腾 A2 上的部署与性能测评
  • 五大经典排序算法详解:插入、希尔、冒泡、选择与堆排序
  • 微信开放官方 Bot API:ClawBot 插件技术解析与接入指南
  • MySQL 9.6.0 Windows 版安装与配置指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online