用大白话 + 流程图 + 类比,把 RAG 的核心组件、工作原理和十模块学习路径一次性讲清楚。不需要任何前置知识。
模型训练完就“冻结”了,不知道昨天的新闻、你公司的内部文档。RAG 把最新资料外挂进来,不用重新训练模型。
外部知识模型在没有依据时会编造。RAG 强制它先检索、再回答,答案里的每一句都能追溯到原文片段。
减少幻觉你的文档可能有几百页,直接全塞给模型既贵又超长。RAG 只挑出最相关的几段,精准投喂。
精准检索把长文档切成小块。切太大:检索不准、塞不进提示词;切太小:上下文断裂、语义不完整。好的切分要按标题层级来切,块与块之间还要留一点重叠,避免把一句话劈成两半。
M01把一段文字变成一串数字(比如 1024 个小数)。语义相近的文字,数字也相近。这样计算机才能“算”两段话像不像。这一步要调 embedding 模型,通常按批发送以省钱省时间。
M02把用户问题也变成向量,然后在库里找“数字最像”的几块。最朴素的算法是手写余弦相似度;数据量大时用 pgvector 的 HNSW 索引做近似检索,用一点点精度换大量速度。
M03光靠向量不够——专有名词、型号、人名它可能找不到。所以要同时跑一路关键词检索,再把两路结果融合(RRF 算法),最后用一个打分器重新排序,把最相关的顶上来。
M04把检索到的几块拼成一段提示词,告诉模型“请根据以下资料回答”。要注意 token 预算——不能全塞进去。还要处理“资料里没有答案”的情况,这时候应该拒答而不是硬编。
M05 · M06怎么知道检索好不好?用一组“问题 → 期望命中”的黄金集,算命中率、召回率、MRR 三个指标。关键是设一条基线:指标掉下去就判失败,防止改着改着越改越差。
M08👆 前两句的数字几乎一样(因为它们意思相近),第三句的数字差很远(意思无关)。检索时就是算“问题向量”和“每块向量”的距离,取最近的几个。这就是向量检索的全部原理。
怎么把文档切成合适的小块。basic 用定长切,advanced 按标题层级切并加重叠,enterprise 配置驱动 + 幂等。
把文字变成数字。basic 批量调模型,advanced 切批 + 磁盘缓存 + 413 重试,enterprise 缓存落 PG + 可续跑。
找最像的几块。basic 手写余弦相似度,advanced SQLite + 阈值 + 回环,enterprise pgvector + HNSW 调优。
向量 + 关键词双路召回,再融合排序。basic 字符 bigram 倒排,advanced RRF 融合,enterprise 可替换打分器。
把检索结果拼进提示词让模型作答。basic 直接拼,advanced 预算裁剪 + 引用编号,enterprise 拒答 + 降级 + 重试。
答案里的 [1][2] 到底来自哪一段。basic 带角标,advanced 回链到原文偏移,enterprise 可验证 + 完整溯源链。
用户的问题往往不适合直接检索。basic 单轮改写,advanced 指代消解 + 历史裁剪,enterprise 路由 + 缓存 + PG 会话。
怎么知道检索好不好。basic 跑 10 条看命中,advanced 算三个指标,enterprise 黄金集 + 基线 + 回归门禁。
让模型自己决定要不要检索、检索几次。basic 把检索变成工具,advanced 自主多轮 + 步数上限,enterprise 预算护栏 + 人工审批。
把前面九个模块串成一个完整应用。basic 单命令跑通,advanced 多轮 + 流式 + 持久化,enterprise pgvector + PG 检查点 + 评估门禁 + 可观测。
| 维度 | basic(先跑通) | advanced(加功能) | enterprise(接真实服务) |
|---|---|---|---|
| 目标 | 理解核心概念,一条命令跑出结果 | 补上工程上必需的细节 | 接真实外部服务,处理失败与代价 |
| 外部依赖 | 无(纯函数,可离线跑) | 本机 ollama(embedding) | ollama + PostgreSQL + pgvector + DeepSeek Key |
| 存储 | 内存 | 磁盘 / SQLite | PostgreSQL + pgvector |
| 典型新增 | — | 缓存、切批、重试、阈值、融合 | 索引调优、跨进程共享、评估门禁、降级、可观测 |
| 代价 | 功能最少,但最容易看懂 | 多一层缓存与重试逻辑 | 要装数据库、要配凭据、失败面变多 |
理解为什么不能把整本书塞给模型。学会按标题层级切分、加重叠窗口、给每块打元数据。这一步是后面所有环节的基础——切得不好,检索再准也没用。
学会把文字变成向量、算相似度、找 top-k。然后补上关键词检索做混合,用 RRF 融合两路结果。最后接上 pgvector,理解 HNSW 索引“用精度换速度”的取舍。
学会构造提示词、控制 token 预算、处理“没答案就拒答”。然后做到每条引用都能回链到原文。再解决多轮对话里的指代消解。最后用黄金集和基线,让“检索质量”变成可判定的数字。
把检索变成模型可以调用的工具,让它自主多轮——“证据不够?改写问题再查一次”。加上预算护栏和人工审批。最后把十个模块串成一个完整应用:可检索、可引用、可评估、可自主多轮。
不是。RAG 的核心是“检索”——先找到最相关的几段,再喂给模型。直接丢整个文档既超长又低效,而且模型会“中间忘掉”(lost in the middle)。
很多人随手按固定字数切,结果一句话被劈成两半、一个标题和它的内容被分到两块。切分粒度直接决定检索质量——切错了,后面全白搭。
向量检索对“意思相近”很擅长,但对专有名词、型号、人名可能失灵。比如搜“A100 显卡”,向量可能给你一堆“GPU 相关”的内容,但搜不到精确提到 A100 的那段。所以要加一路关键词检索。
如果资料里根本没有答案,模型会倾向于硬编一个。正确做法是:当检索结果为空或分数全低于阈值时,明确拒答——“根据现有资料无法回答”。
“感觉还行”不是标准。你需要一组带标准答案的问题(黄金集),算出命中率、召回率、MRR,并设一条基线。否则改了参数之后,你根本不知道是变好了还是变坏了。