OpenAI 的函数调用不会替你直接访问订单、天气或库存接口。模型只会返回“建议调用哪个工具以及参数”,你的后端必须校验参数、执行白名单函数,再把真实结果回传给模型,才能得到最终回答。
定义模型可以使用的工具
官方函数调用指南要求用 JSON Schema 描述工具。下面只开放查询订单状态,不允许模型任意拼 URL 或 SQL。

tools = [{
"type": "function",
"name": "get_order_status",
"description": "按当前用户可访问的订单号查询状态",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
"additionalProperties": False,
},
"strict": True,
}]
工具描述只告诉模型接口契约。真正的 get_order_status 要在服务端检查当前用户是否拥有该订单,并设置超时;即使模型给出格式正确的订单号,也不能跳过归属校验。
执行工具并回传结果
import json
from openai import OpenAI
client = OpenAI()
r1 = client.responses.create(
model="gpt-6-luna",
input="帮我查订单 A102 的状态",
tools=tools,
)
outputs = []
for item in r1.output:
if item.type != "function_call":
continue
if item.name != "get_order_status":
raise ValueError("工具不在白名单")
args = json.loads(item.arguments)
result = get_order_status_for_current_user(args["order_id"])
outputs.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(result, ensure_ascii=False),
})
if outputs:
r2 = client.responses.create(
model="gpt-6-luna",
previous_response_id=r1.id,
input=outputs,
tools=tools,
)
print(r2.output_text)
关键证据是先收到 function_call,后端确实执行函数,再用相同 call_id 回传 function_call_output。只看到模型生成了参数,不能记为“接口调用成功”。代码依据官方 SDK 快速入门组织,实际字段以安装版本为准。
用三种结果验证
- 存在且属于当前用户的订单:应返回数据库里的真实状态。
- 不存在的订单:工具返回结构化“未找到”,模型不得编造物流信息。
- 属于其他用户的订单:工具必须拒绝,日志记录授权失败但不泄露订单内容。
写操作还要增加幂等键和二次确认。网络超时时先查询外部动作是否已发生,再决定是否重试,尤其是退款、发信和删除操作。
常见问题
模型能直接执行 Python 函数吗?不能。你的程序读取工具调用并决定是否执行。
为什么没有返回工具调用?检查工具描述是否清楚、模型是否支持工具以及问题是否真的需要外部数据。本文没有连接你的订单系统,示例中的业务函数需由你实现并测试。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31080.html