赞
踩
工具是代理、链或LLM可以用来与世界互动的接口。它们结合了几个要素:
工具的名称
工具的描述
该工具输入的JSON模式
要调用的函数
是否应将工具结果直接返回给用户
LangChain通过提供统一框架集成功能的具体实现。在框架内,每个功能被封装成一个工具,具有自己的输入输出及处理方法。代理接收任务后,通过大模型推理选择适合的工具处理任务。一旦选定,LangChain将任务输入传递给该工具,工具处理输入生成输出。输出经过大模型推理,可用于其他工具的输入或作为最终结果返回给用户。
简单的说就是:代理根据任务类型和需求通过大模型推理选择工具处理任务,LangChain传递任务输入给工具生成输出,输出再经大模型推理,作为其他工具输入或最终结果返回给用户。
具体工具Tools详情参考:Tools文档
工具名称 | 中文说明 |
---|---|
Alpha Vantage | 提供实时和历史金融市场数据的工具 |
Apify | 用于网络抓取和数据提取的云平台工具 |
ArXiv | 提供访问学术论文和文献的工具 |
AskNews | 为任何LLM注入最新的全球新闻(或历史新闻)的工具 |
AWS Lambda | 提供云函数或无服务器计算的工具 |
Shell (bash) | 提供让LLM使用它来执行任何shell命令的工具 |
Bearly Code Interpreter Bearly | 提供一个代码沙箱(代码解释器),允许远程执行代码的工具 |
Bing Search | 提供 Bing 搜索引擎查询结果的工具 |
Brave Search | 提供 Brave 搜索引擎查询结果的工具 |
ChatGPT Plugins | 插件工具,用于扩展 ChatGPT的功能 |
Connery Action Tool | 提供了各种即用型开源插件,以增加便利性的工具 |
Dall-E Image Generator | OpenAI提供的开发文本到图像模型的工具 |
DataForSeo | 从各种搜索引擎获取搜索结果的工具 |
Dataherald | 提供自然语言到SQL的 API工具 |
DuckDuckGo Search | 提供 DuckDuckGo 搜索引擎查询结果的工具 |
E2B Data Analysis | E2B 的数据分析沙箱允许在沙箱环境中安全执行代码 |
Eden AI | 通过单个API轻松访问更多的AI功能API的工具 |
Eleven Labs Text2Speech | 一个实现文本转语音功能的工具 |
Exa Search | 完全为LLMs使用而设计的搜索引擎工具 |
File System | 提供与本地文件系统交互的工具集 |
Golden Query | 提供基于知识图谱的自然语言查询服务的工具 |
Google Cloud Text-to-Speech | 提供文本转语音功能的工具 |
Google Drive | 提供操作谷歌云端硬盘API的工具 |
Google Places | 提供 Google 地点信息和查询的工具 |
Google Search | 提供 Google 搜索引擎查询结果的工具 |
Google Serper | 用于网络搜索的工具,需要注册并获取 API 密钥 |
Gradio | 提供与 Gradio 应用交互的工具 |
GraphQL | 提供 GraphQL 查询的工具 |
HuggingFace Hub Tools | 提供了与 HuggingFace 库交互的工具 |
Human as a tool | 描述了如何将人类作为一个执行具体任务的工具 |
IFTTT WebHooks | 提供与 IFTTT WebHooks 交互的工具 |
Lemon Agent | 用于实现自动化工作流的工具 |
OpenWeatherMap | 提供查询天气信息的工具 |
PubMed | 提供 PubMed 医学文献查询的工具 |
Requests | 提供网络信息获取功能的工具 |
SceneXplain | 提供图像描述服务的工具 |
Search Tools | 提供各种搜索工具的工具集 |
SearxNG Search | 提供自托管 SearxNG 搜索 API 查询的工具 |
SerpAPI | 提供网络搜索的工具 |
Twilio | 提供 SMS 或其他消息通道发送消息的工具 |
Wikipedia | 提供查询 Wikipedia 百科全书的工具 |
Wolfram Alpha | 提供查询 Wolfram Alpha 的知识引擎的工具 |
YouTube | 提供 YouTube 视频搜索的工具 |
Zapier Natural Language Actions API | 用于自然语言处理的API 工具 |
内置工具:有关所有内置工具的列表,请参阅此页面
自定义工具:虽然内置工具很有用,但很可能必须定义自己的工具。请参阅本指南
工具包:工具包是可以很好地协同工作的工具的集合。请参阅此页面
维基数据是一个自由开放的知识库,人类和机器都可以阅读和编辑。维基数据是世界上最大的开放知识库之一。
WikipediaAPIWrapper是维基百科的包装器,通过它进行维基百科的搜索查询
安装Wikidata相关库
pip install wikipedia
具体实现代码如下
from langchain_community.tools import WikipediaQueryRun from langchain_community.utilities import WikipediaAPIWrapper # 初始化工具 可以根据需要进行配置 # 使用包装器WikipediaAPIWrapper进行搜索并获取页面摘要。默认情况下,它将返回前 k 个结果的页面摘要。它通过 doc_content_chars_max 限制文档内容。 api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100) tool = WikipediaQueryRun(api_wrapper=api_wrapper) # 工具默认名称 print(tool.name) # 工具默认的描述 print(tool.description) # 输入内容 默认JSON模式 print(tool.args) # 工具是否应该直接返回给用户 print(tool.return_direct) # 可以用字典输入来调用这个工具 print(tool.run({"query": "langchain"})) # 使用单个字符串输入来调用该工具。 print(tool.run("langchain"))
wikipedia
A wrapper around Wikipedia. Useful for when you need to answer general questions about people, places, companies, facts, historical events, or other subjects. Input should be a search query.
{'query': {'title': 'Query', 'type': 'string'}}
False
Page: LangChain
Summary: LangChain is a framework designed to simplify the creation of applications
Page: LangChain
Summary: LangChain is a framework designed to simplify the creation of applications
可以修改参数的内置名称、描述和JSON模式。
在定义参数的JSON模式时,重要的是输入保持与函数相同,因此不应更改它,但可以轻松地为每个输入定义自定义描述。
from langchain_community.tools import WikipediaQueryRun from langchain_community.utilities import WikipediaAPIWrapper from langchain_core.pydantic_v1 import BaseModel, Field # 初始化工具 可以根据需要进行配置 api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100) class WikiInputs(BaseModel): """维基百科工具的输入。""" query: str = Field( description="维基百科中的查询,字数应在3个字以内" ) tool = WikipediaQueryRun( name="wiki-tool", description="在维基百科中查找内容", args_schema=WikiInputs, api_wrapper=api_wrapper, return_direct=True, ) print(tool.run("langchain"))
通常使用以下形式代码加载工具
from langchain.agents import load_tools
tool_names = ['tool_name_1','tool_name_2']
tools = load_tools(tool_names)
有些工具(链、代理)可能需要使用LLM来初始化
from langchain.agents import load_tools
tool_names = ['tool_name_1','tool_name_2']
llm = ChatOpenAI(temperature=0.0)
tools = load_tools(tool_names, llm=llm)
在LangChain中,自定义工具有多种方法
@tool装饰器是定义自定义工具的最简单方法。装饰器默认使用函数名称作为工具名称,但可以通过传递字符串作为第一个参数来覆盖此设置。此外,装饰器将使用函数的文档字符串作为工具的描述 - 因此必须提供文档字符串。
示例:
from langchain.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
print(multiply.name)
print(multiply.description)
print(multiply.args)
res = multiply.run({"a": 10, "b": 20})
print(res)
输出:
通过将工具名称和 JSON 参数传递到工具装饰器来自定义
from langchain.pydantic_v1 import BaseModel, Field from langchain.tools import tool class SearchInput(BaseModel): query: str = Field(description="should be a search query") @tool("search-tool", args_schema=SearchInput, return_direct=True) def search(query: str) -> str: """Look up things online.""" return "LangChain" print(search.name) print(search.description) print(search.args) res = search.run({"query": "start test"}) print(res)
通过子类化 BaseTool 类来明确定义自定义工具。这可以最大程度地控制工具定义,但工作量会更大。
示例:
from langchain.pydantic_v1 import BaseModel, Field from typing import Optional, Type from langchain_core.tools import BaseTool from langchain.callbacks.manager import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) class CalculatorInput(BaseModel): a: int = Field(description="第一个数字") b: int = Field(description="第二个数字") class CustomCalculatorTool(BaseTool): name = "Calculator" description = "在需要回答有关数学的问题时很有用" args_schema: Type[BaseModel] = CalculatorInput return_direct: bool = True def _run( self, a: int, b: int, run_manager: Optional[CallbackManagerForToolRun] = None ) -> str: """使用该工具。""" return a * b async def _arun( self, a: int, b: int, run_manager: Optional[AsyncCallbackManagerForToolRun] = None, ) -> str: """异步使用该工具。""" raise NotImplementedError("Calculator 不支持异步") multiply = CustomCalculatorTool() print(multiply.name) print(multiply.description) print(multiply.args) print(multiply.return_direct) res = multiply.run({"a": 10, "b": 20}) print(res)
输出:
还可以使用StructuredTool数据类。此方法是前两种方法的混合。它比从 BaseTool 类继承更方便,但提供的功能比仅使用装饰器更多
from langchain_core.tools import StructuredTool def search_function(query: str): result = query + " : LangChain" return result search = StructuredTool.from_function( func=search_function, name="Search", description="在需要回答有关当前事件的问题时很有用", ) print(search.name) print(search.description) print(search.args) res = search.run("start query") print(res)
自定义 args_schema 来提供有关输入的更多信息
from langchain.pydantic_v1 import BaseModel, Field from langchain_core.tools import StructuredTool class CalculatorInput(BaseModel): a: int = Field(description="第一个数字") b: int = Field(description="第二个数字") def multiply(a: int, b: int) -> int: """将两个数字相乘。""" return a * b calculator = StructuredTool.from_function( func=multiply, name="Calculator", description="multiply numbers", args_schema=CalculatorInput, return_direct=True, ) res = calculator.run({"a":10,"b":20}) print(res)
当工具遇到错误且异常未被捕获时,代理将停止执行。如果希望代理继续执行,可以引发 ToolException 并相应地设置 handle_tool_error。
from langchain_core.tools import StructuredTool from langchain_core.tools import ToolException def search_tool(s: str): raise ToolException("模拟出现异常") search = StructuredTool.from_function( func=search_tool, name="Search_tool", description="一个搜索工具", handle_tool_error=True, ) res = search.run("test") print(res)
当ToolException抛出时,代理不会停止工作,可以根据handle_tool_error工具的变量来处理异常,并将处理结果作为观察返回给代理,并以红色打印。
from langchain_core.tools import StructuredTool from langchain_core.tools import ToolException def search_tool(s: str): raise ToolException("模拟出现异常") def _handle_error(error: ToolException) -> str: result = "工具执行发生错误:" + error.args[0] return result search = StructuredTool.from_function( func=search_tool, name="Search_tool", description="一个搜索工具", handle_tool_error=_handle_error, ) res = search.run("test") print(res)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。