在AI工具开发中,我们常常需要将工具的输出馈送回模型以便进行进一步处理。然而,工具的执行可能会生成一些我们需要传递给下游组件但不希望直接暴露给模型的产物(工件)。例如,工具可能返回自定义对象、数据框或图像,我们可能只想传递关于这些输出的元数据给模型,同时希望能够在其他地方访问到完整的输出。本文将深入探讨如何实现这一功能。
技术背景介绍
在LangChain工具系统中,Tool和ToolMessage接口使得我们能够区分工具输出中是模型需要的部分(即ToolMessage.content),和用于模型外部的部分(ToolMessage.artifact)。使用这些接口,可以有效地管理工具输出。
版本要求: 确保langchain-core版本在0.2.19及以上。
核心原理解析
要实现内容和工件的区分,我们需要在定义工具时指定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]]:
"""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
调用工具:
result = generate_random_ints.invoke(
{
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # 必须包含
"type": "tool_call", # 必须包含
}
)
print(result)
# 输出包括内容和工件
应用场景分析
在AI应用中,我们可能希望将工具的某些部分直接用于机器学习模型的计算,而其他部分则用于日志记录或下游分析。这种机制提供了一种优雅的方式来处理工具输出的多样化需求。
实践建议
- 确保返回的元组是
(content, artifact)的形式,以正确划分模型需要的内容和其他工件。 - 在实际应用中,根据需要进行工具的链式调用,使得工具的输出可以被精确传递至下一个处理阶段。
如果遇到问题欢迎在评论区交流。
—END—

480

被折叠的 条评论
为什么被折叠?



