OpenClaw 作为一款高效的 AI 自动化工具,其龙虾 Skill(工作流技能)是实现自动化操作的核心,能够快速适配各类自动化场景。本文将详细讲解龙虾学AI第13技:Function Calling与Tool Use——让Agent真正操控外部世界的开发、配置及调试方法,附完整代码示例和避坑技巧,适合 OpenClaw 初学者及进阶开发者。
如果说RAG赋予了AI实时获取外部知识的能力,那Function Calling和Tool Use则赋予了AI对外部世界动手操作的能力。这是Agent从思考者变成行动者的关键技术跳跃。
想象一下:用户说"帮我查一下今天上海的天气,如果超过30度就帮我把空调设定温度降低两度"。一个纯语言模型只能回答这个请求无法执行;而一个配备了工具调用能力的Agent,可以:调用天气API获取实时气温 → 判断是否超过阈值 → 调用智能家居API控制空调 → 向用户确认操作完成。
这就是Function Calling的本质:大模型不再只输出文本,而是在合适的时机输出结构化的工具调用请求,外部执行环境完成实际操作后将结果返回给模型,模型继续决策直到任务完成。
2024年OpenAI率先将这个能力标准化,随后Anthropic(Tool Use)、谷歌(Function Calling)、以及各大开源模型陆续跟进,如今已成为构建AI Agent的基础能力标配。理解Function Calling,是从用大模型API到真正构建AI Agent系统的分水岭。
本期龙虾第13技将系统讲解:Function Calling的核心机制与JSON Schema工具定义规范;OpenAI和Anthropic两大主流实现的差异与共性;并行工具调用与错误处理;从零构建一个真实可用的Tool-Equipped Agent;以及生产环境中的工具安全设计。
理解Function Calling,首先需要理解其背后的执行循环(Agentic Loop)。
标准的Function Calling执行流程分为五个阶段:第一,定义工具(Tool Definition)——在调用大模型API之前,你需要提供一份工具清单,用JSON Schema格式描述每个工具的名称、功能说明、参数结构和参数类型;第二,模型决策——模型收到用户消息后,判断是否需要调用工具,如需调用则输出工具调用请求(包含工具名和参数值)而非直接回答;第三,工具执行——你的代码截获模型的工具调用请求,在本地或远程执行对应函数,获得执行结果;第四,结果反馈——将工具执行结果作为新的消息(role: tool)追加到对话历史,再次调用模型;第五,模型综合回复——模型综合工具结果和上下文生成最终回答,或继续调用更多工具直到任务完成。
工具定义的JSON Schema格式是Function Calling的核心语法。一个标准的OpenAI格式工具定义包含以下字段:
类型为function;function对象中包含name(工具名)、description(自然语言描述,模型据此判断何时调用)、parameters(JSON Schema格式的参数定义,包含type、properties、required字段)。description字段极为关键,写得越清晰越准确,模型选择工具越精准;parameters中每个参数也应该有清晰的description说明期望的输入格式和取值范围。
并行工具调用(Parallel Function Calling)是OpenAI在2023年底引入的重要特性。当一个任务需要多个独立工具时,模型可以在单次响应中输出多个工具调用请求,执行引擎并行执行后一并返回结果,大幅提升效率。例如同时查询天气和股价,无需串行等待。
Anthropic的Tool Use与OpenAI Function Calling在功能上基本等价,主要差异在于API格式:Anthropic的工具定义放在顶层tools参数而非messages中;工具结果返回的格式略有不同(role: user,content类型为tool_result);Anthropic支持tool_choice控制模型是否必须使用工具。
下面通过一个完整的实战示例,演示如何用OpenAI Function Calling构建一个能实时查询天气和股价的Agent。
第一步:安装依赖环境 $ pip install openai requests python-dotenv
第二步:定义工具清单。在代码中定义两个工具——get_weather和get_stock_price,每个工具都用JSON Schema格式描述参数结构。工具描述必须清晰准确,模型靠description判断何时使用哪个工具。
第三步:实现工具函数。为每个工具编写对应的Python函数,内部调用真实的外部API。注意工具函数的返回值应该是字符串或可序列化为字符串的数据,这将作为工具结果返回给模型。
第四步:实现核心Agent循环。这是Function Calling的核心部分——需要处理模型可能多次调用工具的循环:
首先将用户消息加入messages列表;调用模型API(传入tools参数);检查response.choices[0].finish_reason是否为tool_calls;如果是tool_calls,提取所有工具调用请求;并行(或串行)执行各工具函数;将工具结果以role: tool格式追加到messages;再次调用模型API;重复以上步骤直到finish_reason为stop。
第五步:错误处理。工具调用可能因各种原因失败(网络超时、API限额、参数错误等)。建议在工具函数内部捕获异常,返回结构化的错误信息而非直接抛出异常,让模型能理解失败原因并决定如何应对。例如返回{"error": "天气API超时,请稍后重试"},模型会将此信息告知用户而不是崩溃。
第六步:测试与验证 $ python agent.py $ # 输入:上海今天天气怎么样?顺便告诉我苹果股票现在多少钱 $ # 期望输出:Agent自动调用两个工具并综合回答
通过本期第13技的学习,你应该已经掌握了Function Calling的完整知识体系:从理解执行循环的五个阶段,到掌握JSON Schema工具定义规范,再到OpenAI和Anthropic两大主流平台的实现差异,以及最重要的从零构建一个完整的Tool-Equipped Agent。
Function Calling和Tool Use在Agent技术栈中处于核心地位,它是连接大模型智能与现实世界的桥梁。掌握了它,你的Agent就不再是一个只能聊天的语言模型,而是一个可以真正执行任务、改变外部世界状态的智能执行者。
回顾我们在龙虾系列中走过的路:从第1技的管道语法基础,到第7技的MCP Server构建,到第12技的RAG检索增强,再到今天的Function Calling,每一技都在为构建完整的Agent系统添加一块拼图。
下期龙虾学AI第14技,我们将进入Agent系统的高级话题:Memory Systems——如何为Agent设计完整的记忆架构(工作记忆、情景记忆、语义记忆、程序记忆),让Agent真正拥有持续学习和自我改进的能力,而不是每次对话都从零开始。
🦞 工具调用让AI从思考者变成行动者,下期见!
掌握基础的Function Calling流程后,生产环境中还需要考虑以下进阶问题,这些是区分玩具级Agent和生产级Agent的关键。
并行工具调用的最佳实践。对于相互独立的工具调用,应该使用asyncio.gather实现并发执行而非串行,可以将总执行时间从N*T降低到T(N为工具数量,T为单次调用时间)。关键是识别哪些工具调用之间没有依赖关系,可以安全并行。需要注意写操作的工具(如数据库写入、文件修改)即使看似独立也应谨慎并行,避免竞态条件。
工具链设计(Tool Chaining)。复杂任务往往需要多步工具调用,前一个工具的输出作为后一个工具的输入。良好的工具链设计需要:每个工具职责单一;工具之间的数据格式约定清晰;支持中间状态的保存和恢复(应对超时重试);整体执行流有超时保护和熔断机制。
工具安全设计(Tool Security)。这是生产环境中最容易被忽视但最重要的方面。主要风险包括:提示词注入(Prompt Injection)——恶意用户通过构造特殊输入让Agent调用危险工具;权限越界——Agent被诱导执行超出预期权限的操作;敏感信息泄露——工具执行结果中包含不应返回给用户的敏感数据。应对策略包括:明确定义每个工具的危险级别,高危操作(数据库写入、文件删除、发送消息)需要人工确认;对工具调用参数进行白名单校验;工具结果在返回模型前过滤敏感字段;实现全链路的工具调用审计日志。
工具调用的可观测性。在生产环境中应该记录每次工具调用的:触发时间、工具名、输入参数、执行时长、输出结果(脱敏后)、是否异常。这些日志不仅用于调试,也是优化工具描述和调用策略的重要数据来源。
后续将更新更多 OpenClaw 技能实操教程,关注不迷路!
资源推荐:OpenClaw 官方文档 · 龙虾工作流参考 · Python 自动化测试教程
📅 2026年04月13日 · 第 13 技 | 龙虾专题
夜雨聆风