【LangChain】langchain_core.tools.convert_runnable_to_tool() 函数:将 Runnable 对象转换为 BaseTool 对象

langchain_core.tools.convert_runnable_to_tool 详解

langchain_core.tools.convert_runnable_to_tool 是 LangChain 框架中的一个核心函数,用于将 Runnable 对象转换为 BaseTool 对象,使其可以作为代理(Agents)或链(Chains)中的工具使用。本文详细介绍其功能、参数、使用方法、实际应用及注意事项,基于提供的源码和相关信息,确保内容条理清晰、易于理解。

1. 概述

1.1 什么是 convert_runnable_to_tool

convert_runnable_to_toollangchain_core.tools 模块中的一个实用函数,旨在将 LangChain 的 Runnable 对象转换为 BaseTool 对象。Runnable 是 LangChain 的核心接口,支持同步和异步执行、批处理和流式输出,而 BaseTool 是工具的基类,用于定义代理或链可调用的功能单元。该函数根据 Runnable 的输入模式自动选择创建 Tool(适合单一字符串输入)或 StructuredTool(适合多参数输入),并配置执行方法和回调支持。

该函数在 langchain-core 0.2.14 版本中引入,增强了 LangChain 的灵活性和扩展性,允许开发者将现有的 Runnable(如自定义函数或复杂链)集成到工具生态系统中。

1.2 与其他组件的关系

  • BaseToolBaseTool 是所有工具的基类,convert_runnable_to_tool 返回其子类(ToolStructuredTool)。
  • StructuredTool:当输入模式为多参数时,函数生成 StructuredTool,支持复杂输入。
  • @tool 装饰器@tool 装饰器直接从函数创建工具,而 convert_runnable_to_tool 将已有的 Runnable 转换为工具,适合更复杂的场景。
  • InjectedToolArgInjectedToolCallId:支持处理注入参数(如用户 ID 或工具调用 ID),确保工具模式正确。
  • chain 装饰器:结合 langchain_core.runnables.chain,可在工具调用链中动态处理输入或输出。

1.3 核心功能

  • 工具类型选择:根据 Runnable 的输入模式(字符串或对象)选择 ToolStructuredTool
  • 执行方法包装:为工具定义同步和异步执行方法,支持回调传递。
  • 输入模式适配:使用 args_schemaarg_types 定义输入结构,或从 Runnable 推断。
  • 回调支持:通过包装函数支持回调,便于监控和日志记录。
  • 版本要求:需 langchain-core>=0.2.14,具体功能可能依赖最新版本。

2. 定义与参数

2.1 函数签名

def convert_runnable_to_tool(
    runnable: Runnable,
    args_schema: Optional[type[BaseModel]] = None,
    *,
    name: Optional[str] = None,
    description: Optional[str] = None,
    arg_types: Optional[dict[str, type]] = None,
) -> BaseTool:

2.2 参数详解

参数类型默认值描述
runnableRunnable无默认要转换的 Runnable 对象,必须提供。
args_schemaOptional[type[BaseModel]]None可选,Pydantic 模型,定义工具的输入模式。若提供,则设置 Runnable 的输入类型。
nameOptional[str]None可选,工具的名称。若未提供,则调用 runnable.get_name() 获取。
descriptionOptional[str]None可选,工具的描述。若未提供,则调用 _get_description_from_runnable 提取。
arg_typesOptional[dict[str, type]]None可选,参数名称到类型的字典,用于生成输入模式,适用于 Runnable 模式不明确时。

2.3 返回值

  • 类型BaseTool
  • 描述:返回一个 BaseTool 子类实例(ToolStructuredTool),根据输入模式确定。

3. 工作原理

根据提供的源码,函数的工作流程如下:

  1. 设置输入类型

    • 若提供了 args_schema,调用 runnable.with_types(input_type=args_schema),设置 Runnable 的输入类型。
  2. 获取名称和描述

    • 若未提供 name,调用 runnable.get_name() 获取名称。
    • 若未提供 description,调用 _get_description_from_runnable(runnable) 提取描述。
  3. 确定输入模式

    • 获取 runnable.input_schema.model_json_schema(),检查模式类型。

    • 若模式为字符串("type": "string"

      • 创建 Tool 对象,设置:
        • name:工具名称。
        • func=runnable.invoke:同步执行方法。
        • coroutine=runnable.ainvoke:异步执行方法。
        • description:工具描述。
    • 否则(模式为对象或其他)

      • 定义包装函数:
        • ainvoke_wrapper:异步包装,调用 await runnable.ainvoke(kwargs, config={"callbacks": callbacks})
        • invoke_wrapper:同步包装,调用 runnable.invoke(kwargs, config={"callbacks": callbacks})
      • 确定 args_schema
        • arg_typesNone 且模式为对象("type": "object")且有属性("properties"),使用 runnable.input_schema
        • 否则,调用 _get_schema_from_runnable_and_arg_types 生成模式。
      • 使用 StructuredTool.from_function 创建工具,设置:
        • name:工具名称。
        • func=invoke_wrapper:同步执行方法。
        • coroutine=ainvoke_wrapper:异步执行方法。
        • description:工具描述。
        • args_schema:输入模式。

4. 使用方法

以下是 convert_runnable_to_tool 的主要使用方式,结合前文内容展示具体示例:

4.1 转换简单 RunnableTool

将单一字符串输入的 Runnable 转换为 Tool

from langchain_core.runnables import RunnableLambda
from langchain_core.tools import convert_runnable_to_tool

def search(query: str) -> str:
    """模拟搜索逻辑"""
    return f"Search results for: {query}"

runnable = RunnableLambda(search)
tool = convert_runnable_to_tool(
    runnable,
    name="SearchTool",
    description="Perform a search based on a query string"
)
result = tool.invoke("LangChain")  # 输出 "Search results for: LangChain"

说明:由于输入模式为字符串,函数创建 Tool 对象,使用 runnable.invokerunnable.ainvoke

4.2 转换复杂 RunnableStructuredTool

将多参数输入的 Runnable 转换为 StructuredTool

from langchain_core.runnables import RunnableLambda
from pydantic import BaseModel, Field
from langchain_core.tools import convert_runnable_to_tool

class AddInput(BaseModel):
    a: int = Field(description="第一个数字")
    b: int = Field(description="第二个数字")

def add(input: AddInput) -> int:
    """添加两个数字"""
    return input.a + input.b

runnable = RunnableLambda(add).with_types(input_type=AddInput)
tool = convert_runnable_to_tool(
    runnable,
    name="AddTool",
    description="Add two numbers"
)
result = tool.invoke({"a": 2, "b": 3})  # 输出 5

说明:输入模式为对象,函数创建 StructuredTool,使用包装函数支持回调。

4.3 使用 arg_types

Runnable 没有明确输入模式时,提供 arg_types

runnable = RunnableLambda(lambda x, y: x + y)
tool = convert_runnable_to_tool(
    runnable,
    name="AddTool",
    description="Add two numbers",
    arg_types={"x": int, "y": int}
)
result = tool.invoke({"x": 2, "y": 3})  # 输出 5

说明arg_types 用于生成 args_schema,确保工具支持多参数输入。

4.4 结合 chain 装饰器和 InjectedToolArg

结合前文讨论的 InjectedToolArgchain 装饰器,注入运行时参数:

from langchain_core.runnables import chain, RunnableLambda
from langchain_core.tools import convert_runnable_to_tool, InjectedToolArg
from pydantic import BaseModel, Field
from typing_extensions import Annotated

class UpdateInput(BaseModel):
    name: str = Field(description="用户名")

def update_user(input: UpdateInput, user_id: Annotated[str, InjectedToolArg]) -> str:
    return f"Updated user {user_id} with name {input.name}"

runnable = RunnableLambda(update_user).with_types(input_type=UpdateInput)
tool = convert_runnable_to_tool(
    runnable,
    name="UpdateUserTool",
    description="Update user profile"
)

@chain
def inject_user_id(input):
    return {**input, "user_id": "123"}

chain = inject_user_id | tool
result = chain.invoke({"name": "Alice"})  # 输出 "Updated user 123 with name Alice"

说明chain 装饰器注入 user_id,工具通过包装函数处理输入。

5. 实际应用

convert_runnable_to_tool 在以下场景中广泛使用:

  • 集成自定义逻辑:将自定义函数或链(如数据处理管道)转换为工具,集成到代理系统中。
  • 模块化功能:将复杂处理链(如检索文档、生成摘要)封装为工具,简化代理或链的设计。
  • 回调支持:通过包装函数支持回调,便于使用 LangSmith 进行监控和日志记录。
  • 扩展工具生态:将现有的 Runnable(如 RunnableLambda、提示模板或模型链)转换为工具,增强 LangChain 的扩展性。

示例:RAG 工具

将 RAG(检索增强生成)链转换为工具:

from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.tools import create_retriever_tool

# 假设有一个检索器工具
retriever_tool = create_retriever_tool(...)

# 定义 RAG 链
prompt = ChatPromptTemplate.from_template("Answer based on: {docs}\nQuestion: {question}")
chain = (
    {"docs": retriever_tool, "question": RunnablePassthrough()}
    | prompt
    | ChatOpenAI()
)

# 转换为工具
rag_tool = convert_runnable_to_tool(
    chain,
    name="RAGTool",
    description="Answer questions using retrieved documents"
)
result = rag_tool.invoke("LangChain 是什么?")

说明:RAG 链被转换为工具,代理可直接调用。

6. 最佳实践

  • 定义输入模式:确保 Runnable 有明确的 input_schema,或提供 args_schemaarg_types 以生成正确的模式。
  • 提供名称和描述:设置有意义的 namedescription,例如:
    description = "Add two numbers. Example: {'a': 2, 'b': 3} returns 5."
    
  • 支持回调:利用包装函数的回调支持,确保监控和日志记录。
  • 版本检查:通过 pip install -qU langchain 确保安装 langchain-core>=0.2.14
  • 调试工具:使用 LangSmith 跟踪工具调用,调试复杂链或代理。

7. 注意事项与限制

  • 输入模式依赖:若 Runnable 没有定义 input_schema,且未提供 args_schemaarg_types,可能导致模式生成失败。
  • 回调配置:包装函数传递回调,需确保 config 中正确设置 callbacks
  • 模块路径:确保正确导入 langchain_core.tools.convert_runnable_to_tool
  • 版本依赖:功能可能受版本限制,需确保兼容最新版本。
  • 异步环境:异步调用需在支持 asyncio 的环境中运行。

8. 结论

langchain_core.tools.convert_runnable_to_tool 是一个高效的函数,通过将 Runnable 对象转换为 BaseTool 对象,扩展了 LangChain 工具生态系统的功能。它根据输入模式自动选择 ToolStructuredTool,并支持同步、异步执行和回调,适合集成自定义逻辑和复杂工作流。结合 BaseToolStructuredToolInjectedToolArgchain 装饰器,开发者可以构建灵活、可维护的 LangChain 应用。遵循最佳实践并注意版本要求,将有助于充分发挥其功能。

9. 参考资料

内容概要:本文详细介绍了基于Simulink平台构建的锂电池供电与双向DCDC变换器智能切换工作的仿真模型。该模型能够根据锂离子电池的状态荷电(SOC)自动或手动切换两种工作模式:一是由锂离子电池通过双向DCDC变换器向负载供电;二是由直流可控电压源为负载供电并同时通过双向DCDC变换器为锂离子电池充电。文中不仅提供了模式切换的具体逻辑实现,还深入探讨了变换器内部的电压电流双环控制机制以及电池热管理模型的关键参数设定方法。此外,针对模型使用过程中可能遇到的问题给出了具体的调试建议。 适用人群:从事电力电子、新能源汽车、储能系统等领域研究和技术开发的专业人士,尤其是那些希望深入了解锂电池管理系统及其与电源转换设备交互机制的研究者和工程师。 使用场景及目标:适用于需要评估和优化锂电池供电系统的性能,特别是涉及双向DCDC变换器的应用场合。通过学习本文提供的理论知识和实践经验,可以帮助使用者更好地理解和掌握相关技术细节,从而提高实际项目的设计效率和可靠性。 其他说明:为了确保仿真的准确性,在使用该模型时需要注意一些特定条件,如仿真步长限制、电池初始SOC范围以及变换器电感参数的选择等。同时,对于可能出现的震荡发散现象,文中也提供了一种有效的解决办法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值