AIAgent之工具调用:Function Call 与 Tool Use
工具调用Function Call 与 Tool Use工具调用是 Agent 的「手」让大模型能操作外部世界。这篇讲 Function Calling 的原理、工具怎么定义、模型怎么选工具、参数怎么传、常见的工具类型以及开发中的最佳实践。大家好我是黒漂技术佬。大模型本身只能输出文字知识有截止日期、不会算精确数学、不能查数据库、发不了邮件。接上工具之后能力边界大大扩展。Function Calling函数调用也叫 Tool Use就是大模型调用外部工具的标准方式。现在主流模型都原生支持是 Agent 开发的核心技术。这篇讲工具调用的原理、工具定义、多工具选择、参数传递、常见工具类型、最佳实践。一、什么是 Function Calling概念你把工具函数的描述告诉大模型模型根据用户问题判断需不需要调用工具调用哪个工具参数填什么然后模型输出结构化的调用指令你的程序执行这个函数把结果返回给模型继续处理。为什么不用普通对话普通对话里你也可以让模型输出「调用搜索(xxx)」但格式不稳定、容易错。Function Calling 是模型专门训练过的输出是标准 JSON 格式稳定可靠。交互流程1. 你用户问题 工具定义 → 发给模型 2. 模型判断要调用工具 → 返回 tool_callsJSON格式 3. 你执行函数拿到结果 4. 你把结果发给模型 5. 模型根据结果生成最终回答多轮的话就是 2-3-4 循环跟 ReAct 对应。二、工具怎么定义JSON Schema 格式每个工具用 JSON Schema 描述名字、描述、参数类型、参数说明。{type:function,function:{name:search_web,description:搜索互联网获取实时信息回答不知道的问题,parameters:{type:object,properties:{query:{type:string,description:搜索关键词}},required:[query]}}}字段说明字段作用name函数名模型调用时返回这个名字description函数说明模型靠这个判断什么时候用parameters参数定义JSON Schema 格式properties每个参数的名字、类型、描述required必填参数列表复杂参数参数可以是嵌套对象、数组、枚举{name:send_email,description:发送邮件给指定收件人,parameters:{type:object,properties:{to:{type:string,description:收件人邮箱地址},subject:{type:string,description:邮件主题},body:{type:string,description:邮件正文},priority:{type:string,enum:[normal,high,low],description:优先级}},required:[to,subject,body]}}多个工具一次可以传多个工具定义模型自己选tools[{type:function,function:{name:search_web,...}},{type:function,function:{name:calculator,...}},{type:function,function:{name:get_weather,...}},]三、调用过程详解第一步用户提问带上工具定义messages[{role:user,content:北京今天天气怎么样}]tools[{type:function,function:{name:get_weather,description:查询指定城市的实时天气,parameters:{type:object,properties:{city:{type:string,description:城市名}},required:[city]}}}]responsellm.chat(messagesmessages,toolstools)第二步模型返回工具调用模型判断需要调用工具返回{role:assistant,tool_calls:[{id:call_abc123,type:function,function:{name:get_weather,arguments:{\city\: \北京\}}}]}tool_calls就是模型要调用的工具列表。arguments 是 JSON 字符串。第三步执行工具函数importjson tool_callresponse.tool_calls[0]func_nametool_call.function.name argsjson.loads(tool_call.function.arguments)# 执行对应的函数iffunc_nameget_weather:resultget_weather(**args)第四步把结果传回模型messages.append(response)# 把模型的tool_call消息加回去messages.append({role:tool,tool_call_id:call_abc123,content:result# 比如北京今天晴25-32℃})final_responsellm.chat(messagesmessages,toolstools)第五步模型生成最终回答模型拿到工具结果整理成自然语言回答北京今天天气晴朗气温25到32摄氏度空气质量良适合出行。多工具多轮如果需要多个工具模型可能返回多个 tool_call或者一轮一轮调用跟 ReAct 循环一样。四、模型怎么选工具靠 description模型主要看函数的 description 判断什么时候用。描述写得清楚模型就选得准。好的 description 怎么写坏例子description:搜索太简略模型不知道什么时候用。好例子description:当需要回答实时信息、新闻、未知事实时调用此工具搜索互联网。 不要用已有知识回答时效性问题。说明清楚什么时候用、什么场景用、什么情况不要用。最佳实践名字直观函数名要见名知意描述详细说明用途、适用场景、不适用场景参数说明清楚每个参数是什么、格式要求、例子工具数量适中太多了模型容易选错一般 5-10 个比较合适功能不重叠两个工具功能差不多的话模型会纠结五、常见的工具类型1. 搜索类网页搜索Google、Bing、Tavily知识库检索企业内部 RAG文档搜索2. 计算类数学计算器Python 代码执行最强大能算能画图能处理数据单位换算3. 信息查询类天气查询股票行情航班/火车查询数据库查询自然语言转 SQL4. 操作执行类发送邮件创建日历日程发送消息飞书/钉钉/微信创建工单文件读写5. 代码类执行 Python 代码代码审查运行测试6. 浏览器类打开网页截图点击/填写表单六、并行工具调用是什么模型一次返回多个 tool_call同时调用多个工具不用等一个完了再调下一个。tool_calls:[{name:get_weather,arguments:{city:北京}},{name:get_weather,arguments:{city:上海}}]好处减少轮次更快独立的查询可以并行执行省时间什么时候并行两个查询互相不依赖需要对比多个信息的时候比如「对比北京和上海的天气」就可以并行查两个城市。七、工具调用的最佳实践1. 工具描述要精准description 是模型选工具的唯一依据一定要写清楚这个工具是干嘛的什么情况下用什么情况下不要用参数的格式和含义2. 参数校验模型传的参数不一定对一定要校验必填参数有没有类型对不对枚举值在不在范围内格式合不合法邮箱、日期等不对就返回错误信息让模型重试。3. 错误处理要友好工具执行失败返回给模型的错误信息要清楚方便它修正错误城市名「火星」不支持支持的城市列表北京、上海、广州...模型看到就知道换个城市名再试。4. 结果要简洁工具返回的结果不要太长太长占 token 还干扰模型。做摘要再返回搜索结果只返回前 3 条摘要数据库查询只返回关键字段长文本先总结再给模型5. 控制工具数量工具太多模型容易选错。按场景给工具客服 Agent 给知识库工单工具数据分析 Agent 给 SQL画图工具不要把所有工具都塞进去6. 敏感操作要确认发邮件、删数据、下单这种有副作用的操作执行前要人确认Agent 生成调用请求弹给用户确认用户点确认了再真正执行7. 工具结果要标记来源RAG 搜索的结果要标来源链接方便用户查证也能追责。八、常见坑坑 1工具描述太模糊“搜索工具” → 模型不知道什么时候该搜。要写成需要实时信息、最新新闻时使用。坑 2参数没校验模型传了个不存在的参数值程序直接崩。一定要校验参数。坑 3工具返回结果太长搜索返回整篇文章token 爆了还干扰判断。要截断、摘要。坑 4工具功能重叠两个工具都能查信息模型不知道选哪个。合并或者区分清楚场景。坑 5循环调用失败工具报错了模型用同样的参数反复调。要加错误提示和重试限制。坑 6安全问题Agent 能调用删数据、发邮件这种危险操作没有确认机制。敏感操作必须人在回路。坑 7arguments 是字符串注意 tool_calls 里的 arguments 是 JSON 字符串不是对象要 json.loads 解析一下。九、一个完整的多工具示例工具定义tools[{type:function,function:{name:search_company,description:查询公司的基本信息包括成立时间、创始人、主营业务,parameters:{type:object,properties:{company_name:{type:string,description:公司名称}},required:[company_name]}}},{type:function,function:{name:get_stock_price,description:查询上市公司的当前股价和市值,parameters:{type:object,properties:{stock_code:{type:string,description:股票代码}},required:[stock_code]}}}]对话过程用户字节跳动上市了吗市值多少模型第一轮先查字节跳动的基本信息看有没有上市、股票代码是什么。tool_call: search_company(“字节跳动”)工具返回字节跳动成立于2012年创始人张一鸣旗下产品有抖音、TikTok等。 目前未上市暂无股票代码。模型第二轮字节跳动还没上市没有股票代码所以查不到市值。直接回答用户。最终回答字节跳动目前尚未上市因此没有公开的市值数据。 公司成立于2012年旗下核心产品包括抖音、TikTok等。十、本篇小结Function Calling模型原生支持的工具调用机制输出结构化的 JSON 调用指令工具定义name description parametersJSON Schema调用流程用户问题工具定义 → 模型返回 tool_calls → 执行函数 → 结果传回 → 模型生成答案模型靠 description 判断选哪个工具描述写得准不准很重要支持并行调用一次返回多个 tool_call独立任务并行执行更快常见工具类型搜索、计算、信息查询、操作执行、代码、浏览器最佳实践描述精准、参数校验、错误友好、结果简洁、控制数量、敏感操作要人确认常见坑描述模糊、不校验参数、结果太长、功能重叠、安全问题下一篇讲记忆系统短期记忆、长期记忆、向量记忆Agent 怎么记住用户和历史。我是黒漂技术佬。

相关新闻

ICM-42688-P与STM32F746ZG在工业自动化中的应用

ICM-42688-P与STM32F746ZG在工业自动化中的应用

1. ICM-42688-P与STM32F746ZG的黄金组合解析 在工业自动化和机器人控制领域,传感器与微控制器的协同设计直接决定了系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动传感器,与STMicroelectronics的STM32F746ZG Cortex-M7微控制器形成的硬…

2026/7/5 12:47:54 阅读更多 →
混合整数二次规划在模型预测控制中的应用与求解器对比

混合整数二次规划在模型预测控制中的应用与求解器对比

1. 混合整数二次规划在模型预测控制中的核心作用 混合整数二次规划(MIQP)作为模型预测控制(MPC)中处理离散决策变量的关键技术,其核心价值在于平衡计算复杂度和控制性能。在车辆动力系统控制这类典型应用中,变速箱档位选择、发动机启停等离散决策变量与连…

2026/7/5 12:47:54 阅读更多 →
YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

如果你在 2024 年或 2025 年才开始接触 YOLO,可能会觉得它已经是一个“古老”且“成熟”的技术栈,网上教程遍地都是,随便找个代码跑起来似乎并不难。但当你真正想把它用起来,无论是做一个毕业设计、一个内部工具,还是想…

2026/7/5 12:45:54 阅读更多 →

最新新闻

Devin工程化落地:AI协作者如何嵌入CI/CD与测试流水线

Devin工程化落地:AI协作者如何嵌入CI/CD与测试流水线

1. 项目概述:这不是一个“AI编程助手”的简单测评,而是一次对工程化落地边界的实战测绘“Software Development With Devin: Integrations, Testing, and CI/CD (Part 3)”——这个标题里藏着三个被绝大多数AI编程类内容刻意绕开的硬核关键词&#xff1a…

2026/7/5 13:44:13 阅读更多 →
行业领先·审查通过·高性能|运营商行业数据库审计和监测最佳实践指南

行业领先·审查通过·高性能|运营商行业数据库审计和监测最佳实践指南

一、方案概要:数据化落地的全周期数据库安全治理体系【提示】本段立足运营商数字化转型全局,聚焦产品核心特性与落地成效,系统性概述方案核心价值与行业定位。在数字基建升级与数据合规强监管态势下,电信运营商数据库安全治理成为…

2026/7/5 13:42:12 阅读更多 →
踩坑3周,我在实验室内网搭了个零公网请求的论文AIGC筛查本地系统

踩坑3周,我在实验室内网搭了个零公网请求的论文AIGC筛查本地系统

搞AIGC内容本地筛查的这三周我人都麻了,之前先后试了GPTZero、Originality.ai、团象AIGC检测、Crossplag、Copyscape、PaperPass旗下的AI检测,全不好用。这些工具要么强制要求把全文上传公网服务器,要么对理工科论文的公式部分误判率高到离谱…

2026/7/5 13:42:12 阅读更多 →
11、<简单>有一个六位数,其个位数字7,现将个位数字移至首位(十万位),而其余各位数字顺序不变,均后退一位,得到一个新的六位数,假如新数为I旧数的4倍,求原来的六位数

11、<简单>有一个六位数,其个位数字7,现将个位数字移至首位(十万位),而其余各位数字顺序不变,均后退一位,得到一个新的六位数,假如新数为I旧数的4倍,求原来的六位数

#include <iostream> using namespace std;int main() {// old 是原六位数&#xff0c;个位固定为7for (long old 100007; old < 999997; old 10){// 拆分前5位long front old / 10;// 个位7移到十万位&#xff0c;生成新六位数long newNum 700000 front;// 判断…

2026/7/5 13:40:12 阅读更多 →
终极精简指南:使用PowerShell脚本让Windows 11瘦身50%

终极精简指南:使用PowerShell脚本让Windows 11瘦身50%

终极精简指南&#xff1a;使用PowerShell脚本让Windows 11瘦身50% 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否曾为Windows 11那臃肿的系统体积和缓慢的…

2026/7/5 13:40:12 阅读更多 →
从《中国统计年鉴》到可比数据:手把手教你计算不变价GDP

从《中国统计年鉴》到可比数据:手把手教你计算不变价GDP

1. 为什么需要计算不变价GDP&#xff1f; 我第一次接触GDP数据时&#xff0c;发现一个奇怪现象&#xff1a;某城市2000年GDP是1000亿元&#xff0c;2020年GDP是8000亿元&#xff0c;看起来增长了8倍。但老师告诉我&#xff0c;这个比较毫无意义&#xff0c;因为没考虑物价变化。…

2026/7/5 13:40:12 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻