GLM 4.5 函数调用完全指南:从集成到问题解决

GLM 4.5 函数调用完全指南:从集成到问题解决

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

  1. 输出更准确可靠

    • 事实性提升: 通过将计算、数据查询、数据库查询等任务委托给外部函数,GLM 4.5 可以避免纯文本回答中常见的错误。
    • 减少幻觉: 模型依赖API或函数返回的验证结果,降低了生成错误或虚构信息的概率。
  2. 复杂任务自动化

    • 任务链式调用: GLM 4.5 可以将用户请求拆分为多个步骤,为每个步骤调用合适的函数并整合结果。
    • 工作流自动化: 它可以通过编排函数调用序列,自动化多步骤业务流程、数据处理或报告生成。
  3. 增强与现实世界系统的集成能力

    • 获取实时数据: 借助函数调用,模型可以从数据库、Web服务或物联网设备获取实时信息,让回复更具时效性和上下文感知能力。
    • 自定义操作: 企业可以定义自定义函数(例如发送邮件、下单),让模型能够安全地执行领域专属操作。
  4. 提升用户体验

    • 交互式应用: 用户可以像使用应用一样与模型交互,模型会透明地触发后端函数。
    • 个性化服务: 函数可以获取用户专属数据或设置,实现个性化回复。
  5. 更好的错误处理和可解释性

    • 透明推理: 函数调用可以追踪使用了哪些外部资源或工具,让模型的推理过程更易审计。
    • 可控执行: 开发者可以监控和限制模型可调用的函数,提升安全性和可预测性。

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%)。

Benefits of Using Function Calling with GLM-4.5

新手教程:在GLM-4.5中使用函数调用

本指南演示如何使用函数调用获取用户指定位置的当前天气信息。我们将通过完整的Python代码示例逐步讲解。

函数调用的具体API格式请参考文档

try glm 4.5

立即试用 GLM 4.5!

  • 初始化客户端

首先,你需要使用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_KEYANTHROPIC_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函数调用的准确率

  1. 模式清晰度

    • 含义: 使用简短、唯一的参数名,在解析器更健壮之前避免嵌套anyOf
    • 解决的问题:
      • 避免参数混淆和命名冲突,让模型更容易正确填充参数。
      • 减少因模式过于复杂导致的解析错误和函数调用失败。
  2. 系统提示词

    • 含义: instruct 模型“首先判断是否需要使用工具,不需要则直接回答”。
    • 解决的问题:
      • 减少不必要或过度的工具/函数调用(过度调用)。
      • 帮助节省计算资源和运营成本。
  3. 温度 ≤ 0.2

    • 含义: 将温度参数设置为0.2或更低。
    • 解决的问题:
      • 降低输出随机性,确保行为更可预测、更一致。
      • 防止模式漂移,让模型遵循预期的参数结构,减少错误。
  4. 使用tool_choice="required"

    • 含义: 当用户明确请求函数调用时设置此选项。
    • 解决的问题:
      • 确保模型始终执行所需的函数调用,提升可靠性和用户满意度。
  5. 谨慎使用并行调用

    • 含义: 仅对真正独立的函数进行并行化,否则生成顺序调用。
    • 解决的问题:
      • 避免调用间的参数混合或逻辑不一致。
      • 确保每个调用都能获得正确的上下文和输入,得到更准确的结果。

排查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愿景成为现实。

推荐阅读