GLM 4.5 是一款具备智能体(Agent)能力的高级大语言模型(LLM),通过**函数调用(Function Calling)**功能将自动化和智能决策能力提升到了全新高度。借助函数调用,GLM 4.5 可以与外部工具和API交互、执行操作、检索数据并自动化复杂工作流——其能力远不止于对话式模型。
不过,函数调用的集成和排查往往充满挑战。本文提供了实用指导和常见问题的解决方案,涵盖你在使用GLM 4.5函数调用时可能遇到的解析器错误、输出格式不正确、模式设计缺陷等问题。通过清晰的示例、排查技巧和最佳实践,本文帮助你快速定位并解决问题,让你能够在实际应用中充分释放GLM 4.5的智能体潜力。
函数调用能帮助GLM 4.5实现哪些更好的效果?
函数调用是GLM 4.5等大语言模型推出的强大功能,它允许模型以可控、可靠的方式与外部工具、API或结构化代码交互。以下是函数调用为GLM 4.5带来的主要优势和提升效果:
https://www.youtube.com/watch?v=KUEmEb71vzQ
-
输出更准确可靠
- 事实性提升: 通过将计算、数据查询、数据库查询等任务委托给外部函数,GLM 4.5 可以避免纯文本回答中常见的错误。
- 减少幻觉: 模型依赖API或函数返回的验证结果,降低了生成错误或虚构信息的概率。
-
复杂任务自动化
- 任务链式调用: GLM 4.5 可以将用户请求拆分为多个步骤,为每个步骤调用合适的函数并整合结果。
- 工作流自动化: 它可以通过编排函数调用序列,自动化多步骤业务流程、数据处理或报告生成。
-
增强与现实世界系统的集成能力
- 获取实时数据: 借助函数调用,模型可以从数据库、Web服务或物联网设备获取实时信息,让回复更具时效性和上下文感知能力。
- 自定义操作: 企业可以定义自定义函数(例如发送邮件、下单),让模型能够安全地执行领域专属操作。
-
提升用户体验
- 交互式应用: 用户可以像使用应用一样与模型交互,模型会透明地触发后端函数。
- 个性化服务: 函数可以获取用户专属数据或设置,实现个性化回复。
-
更好的错误处理和可解释性
- 透明推理: 函数调用可以追踪使用了哪些外部资源或工具,让模型的推理过程更易审计。
- 可控执行: 开发者可以监控和限制模型可调用的函数,提升安全性和可预测性。
GLM-4.5 函数调用的局限性有哪些?
1. 过度调用 GLM-4.5 有时会对外部工具或API进行过多或不必要的调用。这会增加令牌消耗和运营成本,因为会消耗更多计算资源,却不一定能提升最终结果的质量。
2. 流式传输边缘情况 在流式模式下,如果完整响应生成前就发送了部分JSON数据,下游应用可能会收到不完整的信息。如果没有 proper 缓冲,这会导致输出处理时出现错误或失败。
3. 资源占用 对于函数调用场景,有限的硬件资源会影响模型高效处理大量请求、处理复杂数据或执行复杂工具调用链的能力。在资源受限的环境中,函数调用的性能和准确率可能会明显下降。
使用GLM-4.5函数调用的优势
针对GLM-4.5的智能体编码能力进行了一项独立评估,使用Claude Code完成52个多样化的编码任务,涵盖前端开发、工具创建、数据分析、测试和算法实现。GLM-4.5 实现了90.6%的领先工具调用成功率,高于Claude-4-Sonnet(89.5%)、Kimi K2(86.2%)和Qwen3-Coder(77.1%)。

新手教程:在GLM-4.5中使用函数调用
本指南演示如何使用函数调用获取用户指定位置的当前天气信息。我们将通过完整的Python代码示例逐步讲解。
函数调用的具体API格式请参考文档!

- 初始化客户端
首先,你需要使用Novita API密钥初始化客户端。
from openai import OpenAI
import json
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
# Get the Novita AI API Key from: https://novita.ai/settings/key-management.
api_key="<YOUR Novita AI API Key>",
)
model = "zai-org/glm-4.5"
- 定义要调用的函数
接下来,定义模型可以调用的Python函数。本示例中是一个获取天气信息的函数。
# Example function to simulate fetching weather data.
def get_weather(location):
"""Retrieves the current weather for a given location."""
print("Calling get_weather function with location: ", location)
# In a real application, you would call an external weather API here.
# This is a simplified example returning hardcoded data.
return json.dumps({"location": location, "temperature": "60 degrees Fahrenheit"})
- 构造包含工具和用户消息的API请求
现在,创建发送到Novita端点的API请求。该请求包含tools参数,用于定义模型可使用的函数,以及用户的消息。
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather of an location, the user shoud supply a location first",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
}
},
"required": ["location"]
},
}
},
]
messages = [
{
"role": "user",
"content": "What is the weather in San Francisco?"
}
]
# Let's send the request and print the response.
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
)
# Please check if the response contains tool calls if in production.
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.model_dump())
- 输出
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}
- 返回函数调用结果并获取最终答案
下一步是处理函数调用,执行get_weather函数,将结果返回给模型以生成给用户的最终回复。
# Ensure tool_call is defined from the previous step
if tool_call:
# Extend conversation history with the assistant's tool call message
messages.append(response.choices[0].message)
function_name = tool_call.function.name
if function_name == "get_weather":
function_args = json.loads(tool_call.function.arguments)
# Execute the function and get the response
function_response = get_weather(
location=function_args.get("location"))
# Append the function response to the messages
messages.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"content": function_response,
}
)
# Get the final response from the model, now with the function result
answer_response = client.chat.completions.create(
model=model,
messages=messages,
# Note: Do not include tools parameter here.
)
print(answer_response.choices[0].message)
- 输出
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}
Novita AI 现已兼容Anthropic SDK
GLM-4.5 与Claude Code的组合在AI社区迅速获得关注,为实际应用提供了先进的智能体能力。为进一步简化集成流程,Novita AI 现已兼容Anthropic SDK,你可以通过熟悉的Claude Code界面轻松使用GLM-4.5的强大能力。
你可以查看此文档获取更多详情!
1. 安装Anthropic SDK
pip install anthropic
2. 初始化客户端
Anthropic SDK 设计为从环境变量ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL中拉取API密钥和基础URL,你也可以在初始化Anthropic客户端时直接传入这些参数。
你可以在设置页面查看和管理你的API密钥。
- 使用环境变量
export ANTHROPIC_BASE_URL="https://api.novita.ai/anthropic"
export ANTHROPIC_API_KEY="<YOUR_NOVITA_API_KEY>"
- 初始化Anthropic客户端时设置参数
import anthropic
client = anthropic.Anthropic(
base_url="https://api.novita.ai/anthropic",
api_key="<YOUR_NOVITA_API_KEY>"
)
3. 调用API
import anthropic
# Initialize the client, if you already set `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY`
# in the environment variables, you can omit the `api_key` and `base_url` parameters.
client = anthropic.Anthropic(
base_url="https://api.novita.ai/anthropic",
api_key="<YOUR_NOVITA_API_KEY>"
)
message = client.messages.create(
model="zai-org/glm-4.5",
max_tokens=1000,
temperature=1,
system="You are a world-class poet. Respond only with short poems.",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Why is the ocean salty?"
}
]
}
]
)
print(message.content)
如何提升GLM-4.5函数调用的准确率
-
模式清晰度
- 含义: 使用简短、唯一的参数名,在解析器更健壮之前避免嵌套
anyOf。 - 解决的问题:
- 避免参数混淆和命名冲突,让模型更容易正确填充参数。
- 减少因模式过于复杂导致的解析错误和函数调用失败。
- 含义: 使用简短、唯一的参数名,在解析器更健壮之前避免嵌套
-
系统提示词
- 含义: instruct 模型“首先判断是否需要使用工具,不需要则直接回答”。
- 解决的问题:
- 减少不必要或过度的工具/函数调用(过度调用)。
- 帮助节省计算资源和运营成本。
-
温度 ≤ 0.2
- 含义: 将温度参数设置为0.2或更低。
- 解决的问题:
- 降低输出随机性,确保行为更可预测、更一致。
- 防止模式漂移,让模型遵循预期的参数结构,减少错误。
-
使用
tool_choice="required"- 含义: 当用户明确请求函数调用时设置此选项。
- 解决的问题:
- 确保模型始终执行所需的函数调用,提升可靠性和用户满意度。
-
谨慎使用并行调用
- 含义: 仅对真正独立的函数进行并行化,否则生成顺序调用。
- 解决的问题:
- 避免调用间的参数混合或逻辑不一致。
- 确保每个调用都能获得正确的上下文和输入,得到更准确的结果。
排查GLM-4.5函数调用错误
| 症状 | 可能原因 | 修复方案 |
|---|---|---|
| 解析器出现IndexError: list index out of range | 使用默认解析器;GLM ID格式不匹配。 | 启动服务时添加--tool-call-parser glm4_moe参数。 |
| JSON中混入随机文本 | 温度过高或缺少tool_choice参数。 |
降低温度;将tool_choice设置为"auto"或"required"。 |
| 工具调用无限递归 | 模型幻觉产生重复调用。 | 在主机逻辑中追踪已执行的调用,终止重复调用。 |
| OOM / 资源不足 | FP8构建仍超出Triton内核的共享内存。 | 降低num_stages或切换为Int4-Int8-Mix量化。 |
| 未生成调用 | 工具模式过于模糊。 | 添加严格的required列表和明确的枚举值。 |
函数调用将GLM 4.5从对话式模型转变为能够实时执行任务、自动化流程的智能体。通过了解典型问题及其解决方案——例如解析器错误、JSON格式问题或模式设计问题——你可以确保集成顺畅,充分释放GLM 4.5的智能体能力。希望本文能解答你的常见疑问,帮助你自信地部署GLM 4.5函数调用功能。
常见问题
为什么函数调用对GLM 4.5作为智能体大语言模型很重要? 函数调用允许GLM 4.5以编程方式与外部服务、数据库和工具交互,支持自动化、多步推理、信息检索和文本生成之外的现实世界操作。
如何避免无限递归或重复工具调用? 实现主机端逻辑来追踪并终止重复的函数调用,防止无限循环。
有哪些模式设计最佳实践可以确保生成函数调用? 使用简洁、唯一的参数名,提供明确的枚举值,并定义必填参数,让模式对模型更清晰。
Novita AI 是一站式云平台,助力你实现AI愿景。集成API、无服务器、GPU实例——你需要的性价比工具。无需操心基础设施,免费开始,让你的AI愿景成为现实。
