LangChain核心组件之Tools

工具(Tools) 扩展了 智能体(Agents) 的能力,使其能够获取实时数据、执行代码、查询外部数据库,并在现实世界中执行操作。

在底层,工具本质上是具有明确定义输入和输出的可调用函数,这些函数会被传递给 聊天模型(Chat Model)。模型会根据对话上下文决定是否调用某个工具,并确定应传入哪些参数。

关于模型如何处理工具调用的详细说明,请参阅 工具调用(Tool Calling)。

创建工具

基础工具定义

创建工具最简单的方式是使用 @tool 装饰器。默认情况下,函数的文档字符串(docstring)会作为工具的描述,帮助模型理解何时应使用该工具:

fromlangchain.toolsimporttool@tooldefsearch_database(query:str,limit:int=10)->str:"""在客户数据库中搜索匹配指定查询条件的记录。 Args: query: 要搜索的关键词 limit: 返回结果的最大数量 """returnf"找到{limit}条关于 '{query}' 的结果"

类型提示(Type hints)是必需的,因为它们定义了工具的输入结构(input schema)。文档字符串应简洁且信息丰富,以帮助模型准确理解工具的用途。

服务端工具调用(Server-side tool use)
某些聊天模型(例如 OpenAI、Anthropic 和 Gemini)支持 内置工具(built-in tools),这些工具在服务端执行,例如网络搜索或代码解释器。请查阅 提供商概览(Provider Overview),了解如何在你使用的具体聊天模型中启用这些功能。

自定义工具属性
  1. 自定义工具名称
    默认情况下,工具名称取自函数名。如果需要更具描述性的名称,可以显式指定:
@tool("web_search")# 自定义名称defsearch(query:str)->str:"""在网络上搜索信息。"""returnf"搜索结果:{query}"print(search.name)# 输出: web_search
  1. 自定义工具描述
    你可以覆盖自动生成的工具描述,为模型提供更清晰的使用指引:
@tool("calculator",description="执行算术运算。遇到任何数学问题都应使用此工具。")defcalc(expression:str)->str:"""计算数学表达式。"""returnstr(eval(expression))
  1. 高级输入结构定义
    对于复杂输入,可以使用 Pydantic 模型或 JSON Schema 进行定义:
  • Pydantic 模型
frompydanticimportBaseModel,FieldfromtypingimportLiteralclassWeatherInput(BaseModel):"""Input for weather queries."""location:str=Field(description="City name or coordinates")units:Literal["celsius","fahrenheit"]=Field(default="celsius",description="Temperature unit preference")include_forecast:bool=Field(default=False,description="Include 5-day forecast")@tool(args_schema=WeatherInput)defget_weather(location:str,units:str="celsius",include_forecast:bool=False)->str:"""Get current weather and optional forecast."""temp=22ifunits=="celsius"else72result=f"Current weather in{location}:{temp}degrees{units[0].upper()}"ifinclude_forecast:result+="\nNext 5 days: Sunny"returnresult
  • JSON Schema
weather_schema={"type":"object","properties":{"location":{"type":"string"},"units":{"type":"string"},"include_forecast":{"type":"boolean"}},"required":["location","units","include_forecast"]}@tool(args_schema=weather_schema)defget_weather(location:str,units:str="celsius",include_forecast:bool=False)->str:"""Get current weather and optional forecast."""temp=22ifunits=="celsius"else72result=f"Current weather in{location}:{temp}degrees{units[0].upper()}"ifinclude_forecast:result+="\nNext 5 days: Sunny"returnresult
  1. 保留参数名
    以下参数名已被系统保留,不能用作工具参数,否则会导致运行时错误:
参数名用途说明
config保留用于内部向工具传递 RunnableConfig
runtime保留用于 ToolRuntime 参数(用于访问状态、上下文、存储等)

若需访问运行时信息,请使用 ToolRuntime 参数,而不是自行定义名为 config 或 runtime 的参数。

访问上下文(Accessing Context)

为什么这很重要?当工具能够访问智能体状态、运行时上下文和长期记忆时,其能力最为强大。这使得工具能做出上下文感知的决策、个性化响应,并在多轮对话中保持信息一致性。
运行时上下文(Runtime Context)允许你在运行时将依赖项(如数据库连接、用户 ID 或配置)注入工具,从而提升工具的可测试性和复用性。

通过 ToolRuntime 参数,工具可以访问以下运行时信息:

  • State(状态):在执行过程中流动的可变数据(如消息列表、计数器、自定义字段)
  • Context(上下文):不可变的配置信息,如用户 ID、会话详情或应用特定配置
  • Store(存储):跨会话的持久化长期记忆
  • Stream Writer(流写入器):在工具执行过程中流式输出自定义更新
  • Config(配置):当前执行的 RunnableConfig
  • Tool Call ID(工具调用 ID):当前工具调用的唯一标识符

ToolRuntime

使用 ToolRuntime 可以在一个参数中统一访问所有运行时信息。只需在工具函数签名中添加 runtime: ToolRuntime,系统会自动注入该参数,而不会暴露给大语言模型(LLM)。

ToolRuntime是一个统一参数,为工具提供对状态、上下文、存储、流写入、配置和工具调用 ID 的访问能力。它取代了旧版中分散使用的InjectedStateInjectedStoreget_runtimeInjectedToolCallId等注解。
运行时会自动为你提供这些能力,无需显式传递参数或依赖全局状态。

访问状态(State)

工具可通过 ToolRuntime 访问当前图(graph)的状态:

fromlangchain.toolsimporttool,ToolRuntime# 访问当前对话状态@tooldefsummarize_conversation(runtime:ToolRuntime)->str:"""总结当前对话内容。"""messages=runtime.state["messages"]human_msgs=sum(1forminmessagesifm.__class__.__name__=="HumanMessage")ai_msgs=sum(1forminmessagesifm.__class__.__name__=="AIMessage")tool_msgs=sum(1forminmessagesifm.__class__.__name__=="ToolMessage")returnf"对话包含{human_msgs}条用户消息、{ai_msgs}条 AI 回复和{tool_msgs}条工具结果"# 访问自定义状态字段@tooldefget_user_preference(pref_name:str,runtime:ToolRuntime# ToolRuntime 对模型不可见)->str:"""获取用户的某项偏好设置。"""preferences=runtime.state.get("user_preferences",{})returnpreferences.get(pref_name,"未设置")

runtime参数对模型是隐藏的。以上例中,模型在工具 Schema 中仅看到pref_name不会看到runtime

更新状态(Updating State)

使用 Command 可更新智能体状态或控制图的执行流程:

fromlanggraph.typesimportCommandfromlangchain.messagesimportRemoveMessagefromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESfromlangchain.toolsimporttool,ToolRuntime# 清空对话历史@tooldefclear_conversation()->Command:"""清空对话历史。"""returnCommand(update={"messages":[RemoveMessage(id=REMOVE_ALL_MESSAGES)],})# 更新用户姓名@tooldefupdate_user_name(new_name:str,runtime:ToolRuntime)->Command:"""更新用户姓名。"""returnCommand(update={"user_name":new_name})
上下文(Context)

通过 runtime.context 可访问不可变的配置和上下文数据,如用户 ID、会话信息或应用配置:

fromdataclassesimportdataclassfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_agentfromlangchain.toolsimporttool,ToolRuntime USER_DATABASE={"user123":{"name":"Alice Johnson","account_type":"Premium","balance":5000,"email":"alice@example.com"},"user456":{"name":"Bob Smith","account_type":"Standard","balance":1200,"email":"bob@example.com"}}@dataclassclassUserContext:user_id:str@tooldefget_account_info(runtime:ToolRuntime[UserContext])->str:"""获取当前用户的账户信息。"""user_id=runtime.context.user_idifuser_idinUSER_DATABASE:user=USER_DATABASE[user_id]returnf"账户持有人:{user['name']}\n类型:{user['account_type']}\n余额:${user['balance']}"return"用户未找到"model=ChatOpenAI(model="gpt-4o")agent=create_agent(model,tools=[get_account_info],context_schema=UserContext,system_prompt="你是一名金融助手。")result=agent.invoke({"messages":[{"role":"user","content":"我的当前余额是多少?"}]},context=UserContext(user_id="user123"))
记忆(Memory / Store)

通过 runtime.store 可访问跨会话的持久化数据。存储(Store)允许你保存和检索用户或应用级别的长期信息:

fromtypingimportAnyfromlanggraph.store.memoryimportInMemoryStorefromlangchain.agentsimportcreate_agentfromlangchain.toolsimporttool,ToolRuntime# 读取用户信息@tooldefget_user_info(user_id:str,runtime:ToolRuntime)->str:"""查询用户信息。"""store=runtime.store user_info=store.get(("users",),user_id)returnstr(user_info.value)ifuser_infoelse"未知用户"# 保存用户信息@tooldefsave_user_info(user_id:str,user_info:dict[str,Any],runtime:ToolRuntime)->str:"""保存用户信息。"""store=runtime.store store.put(("users",),user_id,user_info)return"用户信息保存成功。"store=InMemoryStore()agent=create_agent(model,tools=[get_user_info,save_user_info],store=store)# 第一次会话:保存用户信息agent.invoke({"messages":[{"role":"user","content":"保存以下用户信息:userid: abc123, name: Foo, age: 25, email: foo@langchain.dev"}]})# 第二次会话:读取用户信息agent.invoke({"messages":[{"role":"user","content":"获取 ID 为 'abc123' 的用户信息"}]})# 输出示例:# - 姓名:Foo# - 年龄:25# - 邮箱:foo@langchain.dev
流写入器(Stream Writer)

通过 runtime.stream_writer,工具可在执行过程中流式输出自定义更新,适用于向用户提供实时反馈:

fromlangchain.toolsimporttool,ToolRuntime@tooldefget_weather(city:str,runtime:ToolRuntime)->str:"""获取指定城市的天气。"""writer=runtime.stream_writer# 在执行过程中流式输出进度writer(f"正在查询城市{city}的数据...")writer(f"已获取{city}的天气数据")returnf"{city}永远阳光明媚!"

若在工具中使用runtime.stream_writer,则必须在 LangGraph 的执行上下文中调用该工具。更多详情请参阅 流式处理(Streaming)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

环境仿真软件:SWAT_(10).模型校准与验证

模型校准与验证 在环境仿真软件中,模型校准与验证是确保模型准确性和可靠性的重要步骤。这一节将详细介绍如何进行模型校准和验证,包括校准的基本步骤、常用的校准方法、验证的目的和方法,以及如何使用SWAT软件进行这些操作。我们将通过具体的…

LangChain核心组件之Short-term memory

概述 记忆是一种用于记录先前交互信息的系统。对于 AI Agent(智能体)而言,记忆至关重要——它使智能体能够记住过往对话、从用户反馈中学习,并适应用户的偏好。随着智能体处理的任务越来越复杂、交互轮次越来越多,这种…

如何有效降低论文AI痕迹?我的真实降AI经验分享

在高校越来越严格的AIGC检测环境下,论文的AI率成为了毕业、答辩的重要门槛。特别是知网AI率检测日益精细,许多同学的论文初稿AI率都偏高,面临被退回甚至重写的风险。作为一名研究生,我也遇到了论文AI率过高的问题,在尝…

基于ADMM的车辆路径问题与时间窗口(VRPTW)的问题分解方案附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

环境仿真软件:SWAT_(6).SWAT在农业与水资源管理中的应用

SWAT在农业与水资源管理中的应用 1. 农业与水资源管理的基本概念 在农业与水资源管理领域,环境仿真软件如SWAT(Soil and Water Assessment Tool)发挥着重要作用。SWAT是一种分布式流域模型,用于模拟水文循环、水质、农作物生长和土…

智能降重软件使用体验分享:如何有效降低论文AI率

"## 近年来,随着AIGC技术在论文写作中的广泛应用,许多高校对论文AI率的检测标准也越来越严格,尤其是知网的AI率检测系统。作为一名长期关注论文降重和查AI率的学生,我最近试用了两款智能降重软件——【嘎嘎降AI】和【比话降…

【资料】基于模型预测算法的含储能微网双层能量管理模型

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

LangChain核心组件之Messages

在 LangChain 中,消息(Messages) 是模型上下文的基本单元。它们代表了模型的输入与输出,既包含实际内容,也携带元数据,用于在与大语言模型(LLM)交互时完整表达对话状态。 消息对象包…

论文重复率修改:如何有效降低论文AI率?

在当前高校论文写作中,AI生成内容(AIGC)检测成为越来越严格的门槛。面对知网、万方等权威平台的AI率检测,很多同学和老师都难免会遇到论文重复率过高的问题。本文结合真实使用体验,介绍两款我在实际论文降重过程中效果…

PHP 使用 Redis

PHP 使用 Redis 引言 Redis 是一款高性能的键值存储系统,常用于缓存、会话存储、消息队列等场景。PHP 作为一种流行的服务器端脚本语言,与 Redis 的结合使用非常广泛。本文将详细介绍 PHP 使用 Redis 的方法、技巧以及注意事项。 Redis 简介 Redis 是一种基于内存的键值存…

元服务一站式平台:告别碎片化,开启All in One一站式经营新纪元

为了给元服务开发者提供更聚焦、更高效的管理体验,我们在AppGallery Connect平台上正式推出了元服务一站式平台。为何打造专属一站式平台? 随着元服务能力不断丰富,相关功能分布在平台的多个模块中。为了帮助您更便捷地查找和使用所需功能&am…

【滤波跟踪】基于量测非线性模型进行仿真;通过对比分析EKF,UKF和PF粒子滤波的性能附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

AI写作降重体验分享:论文降AI率的实用方法

"## 随着AI辅助写作技术的普及,论文AI率(即论文中的AI生成内容比例)问题也日益严峻。尤其是在高校严格的AIGC检测环境下,如知网AIGC检测,论文AI率过高极有可能导致学术不合格甚至退回重写。因此,掌握…

用户选择静态 IP 时最关心的6个核心问题

#静态IP#在跨境电商、社媒多账号运营、广告投放等场景中,静态IP被越来越多的用户所关注。相比较动态IP,静态IP在稳定性和可控性方面具有一定的优势,但是否适合我们呢?仍然需要结合具体的应用场景。下面小编为大家总结了6个用户选择…

【AI+教育】被 “高考不考,坚决不搞” 毁掉的创新力:衡水中学让我复盘半生应试路

应试教育只给了我‘术’,而生活教会了我‘道’。从衡水模式到职场觉醒,这是一个‘标准答案’受害者的十年自救报告。 一、现状:职场失意时,仍会梦回高考考场 如今的我早已步入职场,却仍会被一段关于高考的记忆反复纠缠。 只要工作中遇到不顺心的事,我就会做同一个类型的…

论文降重平台推荐及真实体验分享

"## 在当前高校对论文原创性要求越来越高的背景下,AIGC检测及论文AI率成为大家关注的重点。尤其是当使用知网等权威系统检测时,高AI率不仅会影响论文的合格与否,也直接关系到毕业、答辩等重要环节。作为一名学生,我最近使用了…

鸿蒙开发者12月社区声望值月度榜单揭晓!

亲爱的鸿蒙开发者们, 【HarmonyOS开发者社区】“成长徽章”计划历经两个月的暂停调整,现正式重启评奖活动!感谢大家在暂停期间依然坚守分享初心,以技术传递价值,用热忱共建生态,让社区始终保持蓬勃的技术活…

基于粒子群算法PSO融合动态窗口法DWA的无人机三维动态避障路径规划研究附MATLAB代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

全网最全专科生必备AI论文写作软件TOP10测评

全网最全专科生必备AI论文写作软件TOP10测评 一、不同维度核心推荐:10款AI工具各有所长 对于专科生而言,论文写作是一个复杂而多环节的过程,从开题、初稿撰写到查重、降重和排版,每个阶段都需要合适的工具辅助。在实际测评过程中…

【例4-6】香甜的黄油(信息学奥赛一本通- P1345)

【题目描述】农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1≤N≤500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。农夫John…