工具调用在后面学习智能体的时候会重点讲到现在只做了解即可大模型工具调用Tool Calling可以扩展模型能力使模型突破纯文本生成的限制与外部系统和功能进行交互。在 LangChain 框架中这一功能也被称为函数调用Function Calling两种术语可以互换使用。 术语说明术语含义Tool Calling工具调用Function Calling函数调用两者在 LangChain 中通常表示同一类能力。2.4.1 模型调用工具步骤 ️ 1. 定义查询天气工具下面定义一个查询天气工具工具名称为get_weather。具体工具创建方式可参考 Agent 章节部分。tooldefget_weather(location:str)-str:获取指定位置的天气returnf{location}的天气是晴朗的。 2. 将工具绑定到模型大模型使用工具前需要通过bind_tools()方法将工具与模型绑定让模型能够识别可用工具。绑定后模型会根据输入内容自动判断是否需要调用工具。frominit_llmimportdeepseek_llm model_with_toolsdeepseek_llm.bind_tools([get_weather])# 查询触发工具调用responsemodel_with_tools.invoke(北京今天天气如何)print(type(response))response.pretty_print()运行后response对象是一个AIMessage。如果大模型判断需要调用工具该对象输出内容中只会包含调用工具的参数请求信息并不会主动调用工具。示例输出 Ai Message 我来帮您查询北京的天气情况。 Tool Calls: get_weather (call_00_KSFvPw6CQnMrR97Cp6y65k5v) Call ID: call_00_KSFvPw6CQnMrR97Cp6y65k5v Args: location: 北京 3. 完整调用流程如果真正要让大模型根据工具调用结果进行回复完整调用流程包括以下四个步骤模型绑定工具通过model.bind_tools([...])绑定一个或多个工具。模型生成工具调用请求用户输入问题如果触发工具调用模型返回工具调用信息如工具名称和参数。开发者手动执行工具从响应中提取工具调用信息并手动调用对应工具。将工具执行结果传递给模型生成最终结果把用户提问内容和工具执行结果返回模型模型最终生成回复。完整实现代码如下fromlangchain.toolsimporttoolfromlangchain_core.messagesimportHumanMessagefrominit_llmimportdeepseek_llmtooldefget_weather(location:str)-str:获取指定位置的天气returnf{location}的天气是晴朗的。# 1. 模型绑定工具model_with_toolsdeepseek_llm.bind_tools([get_weather])messages[]human_messageHumanMessage(content北京的天气)# human_message HumanMessage(content海水为什么是咸的)messages.append(human_message)# 2. 模型生成调用工具请求responsemodel_with_tools.invoke(messages)print(response,response)messages.append(response)# 3. 开发者根据模型的响应调用工具并获取结果fortool_callinresponse.tool_calls:iftool_call[name]get_weather:# 调用工具并获取结果tool_resultget_weather.invoke(tool_call)messages.append(tool_result)# 4. 模型根据工具调用结果生成最终响应final_responsemodel_with_tools.invoke(messages)print(final_response,final_response)print(final_response.content)代码运行后可能输出根据查询结果北京目前的天气是晴朗的。⚠️特别注意大模型调用工具是单次推理直接响应。需要开发者手动执行工具并管理循环适合简单、确定的任务。2.4.2 模型多工具调用 大模型调用工具是单次推理。当调用多个工具时需要用户自己管理多次调用循环。 案例模型调用多个工具进行回复fromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessagefrominit_llmimportdeepseek_llm# 定义股票查询工具tooldefget_stock_price(company:str,timeframe:strtoday)-str:获取指定公司的股票价格信息 Args: company: 公司名称如苹果公司, 微软公司, 谷歌公司 timeframe: 时间范围today-今日, week-本周, month-本月 # 模拟股票数据mock_data{苹果公司:{today:185.20,week:183.50,month:180.75},微软公司:{today:415.86,week:412.30,month:405.42},谷歌公司:{today:15.42,week:15.20,month:14.85}}ifcompanyinmock_data:pricemock_data[company].get(timeframe,未知时间范围)returnf{company}{timeframe}价格:{price}美元else:returnf未找到股票代码{company}的数据# 定义新闻搜索工具tooldefsearch_news(company:str)-str:搜索指定公司的财经新闻 Args: company: 公司名称 Return: 公司的财经新闻每个新闻占一行 # 模拟新闻数据mock_news{苹果公司:[苹果发布新款iPhone股价上涨3%,苹果与欧盟达成反垄断和解协议,苹果将在印度扩大生产规模],微软公司:[微软Azure云业务季度增长超预期,微软完成对Nuance的收购,微软推出新一代AI助手Copilot],谷歌公司:[谷歌发布新AI模型性能提升20%,谷歌与OpenAI合作开发新的AI助手,谷歌在欧洲展开AI研究项目]}news_listmock_news.get(company,[f未找到{company}的相关新闻])return\n.join(news_list)# 1. 初始化模型并绑定工具tools[get_stock_price,search_news]model_with_toolsdeepseek_llm.bind_tools(tools)messages[]# human_message HumanMessage(content苹果公司今天的股价是多少最近有什么新闻)# human_message HumanMessage(content比较一下微软和苹果的股价)human_messageHumanMessage(content腾讯最近有什么重大新闻)# human_message HumanMessage(content海水为什么是咸的)messages.append(human_message)# 2. 工具调用循环whileTrue:responsemodel_with_tools.invoke(messages)messages.append(response)# 如果有调用工具处理工具调用响应# 3. 开发者根据模型的响应调用工具并获取结果ifresponse.tool_calls:fortool_callinresponse.tool_calls:iftool_call[name]get_stock_price:stock_resultget_stock_price.invoke(tool_call)print(stock_result,stock_result)messages.append(stock_result)eliftool_call[name]search_news:news_resultsearch_news.invoke(tool_call)print(news_result,news_result)messages.append(news_result)else:print(没有工具调用直接返回答案)breakprint(response,response)print(response.content) 多工具调用逻辑说明以上示例中有两个工具get_stock_price获取公司股票价格search_news获取公司新闻当用户提问苹果公司今天的股价是多少最近有什么新闻显然需要调用两个工具。此时第一次model_with_tools.invoke(message)调用可能触发get_stock_price工具。AIMessage对象中的tool_calls会包含工具调用信息。第二次model_with_tools.invoke(message)调用可能触发search_news工具。AIMessage对象中的tool_calls同样会包含工具调用信息。当模型不再调用工具时返回的AIMessage对象中的tool_calls为空。因此可以使用一个while循环来自行管理工具多次调用循环。最终将所有消息交给大模型后得到最终结果。✅ 小结步骤作用关键代码1绑定工具model.bind_tools([...])2生成工具调用请求model_with_tools.invoke(messages)3开发者执行工具tool.invoke(tool_call)4生成最终回复model_with_tools.invoke(messages)核心记忆点大模型只负责“决定调用哪个工具、传什么参数”真正执行工具的是开发者。多工具调用时需要开发者使用循环管理完整的工具调用过程。
企业数字化 ERP 产品动态
相关推荐
别跟风死磕算法!普通程序员的「AI+」逆向入局、学习与变现全攻略! 从事互联网行业多年,从传统后端开发到AI工程落地,踩过无数程序员转型AI的坑。先抛出一个颠覆90%普通人认知的逆向结论:互联网+不是落幕,而是饱和内卷;AI+不是颠覆革命,而是传统技术的效率补全。普通程序员学AI,最大的误区是从头学算法、啃数学、追大模型,真正的捷径是反… · 2026/9/24 4:54:32
4G/5G分布式基站光纤前传链路详解:BBU与RRU之间的CPRI与CWDM方案 摘要:本文详解4G/5G分布式基站中BBU与RRU之间的光纤前传链路,涵盖CPRI协议承载的基带IQ信号传输、常用光模块选型、CWDM波分方案的光纤资源优化及组网维护要点。4G/5G分布式基站采用 BBU(基带处理单元) RRU(射频拉远单… · 2026/9/24 4:54:26
実行プランをハーネスの第一級市民にする:repo-template の PLANS.md 運用ガイド 【免费下载链接】learn-harness-engineering Harness engineering beginner tutorial, from 0 to 1 项目地址: https://gitcode.com/gh_mirrors/le/learn-harness-engineering 点击查看 免费下载 本ガイドは、OpenAI アドバンストパック(docs/ja/resour… · 2026/9/24 4:54:20
IPD集成产品开发流程管理:从PACE到Charter的研发项目管理实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:31:45
读懂AI设计发展演变史后,教你应对设计焦虑 AI 行业的爆发始于2022年 ChatGPT 和 Midjouney 的发布,到现在已经快4年了,整个发展过程用突飞猛进、日新月异形容一点都不过分。
但不管它过去还是现在,发展得有多迅猛,都依旧处于行业早期的开荒和发展阶段,离真正成… · 2026/9/24 5:31:45
Jev :Agent 又慢又贵的根因,是决策环节的冗余调用? Agent 每走一步都在做判断:这条消息紧急吗、这个工单转给哪个部门、这条命令该直接执行还是先问人。这些题的答案就是个结构化结论——是/否、A 还是 B——模型根本不需要写一段话来推理。 Agent每做一次判断,就得把整段上下文喂给大模型、等它生成一整段… · 2026/9/24 5:30:56
ENSP校园网组网实战:从VLAN规划到静态路由的完整配置指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:30:32
ESP32-C3小彩屏翻页时钟:从硬件选型到动画实现 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:30:26
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44