如何将可运行对象转换为工具
在这里,我们将演示如何将一个 LangChain 可运行对象
转换为可以被代理、链或聊天模型使用的工具。
依赖
注意:本指南需要 langchain-core
>= 0.2.13。我们还将使用 OpenAI 进行嵌入,但任何 LangChain 嵌入都应该足够。我们将使用一个简单的 LangGraph 代理进行演示。
%%capture --no-stderr
%pip install -U langchain-core langchain-openai langgraph
LangChain 工具 是代理、链或聊天模型与世界交互的接口。有关工具调用、内置工具、自定义工具及更多信息的使用指南,请参见 这里。
LangChain 工具——BaseTool 的实例——是具有额外约束的 可运行对象,使其能够被语言模型有效调用:
- 它们的输入被限制为可序列化,特别是字符串和 Python
dict
对象; - 它们包含名称和描述,指示如何以及何时使 用;
- 它们可能包含详细的 args_schema 以定义其参数。也就是说,虽然一个工具(作为
Runnable
)可能接受单个dict
输入,但填充dict
所需的特定键和类型信息应在args_schema
中指定。
接受字符串或 dict
输入的可运行对象可以使用 as_tool 方法转换为工具,该方法允许为参数指定名称、描述和额外的模式信息。
基本用法
使用类型化的 dict
输入:
<!--IMPORTS:[{"imported": "RunnableLambda", "source": "langchain_core.runnables", "docs": "https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.base.RunnableLambda.html", "title": "How to convert Runnables as Tools"}]-->
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)
as_tool.args_schema.schema()
Explanation of when to use tool.
{'title': 'My tool',
'type': 'object',
'properties': {'a': {'title': 'A', 'type': 'integer'},
'b': {'title': 'B', 'type': 'array', 'items': {'type': 'integer'}}},
'required': ['a', 'b']}
as_tool.invoke({"a": 3, "b": [1, 2]})
'6'
在没有类型信息的情况下,可以通过 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]},
)
或者,可以通过直接传递所需的 args_schema 完全指定模式:
from pydantic import BaseModel, Field
class GSchema(BaseModel):
"""Apply a function to an integer and list of integers."""
a: int = Field(..., description="Integer")
b: List[int] = Field(..., description="List of ints")
runnable = RunnableLambda(g)
as_tool = runnable.as_tool(GSchema)
字符串输入也被支持:
def f(x: str) -> str:
return x + "a"
def g(x: str) -> str:
return x + "z"
runnable = RunnableLambda(f) | g
as_tool = runnable.as_tool()
as_tool.invoke("b")
'baz'