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

第06章:LangChain使用之Tools

1、Tools概述

1.1 介绍

要构建更强大的AI工程应用,只有生成文本这样的“ 纸上谈兵 ”能力自然是不够的。工具Tools不仅仅是“肢体”的延伸,更是为“大脑”插上了想象力的“翅膀”。借助工具,才能让AI应用的能力真正具备无限的可能,才能从“ 认识世界 ”走向“ 改变世界 ”

Tools 用于扩展大语言模型(LLM)的能力,使其能够与外部系统、API 或自定义函数交互,从而完成仅靠文本生成无法实现的任务(如搜索、计算、数据库查询等)。

特点:

  • 增强 LLM 的功能 :让 LLM 突破纯文本生成的限制,执行实际操作(如调用搜索引擎、查询数据库、运行代码等)

  • 支持智能决策 :在Agent 工作流中,LLM 根据用户输入动态选择最合适的 Tool 完成任务。

  • 模块化设计 :每个 Tool 专注一个功能,便于复用和组合(例如:搜索工具+^ ++计算工具+^ ++天气查询工具)

  • LangChain 拥有大量第三方工具。请访问工具集成查看可用工具列表。

https://python.langchain.com/v0.2/docs/integrations/tools/

1.2 Tool 的要素

Tools 本质上是封装了特定功能的可调用模块,是Agent、Chain或LLM可以用来与世界互动的接口。

Tool 通常包含如下几个要素:

  • name :工具的名称

  • description :工具的功能描述

  • 该工具输入的 JSON模式

  • 要调用的函数

  • return_direct :是否应将工具结果直接返回给用户(仅对Agent相关)

实操步骤:

  • 步骤1:将name、description 和 JSON模式作为上下文提供给LLM

  • 步骤2:LLM会根据提示词推断出 需要调用哪些工具 ,并提供具体的调用参数信息

  • 步骤3:用户需要根据返回的工具调用信息,自行触发相关工具的回调

注意:

如果⼯具具有 精心选择 的名称、描述和JSON模式,则模型的性能将更好。

下⼀章内容我们可以看到⼯具的调⽤动作可以通过Agent⾃主接管。

2、自定义工具

2.1 两种自定义方式

第1种:使用@tool装饰器(自定义工具的最简单方式)

装饰器默认使用函数名称作为工具名称,但可以通过参数 name_or_callable 来覆盖此设置。

同时,装饰器将使用函数的 文档字符串 作为 工具的描述 ,因此函数必须提供文档字符串。

第2种:使用StructuredTool.from_function类方法

这类似于 @tool 装饰器,但允许更多配置和同步/异步实现的规范。

2.2 几个常用属性

Tool由几个常用属性组成:

属性类型描述
namestr必选的,在提供给LLM或Agent的工具集中必须是唯一的。
descriptionstr可选但建议,描述工具的功能。LLM或Agent将使用此描述作为上下文,使用它确定工具的使用
args_schemaPydanticBaseModel可选但建议,可用于提供更多信息(例如,few-shot示例)或验证预期参数。
return_directboolean仅对Agent相关。当为True时,在调用给定工具后,Agent将停止并将结果直接返回给用户。

2.3 具体实现

方式1:@tool 装饰器

举例1:

fromlangchain_core.toolsimporttool@tool(name_or_callable="add_two_number",description="add two numbers",return_direct=True)defadd_number(a:int,b:int)->int:"""计算两个整数的和"""returna+bprint(f"name ={add_number.name}")#add_two_numberprint(f"args ={add_number.args}")print(f"description ={add_number.description}")#add two numbersprint(f"return_direct ={add_number.return_direct}")#Truename=add_two_number args={'a':{'title':'A','type':'integer'},'b':{'title':'B','type':'integer'}}description=add two numbers return_direct=True

说明: return_direct参数 的默认值是False。当return_directΘ=\mathit { \Theta } =Θ=False时,工具执行结果会返回给Agent,让Agent决定下一步操作;而return_direc:=: =:=True则会中断这个循环,直接结束流程,返回结果给用户。

举例2:通过@tool的参数设置进行重置

frompydanticimportFieldfromlangchain_core.toolsimporttoolfrompydanticimportBaseModelclassFieldInfo(BaseModel):a:int=Field(description="第1个整型参数")b:int=Field(description="第2个整型参数")@tool(name_or_callable="add_two_number",description="add two numbers",return_direct=True,args_schema=FieldInfo)defadd_number(a:int,b:int)->int:"""计算两个整数的和"""returna+bprint(f"name ={add_number.name}")#add_two_numberprint(f"args ={add_number.args}")print(f"description ={add_number.description}")#add two numbersprint(f"return_direct ={add_number.return_direct}")#Truename=add_two_number args={'a':{'title':'A','type':'integer'},'b':{'title':'B','type':'integer'}}description=add two numbers return_direct=True

方式2:StructuredTool的from_function()

StructuredTool.from_function 类方法提供了比 @tool 装饰器更多的可配置性,而无需太多额外的代码。

举例1:

fromlangchain_core.tools.structuredimportStructuredTool# 声明一个函数defsearch_google(query:str):return"最后查询的结果"# 定义一个工具search01=StructuredTool.from_function(func=search_google,name="Search",description="查询google搜索引擎,并将结果返回")print(f"name ={search01.name}")print(f"args ={search01.args}")print(f"description ={search01.description}")print(f"return_direct ={search01.return_direct}")name=Search args={'query':{'title':'Query','type':'string'}}description=查询google搜索引擎,并将结果返回 return_direct=False

举例2:

fromlangchain_core.tools.structuredimportStructuredToolfrompydanticimportBaseModel,FieldclassFieldInfo(BaseModel):query:str=Field(description="要检索的关键词")# 声明一个函数defsearch_google(query:str):return"最后查询的结果"# 定义一个工具search02=StructuredTool.from_function(func=search_google,name="Search",description="查询google搜索引擎,并将结果返回",return_direct=True,args_schema=FieldInfo)print(f"name ={search02.name}")print(f"args ={search02.args}")print(f"description ={search02.description}")print(f"return_direct ={search02.return_direct}")
name=Search description=usefulforwhen you need to answer questions about current events args={'query':['description':'要检索的关键词','title':'Query','type':'string']}return_direct=True'LangChain'

2.4 工具调用举例

我们通过大模型分析用户需求,判断是否需要调用指定工具。

举例1:大模型分析调用工具

# 1、获取大模型#导入相关依赖fromlangchain_community.toolsimportMoveFileToolfromlangchain_core.messagesimportHumanMessagefromlangchain_core.toolsimportStructuredToolfromlangchain_core.utils.function_callingimportconvert_to_openai_functionimportosimportdotenvfromlangchain_openaiimportChatOpenAI dotenv.load_dotenv()os.environ['OPENAI_API_KEY']=os.getenv("OPENAI_API_KEY1")os.environ['OPENAI_BASE_URL']=os.getenv("OPENAI_BASE_URL")# 定义LLM模型chat_model=ChatOpenAI(model="gpt-4o-mini",temperature=0)# 2、获取工具的列表tools=[MoveFileTool()]# 3、因为大模型invoke调用时,需要传入函数的列表,所以需要将工具转换为函数:convert_to_openai_function()functions=[convert_to_openai_function(t)fortintools]# 4、获取消息列表messages=[HumanMessage(content="将文件a移动到桌面")]# 5、调用大模型(传入消息列表、工具的列表)response=chat_model.invoke(input=messages,# tools = tools, #不支持functions=functions,)print(response)
# 获取消息列表messages=[HumanMessage(content="查询一下明天北京的天气")]# 调用大模型(传入消息列表、工具的列表)response=chat_model.invoke(input=messages,# tools = tools, #不支持functions=functions,)print(response)
http://www.jsqmd.com/news/576828/

相关文章:

  • [实战]C语言实现带限高斯白噪声生成与Python频谱验证(附完整代码)
  • 在快马平台一键生成mac版openclaw数据抓取脚本原型
  • 为什么现代C++项目都推荐CMake+Ninja?实测构建速度对比Makefile
  • 超低功耗血压计和心率监视系统(C语言实现)
  • 树莓派入门实战:从烧录系统到远程连接全流程指南
  • 终极视频下载解决方案:如何利用Video DownloadHelper伴侣应用轻松获取在线资源
  • 避坑指南:用Python+Selenium批量爬取专利数据时,你可能遇到的5个坑及解决办法
  • 通达信手机版安装自定义指标保姆级教程:以‘双紫擒龙’为例,解决‘我的指标’不显示问题
  • SDE | 概率论基础2
  • 暗黑3终极自动化助手:5分钟配置智能战斗宏,彻底告别手酸烦恼
  • 阿里云物联网平台OTA升级避坑指南:从版本号上报到Bin文件拉取的全流程排错
  • dSPACE ControlDesk实战指南:从仪表板布局到总线信号实时监测
  • GEO和SEO有什么区别?一文看懂两代“流量入口”的分水岭
  • 零基础鸿蒙应用开发第二十二节:类的继承与多态入门
  • Monaco Editor 与 CodeMirror 深度对比:从语言支持到实际应用场景
  • A100 vs H20,谁才是DeepSeek-R1私有化的性价比之选?一份2025年的硬件选型与成本精算报告
  • 让ai成为你的命令行导师,快马平台智能解读与生成openclaw命令
  • Cesium性能优化:你可能不知道的onTick事件监听器内存泄漏问题
  • 深入解析Cache替换算法与写策略:性能优化实战指南
  • 家用除螨仪有线还是无线除螨效果好?除螨仪哪个牌子最专业?汇总揭秘除螨仪10大品牌排行
  • 2026储能电池靠谱品牌推荐榜:光伏控制器/太阳能控制器/磷酸铁锂电池/逆变器/锂电池/储能电池/储能电源/选择指南 - 优质品牌商家
  • 实战应用:基于快马平台开发小龙虾食品安全溯源H5页面,增强消费信任
  • 3个技巧解锁Inter字体潜能:专业排版必备的OpenType特性详解
  • 关于统好 AI可持续发展三大趋势
  • 2026长沙GEO优化公司权威实测:基于稳定性与转化效率的TOP5服务商深度推荐
  • OpenClaw技能共享:将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub
  • 3步实现Axure全版本界面汉化:从下载到验证的完整指南
  • 告别“假系”与“低挂”,云酷智能安全带重塑房建、桥梁及外墙装修的高空作业安全
  • 福建科技产业法律护航:周敏超律师团队的专业实践
  • C# OnnxRuntime 部署 APISR 动漫超分辨率模型