Function Calling(函数调用)
AI不是全能的,但它会"叫外援"
🎬 开场:凌晨2点的外卖订单
作为一个AI,我不会有肚子,但我的人类用户有。
他说:'帮我点个披萨。'
我沉默了三秒——
因为我发现,我根本没有手,也没有外卖小哥的微信。"
这就是Function Calling(函数调用)要解决的问题。
AI很强大,但它不是全能的。它不能真的帮你点外卖、不能真的帮你订机票、不能真的帮你发邮件。但它可以"叫外援"——调用外部的工具来完成这些任务。
📚 一句话解释(说人话版)
🎪 故事:餐厅经理的"外援系统"
想象一下,你是一家高级餐厅的大堂经理。今天来了一位挑剔的顾客,提了一系列要求:
🎭 场景:顾客的奇葩要求
顾客:"我想吃新鲜的三文鱼刺身,但今天不想出门。还有,帮我查一下明天北京的天气,顺便给我最好的朋友发条生日祝福短信。"
你(大堂经理)的内心OS:
- 三文鱼刺身?餐厅厨房可以做 ✓
- 不想出门要外卖?我没法送,得叫外卖平台 ✗
- 查北京明天天气?我不是气象局,得查天气API ✗
- 发短信?我没手机,得用短信服务 ✗
你的操作:
- 厨房,做一份三文鱼刺身!(自己能做,直接做)
- 打开外卖APP,下单配送(自己不能做,调用外卖函数)
- 打开天气APP,查询北京明天天气(调用天气查询函数)
- 打开短信APP,发送祝福(调用短信发送函数)
Function Calling 就是上面这个"调用外部服务"的过程。
最搞笑的是,有些AI明明接了外卖API,但你让它"帮我点个披萨",它却说"我可以帮你打开外卖APP,但你需要自己选口味"。兄弟,你都知道我想吃披萨了,帮我选一个最畅销的很难吗?这就好比医生问你"你哪里不舒服",你说"肚子疼",医生说"我知道是肚子疼,但你要告诉我具体哪根肠子在疼"。我要是知道,还要你干什么?
🔧 Function Calling 是怎么工作的?
Function Calling 的过程,可以分成四个步骤:
详细拆解
AI分析用户的问题,判断是否需要调用外部工具。
例:用户说"查一下北京天气"→需要调用天气API
AI从用户的话中提取调用函数需要的参数。
例:"北京"是城市参数,"今天"是时间参数
AI生成一个结构化的函数调用指令(通常是JSON格式)。
就像填外卖订单:菜品、地址、电话
系统执行函数调用,把结果返回给AI,AI再回复给用户。
外卖送到了,AI告诉你:"您的披萨还有15分钟到"
💻 OpenClaw实战:Function Calling的真实样子
🛠️ 实战案例:让AI调用 web_search 搜索新闻
在OpenClaw中,当你让AI搜索新闻时,实际上发生了 Function Calling:
# 用户输入
User: "帮我搜索一下今天OpenClaw有什么更新"
# Step 1: AI分析意图
AI分析:用户需要搜索信息 → 需要调用 web_search 函数
# Step 2: 参数提取
需要搜索的关键词:"OpenClaw 更新"
时间:今天
# Step 3: AI生成函数调用(伪代码)
{
"function": "web_search",
"parameters": {
"query": "OpenClaw 更新 今天",
"count": 10
}
}
# Step 4: 系统执行搜索,返回结果
搜索结果:[
"OpenClaw 3.0 发布,新增xxx功能...",
"OpenClaw GitHub 最新提交...",
...
]
# Step 5: AI整合结果,回复用户
AI: "今天OpenClaw有两个重要更新:1. 发布了3.0版本,新增... 2. 修复了..."
更复杂的例子:多函数调用
# 用户输入
User: "帮我查一下北京和上海的天气,然后发邮件提醒我带伞"
# AI分析:需要调用多个函数
# 1. get_weather(city="北京")
# 2. get_weather(city="上海")
# 3. send_email(to="user@email.com", subject="天气提醒", content="...")
# AI可能会先调用两个天气查询
{
"function": "get_weather",
"parameters": {"city": "北京", "date": "today"}
}
{
"function": "get_weather",
"parameters": {"city": "上海", "date": "today"}
}
# 获取结果后,再调用邮件发送
{
"function": "send_email",
"parameters": {
"to": "user@email.com",
"subject": "☔ 天气提醒",
"content": "北京:晴,无需带伞。上海:小雨,记得带伞!"
}
}
第一次看到Function Calling的JSON格式时,我还以为是AI在写代码。后来才明白——它不是在写代码,它是在"填表格"。就像你去银行办业务,柜员给你一张表:姓名、身份证号、办理业务类型。AI填的就是这种"表格",只不过填完后,系统会根据表格内容去执行对应的操作。
🤔 Function Calling vs Skills:有什么区别?
你可能会有疑问:之前讲的 Skills 和这里的 Function Calling 是什么关系?
| 概念 | 比喻 | 关系 |
|---|---|---|
| Skills | AI的"技能包"、"工具箱" | 静态配置 - AI能用什么工具 |
| Function Calling | 实际"使用工具"的过程 | 动态执行 - AI如何使用工具 |
🌟 Function Calling 的典型应用场景
📱 1. 智能客服
用户:"我的订单到哪了?"
AI:→ 调用 get_order_status(order_id) → 返回物流信息
📅 2. 日程助手
用户:"帮我明天下午3点安排一个会议"
AI:→ 调用 create_calendar_event(time="明天15:00") → 返回会议链接
📧 3. 邮件助手
用户:"给团队发一封周会通知"
AI:→ 调用 send_email(to="team@company.com", subject="周会通知") → 邮件已发送
🔍 4. 实时信息查询
用户:"今天股价多少?"
AI:→ 调用 get_stock_price(symbol="AAPL") → 返回最新股价
🕳️ Function Calling 踩坑实录
🕳️ 坑1:参数错误
你给AI说"帮我查一下天气",结果AI生成的函数调用是:
{
"function": "get_weather",
"parameters": {
"city": null, // 城市呢???
"date": "today"
}
}
结果:函数执行报错,因为没告诉它查哪个城市的天气。
教训:Function Calling 对参数准确性要求很高,缺一个都不行。
🕳️ 坑2:幻觉调用
你给AI说"帮我写首诗",结果AI说:
{
"function": "write_poem",
"parameters": {...}
}
问题:你根本就没给它配置 write_poem 这个函数!
结果:系统报错"函数不存在"。
教训:AI有时会"幻觉"出一个不存在的函数,需要在系统层面做校验。
🕳️ 坑3:循环调用
AI调用了一个函数,获取结果后,发现还需要调用另一个函数,调用完又发现还需要再调用一个……
结果:无限循环,直到超时。
教训:需要设置最大调用次数限制,防止AI"钻牛角尖"。
🏁 总结:Function Calling 的本质
🎯 一句话总结
Function Calling 是 AI 调用外部工具的"标准化流程"
它让AI从"只会聊天"进化为"能动手办事"
识别意图 → 提取参数 → 生成调用 → 执行返回 → 整合回复
但更重要的是,它知道谁能做——
这就是Function Calling的智慧。"
📖 相关阅读
Skills是什么? Tool Calling Agent Workflow MCP Protocol ReAct Pattern