专栏系列第 5 篇 · 智能体纪元
在前几篇文章中,我们构建了一个基础 Agent,理解了其决策逻辑(ReAct)并通过提示工程提升了智能水平。但你是否遇到过这样的问题:
Agent 回答不了你私有文档中的问题,比如企业内部手册、PDF 报告或技术文档。
这正是 RAG(Retrieval-Augmented Generation)技术要解决的问题。今天,我们就来揭开它的面纱,并实战打造一个能读懂你文档的智能 Agent。
1. 什么是 RAG?
RAG(检索增强生成)是一种 将检索(Retrieval)与生成(Generation)结合起来 的方法。它的基本思路是:
- 从外部知识库中检索相关信息(如你的文档);
- 把检索结果作为上下文提供给语言模型;
- 语言模型据此进行回答生成。
它的目标是弥补语言模型“只知训练前知识”的缺陷,让 Agent 实时“读文档、查资料”。
2. 核心架构解析
RAG 架构由以下几部分组成:
┌────────────┐
│ 用户提问 │
└────┬───────┘
↓
┌────────────┐
│ 检索组件(向量库)│ ← 从文档中检索相关信息
└────┬───────┘
↓
┌────────────┐
│ 语言模型(LLM) │ ← 根据检索信息生成答案
└────┬───────┘
↓
┌────────────┐
│ 返回答案 │
└────────────┘
关键组件包括:
- 文档加载与切分(Loader & Splitter)
- 向量化存储(Vector Store)
- 语言模型集成(LLM + Prompt)
- 查询链路(RetrievalQA Chain)
3. 实战:让 Agent 读懂你的 PDF 文档
Step 1:安装所需依赖
pip install langchain openai faiss-cpu pypdf tiktoken
Step 2:构建 RAG Agent
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
# 1. 加载文档
loader = PyPDFLoader("GB+38031-2025.pdf")
pages = loader.load()
# 2. 文本切分
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(pages)
# 3. 构建向量数据库
# embedding_model = OpenAIEmbeddings()
# 创建中文 Embedding 模型(bge-small-zh)
embedding_model = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh",
model_kwargs={"device": "cpu"}, # 如果你有 GPU,可改为 "cuda"
encode_kwargs={"normalize_embeddings": True} # 官方推荐开启
)
db = FAISS.from_documents(docs, embedding_model)
# retriever = db.as_retriever()
# results = retriever.get_relevant_documents("文档中提到的某个关键词")
#
# for i, doc in enumerate(results):
# print(f"匹配结果 {i+1}: {doc.page_content}")
# 4. 初始化语言模型
API_KEY = os.getenv('DEEPSEEK_API_KEY')
llm = ChatOpenAI(
model='deepseek-chat',
openai_api_key=API_KEY,
openai_api_base='https://api.deepseek.com/v1'
)
# 5. 构建 RAG 问答链
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=db.as_retriever(),
return_source_documents=True
)
# 6. 提问
query = "请用中文回答:这份文档的核心内容有哪些?"
response = rag_chain.invoke({"query": query})
print(response["result"])
你现在拥有了一个能“读懂 PDF 并回答问题”的 Agent!
输出:
4. 提示工程与 RAG 协同进化
在 RAG 的基础上使用提示工程,可以进一步优化智能体行为,比如:
- 指定回答格式:“请分点概括”
- 控制输出风格:“用专业语气简洁回答”
- 加入角色设定:“你是文档分析专家”
这使得你的 Agent 不仅“知其然”,更能“言之有物”。
5. 小结与展望
本篇文章我们系统学习了 RAG 技术的原理与实战方法。它是让 Agent 融入私有知识的重要路径,也是实现“个性化智能体”的关键一环。
下一篇,我们将进入多模态智能体的探索,让 Agent 不止能看文本,还能“识图听声”。
如果你喜欢这个系列,欢迎点赞收藏,下期我们将一起迈向更加通用的 Agent 世界!