35 分钟
实战专项

RAG 检索增强生成:从原理到生产

掌握 RAG 系统的完整构建流程,能搭建生产级知识库问答系统

  • 理解 RAG 的原理和适用场景
  • 掌握文档切分、Embedding、向量检索
  • 学会混合检索和 Rerank 优化
  • 了解 RAG 的评估和常见问题

为什么需要 RAG?

LLM 的知识有截止日期,且不了解你的私有数据。RAG(Retrieval-Augmented Generation)在回答前先从知识库中检索相关文档,把内容塞进 Prompt,让模型基于真实数据回答。这解决了「知识过时」和「私有数据」两个问题,同时比微调更便宜、更可更新。

示例代码(可运行)

文档切分(Chunking)策略

切分质量直接决定检索质量。切太大,检索到很多无关内容浪费 Token;切太小,丢失上下文。

示例代码(可运行)

Embedding 和向量数据库

Python
# Embedding 模型选择
# - OpenAI text-embedding-3-small:便宜,1536维,效果好
# - 豆包 embedding:国内访问快
# - BGE-M3(开源):支持中英文,可本地部署
# - M3E:中文效果好的开源模型

# 向量数据库选择
# - Pinecone:全托管,省事,贵
# - Weaviate / Qdrant / Milvus:开源自部署
# - pgvector:PostgreSQL 插件,已有PG就用这个
# - Chroma:轻量,适合原型和小规模
# - Redis:带向量搜索功能,适合已有Redis的项目

# 用 Chroma 的示例
import chromadb
client = chromadb.Client()
collection = client.create_collection("docs")
collection.add(
    documents=chunks,
    ids=[f"chunk_{i}" for i in range(len(chunks))],
    # embeddings=chunk_embeddings  # 也可自动用默认模型
)
results = collection.query(query_texts=["什么是GIL?"], n_results=3)
for doc in results["documents"][0]:
    print(doc)

检索质量优化

混合检索:向量检索 + 关键词检索向量检索擅长语义匹配(「怎么提速」匹配「性能优化」)关键词检索擅长精确匹配(「GIL」「IndexError」)两者结合用 RRF(Reciprocal Rank Fusion)合并结果 Rerank(重排序)初检索用向量快速召回 Top-20再用 Cross-Encoder 对这20个做精排,取 Top-5Cross-Encoder 比 Bi-Encoder(embedding)准但慢模型:bge-reranker-v2-m3、Cohere Rerank 查询改写(Query Rewriting)用户问题可能模糊,用LLM改写成更适合检索的查询「它怎么用?」->「Python GIL 的使用方法和注意事项」 多路召回同时检索:原始问题 + 改写问题 + 子问题分解合并去重后 rerank 元数据过滤按文档类型、时间、版本过滤只检索最新版本文档,避免返回过时信息

RAG 的常见问题和评估

常见问题

检索不到:切分不合理、embedding模型不匹配、问题太短检索到但不回答:Prompt没有强制「只基于检索内容回答」幻觉:模型编造检索内容中没有的信息 -> Prompt加「如果检索内容中没有答案,说不知道」回答不完整:chunk太小丢失上下文 -> 父子文档/扩大chunk过时信息:检索到旧版本文档 -> 元数据过滤+版本管理RAG 评估指标检索质量:Recall@K(相关文档是否被检索到)、MRR生成质量:答案相关性、忠实度(是否基于检索内容)、正确性端到端:RAGAS 框架(faithfulness/answer_relevancy/context_precision)生产级 RAG 还需要:引用来源(让用户验证答案)反馈机制(点赞/踩,持续优化)监控检索命中率和无答案率文档更新管道(增量索引)

🐍RAG vs 微调 vs 长上下文

RAG:知识频繁更新、需要引用来源、成本低——首选。微调:需要改变模型风格/格式、领域术语多、示例充足时用。长上下文(200K+):文档量小但单篇很长时可以直接塞,但成本高且有「中间迷失」问题(模型忽略中间内容)。三者可以组合:微调风格 + RAG 知识。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

模型参数里的知识是「冻结」的:会过时、会幻觉、不知道你的私有数据。RAG 先从知识库检索出相关片段,再让模型「只依据这些片段」作答,相当于把记忆外挂到可随时更新的向量库。它不用重新训练、答案可溯源、知识可实时更新,是当前让大模型回答专业/私有问题最务实的方案。

挑战任务

搭建迷你 RAG

简单+50 XP

用你熟悉的工具搭个最小 RAG:3-5 个文档块,模拟 embedding 和检索,输入问题返回最相关的文档块。

搭建迷你 RAG
3 个测试用例

课后作业

搭建知识库问答

中等+50 XP

给某份技术文档(比如 Python 官方教程的一章)搭个完整的 RAG 问答系统:加载文档→切分→Embedding→检索→生成,要求带引用来源。

搭建知识库问答
1 个测试用例