构建强大LangChain代理:使用AgentExecutor的完整指南
引言
语言模型(LLM)本身无法执行操作,但通过LangChain,我们可以创建代理(agents),它们利用LLM作为推理引擎来决定要采取的行动和相应的输入。本教程将引导您如何使用LangChain的AgentExecutor构建一个代理,该代理能够与本地数据库和搜索引擎进行交互。
主要内容
使用语言模型及其工具调用能力
LangChain使得通过语言模型进行工具调用变得简单。我们将介绍如何设置和调用不同的工具。
创建Retriever以暴露信息
通过构建一个Retriever,我们可以轻松地从本地索引中检索信息,并将其作为工具提供给我们的代理。
使用搜索工具进行在线查找
我们将使用Tavily搜索引擎的工具来实现在线信息查询。
会话历史
通过保存聊天历史,代理能够“记住”用户的先前交互,提升响应的连贯性。
使用LangSmith进行调试和追踪
随着应用复杂性的增加,对应用内部进行调试和追踪变得至关重要。LangSmith为此提供了便捷的解决方案。
代码示例
以下是一个完整的代码示例,展示如何构建一个能够调用工具的代理。
import os
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools.retriever import create_retriever_tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
# 使用API代理服务提高访问稳定性
os.environ["TAVILY_API_KEY"] = "your_tavily_api_key"
search = TavilySearchResults(max_results=2)
loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(retriever, "langsmith_search", "Search for information about LangSmith.")
tools = [search, retriever_tool]
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
model = ChatOpenAI(model="gpt-4")
agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 运行代理
response = agent_executor.invoke({"input": "hi!"})
print(response['output'])
response = agent_executor.invoke({"input": "how can langsmith help with testing?"})
print(response['output'])
常见问题和解决方案
如何解决API访问限制?
由于某些地区的网络限制,API访问可能不稳定。为提高访问稳定性,建议使用API代理服务。
如何在本地测试代码?
建议使用Jupyter Notebook进行交互式测试,如果遇到问题(如输出异常或API不可用),可以更好地调试。
总结和进一步学习资源
本教程介绍了如何使用LangChain构建一个简单代理。代理是一个复杂的主题,涉及许多高级概念。如果您希望深入了解或构建更高级的代理,请参考以下资源:
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---