构建智能代理:使用LangChain的AgentExecutor(遗留版本)

123 阅读3分钟

构建智能代理:使用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---