LESSON · 05

把
外部
知识
塞进去

RAG · Retrieval-Augmented Generation

为什么需要 RAG

  • 知识截断:模型不知道训练之后的事
  • 私有数据:模型没见过你公司的文档
  • 可溯源:答案要能引用原文
  • 可更新:今天加文档,今天就能问
  • → 比微调便宜 10-100 倍

RAG
四步
工序

索引 → 检索 → 增强 → 生成

rag pipeline

[ 离线 INDEX ] 📄 文档 ✂️ 切块 🔢 向量化 🗄️ 向量库 [ 在线 QUERY ] ❓ 问题 🔢 向量化 🔍 检索 Top-K 匹配 📝 组装 Prompt 🧠 LLM ✅ 带引用的答案

5 min RAG quickstart


# pip install langchain langchain-openai chromadb
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = TextLoader("my_doc.txt")
docs = loader.load()

# 2. 切块
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, chunk_overlap=50
)
chunks = splitter.split_documents(docs)

# 3. 向量化 + 存储
db = Chroma.from_documents(chunks, OpenAIEmbeddings())

# 4. 检索 + 生成
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-4o-mini"),
    retriever=db.as_retriever(search_kwargs={"k": 3})
)
print(qa.invoke("文档里说了什么?"))

向量库选型决策表

  • Chroma · 本地开发 / 原型 · < 10 万文档
  • pgvector · 已有 Postgres,不想加新组件
  • Qdrant · 需要过滤 + 高性能 · 10 万 - 1000 万
  • Milvus · 海量数据 + 分布式 · > 1000 万
  • Pinecone · 不想运维、有预算 · SaaS 全托管

Embedding 是什么

  • 文本 → 一个高维向量(768 / 1536 / 3072 维)
  • 语义相近 → 向量相近
  • "猫" 和 "喵星人" 离得很近
  • "猫" 和 "汽车" 离得很远
  • 模型:OpenAI text-embedding-3 / BGE / GTE

三种相似度

  • 余弦相似度 · cos(θ) ∈ [-1, 1] · 最常用
  • 点积 · 速度快,需归一化
  • 欧氏距离 · 几何直觉
  • 归一化向量后,三者等价

向量数据库

  • Chroma · 轻量,本地起手
  • Milvus / Zilliz · 大规模生产
  • Pinecone · SaaS 标杆
  • Qdrant · Rust 实现,性能好
  • pgvector · Postgres 直接加
  • 小项目用 Chroma / pgvector,规模上来再换

切得
对

Chunking 是 RAG 效果的第一胜负手。

Chunking 策略

  • 固定窗口 · 500 token 一段,简单粗暴
  • 滑动窗口 · 加 overlap,避免切断语义
  • 按结构 · 章节 / 段落 / Markdown 标题
  • 按语义 · LLM 协助找断点
  • 父子分块 · 子用于检索,父用于上下文

Hybrid Search · 混合检索

  • BM25(关键词)+ 向量(语义)
  • 关键词擅长术语 / 实体名 / 错别字
  • 向量擅长语义 / 同义改写
  • RRF 融合排序,鱼和熊掌

Re-rank · 重排

  • 向量检索 top-50 召回,不一定是最相关的 top-5
  • 用 Cross-Encoder 二次精排
  • 代表模型:BGE-Reranker / Cohere Rerank
  • 代价:慢一些,但召回质量提升明显

长上下文压缩

  • 问题:召回了 10 段,可能太长
  • 方案 1:摘要后再喂
  • 方案 2:LLM 抽取相关句子
  • 方案 3:LLMLingua 等压缩工具

RAG 评估

  • 检索侧:召回率 / Recall@k / NDCG
  • 生成侧:答案准确率 / 忠实度 / 引用正确
  • RAGAS:自动化评估框架
  • 没有评估,调优就是玄学

进阶变体

  • GraphRAG · 知识图谱 + 检索
  • Self-RAG · 让模型自己决定要不要检索
  • Agentic RAG · 多轮检索 + 推理
  • HyDE · 让 LLM 先编个答案再用它去检索

本课收获

四步工序 Embedding 向量库选型 Chunking 是关键 Hybrid + Re-rank RAGAS 评估

下一课 · Agent 智能体:让 LLM 自己干活