工具是在AI模型中被调用并将输出反馈给模型的实用程序。有时,我们希望将工具执行的工件,例如自定义对象、数据帧或图像,传递给链或代理中的下游组件,但不希望向模型本身暴露这些工件。为了实现这一点,Tool
和 ToolMessage
接口提供了一个机制,以区分提供给模型的信息 (ToolMessage.content
) 和供外部使用的信息 (ToolMessage.artifact
)。
技术背景介绍
在 AI 开发中,工具的设计通常是为了简单地处理数据并将结果反馈给模型。然而,在复杂的应用场景中,我们需要将模型无法处理的数据或信息传递给其他组件,这就涉及到工具工件的处理。
本功能在 langchain-core
版本 0.2.19
中添加。如果您希望使用此功能,请确保您的库版本已更新。
核心原理解析
为了实现工具输出的区分,我们需要定义工具时指定 response_format="content_and_artifact"
,并确保工具返回一个内容和工件的元组 (content, 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
# 直接调用工具方法
generate_random_ints.invoke(
{
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # 必须提供的工具调用ID
"type": "tool_call", # 必须指定为工具调用
}
)
上述代码演示了如何定义一个工具以返回执行结果和工件。可以看到,通过提供工具调用相关信息,我们获得了完整的工具消息 ToolMessage
,其中包含内容和工件。
应用场景分析
在实际应用中,您可能需要将工具的数值结果传递给其他组件,例如将数据处理结果输入到机器学习模型或数据分析工具中。这个功能为开发者提供了灵活性,能轻松地将所需的工件传递给特定的处理环节。
实践建议
- 定义工具时,明确区分需要传递给模型的信息和其他需要处理的信息。
- 确保使用最新的
langchain-core
库版本,以支持这些特性。 - 当在复杂应用中处理工具工件时,请详细规划每个组件的交互方式,以确保数据流的合理性和有效性。
如果遇到问题欢迎在评论区交流。
—END—