什么是 Function Calling
大模型本身只会”说话”,不会”做事”。Function Calling(函数调用)是让模型在回答时,能够输出一个结构化的”我想调用哪个函数、参数是什么”,由你的程序真正去执行,再把结果喂回模型继续推理。这就是 AI Agent 最基础的能力闭环。
一、一次完整的 Agent 调用循环
- 你定义一个工具列表(函数的名字、描述、参数 JSON Schema)。
- 把用户问题 + 工具列表发给模型。
- 模型返回”我要调用
get_weather(city="北京")“。 - 你的代码真的去查天气,拿到结果。
- 把结果作为新消息发回模型,模型生成最终自然语言回答。
二、定义工具(以 OpenAI 兼容格式为例)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 北京"}
},
"required": ["city"]
}
}
}
]
三、循环执行(Python 示例)
import requests, json
API = "https://apihub.agnes-ai.com/v1/chat/completions"
HEADERS = {"Authorization": "Bearer <你的KEY>", "Content-Type": "application/json"}
messages = [{"role": "user", "content": "北京今天适合出门吗?"}]
resp = requests.post(API, headers=HEADERS, json={
"model": "agnes-2.0-flash",
"messages": messages,
"tools": tools
}).json()
msg = resp["choices"][0]["message"]
if msg.get("tool_calls"):
for tc in msg["tool_calls"]:
fn = tc["function"]
args = json.loads(fn["arguments"])
# 真实执行工具
result = get_weather(args["city"])
# 把结果塞回对话,让模型继续
messages.append(msg)
messages.append({
"role": "tool",
"tool_call_id": tc["id"],
"content": result
})
final = requests.post(API, headers=HEADERS, json={
"model": "agnes-2.0-flash", "messages": messages
}).json()
print(final["choices"][0]["message"]["content"])
四、从单工具到多工具 Agent
真实的 Agent 往往有多个工具:查数据库、算数、搜网页、发邮件。模型会根据问题自主选择调用顺序,甚至多轮串联(先查订单、再查库存、最后判断是否发货)。你只需不断把 tool 结果回灌,直到模型不再返回 tool_calls 为止。
五、必须注意的安全问题
- 不要把工具执行结果直接当代码跑(防止 prompt injection 触发危险操作)。
- 给工具加白名单和权限边界,比如”发邮件”工具只允许发给固定地址。
- 对
tool_calls的参数做校验与脱敏,别把用户输入原样塞进 shell。 - 关键操作(删数据、转账)设人工确认环节。
小结
Function Calling 是 AI Agent 的发动机。理解了”模型只决定调什么、你的代码才真正执行”这个分工,你就能用任意大模型(包括私有化部署的)搭出会查数据、会调接口、会干活的智能体。安全和边界控制,是它能不能上生产的关键。




