当前位置:   article > 正文

LangChain-v0.2文档翻译:3.4、如何使用模型调用工具_langchain 工具调用

langchain 工具调用

如何使用模型调用工具

工具调用与函数调用

我们通常将工具调用与函数调用交替使用。尽管函数调用有时指的是单个函数的调用,我们将所有模型视为在每条消息中可以返回多个工具或函数调用。

工具调用允许聊天模型通过“调用工具”来响应给定的提示。虽然名称暗示模型正在执行某些操作,但实际上并非如此!模型生成工具的参数,而实际运行工具(或不运行)取决于用户。例如,如果你想从未结构化的文本中提取与某些模式匹配的输出,你可以给模型一个“提取”工具,该工具接受与所需模式匹配的参数,然后将生成的输出作为你的最终结果。

然而,工具调用不仅限于结构化输出,因为你可以将调用工具的响应反馈回模型以创建更长的交互。例如,给定一个搜索引擎工具,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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

我们可以如下绑定它们到聊天模型:

  • OpenAI
pip install -qU langchain-openai
  • 1
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们将使用.bind_tools()方法处理将Multiply转换为模型的正确格式,然后绑定它(即,在每次调用模型时传递它)。

llm_with_tools = llm.bind_tools(tools)
  • 1

正如我们所见,即使提示没有真正建议工具调用,我们的LLM也进行了调用,因为它被迫这样做。您可以查看bind_tool的文档,了解所有自定义LLM选择工具的方式。

工具调用

如果LLM响应中包含工具调用,它们将附加到相应的消息或消息块作为.tool_calls属性中的一组工具调用对象列表。

请注意,聊天模型可以一次调用多个工具。

ToolCall是一个类型化的字典,包括工具名称、参数值字典和(可选的)标识符。没有工具调用的消息默认为此属性的空列表。

query = "3乘以12是多少?还有,11加49是多少?"

llm_with_tools.invoke(query).tool_calls
  • 1
  • 2
  • 3
[{'name': 'Multiply',
  'args': {'a': 3, 'b': 12},
{  "id": "call_KquHA7mSbgtAkpkmRPaFnJKa"}
 {'name': 'Add',
{  "args": {"a": 11, "b": 49}
{  "id": "call_Fl0hQi4IBTzlpaJYlM5kPQhE"}]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

.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)
  • 1
  • 2
  • 3
  • 4
[Multiply(a=3, b=12), Add(a=11, b=49)]
  • 1

下一步

现在您已经学会了如何将工具模式绑定到聊天模型并调用这些工具。接下来,您可以了解更多关于如何使用工具的信息:

  • 使用工具进行少量示例提示
  • 流式工具调用
  • 绑定模型特定工具
  • 向工具传递运行时值
  • 将工具结果传回模型

您还可以查看工具调用的一些更具体用途:

  • 构建使用工具的链和代理
  • 从模型获取结构化输出

总结

本文介绍了如何在LangChain中使用工具调用功能,包括如何定义工具、将工具绑定到聊天模型以及如何调用这些工具。工具调用允许模型在响应提示时生成工具的参数,而实际执行工具则由用户决定。LangChain支持多种内置工具,并允许用户定义自己的自定义工具。此外,还介绍了如何使用.bind_tools方法将工具绑定到聊天模型,并展示了如何在LLM响应中包含工具调用。

扩展知识

  1. LangChain:是一个Python库,提供了一系列的工具和接口来与大型语言模型进行交互,包括工具调用、文本生成等。

  2. 工具调用(Tool Calling):这是一种功能,允许模型在生成响应时调用外部工具或函数。

  3. .bind_tools方法:这是聊天模型的一个方法,用于将工具绑定到模型,以便在模型调用时包含工具模式。

  4. @tool装饰器:在Python中,这是一种用于定义自定义工具的装饰器。

  5. Pydantic:是一个用于数据验证和设置管理的Python库,可以用来定义工具的模式。

  6. API密钥:在使用OpenAI等模型提供商的API时,需要提供有效的API密钥。

  7. 输出解析器(Output Parsers):这些工具可以进一步处理模型的输出,例如将输出转换回原始的Pydantic类。

  8. LLM提供商:指提供大型语言模型服务的公司或组织,如OpenAI、Anthropic等。

请注意,实际使用LangChain时,需要确保有有效的API密钥,并且理解如何通过LangChain库与大型语言模型进行交互。此外,LangChain库的安装和配置可能需要一定的Python编程知识。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/853684
推荐阅读
相关标签
  

闽ICP备14008679号