chatglm模型工具调用需严格遵循格式:先定义json schema工具(含name、description、parameters字段,参数类型限string/number/integer/boolean/array),再用和包裹工具数组并置于用户提问前,最后通过正则提取块解析结果。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Python中调用ChatGLM模型并实现工具调用(Tool Calling),必须显式构造符合其 tokenizer 要求的工具描述格式,并在 prompt 中嵌入特殊 token 标识工具区域,否则模型根本无法识别工具意图,会直接忽略或胡乱生成。
准备工具定义结构
ChatGLM系列(如ChatGLM3-6B)要求工具以标准JSON Schema格式声明,且字段名必须为name、description、parameters,缺一不可。参数类型只支持string、number、integer、boolean、array五种,写成int或float会导致解析失败。
定义一个查询天气的工具示例:
{ "name": "get_weather", "description": "根据城市名称获取当前天气信息", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,如北京、上海" } }, "required": ["city"] } }
构造带工具标识的输入prompt
ChatGLM3使用和标记工具定义区块,这两个token必须严格存在,且中间不能换行、不能加空格,否则模型无法切分工具上下文。
将工具定义插入prompt开头,格式如下:
[{"name":"get_weather","description":"根据城市名称获取当前天气信息","parameters":{"type":"object","properties":{"city":{"type":"string","description":"城市名称,如北京、上海"}},"required":["city"]}}]用户:今天杭州天气怎么样?
一款AI工具,主要用于使用 Codex CLI 进行深度网络搜索,适用于需要多源综合分析的复杂查询。当 `web_search`(Brave)返回结果不足,或用户……时使用,适合需要提升相关任务效率的用户。
注意:工具数组必须是合法JSON字符串,不能用Python dict字面量;【工具定义必须放在用户提问之前,且紧贴,中间无换行】。
调用模型并解析响应
方法一:使用chatglm3-6b官方推理脚本
加载模型后,传入上述完整prompt,设置tools参数为空列表(因工具已硬编码进prompt),调用model.chat()。
方法二:手动tokenizer处理(更可控)
第一步:用tokenizer.encode()对完整prompt编码,确保等特殊token被正确映射为单个id(验证方式:打印tokenizer.convert_ids_to_tokens([token_id]))。
第二步:设置generate_kwargs = {"max_new_tokens": 512, "do_sample": False, "temperature": 0.1}——温度设为0.1可抑制无关发散,但不能为0,否则工具调用概率坍缩为0。
第三步:捕获输出文本,用正则r'(.*?)'提取工具调用块,再用json.loads()解析内部JSON。若没匹配到该模式,说明模型未触发工具调用,需检查prompt中是否漏掉或工具schema格式错误。










