全部文章

用 DeepSeek 和 GLM 做函数调用与工具使用

· 实战· Agent· API

工具调用(也叫函数调用)是把对话模型变成 agent 的关键。你描述模型可调用的函数,它决定何时调用、传什么参数,你的代码执行,结果再回给模型。DeepSeek V4 和 GLM-5.1 都支持标准 OpenAI tools 接口,所以你已经会的套路原样能用。

定义一个工具

import json, os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["TURILOOP_API_KEY"],
    base_url="https://api.turiloop.com/v1",
)

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "查询某城市当前天气",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

工具调用循环

def run(user_msg: str) -> str:
    messages = [{"role": "user", "content": user_msg}]
    r = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=messages,
        tools=tools,
    )
    msg = r.choices[0].message

    if msg.tool_calls:
        messages.append(msg)
        for call in msg.tool_calls:
            args = json.loads(call.function.arguments)
            result = get_weather(args["city"])          # 你的真实函数
            messages.append({
                "role": "tool",
                "tool_call_id": call.id,
                "content": json.dumps(result),
            })
        r = client.chat.completions.create(
            model="deepseek-v4-pro", messages=messages, tools=tools,
        )
        return r.choices[0].message.content
    return msg.content

这就是完整 agent 循环:你提问,模型请求工具,你执行,把结果喂回,模型作答。

选模型

  • GLM-5.1 是工具密集型 agent 循环里又强又便宜的默认。把 model 改成 "glm-5.1" 即可。
  • DeepSeek V4-Pro:当 agent 在工具调用之间需要更难的推理时。
  • Kimi K2.6:当 agent 带一大段稳定上下文时(它的缓存定价让重复的 system prompt 很便宜)。

实用建议

  • 工具描述要精确无歧义。模型就靠它来判断何时调用。
  • 执行前校验参数;模型偶尔会产出畸形 JSON。
  • 给循环设上限,防止一个糊涂的 agent 无限打转。

三款模型都在 Turiloop 一个 OpenAI 兼容的 Key 背后,你可以改一个字符串就在 DeepSeek、GLM、Kimi 上 A/B 同一个 agent。按量付费、国际卡。