使用 LangChain 构建智能体应用
LangChain 是一个强大的框架,支持将外部数据源和计算资源连接到大型语言模型(LLM),从而构建复杂的应用程序。本文将带你从基础的 LLM 链开始,逐步构建检索链、对话检索链,最终实现一个能够自主决定行动的智能体(Agent)。
1. 从链到代理的演进
基础 LLM 链
最简单的形式是只依赖提示模板中的信息来响应请求。这种模式适合知识固定的场景。
检索链(Retrieval Chain)
为了处理动态数据,我们可以构建检索链。它先从独立的数据库获取相关数据,再将其注入到提示模板中,增强回答的准确性。
对话检索链
在此基础上添加聊天记录管理,创建对话检索链。这使得 LLM 能够记住上下文,允许用户以自然对话的方式交互。
智能体(Agent)
这是本教程的核心。与预设步骤的链不同,Agent 利用 LLM 的能力来决定下一步该做什么。它可以根据问题类型,自主选择调用工具或生成答案。
2. Agent 核心概念
一句话概括:Agent(代理)是目前构建智能体的基础架构。
构建 Agent 的首要任务是确定其权限范围,即它可以访问哪些工具(Tools)。在本示例中,我们将配置两个核心工具:
- 文档检索工具:基于百度文库或公开网页数据的《让子弹飞》电影信息。
- 数学计算工具:LangChain 内置的
llm-math,用于处理复杂的数值运算。
简单来说,当用户询问电影细节时,Agent 会调用检索工具;当涉及计算时,则调用数学工具。
3. 环境准备与数据加载
在开始之前,需要确保已安装必要的依赖库,如 langchain-community, faiss-cpu, torch 等。以下是初始化嵌入模型、加载网页数据并构建向量数据库的标准流程。
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
# 设置设备:优先使用 GPU (CUDA),其次是 Apple Silicon (MPS),最后是 CPU
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={: EMBEDDING_DEVICE}
)
loader = WebBaseLoader()
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=, chunk_overlap=)
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever(search_kwargs={: })


