Function Calling 实战:让模型调用你的函数查实时数据
本站为独立第三方技术服务平台,提供多模型 API 聚合接入服务,与 Anthropic、OpenAI、Google 等模型提供商无任何关联、授权或合作关系。
大模型的知识是"截止到某个时间"的,你问它"现在库存多少""这个订单啥状态",它答不上来——因为这些数据在你的系统里,不在模型脑子里。Function Calling(工具调用)就是解决这个的:模型判断需要外部数据时,主动"请求"调用你写好的函数,你执行后把结果回传,它再据此作答。这篇带你在 Code0 上用 OpenAI SDK 跑通这个完整闭环。
TL;DR
- Function Calling 让模型"知道自己不知道",主动调用你的函数补数据。
- 闭环四步:定义工具 → 模型请求调用 → 你执行函数 → 结果回传给模型作答。
- 用 OpenAI SDK 标准
tools参数,换模型只改model字段。 - 适用查库存、查订单、查天气、算价格等一切"实时/私有数据"场景。
前置准备
- 注册 Code0 账号:https://console.code0.ai/console/dashboard
- 获取 API Key(控制台 → API Keys → 创建)
- 安装 SDK:
pip install openai
from openai import OpenAI
client = OpenAI(base_url="https://hk.code0.ai/v1", api_key="sk-你的Key")
步骤拆解
步骤 1:写你的真实函数
这里用一个查天气的假函数示意,实际换成你查数据库、调内部 API 的代码即可。
def get_weather(city: str) -> str:
# 真实场景:这里去查你的接口/数据库
fake = {"北京": "晴,26℃", "上海": "多云,28℃"}
return fake.get(city, "暂无数据")
步骤 2:把函数描述成"工具"给模型
模型不看你的代码,它看的是一段 JSON 描述——函数叫什么、干什么、要什么参数。
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 北京"},
},
"required": ["city"],
},
},
}]
步骤 3:第一次请求,看模型要不要调工具
带上 tools 发起请求。如果模型认为需要查数据,它不会直接回答,而是返回一个"工具调用请求"。
messages = [{"role": "user", "content": "北京现在天气怎么样?"}]
resp = client.chat.completions.create(
model="claude-opus-4-8", # 换 gpt-5.4 / gemini-3-pro 只改这行
messages=messages,
tools=tools,
)
msg = resp.choices[0].message
步骤 4:执行函数,把结果回传,拿最终答案
如果模型请求了工具调用,你就执行对应函数,把返回值作为一条 tool 消息塞回去,再请求一次,模型据此给出自然语言答案。
import json
if msg.tool_calls:
messages.append(msg) # 把模型的工具调用请求加入历史
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_weather(**args) # 真正执行你的函数
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
# 带着函数结果再问一次
final = client.chat.completions.create(
model="claude-opus-4-8", messages=messages, tools=tools,
)
print(final.choices[0].message.content)
else:
print(msg.content) # 模型觉得不用查,直接答
完整代码示例
可直接复制运行:
import json
from openai import OpenAI
client = OpenAI(base_url="https://hk.code0.ai/v1", api_key="sk-你的Key")
def get_weather(city: str) -> str:
fake = {"北京": "晴,26℃", "上海": "多云,28℃"}
return fake.get(city, "暂无数据")
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名"}},
"required": ["city"],
},
},
}]
def ask(question: str, model: str = "claude-opus-4-8") -> str:
messages = [{"role": "user", "content": question}]
resp = client.chat.completions.create(model=model, messages=messages, tools=tools)
msg = resp.choices[0].message
if not msg.tool_calls:
return msg.content
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_weather(**args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": result})
final = client.chat.completions.create(model=model, messages=messages, tools=tools)
return final.choices[0].message.content
if __name__ == "__main__":
print(ask("北京现在天气怎么样?")) # 会触发工具调用
print(ask("你好,介绍下你自己")) # 不需要工具,直接答
换个模型跑同一套工具
工具定义和闭环逻辑对所有支持工具调用的模型通用,换模型只改 model:
print(ask("上海天气如何?", model="gpt-5.4"))
print(ask("上海天气如何?", model="gemini-3-pro"))
同一套 tools、同一个 Key,挑对你场景工具调用最靠谱的模型即可。
常见问题
- Q:模型每次都会调工具吗? → 不会,它自己判断。问题不需要外部数据时会直接回答。想强制调用可用
tool_choice参数指定。 - Q:能定义多个工具吗? → 能,
tools列表里放多个,模型会按需选择甚至连续调用多个。 - Q:哪些模型支持工具调用? → 支持 Function Calling 的模型都行,可用列表以控制台为准,切换只改
model。 - Q:函数报错怎么办? → 在执行函数处做好异常捕获,把错误信息作为
tool结果回传,让模型据此给出兜底回复。 - Q:这算 Agent 吗? → 这是 Agent 最核心的一块。把"多工具 + 多轮循环调用"组合起来,就是一个能自己查、自己算的智能体雏形。
小结
Function Calling 的本质,是给模型装上"手"——让它能主动调你的系统去拿实时和私有数据。闭环不复杂,四步就能跑通。用 Code0 的好处是一套 tools、一个 Key,就能在 Claude、GPT、Gemini 间挑工具调用最稳的模型。想把多个模型按任务难度组合起来,可以接着看 一套代码切换所有模型:Code0 多模型路由实战。



