位置:首页 > 热点资讯 > ChatGLM工具调用参数完整编写指南与常见错误规避

ChatGLM工具调用参数完整编写指南与常见错误规避

时间:2026-07-25  |  作者:318050  |  阅读:0

ChatGLM模型的工具调用,格式上是有严格要求的——不是随便写个JSON就能用。你需要先定义一个JSON Schema格式的工具描述,包含namedescriptionparameters这三个字段,参数类型只能支持stringnumberintegerbooleanarray这五种。然后,用<|tool_start|><|tool_end|>把工具数组包裹起来,放在用户提问之前。最后,模型输出中会包含<|tool_call|>块,用正则提取出来解析即可。

ChatGLM工具调用参数怎么写

要在Python中调用ChatGLM模型并实现工具调用(Tool Calling),必须显式构造符合其tokenizer要求的工具描述格式,并在prompt中嵌入特殊token来标识工具区域。否则模型根本识别不到工具意图,要么直接忽略,要么胡乱生成一通。

准备工具定义结构

ChatGLM系列(比如ChatGLM3-6B)要求工具以标准JSON Schema格式声明,字段名必须是namedescriptionparameters,一个都不能少。参数类型只支持stringnumberintegerbooleanarray这五种,如果你写成intfloat,解析就会直接挂掉。

举个例子,定义一个查询天气的工具:

{ "name": "get_weather", "description": "根据城市名称获取当前天气信息", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,如北京、上海" } }, "required": ["city"] } }

构造带工具标识的输入prompt

ChatGLM3使用<|tool_start|><|tool_end|>来标记工具定义区块,这两个token必须严格存在,而且中间不能换行、不能加空格,否则模型无法正确切分工具上下文。

把工具定义插入prompt开头,格式是这样的:

<|tool_start|>[{"name":"get_weather","description":"根据城市名称获取当前天气信息","parameters":{"type":"object","properties":{"city":{"type":"string","description":"城市名称,如北京、上海"}},"required":["city"]}}]<|tool_end|>用户:今天杭州天气怎么样?

注意:工具数组必须是合法的JSON字符串,不能用Python dict字面量;【工具定义必须放在用户提问之前,且紧贴<|tool_start|>,中间无换行】

调用模型并解析响应

有两种方式可以处理。

方法一:使用chatglm3-6b最新推理脚本

加载模型后,传入上述完整prompt,设置tools参数为空列表(因为工具已经硬编码进prompt了),然后调用model.chat()即可。

方法二:手动tokenizer处理(更可控)

第一步:用tokenizer.encode()对完整prompt编码,确保<|tool_start|>等特殊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'<|tool_call|>(.*)<|tool_end|>'提取工具调用块,再用json.loads()解析内部JSON。如果没匹配到这个模式,说明模型没有触发工具调用,这时候需要检查prompt中是否漏掉了<|tool_start|>,或者工具schema格式是否有误。

来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多