LangChain【7】之工具创建和错误处理策略

文章目录

  • 一 LangChain 自定义工具概述
  • 二创建自定义工具的三种方法
    • 2.1 方法一:@tool 装饰器
      • 2.1.1 同步方法案例
      • 2.1.2 工具描述方式1:传参
      • 2.1.3 工具描述方式2:文档字符串
    • 2.2 方法二:StructuredTool类
      • 2.2.1 StructuredTool创建自定义工具
      • 2.2.2 StructuredTool配置信息
    • 2.3 方法三:BaseTool类
  • 三 异步工具的实现
  • 四 工具错误处理策略

一 LangChain 自定义工具概述

  • LangChain提供了一套工具、组件和接口,可简化创建由大型语言模型(LLM)和聊天模型提供支持的应用程序的过程。
  • 在构建智能代理时,为其提供合适的工具是确保其强大功能的关键,LangChain作为一个支持创建和管理工具的框架,能让开发者以模块化方式扩展代理的能力。

  • 当构建代理时,需要为其提供一组工具列表,代理可以使用这些工具。除了调用的实际函数之外,工具由几个组件组成:
    • name(str)是必需的,并且在提供给代理的工具集中必须是唯一的;
    • description(str)是可选的但建议的,因为代理使用它来确定工具的使用方式;
    • return_direct(bool)默认为False;
    • args_schema(PydanticBaseModel)是可选的但建议的,可以用于提供更多信息或用于验证预期参数。

二创建自定义工具的三种方法

  • LangChain为开发人员提供了不同的方式来创建工具,这些工具可以被智能代理或语言模型调用。
    • 第一种方法是使用@tool装饰器(定义自定义工具的最简单方法);
    • 第二种方法是使用StructuredTool类,允许更细粒度的配置而无需过多的代码;
    • 第三种方法是基于BaseTool类构造子类显式自定义工具,工具定义提供最大限度的把控,但需要做更多的工作。

2.1 方法一:@tool 装饰器

  • 使用@tool修饰符是自定义工具最简单的方法。默认情况下修饰符用函数的名字作为工具名称,但传字符串作为第一个参数可以重命名工具名称。例如,可以创建一个总是返回字符串"LangChain"的虚构搜索函数,或者将两个数字相乘的乘法函数。这些函数最大的区别是第一个函数只有一个输入,第二个函数需要多个输入。

2.1.1 同步方法案例

from langchain_core.tools import tool
@tool
def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*bprint(multiply.name) # multiply
print(multiply.description) # Multiply two numbers
print(multiply.args) # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

2.1.2 工具描述方式1:传参

  • 通过将工具名称和 JSON 参数传递给工具装饰器进行自定义
from langchain_core.tools import tool
from pydantic import BaseModel, Fieldclass CalculatorInput(BaseModel):a: int = Field(description="The first number")b: int = Field(description="The second number")@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)
def multiply(a: int, b: int) -> int:"""Multiply two numbers"""return a * bprint(multiply.name)  # multiplication-tool
print(multiply.description)  # Multiply two numbers
print(multiply.args)  # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}
print(multiply.return_direct)  # True

2.1.3 工具描述方式2:文档字符串

  • @tool 可以选择性地解析 Google 风格文档字符串,并将文档字符串组件(如参数描述)与工具模式的相关部分关联起来。
@tool(parse_docstring=True)
def foo(bar: str, baz: int) -> str:"""The foo.Args:bar: The bar.baz: The baz."""return bar
foo.args_schema.schema()
{'description': 'The foo.','properties': {'bar': {'description': 'The bar.','title': 'Bar','type': 'string'},'baz': {'description': 'The baz.', 'title': 'Baz', 'type': 'integer'}},'required': ['bar', 'baz'],'title': 'fooSchema','type': 'object'}

2.2 方法二:StructuredTool类

  • 使用StructuredTool类,允许更细粒度的配置而无需过多的代码

2.2.1 StructuredTool创建自定义工具

  • 使用StructuredToolfrom_function可以创建自定义工具,包含两个参数func,coroutine,分别指定同步方法和异步方法。
import asyncio
from langchain_core.tools import StructuredTooldef multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*b
async def a_multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*basync def main():calculator=StructuredTool.from_function(func=multiply,coroutine=a_multiply)print(calculator.run({"a":2, "b":3}))print(calculator.invoke({"a":2, "b":3}))print(await calculator.ainvoke({"a":2, "b":5}))asyncio.run(main())

2.2.2 StructuredTool配置信息

import asyncio
from langchain_core.tools import StructuredTool
from pydantic import Field, BaseModelclass CalculatorInput(BaseModel):a: int = Field(description="The first number")b: int = Field(description="The second number")#创建同步、异步包装器函数
def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*b
async def async_multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*basync def main():calculator=StructuredTool.from_function(func=multiply,name="calculator",description="Multiply two numbers",args_schema=CalculatorInput,coroutine=async_multiply,return_direct=True)print(calculator.name)print(calculator.description)print(calculator.args)asyncio.run(main())

2.3 方法三:BaseTool类

  • 接受字符串或 dict 输入的 LangChain Runnables 可以使用 as_tool 方法转换为工具,该方法允许为参数指定名称、描述和其他模式信息。
# 导入所需的模块
from langchain_core.language_models import GenericFakeChatModel  # 导入一个假的聊天模型,用于测试
from langchain_core.output_parsers import StrOutputParser  # 导入字符串输出解析器
from langchain_core.prompts import ChatPromptTemplate  # 导入聊天提示模板# 创建一个聊天提示模板,包含一个占位符 {answer_style}
prompt = ChatPromptTemplate.from_messages([("human", "Hello. Please respond in the style of {answer_style}.")]
)# 创建一个假的聊天模型实例,并提供一个固定的响应
llm = GenericFakeChatModel(messages=iter(["hello matey"]))# 构建一个链式调用:先应用提示模板,然后调用 LLM,最后解析输出为字符串
chain = prompt | llm | StrOutputParser()# 将 chain 转换为一个工具(Tool),并指定名称和描述
as_tool = chain.as_tool(name="Style responder", description="Description of when to use tool."
)# 打印工具的参数信息
print(as_tool.args) # {'answer_style': {'title': 'Answer Style', 'type': 'string'}}

三 异步工具的实现

  • LangChain的工具可以实现异步版本,以节省计算资源和提高效率。在定义异步工具时,需要使用async/await语法,并确保函数和工具名准确反映功能,提供详细的文档字符串。对于涉及外部API调用的工具,建议使用API代理服务来提高访问的稳定性,并确保异步工具充分利用并发优势,避免阻塞操作。
from langchain_core.tools import tool@tool
async def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*bprint(multiply.name) # multiply
print(multiply.description) # Multiply two numbers
print(multiply.args) # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

四 工具错误处理策略

  • 为了让代理能从错误中恢复并继续执行,需要特定的错误处理策略。可以抛出ToolException并定义错误处理函数,设置handle_tool_error属性来定义工具错误的应对策略,可以是字符串、布尔值或函数。需要注意的是仅引发ToolException是无效的,需要先设置该工具的handle_tool_error,因为它的默认值为False
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""获取给定城市的天气。"""raise ToolException(f"错误:没有名为{city}的城市。")get_weather_tool = StructuredTool.from_function(func=get_weather,# 默认情况下,如果函数抛出TooLException,则将TooLException的message作为响应。# 如果设置为True,则将返回TooLException异常文本,False将会抛出TooLExceptionhandle_tool_error=True,
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 错误:没有名为天京的城市。
  • 定义异常处理
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""获取给定城市的天气。"""raise ToolException(f"错误:没有名为{city}的城市。")get_weather_tool = StructuredTool.from_function(func=get_weather,handle_tool_error="没有找到这个城市",
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 没有找到这个城市
  • 异常个性化处理
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""获取给定城市的天气。"""raise ToolException(f"错误:没有名为{city}的城市。")def _handle_tool_error(error: ToolException) -> str:"""处理工具错误。"""return f"工具执行期间发生以下错误:`{error.args[0]}`"get_weather_tool = StructuredTool.from_function(func=get_weather,handle_tool_error=_handle_tool_error
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 工具执行期间发生以下错误:`错误:没有名为天京的城市。`

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

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

相关文章

【信息系统项目管理师-选择真题】2025上半年(第二批)综合知识答案和详解(回忆版)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…

「EN 18031」访问控制机制(ACM - 1):智能路由器的安全守卫

家用路由器要是出口欧洲,可得留意欧盟EN18031标准里的访问控制机制。以路由器为例,访问控制机制(ACM)能决定谁能连入网络、访问哪些网站。比如通过设置不同的用户角色和权限,家长可以限制孩子设备的上网时间和可访问的…

关于项目多语言化任务的概述

今天的任务一个是关于多语言化的,也就是i18n,我需要做的呢首先是知道项目多语言是怎么实现的,一般情况下没有多语言化这个功能的时候,我们会写一个页面,默认是英文,然后里面的文本都是英文,那么…

护网行动面试试题(2)

文章目录 51、常见的安全工具有哪些?52、说说Nmap工具的使用?53、近几年HW常见漏洞有哪些?54、HW 三(四)大洞56、获得文件读取漏洞,通常会读哪些文件57、了解过反序列化漏洞吗?58、常见的框架漏…

Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)

Transformer-BiGRU多变量时序预测(Matlab完整源码和数据) 目录 Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-BiGRU多变量时间序列预测&…

SOC-ESP32S3部分:31-ESP-LCD控制器库

飞书文档https://x509p6c8to.feishu.cn/wiki/Syy3wsqHLiIiQJkC6PucEJ7Snib ESP 系列芯片可以支持市场上常见的 LCD(如 SPI LCD、I2C LCD、并行 LCD (Intel 8080)、RGB/SRGB LCD、MIPI DSI LCD 等)所需的各种时序。esp_lcd 控制器为上述各类 LCD 提供了一…

苹果电脑深度清理,让老旧Mac重焕新生

在日常使用苹果电脑的过程中,随着时间推移,系统内会积累大量冗余数据,导致电脑运行速度变慢、磁盘空间紧张。想要让设备恢复流畅,苹果电脑深度清理必不可少。那么,如何进行苹果电脑深度清理呢?接下来为你详…

如何处理React中表单的双向数据绑定?

在前端开发中,双向数据绑定(Two-way Data Binding)是指视图(View)与数据模型(Model)之间保持同步:当模型发生变化时,视图会自动更新;当视图(用户输…

手机上网可以固定ip地址吗?详细解析

在移动互联网时代,手机已成为人们日常上网的主要设备之一。无论是工作、学习还是娱乐,稳定的网络连接都至关重要。许多用户对IP地址的概念有所了解,尤其是固定IP地址的需求。那么,手机上网能否固定IP地址?又该如何实现…

Spring Boot + Prometheus 实现应用监控(基于 Actuator 和 Micrometer)

文章目录 Spring Boot Prometheus 实现应用监控(基于 Actuator 和 Micrometer)环境准备示例结构启动和验证验证 Spring Boot 应用Prometheus 抓取配置(静态方式)Grafana 面板配置总结 Spring Boot Prometheus 实现应用监控&…

rk3588 上运行smolvlm-realtime-webcam,将视频转为文字描述

smolvlm-realtime-webcam 是一个开源项目,结合了轻量级多模态模型 SmolVLM 和本地推理引擎 llama.cpp,能够在本地实时处理摄像头视频流,生成自然语言描述, 开源项目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…

原生js操作元素类名(classList,classList.add...)

1、classList classList属性是一个只读属性&#xff0c;返回元素的类名&#xff0c;作为一个DOMTokenList集合(用于在元素中添加&#xff0c;移除及切换css类) length:返回类列表中类的数量&#xff0c;该属性是只读的 <style> .lis { width: 200px; …

九.C++ 对引用的学习

一.基本概念 引用即内存的别名 int a 10; int& b a; 引用本身不占用内存&#xff0c;并非实体&#xff0c;对引用的所有操作都是在对目标内存进行操作 引用必须初始化&#xff0c;且不能更换对象 int c 5; b c; // 仅仅是在对引用的目标内存进行赋值 #include <ios…

7.2.1_顺序查找

知识总览&#xff1a; 顺序查找&#xff1a; 算法思想&#xff1a; 从头到脚挨个找或者从脚到头挨个找适用于线性表(顺序存储和链式存储都适用)&#xff0c;又叫线性查找 实现&#xff1a; 1个数组elem指向数组的起始位置&#xff0c;索引从0开始遍历数组直到找到目标值返回…

视觉SLAM基础补盲

3D Gaussian Splatting for Real-Time Radiance Field Rendering SOTA方法3DGS contribution传统重建基于点的渲染NeRF 基础知识补盲光栅化SFM三角化极线几何标准的双目立体视觉立体匹配理论与方法立体匹配的基本流程李群和李代数 李群和李代数的映射李代数的求导李代数解决求导…

如何利用 Redis 实现跨多个无状态服务实例的会话共享?

使用 Redis 实现跨多个无状态服务实例的会话共享是一种非常常见且有效的方案。无状态服务本身不存储会话信息&#xff0c;而是将用户的会话数据集中存储在外部存储中&#xff08;如 Redis&#xff09;&#xff0c;这样任何一个服务实例都可以通过查询外部存储来获取和更新用户的…

《chipyard》docker使用

一、启动/重启服务 二、登入/退出 容器对象查看 sudo docker ps -a # 查看容器列表 登入已例化的容器 sudo docker exec -it -u root 737ed3ddd5ff bash # 737ed3ddd5ff<容器名称/ID> 三、容器编辑 删除单个容器 sudo docker stop <容器ID> #停止容器 s…

浏览器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 简单回顾下上节前三个阶段的主要内容&#xff1a;在HTML页面内容被提交给渲染引擎之后&#xff0c;渲染引擎首先将HTML解析为浏览器可以理解的DOM&#xff1b;然后根据CSS样式表&#xff0c;计算出DOM树所有节点的样式&#xff1b;接着又计算每个元素…

AI书签管理工具开发全记录(十三):TUI基本框架搭建

文章目录 AI书签管理工具开发全记录&#xff08;十三&#xff09;&#xff1a;TUI基本框架搭建前言 &#x1f4dd;1.TUI介绍 &#x1f50d;2. 框架选择 ⚙️3. 功能梳理 &#x1f3af;4. 基础框架搭建⚙️4.1 安装4.2 参数设计4.3 绘制ui4.3.1 设计结构体4.3.2 创建头部4.3.3 创…

CC7利用链深度解析

CommonsCollections7&#xff08;CC7&#xff09;是CC反序列化利用链中的重要成员&#xff0c;由Matthias Kaiser在2016年发现。本文将从底层原理到实战利用&#xff0c;全面剖析这条独特而强大的利用链。 一、CC7链技术定位 1.1 核心价值 无第三方依赖&#xff1a;仅需JDK原…