赞
踩
我们通常将工具调用与函数调用交替使用。尽管函数调用有时指的是单个函数的调用,我们将所有模型视为在每条消息中可以返回多个工具或函数调用。
工具调用允许聊天模型通过“调用工具”来响应给定的提示。虽然名称暗示模型正在执行某些操作,但实际上并非如此!模型生成工具的参数,而实际运行工具(或不运行)取决于用户。例如,如果你想从未结构化的文本中提取与某些模式匹配的输出,你可以给模型一个“提取”工具,该工具接受与所需模式匹配的参数,然后将生成的输出作为你的最终结果。
然而,工具调用不仅限于结构化输出,因为你可以将调用工具的响应反馈回模型以创建更长的交互。例如,给定一个搜索引擎工具,LLM可能首先通过使用参数向搜索引擎发出调用。调用LLM的系统可以接收工具调用,执行它,并将输出返回给LLM以通知其响应。LangChain包括一系列内置工具,并支持多种方法来定义自己的自定义工具。
工具调用并非通用,但许多流行的LLM提供商,包括Anthropic、Cohere、Google、Mistral、OpenAI等,都支持工具调用特性的变体。
LangChain实现了定义工具的标准接口,将它们传递给LLM,并表示工具调用。本指南以及其他工具部分中的“如何操作”页面将向您展示如何使用LangChain使用工具。
支持工具调用特性的聊天模型实现了一个.bind_tools
方法,该方法接收LangChain工具对象的列表,并以预期的格式将它们绑定到聊天模型。随后对聊天模型的调用将包括在对LLM的调用中的工具模式。
例如,我们可以使用@tool
装饰器在Python函数上定义自定义工具的模式:
from langchain_core.tools import tool
@tool
def add(a: int, b: int) -> int:
"""将a和b相加。"""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""将a和b相乘。"""
return a * b
tools = [add, multiply]
API参考: 工具
或者,我们使用Pydantic定义模式:
from langchain_core.pydantic_v1 import BaseModel, Field # 注意这里的文档字符串非常重要,因为它们将与类名一起传递给模型。 class Add(BaseModel): """将两个整数相加。""" a: int = Field(..., description="第一个整数") b: int = Field(..., description="第二个整数") class Multiply(BaseModel): """将两个整数相乘。""" a: int = Field(..., description="第一个整数") b: int = Field(..., description="第二个整数") tools = [Add, Multiply]
我们可以如下绑定它们到聊天模型:
pip install -qU langchain-openai
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
我们将使用.bind_tools()
方法处理将Multiply
转换为模型的正确格式,然后绑定它(即,在每次调用模型时传递它)。
llm_with_tools = llm.bind_tools(tools)
正如我们所见,即使提示没有真正建议工具调用,我们的LLM也进行了调用,因为它被迫这样做。您可以查看bind_tool
的文档,了解所有自定义LLM选择工具的方式。
如果LLM响应中包含工具调用,它们将附加到相应的消息或消息块作为.tool_calls
属性中的一组工具调用对象列表。
请注意,聊天模型可以一次调用多个工具。
ToolCall
是一个类型化的字典,包括工具名称、参数值字典和(可选的)标识符。没有工具调用的消息默认为此属性的空列表。
query = "3乘以12是多少?还有,11加49是多少?"
llm_with_tools.invoke(query).tool_calls
[{'name': 'Multiply',
'args': {'a': 3, 'b': 12},
{ "id": "call_KquHA7mSbgtAkpkmRPaFnJKa"}
{'name': 'Add',
{ "args": {"a": 11, "b": 49}
{ "id": "call_Fl0hQi4IBTzlpaJYlM5kPQhE"}]
.tool_calls
属性应包含有效的工具调用。注意,有时模型提供商可能会输出格式错误的工具调用(例如,不是有效的JSON参数)。在这些情况下,如果解析失败,.invalid_tool_calls
属性中将填充InvalidToolCall实例。InvalidToolCall可以具有名称、字符串参数、标识符和错误消息。
如果需要,输出解析器可以进一步处理输出。例如,我们可以将其转换回原始的Pydantic类:
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
chain = llm_with_tools | PydanticToolsParser(tools=[Multiply, Add])
chain.invoke(query)
[Multiply(a=3, b=12), Add(a=11, b=49)]
现在您已经学会了如何将工具模式绑定到聊天模型并调用这些工具。接下来,您可以了解更多关于如何使用工具的信息:
您还可以查看工具调用的一些更具体用途:
本文介绍了如何在LangChain中使用工具调用功能,包括如何定义工具、将工具绑定到聊天模型以及如何调用这些工具。工具调用允许模型在响应提示时生成工具的参数,而实际执行工具则由用户决定。LangChain支持多种内置工具,并允许用户定义自己的自定义工具。此外,还介绍了如何使用.bind_tools
方法将工具绑定到聊天模型,并展示了如何在LLM响应中包含工具调用。
LangChain:是一个Python库,提供了一系列的工具和接口来与大型语言模型进行交互,包括工具调用、文本生成等。
工具调用(Tool Calling):这是一种功能,允许模型在生成响应时调用外部工具或函数。
.bind_tools
方法:这是聊天模型的一个方法,用于将工具绑定到模型,以便在模型调用时包含工具模式。
@tool
装饰器:在Python中,这是一种用于定义自定义工具的装饰器。
Pydantic:是一个用于数据验证和设置管理的Python库,可以用来定义工具的模式。
API密钥:在使用OpenAI等模型提供商的API时,需要提供有效的API密钥。
输出解析器(Output Parsers):这些工具可以进一步处理模型的输出,例如将输出转换回原始的Pydantic类。
LLM提供商:指提供大型语言模型服务的公司或组织,如OpenAI、Anthropic等。
请注意,实际使用LangChain时,需要确保有有效的API密钥,并且理解如何通过LangChain库与大型语言模型进行交互。此外,LangChain库的安装和配置可能需要一定的Python编程知识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。