当前位置: 首页 > news >正文

AI-Agent工具调用深度实战

AI Agent工具调用(Function Calling)深度实战:从原理到生产级架构

工具调用是AI Agent的核心能力——让大语言模型不仅能"说",还能"做"。本文从协议原理到生产级实现,手把手带你掌握Function Calling的每一个细节。

前言

2024年以来,AI Agent的概念火遍整个技术圈。但你有没有想过,一个Agent到底是怎么"动手"操作外部世界的?答案就是工具调用(Tool Use / Function Calling)

我在实际项目中踩过无数坑:参数解析失败、工具名幻觉、循环调用死循环、并发工具调用竞态……这些问题官方文档很少提及,但每一个都可能让你的Agent在生产环境中翻车。

这篇文章会从协议层面讲清楚工具调用的原理,然后用真实的Python代码带你从零实现一个生产级的工具调用框架。


一、Function Calling 协议原理

1.1 核心概念

Function Calling的本质是:让LLM输出结构化的工具调用请求,由外部系统执行后将结果返回给LLM

整个流程是这样的:

用户输入 → LLM推理 → 输出工具调用请求(JSON) → 外部系统执行工具 → 将结果返回LLM → LLM整合结果生成最终回复

关键点在于:LLM本身不执行任何工具,它只是决定"要调用什么工具、传什么参数"。真正的执行发生在你的应用层代码中。

1.2 三大厂商协议对比

不同厂商的Function Calling协议有细微但重要的差异:

OpenAI 协议
# OpenAI 的工具定义格式tools=[{"type":"function","function":{"name":"get_weather","description":"获取指定城市的天气信息","parameters":{"type":"object","properties":{"city":{"type":"string","description":"城市名称,如'北京'"},"unit":{"type":"string","enum":["celsius","fahrenheit"],"description":"温度单位"}},"required":["city"]}}}]response=client.chat.completions.create(model="gpt-4o",messages=[{"role":"user","content":"北京今天天气怎么样?"}],tools=tools,tool_choice="auto"# auto | none | required | {"type":"function","function":{"name":"xxx"}})

OpenAI返回的工具调用在message.tool_calls中:

# 返回结构message=response.choices[0].messageifmessage.tool_calls:fortcinmessage.tool_calls:print(tc.function.name)# "get_weather"print(tc.function.arguments)# '{"city":"北京","unit":"celsius"}'print(tc.id)# "call_abc123",用于后续提交结果
Anthropic (Claude) 协议
# Claude 的工具定义格式 - 注意差异!tools=[{"name":"get_weather","description":"获取指定城市的天气信息","input_schema":{# 注意:Claude用 input_schema,不是 parameters"type":"object","properties":{"city":{"type":"string","description":"城市名称"}},"required":["city"]}}]response=client.messages.create(model="claude-sonnet-4-20250514",max_tokens=1024,messages=[{"role":"user","content":"北京今天天气怎么样?"}],tools=tools)

Claude的返回结构也不同:

# Claude 返回在 content 数组中,类型为 tool_useforblockinresponse.content:ifblock.type=="tool_use":print(block.name)# "get_weather"print(block.input)# {"city": "北京"} - 注意是 dict,不是字符串!print(block.id)# "toolu_abc123"
Google Gemini 协议
# Gemini 的工具定义importgoogle.generativeaiasgenaidefget_weather(city:str,unit:str="celsius")->dict:"""获取指定城市的天气信息"""pass# Gemini 支持直接传入 Python 函数!model=genai.GenerativeModel('gemini-2.0-flash',tools=[get_weather]# 自动从函数签名生成Schema)# 也可以用 FunctionDeclaration 手动定义fromgoogle.generativeai.typesimportFunctionDeclaration,Tool weather_func=FunctionDeclaration(name="get_weather",description="获取指定城市的天气信息",parameters={"type":"object","properties":{"city":{"type":"string","description":"城市名称"}},"required":["city"]})model=genai.GenerativeModel('gemini-2.0-flash',tools=[Tool(function_declarations=[weather_func])])

1.3 关键差异总结

特性OpenAIClaudeGemini
Schema字段名parametersinput_schemaparameters
返回格式字符串JSON原生dict原生dict
工具ID自动生成自动生成无(靠name匹配)
并行调用支持(多个tool_calls)支持(多个tool_use块)支持(多个function_call)
强制调用tool_choice="required"无直接支持无直接支持
原生函数支持不支持不支持支持(Python函数直接传入)

二、工具定义的 JSON Schema 最佳实践

2.1 常见错误:模糊的描述

# ❌ 错误:描述太模糊,LLM不知道怎么调用{"name":"search","description":"搜索","parameters":{"type":"object","properties":{"q":{"type":"string"}}}}# ✅ 正确:描述清晰,包含使用场景和约束{"name":"search_products","description":"在商品库中搜索产品。支持关键词模糊匹配。返回最多20条结果,按相关性排序。当用户询问商品信息、价格比较、购买建议时使用此工具。","parameters":{"type":"object","properties":{"query":{"type":"string","description":"搜索关键词,如'无线蓝牙耳机'、'iPhone手机壳'"},"category":{"type":"string","enum":["electronics","clothing","food","books"],"description":"商品分类筛选,可选。不指定则搜索全部分类"},"max_price":{"type":"number","description":"最高价格限制(元),可选"},"sort_by":{"type":"string","enum":["relevance","price_asc","price_desc","sales"],"description":"排序方式,默认按相关性排序"}},"required":["query"]}}

2.2 嵌套对象与数组

当工具需要复杂参数时,Schema的定义变得关键:

# 复杂参数的正确定义{"name":"create_order","description":"创建订单。当用户确认购买意向后调用。","parameters":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"product_id":{"type":"string","description":"商品ID,格式为'PROD-XXXX'"},"quantity":{"type":"integer","minimum":1,"maximum":99,"description":"购买数量"}},"required":["product_id","quantity"]},"description":"订单商品列表"},"shipping_address":{"type":"object","properties":{"province":{"type":"string"},"city":{"type":"
http://www.jsqmd.com/news/789200/

相关文章:

  • 如何用Umi-OCR实现高效批量文字识别:5个实用场景全解析
  • 怎么把旧 Linux 的数据复制给新建的 Linux 使用?
  • 免费开源鼠标连点器:MouseClick让你的重复操作自动化
  • Leech-AIO-APP-EX:构建自动化下载与媒体管理流水线
  • 【2026年最新版|建议收藏】Agent开发系统化学习路线,小白入门、程序员进阶,轻松拿捏大厂高薪offer
  • 解密启动盘UD分区的技术原理 | FBinst 理论+实操手搓全能三分区启动盘
  • 从混沌到可控,AIAgent测试实践指南,SITS2026认证的9步标准化交付流程
  • Linux 基本工具详解
  • 为Home Assistant AI构建持久记忆系统:PERMEAR架构详解与实战
  • ContextMenuManager:让Windows右键菜单变得清爽高效的终极解决方案
  • Docker 私有仓库 Harbor 搭建与镜像推送(系列第六篇:企业私有镜像仓库实战)
  • 探索Noto Emoji:打造跨平台表情符号统一体验的完整指南
  • Xplorer文件属性查看器:从新手到专家的完整指南
  • LinkSwift网盘直链下载助手:九大网盘一键获取真实下载地址的终极解决方案
  • 2026年AI技术大会餐饮安排:3大颠覆性变革、5类参会者精准营养画像、72小时动态餐食推演系统全解析
  • 2026年毕业生必备:论文被AI标记?三招避三大坑,高效降AI率! - 降AI实验室
  • JiYuTrainer终极解析:5步掌握极域电子教室破解与系统控制实战技巧
  • 优选驾考小程序(30276)
  • BB响实战指南:从基础设置到飞行安全的全流程解析
  • 神经网络波函数:AI破解量子多体问题维度灾难的新范式
  • 2026济南钻石回收靠谱商家推荐|专业高价,安全变现不套路 - 奢侈品回收测评
  • Win10任务管理器里那个NVIDIA Display Container LS服务到底是干嘛的?关了它会影响玩游戏吗?
  • 别再死记硬背了!用这个“水管模型”5分钟搞懂三极管电流放大原理
  • K8s 集群快速搭建(系列第八篇:单机/多节点集群实战)
  • 面试拷打:Java 泛型 T / E / K / V / ?——只会用不会讲,答完面试官直接拒绝
  • 元学习在药物虚拟筛选中的应用:MetaScreener项目深度解析
  • Switchyard:AI应用统一运行时层,简化多模型API集成与Web会话管理
  • YOLOv11自然生态鸟类目标分割数据集-3858张-flying-bird-1
  • 构建可穿戴设备ECG AI分析平台:从异构数据到实时推理的工程实践
  • 告别玄学调参:手把手教你为TensorRT INT8量化编写Python校准器(附完整代码)