V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
matrix1010
V2EX  ›  程序员

国内哪个大模型支持结构化输出(JSON schema, 不是 JSON mode)

  •  
  •   matrix1010 ·
    Yiling-J · 9 天前 · 2776 次点击

    看了几个似乎都不支持,比如千问的 [https://www.alibabacloud.com/help/zh/model-studio/json-mode#cedc170c4dlts] OpenAI 这个功能应该出了快一年了,不知道为什么国内大模型没跟进

    22 条回复    2025-08-15 14:56:53 +08:00
    LiuJiang
        1
    LiuJiang  
       9 天前
    阿?我以为所有模型都支持。。。国外好像都支持
    LeslieLeung
        2
    LeslieLeung  
       9 天前   ❤️ 1
    OpenAI 甚至把方法都公开了,就是 decode 的时候加个约束,是个工程上的方法,不需要对模型做修改。( via [link]( https://openai.com/index/introducing-structured-outputs-in-the-api/))

    不知道国内的大模型研发是不是有什么难言之隐。
    857681664
        3
    857681664  
       9 天前
    我用 langchain 的 json schema ,接入 deepseek 模型是没有问题的
    maemual
        4
    maemual  
       9 天前
    neteroster
        5
    neteroster  
       9 天前
    这个其实不难,就是推理引擎加个约束采样,感觉更多是不重视,火山引擎就可以

    https://www.volcengine.com/docs/82379/1568221

    也可以用一些第三方平台提供的推理服务,都有这些功能

    https://fireworks.ai/docs/structured-responses/structured-response-formatting

    https://docs.nebius.com/studio/inference/json
    matrix1010
        6
    matrix1010  
    OP
       9 天前
    @LeslieLeung 模型层面应该也需要针对 json shema 训练的,可以看看这个 openai dev day 的视频
    ?si=0Oy7D2fmnMoWUXQc&t=1986 。豆包确实支持,但不知道是只 decoding 层面约束还是模型也做了针对性训练
    matrix1010
        7
    matrix1010  
    OP
       9 天前
    @matrix1010 33 分钟开始,research 部分
    musi
        8
    musi  
       9 天前 via iPhone
    @LeslieLeung 如果只是 decode 的时候约束,但是模型给你返回了一个不合法的字段你要怎么办呢?直接报错吗?
    neteroster
        9
    neteroster  
       9 天前   ❤️ 1
    @matrix1010 这里其实比较微妙,实际上现在绝大多数的大模型都或多或少接受过“给定一个 json schema ,生成满足这个 schema 的 json” 这种训练(或者由其他类似的训练泛化得到相同能力)——你可以纯纯的使用 prompt 给模型 schema 要求它生成,他不至于完全做不了,顶多是有些地方会有语法/语义错误,然后 guided decode 就可以强制解决语法错误,至于内容和语义上,最终还是看模型的能力。

    @musi #8 ,这里的 decode 是指 LLM 生成的最后一个阶段——从概率分布中采样,不是说 decode json string
    iyaozhen
        10
    iyaozhen  
       9 天前
    @maemual +1 火山上的 deepseek 、doubao 都支持,kimi-k2 也在支持的路上了
    iyaozhen
        11
    iyaozhen  
       9 天前
    @neteroster #9 我理解不是给一个 schema 让模型去生成一个 json 再修语法。而是使用已有的数据(非 json 的 output ),往 schema 上填。

    因为按火山引擎的文档以及 openai 的文档,有提到“结合结构化信息写业务内容,而不是格式引导”


    当然我对模型训练不了解。但工程经验来看,用 json schema 就不要想着你的 prompt 要输出 json ,更多是关注自己的业务逻辑,输出更有条理、结构化
    neteroster
        12
    neteroster  
       9 天前   ❤️ 3
    @iyaozhen

    > 不是给一个 schema 让模型去生成一个 json 再修语法。而是使用已有的数据(非 json 的 output ),往 schema 上填。

    可以很明确的说并不是这样的,各大开源推理引擎都有相关实现可以参考。

    ---

    来具体捋一下:

    guided decode 可以确保模型生成的内容满足 json schema (前提是生成会终止),但是“让模型知道我要按某个 schema 输出 json” 是提示词(或者说上下文)做的事。

    有的厂商,例如 OpenAI 和火山,他会告诉你:你直接在参数里给我传 schema 就行了,prompt 里不用说我要这个 json ,关注业务就好。这里,它们实际做的事是:在你的 prompt 后面或者在系统提示词里,按一定格式(可能有针对训练固定格式,也可能是直接拼接 prompt )告诉模型:下面这个是 schema ,你要按照这个生成,最后在 decode 时候由采样器强制规范,完成整个过程。实际上输入给模型的大多是这样的东西(示意)

    <|user|>{你的 prompt} <|output_format|>JSON: {schema} <|assistant>

    也可以参考 OpenAI 最近的开源模型,它的聊天模板里明确说了

    Structured output

    To control the output behavior of the model, you can define a response format at the end of the developer message with the following structure:

    ```
    # Response Formats
    ## {format name}
    // {description or context}
    {schema}<|end|>
    ```

    是加在系统提示里面的。最后结合推理引擎的 guided decode 生成。
    liuzhedash
        13
    liuzhedash  
       9 天前
    @musi
    差不多,现在的大模型不能百分之百保证返回的 schema 符合指令,所以必须检查返回内容
    wx497657341
        14
    wx497657341  
       9 天前
    我们有一个后端将图片给 google ocr 获取图片文本内容,然后将文本内容给 deepseek 提取程序可用的 json 数据。运行良好

    $response = $client->post($url, [
    'headers' => [
    'Content-Type' => 'application/json',
    'Authorization' => "Bearer {$token}",
    ],
    'timeout' => 30,
    'json' => [
    'model' => 'deepseek-chat',
    'messages' => [
    [
    'role' => 'system',
    'content' => 'You are a Singapore vocational skills certificate expert and PHP developer. Your task is to extract key information about the certificate from the given text and return it in JSON format. so long as recipient.idrecipient.name 、competency.code 、competency.description 、date_issued 、certificate_number field',
    ],
    [
    'role' => 'user',
    'content' => $this->text,
    ],
    ],
    ],
    ]);
    asmoker
        15
    asmoker  
       9 天前
    靠提示词不稳定吧~
    sitdownkevin
        16
    sitdownkevin  
       8 天前
    sitdownkevin
        17
    sitdownkevin  
       8 天前
    可以用 LangChain 的结构化输出。根据我的实践经验,如果返回的 JSON 只有一个层级,现在的国产模型都能通过提示词的方式返回。如果 JSON 存在多个层级,就只有 ChatGPT 比较稳定。
    crackidz
        18
    crackidz  
       8 天前
    这个确实是要模型训练上单独做一些额外的处理的,但是这方面应该说是不是主要的方向,因为有很多方式可以实现这个功能,不一定需要声明 json schema 才可以做到。这些方案在 OpenAI 优化之前也是很多大模型的通用解决方案,因此这个功能确实属于优先级不高,尤其是很多 Agent 框架可以屏蔽这种差异(内置解决方案)
    totoro52
        19
    totoro52  
       8 天前
    @wx497657341 不得慢死吗,我们也是这么干,结果 2 多分钟才输出完,特别是很多文字
    totoro52
        20
    totoro52  
       8 天前
    我现在就是用这个方法去生成 json 没啥问题,缺点是太慢了。。 我现在自己在训练 NLP 模型了,用 LLM 模型真的慢,特别是 json 多的时候
    nno
        21
    nno  
       8 天前
    @LeslieLeung 事实上,这种大模型的格式化输出方案,并不是 openai 提出来的;最早是来自于这两个社区
    https://github.com/dottxt-ai/outlines
    https://github.com/guidance-ai/guidance
    iyaozhen
        22
    iyaozhen  
       8 天前
    @neteroster #12 感谢感谢,学到了。
    我们最近有个场景,使用的 agent 框架( ReAct Agent 模式),本身无法设置 output format (模型支持 纯工程上没有支持)
    导致又另外加了一个 chat 节点,把 agent 的返回和原始的输入,又过一遍模型,只是为了输出格式满足 json (靠提示词还是不稳定)。但最后这一步其实拿不到中间 tool 调用的上下文。langchain 也是这样搞的,不过他是在原始 chain 加的 node ,能有上下文。
    整体感觉怪怪的,看来还是得再研究研究
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:07 · PVG 19:07 · LAX 04:07 · JFK 07:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.