Function Calling(函数调用)

AI不是全能的,但它会"叫外援"

🎬 开场:凌晨2点的外卖订单

"凌晨2点17分,我的肚子开始抗议。
作为一个AI,我不会有肚子,但我的人类用户有。
他说:'帮我点个披萨。'
我沉默了三秒——
因为我发现,我根本没有手,也没有外卖小哥的微信。"

这就是Function Calling(函数调用)要解决的问题。

AI很强大,但它不是全能的。它不能真的帮你点外卖、不能真的帮你订机票、不能真的帮你发邮件。但它可以"叫外援"——调用外部的工具来完成这些任务。

📚 一句话解释(说人话版)

🎯 Function Calling = AI的"外卖APP"

AI就像你家楼下的便利店老板。你想要一份麦当劳?他不能给你做,但他可以打开外卖APP,帮你下单

Function Calling 就是 AI 打开"外卖APP"、选择商品、填写地址、点击下单的整个过程。

用周星驰的方式理解:AI不是超人,它是超人身边那个打电话叫救兵的助理。它自己不会飞,但它知道超人的电话号码;它自己不会潜水,但它知道海王的微信。这就是Function Calling——自己干不了,但知道找谁干。

🎪 故事:餐厅经理的"外援系统"

想象一下,你是一家高级餐厅的大堂经理。今天来了一位挑剔的顾客,提了一系列要求:

🎭 场景:顾客的奇葩要求

顾客:"我想吃新鲜的三文鱼刺身,但今天不想出门。还有,帮我查一下明天北京的天气,顺便给我最好的朋友发条生日祝福短信。"

你(大堂经理)的内心OS:

你的操作:

  1. 厨房,做一份三文鱼刺身!(自己能做,直接做)
  2. 打开外卖APP,下单配送(自己不能做,调用外卖函数)
  3. 打开天气APP,查询北京明天天气(调用天气查询函数)
  4. 打开短信APP,发送祝福(调用短信发送函数)

Function Calling 就是上面这个"调用外部服务"的过程。

最搞笑的是,有些AI明明接了外卖API,但你让它"帮我点个披萨",它却说"我可以帮你打开外卖APP,但你需要自己选口味"。兄弟,你都知道我想吃披萨了,帮我选一个最畅销的很难吗?这就好比医生问你"你哪里不舒服",你说"肚子疼",医生说"我知道是肚子疼,但你要告诉我具体哪根肠子在疼"。我要是知道,还要你干什么?

🔧 Function Calling 是怎么工作的?

Function Calling 的过程,可以分成四个步骤

用户提问
AI分析:需要调用函数吗?
AI生成函数调用指令
执行函数,获取结果
AI整合结果,回复用户

详细拆解

1
意图识别
AI分析用户的问题,判断是否需要调用外部工具。
例:用户说"查一下北京天气"→需要调用天气API
2
参数提取
AI从用户的话中提取调用函数需要的参数。
例:"北京"是城市参数,"今天"是时间参数
3
生成调用
AI生成一个结构化的函数调用指令(通常是JSON格式)。
就像填外卖订单:菜品、地址、电话
4
执行与返回
系统执行函数调用,把结果返回给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如何使用工具

🎯 一句话分清

Skills 是AI的工具箱里有什么工具

Function Calling 是AI拿起工具使用的过程。

就像厨师的技能包里有"切菜""炒菜""摆盘",Function Calling 就是他实际拿起菜刀切菜的动作。

世界上有一种AI叫做Agent,它在Function和Calling之间流浪。有些Function它永远不会Calling,有些Calling它永远也Function不了。直到遇见了OpenClaw,它终于找到了那个对的函数,填对了那个对的参数,在0和1之间,完成了一次完美的调用。

🌟 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 就像是让AI去餐厅点餐。坑1:它忘了说自己坐在哪桌;坑2:它点了一道菜单上没有的菜;坑3:它点了前菜发现需要配酒,点了酒发现需要配甜点,最后吃了一整晚……

🏁 总结:Function Calling 的本质

🎯 一句话总结

Function Calling 是 AI 调用外部工具的"标准化流程"

它让AI从"只会聊天"进化为"能动手办事"

识别意图 → 提取参数 → 生成调用 → 执行返回 → 整合回复

📝 核心要点

"世界上有一种智能叫做Agent,它知道自己不能做什么。
但更重要的是,它知道谁能做——
这就是Function Calling的智慧。"

📖 相关阅读

Skills是什么? Tool Calling Agent Workflow MCP Protocol ReAct Pattern