Grok4 函数调用 — Function Calling 原生工具集成
什么是函数调用(Function Calling)
函数调用是 Grok 4 最核心的开发者能力之一。它让模型能够在对话过程中自主决定是否调用你预定义的外部函数——模型识别到需要外部信息或执行某个动作时,会返回一个「我要调用函数 X,参数是 Y」的请求,由你的应用执行函数并把结果返回给模型,模型再基于结果给出最终回答。
这不是「模型外挂插件」,而是训练阶段就学会的能力——Grok 4 在训练时就学习了函数调用的意图识别和参数生成,所以调用过程非常自然。
为什么重要
函数调用让 AI 从「只会聊天」变成「能办事的智能体」:
- 实时数据获取:查天气、查股票价格、查数据库
- 执行动作:发送邮件、创建日历事件、下单
- 自动化工作流:多步任务自动执行
- 接入外部系统:任何有 API 的系统都能接入
基本流程
用户提问 → 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"]
}
}
}
]
}
函数定义三要素
- name:函数名称,模型调用时用这个名字
- description:函数描述,模型理解这个函数能做什么(越清晰越好)
- parameters:参数定义,JSON Schema 格式,包含类型、描述、必填项
模型返回的调用请求
当 Grok 决定要调用函数时,它返回的消息中会包含 tool_calls 字段:
{
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"北京\", \"unit\": \"celsius\"}"
}
}
]
}
你的应用需要:
- 解析
arguments(JSON 字符串) - 执行对应的 Python 函数
- 把结果封装成
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 理解函数功能。写清楚:
- 函数能做什么
- 什么时候应该调用
- 参数含义和取值范围
- 返回值格式
处理模型的不确定性
模型可能在不该调用时调用,或在该调用时没调用。建议:
- 在应用层做参数校验
- 对不该调用的情况给出提示
tool_choice参数可以强制模型调用或不调用
多函数编排
Grok 可以在一次回复中返回多个函数调用请求。你的应用应该:
- 执行所有调用
- 把所有结果都返回给模型
- 让模型综合所有结果
错误处理
函数可能执行失败:
- 把错误信息返回给模型
- 让模型决定是否重试或换方案
与其他能力配合
与结构化输出配合
让函数返回 JSON,模型更容易处理:
"parameters": {
"type": "object",
"properties": {...}
}
与 Web 搜索配合
Grok 内置的 DeepSearch 也是一种「工具」。可以在对话中同时使用内置搜索和自定义函数。
与 Grok Build 配合
Gro kBuild 智能体的核心就是函数调用——让普通用户通过对话配置工具调用链。
常见问题
Grok 会不会乱调用函数
不会。Grok 在训练中学习了何时该调用何种函数。但你仍应在应用层做安全校验。
如何防止危险函数被调用
- 对敏感函数加二次确认
- 在
description中写清楚什么时候不应该调用 - 应用层做白名单校验
函数调用的额外计费吗
函数调用本身不额外计费,按普通 token 价格计费。但如果函数执行有成本(如调用外部付费 API),那部分成本由你承担。
继续阅读 结构化输出 了解如何让模型返回 JSON 格式数据。