LangChain Tool Calling 工具调用:让大模型真正‘动手
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 大模型开发从0到1 其他栏目: iOS项目总结大全 其他栏目: 我想学python了 其他栏目: iOS UI 文章目录LangChain Tool Calling 工具调用让大模型真正动手一、先纠正一个常见误解二、定义一个工具2.1 描述写不好工具就用不对三、绑定工具并调用四、手动跑完整个循环五、多个工具 强制选择六、并行调用与容错6.1 一次要调多个工具6.2 工具报错了怎么办七、结构化输出工具调用的另一种用法八、常见坑九、小结LangChain Tool Calling 工具调用让大模型真正动手大模型会说话但不会做事——它不知道今天的天气查不了你的数据库也发不出一封邮件。Tool Calling 就是补上这块让模型决定调用哪个函数、传什么参数真正执行由你的代码来做。这篇讲清楚一次完整工具调用的数据流以及bind_tools背后到底发生了什么。一、先纠正一个常见误解大模型不会执行任何代码。很多人以为模型调用了天气 API其实不是。真实的流程是① 你告诉模型你有这些工具可用函数名 描述 参数 schema ② 模型收到用户问题判断要不要用工具 ③ 模型返回一个 JSON我想调用 get_weather参数是 city北京 ④ 【你的代码】拿到这个 JSON真正去调天气 API ⑤ 【你的代码】把结果塞回对话再问一次模型 ⑥ 模型基于结果生成最终回答模型只负责第 ③ 步——输出一个调用意图的 JSON。执行永远在你的进程里。理解这一点后面所有概念都会顺。二、定义一个工具最简单的方式是tool装饰器fromlangchain_core.toolsimporttooltooldefget_weather(city:str)-str:查询指定城市的当前天气。当你需要知道某地天气时调用它。# 真实项目里这里应该调天气 APIreturnf{city}晴26℃东南风 3 级print(get_weather.name)# get_weatherprint(get_weather.description)# 查询指定城市的当前天气……print(get_weather.args)# {city: {title: City, type: string}}三个细节函数名会被送给模型所以要起得见名知义docstring 就是工具描述模型靠它判断什么时候该用这个工具这行字的重要性远超你的想象类型注解决定参数 schema模型靠它知道该传什么。2.1 描述写不好工具就用不对这是新手最常踩的坑。对比一下# ❌ 太简略模型不知道什么时候该用tooldefquery(sql:str)-str:执行 SQL...# ✅ 说清楚用途、参数格式、边界tooldefquery_employee(sql:str)-str:查询员工信息数据库。 当用户询问员工人数、部门分布、入职时间、薪资等结构化数据时使用。 只支持 SELECT 语句不支持增删改。 表名employees(id, name, dept, hire_date, salary) sql 参数必须是合法的 SQLite 语法。 ...把工具描述当成给同事写的接口文档来写模型才能用对。三、绑定工具并调用fromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-4o-mini)llm_with_toolsllm.bind_tools([get_weather])resultllm_with_tools.invoke(北京今天天气怎么样)print(result.tool_calls)bind_tools做的事把工具的 name/description/args schema 转成模型要求的格式每次调用时自动带上。之后llm_with_tools就成了一个会表达调用意图的模型。输出[{name:get_weather,args:{city:北京},id:call_abc123}]注意这时候工具还没被执行。模型只是说我想这么调。result.content是空的result.tool_calls里有内容。四、手动跑完整个循环把这个数据流完整写一遍理解会牢固很多fromlangchain_core.messagesimportHumanMessage,ToolMessage tools_by_name{t.name:tfortin[get_weather]}messages[HumanMessage(北京今天天气怎么样)]# ① 模型输出调用意图ai_msgllm_with_tools.invoke(messages)messages.append(ai_msg)print(模型想调:,ai_msg.tool_calls)# ② 你的代码真正执行forcallinai_msg.tool_calls:selectedtools_by_name[call[name]]outputselected.invoke(call[args])# 这里才是真的执行print(执行结果:,output)# ③ 把结果作为 ToolMessage 塞回对话messages.append(ToolMessage(contentstr(output),tool_call_idcall[id]))# ④ 再问一次拿到最终回答finalllm_with_tools.invoke(messages)print(final.content)# 北京今天是晴天气温 26℃东南风 3 级。关键点ToolMessage必须带tool_call_id跟tool_calls里的id对应模型才知道这个结果是哪个调用的返回多轮工具调用模型调完 A 又要调 B就是把这个循环跑多次直到tool_calls为空。五、多个工具 强制选择tooldefsearch_order(order_id:str)-str:根据订单号查询订单状态和物流信息。returnf订单{order_id}已发货预计明天送达tooldefsend_email(to:str,subject:str,body:str)-str:发送邮件给用户。需要收件人、主题和正文。returnf邮件已发送给{to}tools[get_weather,search_order,send_email]llm_with_toolsllm.bind_tools(tools)强制模型必须调工具不想让它直接回答时llm.bind_tools(tools,tool_choiceany)# 必须调随便哪个llm.bind_tools(tools,tool_choicesearch_order)# 必须调这个llm.bind_tools(tools,tool_choicenone)# 禁止调等于没绑六、并行调用与容错6.1 一次要调多个工具用户问北京和上海天气分别怎么样模型可能一次返回两个tool_calls。逐个执行即可上面的循环已经处理了。要并发的话可以importasyncioasyncdefrun_all(calls):returnawaitasyncio.gather(*[tools_by_name[c[name]].ainvoke(c[args])forcincalls])6.2 工具报错了怎么办forcallinai_msg.tool_calls:try:outputtools_by_name[call[name]].invoke(call[args])exceptExceptionase:# 关键把错误也告诉模型让它自己决定重试还是换个办法outputf工具调用失败{e}。请检查参数后重试或换一种方式回答。messages.append(ToolMessage(contentstr(output),tool_call_idcall[id]))不要让异常中断整个流程。把错误信息作为 ToolMessage 返回模型经常会自己修正参数重试一次——这比你在代码里写重试逻辑灵活得多。七、结构化输出工具调用的另一种用法如果你只是想让模型输出结构化 JSON而不是真要调用函数可以用一个空实现的工具frompydanticimportBaseModel,FieldclassPerson(BaseModel):一个人的基本信息name:strField(description姓名)age:intField(description年龄)city:strField(description所在城市)tool(args_schemaPerson)defextract_person(name:str,age:int,city:str)-str:从文本中提取人物信息。return# 不需要实现我们只要模型的参数llm_with_toolsllm.bind_tools([extract_person])resultllm_with_tools.invoke(张三今年 28 岁住在杭州)print(result.tool_calls[0][args])# {name: 张三, age: 28, city: 杭州}这就是with_structured_output的底层原理之一。不过真要做结构化输出直接用with_structured_output更简洁后面会单独讲。八、常见坑现象原因解法模型不调工具自己编答案描述不清 / 模型觉得不需要补全 docstring或tool_choiceany参数类型不对传了字符串 28schema 约束不强用 Pydantic 定义args_schema模型调用了不存在的工具工具列表和描述不一致检查tools_by_name是否覆盖全部拿到结果后模型还是瞎说没把 ToolMessage 塞回去检查tool_call_id是否对应工具执行了但报错中断没做异常捕获把错误转成 ToolMessage 返回中文参数变成乱码/被转义一般没问题检查日志打印方式直接读args字典别打印原始 JSON九、小结模型只输出调用意图的 JSON执行永远在你的代码里——这是理解一切的前提tool装饰器的三要素函数名、docstring决定什么时候被调用、类型注解决定参数bind_tools把 schema 绑到模型上返回的AIMessage.tool_calls是意图而非结果完整循环模型出意图 → 你执行 → 结果塞回 ToolMessage带 tool_call_id→ 再问模型tool_choice可强制调用any/ 指定名字 /none工具报错要转成 ToolMessage 返回给模型让它自己重试比硬编码重试更灵活。下一篇讲自定义 Tool 的几种写法和它们各自的适用场景。

相关新闻

Word部分内容不打印:隐藏文字加一个设置就行

Word部分内容不打印:隐藏文字加一个设置就行

有时候一份Word文档,屏幕上看着内容齐全,但打印出来需要去掉某些部分,这部分内容不希望出现在纸质版上,应该怎么做呢?Word没有直接标一个“不打印”的选项,但通过“隐藏文字”加打印设置,可以轻…

2026/10/16 6:29:53 阅读更多 →
MySQL数据库进阶应用(1)—事务管理

MySQL数据库进阶应用(1)—事务管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 6:28:53 阅读更多 →
软件硬件:个人PC核心硬件全景深度分析

软件硬件:个人PC核心硬件全景深度分析

前言一台完整个人电脑(台式机/笔记本)由核心计算硬件、存储硬件、输入输出硬件、供电散热硬件、板载互联硬件五大模块构成。硬件之间通过总线、接口协同工作,任何一个部件瓶颈都会限制整机性能。本文使用多表格拆解各硬件定位、核心参数、性能…

2026/10/16 6:28:53 阅读更多 →

最新新闻

Win11地址栏拖拽失效:原因排查与替代方案指南

Win11地址栏拖拽失效:原因排查与替代方案指南

这事还得从上周整理文件说起。我在Win11的资源管理器里打开了一串多级目录,类似D盘-素材库-项目A-最终交付,手头有一份改完的压缩包要归位到上级的“项目A”目录。按照以前用Win10的习惯,我直接把文件往地址栏的面包屑路径上一拖就完事了&…

2026/10/16 7:15:04 阅读更多 →
PostgreSQL内核元数据核心:PG_CLASS系统表字段详解与实战排查指南

PostgreSQL内核元数据核心:PG_CLASS系统表字段详解与实战排查指南

维护基于 PostgreSQL 内核的数据库产品时,几乎每天都会和各种系统表打交道,而 PG_CLASS 是其中最绕不开的一张。HIGHGO 这个名字是我对某个基于 PG 内核的数据库项目的代号,它的目录体系和原生 PostgreSQL 保持一致,所以很多排查思…

2026/10/16 7:15:04 阅读更多 →
WinForms VS风格主界面框架:可继承可调试的桌面UI解决方案

WinForms VS风格主界面框架:可继承可调试的桌面UI解决方案

简介:这是一套高度仿Visual Studio界面风格的WinForms Docking框架源代码,面向C#桌面开发初学者与中级工程师,用于快速构建具备专业级停靠、浮动、标签页管理功能的MDI应用程序。资源包含230个文件,主体为95个C#核心逻辑文件&…

2026/10/16 7:15:04 阅读更多 →
分布式事务实战:8种方案的选型逻辑与踩坑指南

分布式事务实战:8种方案的选型逻辑与踩坑指南

1. 为什么“分布式事务”不是一道选择题,而是一场持续权衡的实战“8种常用的分布式事务解决方案”——这个标题听起来像一份技术选型清单,但在我过去十年参与过的二十多个中大型系统重构项目里,它从来不是“挑一个用”的简单动作。我见过某电…

2026/10/16 7:15:04 阅读更多 →
如何把电视盒子变成全屋打印服务器(Armbian + CUPS 完整实操)

如何把电视盒子变成全屋打印服务器(Armbian + CUPS 完整实操)

如何把电视盒子变成全屋打印服务器(Armbian CUPS 完整实操) 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905…

2026/10/16 7:15:04 阅读更多 →
面向对象核心知识详解:从类与对象到封装继承多态

面向对象核心知识详解:从类与对象到封装继承多态

最近重新翻出自己几年前记的一套面向对象基础笔记,边看边感慨。当年跟着一套讲得很细的Java基础课,逐行敲代码、抄概念、画内存图的日子,其实才是真正把编程底子打牢的阶段。面向对象这四个字,很多新手一听就觉得抽象,…

2026/10/16 7:14:04 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →