RAG 技术详解:让 Agent 学会读文档

136 阅读3分钟

专栏系列第 5 篇 · 智能体纪元


在前几篇文章中,我们构建了一个基础 Agent,理解了其决策逻辑(ReAct)并通过提示工程提升了智能水平。但你是否遇到过这样的问题:

Agent 回答不了你私有文档中的问题,比如企业内部手册、PDF 报告或技术文档。

这正是 RAG(Retrieval-Augmented Generation)技术要解决的问题。今天,我们就来揭开它的面纱,并实战打造一个能读懂你文档的智能 Agent。


1. 什么是 RAG?

RAG(检索增强生成)是一种 将检索(Retrieval)与生成(Generation)结合起来 的方法。它的基本思路是:

  1. 从外部知识库中检索相关信息(如你的文档);
  2. 把检索结果作为上下文提供给语言模型
  3. 语言模型据此进行回答生成

它的目标是弥补语言模型“只知训练前知识”的缺陷,让 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!

输出:

2025-05-12 14 59 38.png


4. 提示工程与 RAG 协同进化

在 RAG 的基础上使用提示工程,可以进一步优化智能体行为,比如:

  • 指定回答格式:“请分点概括”
  • 控制输出风格:“用专业语气简洁回答”
  • 加入角色设定:“你是文档分析专家”

这使得你的 Agent 不仅“知其然”,更能“言之有物”。


5. 小结与展望

本篇文章我们系统学习了 RAG 技术的原理与实战方法。它是让 Agent 融入私有知识的重要路径,也是实现“个性化智能体”的关键一环。

下一篇,我们将进入多模态智能体的探索,让 Agent 不止能看文本,还能“识图听声”。


如果你喜欢这个系列,欢迎点赞收藏,下期我们将一起迈向更加通用的 Agent 世界!