构建智能代理:使用LangChain的AgentExecutor(遗留版本)
引言
在当今的科技世界中,智能代理的应用越来越广泛。LangChain提供了一个强大的框架来构建这样的代理。虽然LangChain的遗留AgentExecutor是一个很好的起点,但我们也应了解其局限性以及何时需要更灵活的解决方案。本教程将指导您如何利用LangChain创建一个能够与多个工具交互的智能代理。
主要内容
基本概念
我们将探索:
- 使用语言模型的工具调用能力
- 创建一个检索器来向代理公开特定信息
- 使用搜索工具在线查找信息
- 聊天记录功能,让聊天机器人"记住"过去的互动
- 使用LangSmith调试和跟踪应用程序
设置环境
我们建议在Jupyter Notebook中执行本教程,确保能够进行即时的交互式学习。安装LangChain的命令如下:
pip install langchain
# 或
conda install langchain -c conda-forge
调试环境LangSmith
在构建复杂应用程序时,了解链或代理内部发生的事情至关重要。LangSmith提供了这样的能力。设置环境变量以开始记录追踪:
import os
import getpass
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
定义工具
我们将创建两个工具:一个是Tavily搜索引擎,另一个是本地索引的检索器。
Tavily搜索工具
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=2)
# 使用API代理服务提高访问稳定性
检索器
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
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()
使用语言模型
选择一个合适的语言模型,例如OpenAI的GPT-4:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")
创建代理和执行工具
from langchain.agents import create_tool_calling_agent, AgentExecutor
agent = create_tool_calling_agent(model, [search, retriever])
agent_executor = AgentExecutor(agent=agent, tools=[search, retriever])
代码示例
以下是一个使用LangChain创建智能代理的完整代码示例:
# 定义和导入必要的模块及工具
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
# 初始化模型和工具
search = TavilySearchResults(max_results=2) # 使用API代理服务提高访问稳定性
model = ChatOpenAI(model="gpt-4")
# 创建代理和执行器
from langchain.agents import create_tool_calling_agent, AgentExecutor
agent = create_tool_calling_agent(model, [search])
agent_executor = AgentExecutor(agent=agent, tools=[search])
# 运行代理
response = agent_executor.invoke({"input": "What is the weather in SF?"})
print(response)
常见问题和解决方案
- 访问API的网络问题:如果您在某些地区,可能会遇到访问问题,建议使用API代理服务来解决。
- 内存和状态管理:默认情况下,代理是无状态的。可以通过实现
ChatMessageHistory来进行状态管理。
总结和进一步学习资源
本教程介绍了如何使用LangChain的遗留版本AgentExecutor构建基本智能代理。推荐深入了解LangGraph Agents和更高级的代理实现方式。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---