基于 LangChain 构建 LLM Agent
LangChain 是一个强大的框架,支持构建应用程序,将外部数据源和计算源连接到大型语言模型(LLM)。本文将介绍如何从简单的 LLM 链开始,逐步构建检索链、对话检索链,并最终实现一个能够自主决定步骤的智能体(Agent)。
1. Agent 概述
在之前的示例中,我们创建的链每一步都是预先确定的。而 Agent(智能体)的核心在于 LLM 可以自主决定采取哪些步骤来完成任务。
简单来说,Agent 就是赋予 LLM 使用工具的能力。在这个示例中,我们将授予 Agent 对两个工具的访问权限:
- 文档检索工具:基于外部知识库(如百度百科)的电影信息。
- 数学计算工具:LangChain 内置的
llm-math工具,用于处理复杂的数学运算。
当用户询问电影相关问题时,Agent 会使用第一个工具;当涉及数学计算时,则调用第二个工具。
2. 环境准备与依赖安装
在开始之前,请确保已安装必要的 Python 库。可以使用 pip 进行安装:
pip install langchain langchain-community langchain-core faiss-cpu torch transformers
同时需要配置好环境变量或 API Key,特别是对于 HuggingFace 模型的使用。
3. 数据加载与向量化
Agent 需要访问外部知识,这通常通过 RAG(检索增强生成)技术实现。我们需要加载网页数据,将其切分,并通过嵌入模型转换为向量存储到向量数据库中。
3.1 初始化嵌入模型
首先加载词嵌入模型。根据硬件情况选择设备(CUDA, MPS 或 CPU)。
from langchain_community.document_loaders import WebBaseLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import torch
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 检测设备
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
# 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name='m3e-base',
model_kwargs={'device': EMBEDDING_DEVICE}
)
3.2 加载与处理文档
加载外部文档并进行文本分割。合理的文本分割有助于提高检索精度。
loader = WebBaseLoader()
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever()


