必须使用ChatGLM3-6B及以上版本,满足transformers≥4.40.2且加载时设trust_remote_code=True,再通过generate()传schema字典、Pydantic类绑定或Ollama中FORMAT json+options.schema三种方式实现标准JSON输出。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

让ChatGLM输出标准JSON格式而非自由文本,是接入数据库、调用API或对接游戏引擎前必须解决的问题——不加约束时模型可能在JSON前后插入解释性文字、字段名大小写混乱、漏掉required字段,甚至返回纯中文描述而非键值对。
确认模型与环境支持结构化能力
ChatGLM3-6B及以上版本原生支持JSON Schema约束,但需满足两个前提:【transformers库版本必须为4.40.2】,高版本会因内部token处理逻辑变更导致schema解析失败;【加载模型时必须传入trust_remote_code=True】,否则无法启用GLM自定义的structured generation接口。
验证方式:执行model.has_structured_generation == True,返回True才可继续下一步。
方法一:直接使用JSON Schema字符串约束
第一步:定义Schema字典,例如要求返回用户信息:
{ "type": "object", "properties": { "name": { "type": "string" }, "age": { "type": "integer", "minimum": 0, "maximum": 150 }, "city": { "type": "string" } }, "required": ["name", "city"] }
第二步:将Schema传入generate函数的parameters参数中,注意key名必须为"schema"(不是"json_schema"或"output_schema"):
output = model.generate(tokenizer.encode("请提取以下文本中的用户信息:张三,32岁,住上海浦东新区"), parameters={"schema": your_schema_dict})
这一步不能用chat()接口,必须调用底层generate(),否则schema会被忽略。
方法二:用Pydantic类绑定输出结构(推荐)
方法二更稳定,因为Pydantic会在模型返回后自动校验字段缺失和类型错误:
from pydantic import BaseModel, Field
class UserInfo(BaseModel):
name: str = Field(..., description="真实姓名,不能为空")
age: int = Field(ge=0, le=150, description="年龄,0到150之间")
city: str = Field(..., description="常住城市,需写全称如'北京市朝阳区'")
第三步:调用model.with_structured_output(UserInfo)生成封装后的模型实例,再invoke:
structured_model = model.with_structured_output(UserInfo)
result = structured_model.invoke("王五,今年45岁,户籍在广州市天河区")
注意:invoke传入的是纯字符串提示词,不要加“请返回JSON”这类冗余指令——模型已知要结构化输出,额外提示反而干扰解析。
方法三:Ollama部署时启用JSON Schema流式输出
如果你用Ollama运行ChatGLM3-6B-32k,需在Modelfile中显式声明:
FROM chatglm3-6b-32k
PARAMETER temperature 0.1
PARAMETER num_ctx 32768
TEMPLATE """{{.System}} {{.Prompt}}"""
FORMAT json
然后通过curl调用时,在请求体中加入schema字段:
curl http://localhost:11434/api/chat -d '{ "model": "chatglm3", "messages": [{"role":"user","content":"生成一个带坐标的游戏关卡"}], "format": "json", "options": {"schema": {"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]}} }'
这一步必须同时设置FORMAT json和options.schema,缺一不可,否则Ollama会退回自由文本模式。

















