grok4 中文文档 下载 App

Grok4 函数调用 — Function Calling 原生工具集成

什么是函数调用(Function Calling)

函数调用是 Grok 4 最核心的开发者能力之一。它让模型能够在对话过程中自主决定是否调用你预定义的外部函数——模型识别到需要外部信息或执行某个动作时,会返回一个「我要调用函数 X,参数是 Y」的请求,由你的应用执行函数并把结果返回给模型,模型再基于结果给出最终回答。

这不是「模型外挂插件」,而是训练阶段就学会的能力——Grok 4 在训练时就学习了函数调用的意图识别和参数生成,所以调用过程非常自然。

为什么重要

函数调用让 AI 从「只会聊天」变成「能办事的智能体」:

基本流程

用户提问 → Grok 判断需要调用函数
         → Grok 返回函数名 + 参数
         → 你的应用执行函数
         → 你的应用把结果返回 Grok
         → Grok 基于结果生成最终回答

定义函数

在 API 请求的 tools 参数中定义可用函数:

{
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取指定城市的当前天气",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名称,如 '北京'"
            },
            "unit": {
              "type": "string",
              "enum": ["celsius", "fahrenheit"],
              "description": "温度单位"
            }
          },
          "required": ["city"]
        }
      }
    }
  ]
}

函数定义三要素

  1. name:函数名称,模型调用时用这个名字
  2. description:函数描述,模型理解这个函数能做什么(越清晰越好)
  3. parameters:参数定义,JSON Schema 格式,包含类型、描述、必填项

模型返回的调用请求

当 Grok 决定要调用函数时,它返回的消息中会包含 tool_calls 字段:

{
  "tool_calls": [
    {
      "id": "call_abc123",
      "type": "function",
      "function": {
        "name": "get_weather",
        "arguments": "{\"city\": \"北京\", \"unit\": \"celsius\"}"
      }
    }
  ]
}

你的应用需要:

  1. 解析 arguments(JSON 字符串)
  2. 执行对应的 Python 函数
  3. 把结果封装成 tool 角色消息返回给模型

Python 实现示例

import json
from openai import OpenAI

client = OpenAI(
    api_key="your-key",
    base_url="https://api.x.ai/v1",
)

def get_weather(city: str, unit: str = "celsius") -> str:
    """模拟查天气的函数(实际应调用真实 API)"""
    return json.dumps({
        "city": city,
        "temperature": 25,
        "unit": unit,
        "condition": "晴朗"
    })

# 定义工具
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取指定城市的当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称"},
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["city"]
        }
    }
}]

messages = [{"role": "user", "content": "北京今天天气怎么样?"}]

# 第一轮:模型返回函数调用请求
response = client.chat.completions.create(
    model="grok-4.7",
    messages=messages,
    tools=tools,
)

assistant_message = response.choices[0].message
messages.append(assistant_message)

# 检查是否有函数调用
if assistant_message.tool_calls:
    tool_call = assistant_message.tool_calls[0]
    args = json.loads(tool_call.function.arguments)
    
    # 执行函数
    result = get_weather(args["city"], args.get("unit", "celsius"))
    
    # 把结果返回给模型
    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": result,
    })
    
    # 第二轮:模型基于结果生成回答
    response = client.chat.completions.create(
        model="grok-4.7",
        messages=messages,
        tools=tools,
    )
    
    print(response.choices[0].message.content)

实际应用场景

场景 1:数据库查询

函数:query_database(sql_string)用户:「帮我查一下上个月销售额最高的前 5 个产品」Grok:自动生成 SQL 并调用,返回结果后总结

场景 2:邮件助手

函数:send_email(to, subject, body)、get_inbox(folder)用户:「帮我回复刚才收到的那封邮件」Grok:先调用 get_inbox 获取最新邮件,再生成回复并调用 send_email

场景 3:日程管理

函数:create_calendar_event(date, time, title)、check_schedule(date)用户:「明天下午有时间吗?帮我约个会」Grok:先查日程,再创建事件

最佳实践

清晰的函数描述

模型靠 description 理解函数功能。写清楚:

处理模型的不确定性

模型可能在不该调用时调用,或在该调用时没调用。建议:

多函数编排

Grok 可以在一次回复中返回多个函数调用请求。你的应用应该:

  1. 执行所有调用
  2. 把所有结果都返回给模型
  3. 让模型综合所有结果

错误处理

函数可能执行失败:

与其他能力配合

与结构化输出配合

让函数返回 JSON,模型更容易处理:

"parameters": {
    "type": "object",
    "properties": {...}
}

与 Web 搜索配合

Grok 内置的 DeepSearch 也是一种「工具」。可以在对话中同时使用内置搜索和自定义函数。

与 Grok Build 配合

Gro kBuild 智能体的核心就是函数调用——让普通用户通过对话配置工具调用链。

常见问题

Grok 会不会乱调用函数

不会。Grok 在训练中学习了何时该调用何种函数。但你仍应在应用层做安全校验。

如何防止危险函数被调用

函数调用的额外计费吗

函数调用本身不额外计费,按普通 token 价格计费。但如果函数执行有成本(如调用外部付费 API),那部分成本由你承担。

继续阅读 结构化输出 了解如何让模型返回 JSON 格式数据。