智谱 GLM 的 Function Calling 也采用“模型提出工具调用,程序执行,再回传结果”的流程。模型不会替你安全地访问数据库或外部 API;执行权限、参数校验、幂等和失败状态都由业务程序负责。
工具调用包含哪些关键字段
智谱官方工具调用文档说明:用 tools 声明函数列表,tool_choice 当前默认且仅支持 auto;响应中的 tool_calls 包含函数名、JSON 字符串参数和调用 ID。程序必须保留这个 ID,回传工具结果时用于对应原调用。

最小 Python 示例
安装 zai-sdk,把 ZAI_API_KEY 放进环境变量。示例函数只返回固定演示数据,没有请求真实天气服务。
import json, os
from zai import ZhipuAiClient
client = ZhipuAiClient(api_key=os.environ["ZAI_API_KEY"])
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "返回指定城市的演示天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
"additionalProperties": False
}
}
}]
messages = [{"role": "user", "content": "北京天气怎样?"}]
first = client.chat.completions.create(
model="glm-5.3", messages=messages,
tools=tools, tool_choice="auto"
)
message = first.choices[0].message
messages.append(message.model_dump())
for call in message.tool_calls or []:
if call.function.name != "get_weather":
raise ValueError("工具不在白名单")
args = json.loads(call.function.arguments)
if args.get("city") != "北京":
raise ValueError("参数未通过校验")
demo = {"city": "北京", "temperature": "22℃", "source": "demo"}
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(demo, ensure_ascii=False)
})
final = client.chat.completions.create(
model="glm-5.3", messages=messages, tools=tools
)
print(final.choices[0].message.content)
模型名、SDK 版本和返回对象应以当前官方页面为准。固定的 22℃ 是演示值,不能作为天气事实。
验证四个节点
- 模型决定:第一轮是否真的返回
tool_calls;没有就不能假装函数已执行。 - 参数:
arguments能否解析为 JSON,字段和类型是否符合 schema。 - 执行:业务日志是否记录调用 ID、工具名、脱敏参数和真实成功或失败状态。
- 回传:最终回答是否忠实使用工具结果,且
tool_call_id与原调用一致。
测试时可让模拟函数返回错误对象,确认模型不会把失败解释成成功。一次返回多个工具调用时,要逐个校验和处理,不能只取数组第一项。
真实业务的安全门槛
- 函数名映射到固定代码,禁止拼接执行任意命令。
- 参数做长度、枚举、格式、租户归属和权限检查。
- 付款、发送、删除等操作要二次确认、幂等和审计。
- 外部调用超时记为未知或失败,先查询真实状态,再决定是否重试。
失败边界与未实测说明
模型可能选择不调用、返回错误函数名、生成无效 JSON 或省略必填参数。Function Calling 只是结构化建议,并不保证参数可信。本文依据 2026-10-01 的智谱官方文档整理,未用你的 Key 调用 GLM,也未接真实天气服务;请先通过无副作用模拟,再接生产资源。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32934.html