Skip to content

RAG(检索增强生成)

RAG(Retrieval-Augmented Generation)是解决 LLM "幻觉"和"知识过期"问题的最有效方案。

什么是 RAG

LLM 的痛点:

  • 训练数据有截止日期(不知道最新信息)
  • 无法访问私有数据(公司内部文档)
  • 会编造答案(幻觉)

RAG 的解决方案:让 LLM 在回答前,先查资料

传统 LLM:
用户问 → LLM 直接答(可能瞎编)

RAG:
用户问 → 先检索相关资料 → 把资料给 LLM → LLM 基于资料回答

RAG 工作流程

┌───────────┐
│ 1. 建立知识库                              │
│   文档 → 切片 → 向量化 → 存入向量数据库     │
└───────────┘

┌───────────┐
│ 2. 用户提问                                │
│   问题 → 向量化 → 在向量库中检索相关片段    │
└───────────┘

┌───────────┐
│ 3. 增强生成                                │
│   问题 + 检索到的片段 → LLM → 最终答案      │
└───────────┘

核心步骤详解

1. 文档切片(Chunking)

把文档切成小块,太大则检索不精准,太小则丢失上下文:

python
# 常见策略
- 按固定字数切分(如每 500 字一块)
- 按段落切分
- 按语义切分(保留完整意思)
- 滑动窗口(相邻块有重叠)

2. 向量化(Embedding)

把文本转换成向量(数字数组),语义相似的文本向量也相似:

python
from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("什么是 RAG?")
# vector: [0.123, -0.456, ..., 0.789]  1536 维

3. 向量检索

用户提问 → 转成向量 → 在向量库中找最相似的文档片段:

python
# 语义相似,不是关键词匹配
查询:"怎么部署 Docker?"
检索结果:包含"Docker 部署步骤""Docker 安装教程"的片段
(即使没有完全匹配"怎么部署"这个词)

4. 生成回答

把检索到的片段作为上下文,让 LLM 基于这些资料回答:

python
prompt = f"""
根据以下资料回答问题,不要使用资料以外的信息。
如果资料中没有答案,请说"不知道"。

资料:
{retrieved_docs}

问题:{user_question}

回答:
"""

技术栈

组件常用选择
Embedding 模型OpenAI text-embedding-3、BGE、M3E
向量数据库Milvus、Pinecone、Chroma、Qdrant
LLMGPT-4、Claude、本地模型
框架LangChain、LlamaIndex

简单实现(LangChain)

python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

# 1. 构建向量库
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

loader = TextLoader("company_docs.txt")
documents = loader.load()
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(documents)

vectorstore = Chroma.from_documents(docs, OpenAIEmbeddings())

# 2. 创建 RAG 链
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(),
    retriever=vectorstore.as_retriever()
)

# 3. 提问
answer = qa.run("公司的年假政策是什么?")

RAG 优化技巧

1. Hybrid Search(混合检索)

向量检索 + 关键词检索,各有优势:

python
# 向量检索:语义相似("怎么部署" ≈ "部署步骤")
# 关键词检索:精确匹配(必须包含"Docker")
# 两者结合,效果最好

2. Rerank(重排序)

检索到 20 个候选,用更精确的模型重新排序,取 Top 5:

python
# 第一遍:快速检索(向量相似度)
candidates = vectorstore.similarity_search(query, k=20)

# 第二遍:精确重排(Cross-Encoder)
reranked = rerank_model.rank(query, candidates, top_k=5)

3. 元数据过滤

给每个文档片段加上元数据,检索时先过滤:

python
# 只检索"技术文档"类型的文档
results = vectorstore.similarity_search(
    query,
    filter={"doc_type": "tech_doc"}
)

RAG vs Fine-tuning

维度RAGFine-tuning
知识更新实时(更新文档即可)需要重新训练
成本低(只用 API)高(需要 GPU)
幻觉少(有资料依据)仍可能有
适用场景知识库问答改变模型行为/风格

建议:优先用 RAG,解决不了再考虑 Fine-tuning,或者两者结合。

相关资源