我的RAG扫盲

2026-04-05T10:39:37+08:00 | 4分钟阅读 | 更新于 2026-04-06T13:24:49+08:00

@
我的RAG扫盲

最近在做 AI Agent 项目,一下子接触到了很多新的专业术语。很多术语我都停留在“大概知道是干嘛的”这个层次,真要让我解释清楚它是怎么工作的,我其实说不明白。

所以我准备 各个击破。每个重要的概念,做一个 toy project,自己跑一遍整个流程。

RAG 是我的第一个学习目标。RAG 听过很多遍了,有些是同事说起的,有些是在 B 站看到的,甚至在抖音的评论区也看过,可见这个技术的火热程度。学习之前,我对 RAG 的理解停留在“做知识库”这个层面。

所以这篇文章主要记录两件事:

  1. 我是怎么一步步把 RAG 的主流程搞明白的
  2. 我是怎么基于自己的博客,做出一个最小可运行的 toy RAG 项目的

项目地址先放这:

什么是 RAG,我们为什么需要 RAG

RAG 全称是 Retrieval-Augmented Generation,一般翻译成“检索增强生成”。

如果只看名字,它有点抽象。但换成更直白的话,其实就是:

先去外部知识库里找资料,再把找到的资料和用户问题一起交给大模型,让它基于这些资料回答。

我一开始对它的理解是:
“把大的知识库分片,然后挑出一部分发给 LLM,而不是把整个知识库都发给 LLM。”
这个理解不能说错,但还不够完整,因为它只解释了“RAG 大概有用”,没有解释“为什么需要它”。

RAG 存在的必要性,主要来自下面几个现实问题。

1. 大模型并不天然知道你的私有知识

大模型参数里有很多通用知识,但它不知道你的公司文档、你的个人博客、你的产品手册、你的代码仓库。
这些内容如果不额外接进来,模型就只能靠猜。

2. 把整个知识库都塞进 Prompt 是不现实的

最朴素的想法是:既然模型不知道,那我把所有资料一股脑贴进去不就行了?

理论上可以,实际上通常不行。因为知识库一大,会立刻遇到几个问题:

  • 上下文窗口有限:模型能吃进去的 token 是有限的
  • 成本高:每次都把大量无关资料送进去,token 消耗会很夸张
  • 噪音大:资料太多时,真正有用的信息反而会被淹没
  • 延迟高:输入越长,调用越慢

所以问题不只是“能不能发给模型”,而是“能不能只发最相关的那一小部分”。

3. 纯靠大模型回答,容易幻觉

如果模型没有拿到足够的外部依据,它往往也不会老老实实说“我不知道”,而是根据自己见过的相似模式给你补一个看起来很像真的答案。

RAG 的价值就在于:
它尽量先把资料找出来,再要求模型基于资料回答。这样回答的依据更明确,调试时也能知道它到底是“没检索到”还是“看到了但总结错了”。

4. 知识变化很快,不适合全靠训练更新

像博客、文档、FAQ、产品说明这类内容,变化是很频繁的。
如果每次内容更新都去重新训练模型,成本太高,也不现实。

RAG 的思路是把知识放在模型外部:
知识更新了,只要重新做索引,不用重新训练模型。

所以我现在会把 RAG 理解成:

它不是一个新模型,而是一种系统设计:把“检索外部知识”和“基于知识生成答案”串起来。


RAG 的执行过程是什么样的

我后来真正开始理解 RAG,是因为把它拆成了两个阶段看:

  1. ingest 阶段:建索引
  2. chat 阶段:问答

如果用一句话概括:

  • ingest 阶段负责“把知识库准备好”
  • chat 阶段负责“拿用户问题去查,再基于结果回答”

可以先看整个主流程:

toy project

为了把这套流程真正走一遍,我基于自己的博客做了一个最小可运行的 RAG 项目:

  • 项目地址:https://github.com/huojian-jan/blog-rag-lab
  • 数据源是 data/ 目录里的博客链接清单
  • 程序会抓取网页正文,切成 chunk,做 embedding,然后写入本地 Chroma
  • 问答阶段通过命令行提问,先检索相关片段,再交给模型组织答案
  • 输出结果时还会把参考片段、来源链接和相似度一起打印出来,方便调试

核心就是 Python、LlamaIndex、Chroma 和 OpenAI 兼容接口。它没有做 Web UI,也没有上复杂的检索策略,容易看清楚 ingest 和 chat 这两条链路到底分别在做什么。

小结

把这条链路拆开以后,我对 RAG 的理解就清楚多了。它其实就是把几件事按顺序串起来:

  • ingest 阶段把外部知识整理成可检索的形式
  • chat 阶段根据用户问题召回最相关的内容
  • 最后再由模型基于这些内容组织答案

切 chunk、做 embedding、文档清洗、检索质量和 prompt 组织…,每个阶段都有很多值得深入研究的地方,但是因为我的目的不是发论文,只是在广度上补充我缺失的领域知识,暂时学习到这个层次就够了。

© 2026 火箭的博客

🌱 Powered by Hugo with theme Dream.

爱好
  • 三国演义:从大二开始听评书版的《三国演义》,现在主要是作为睡前小故事来听(我估计是第七八遍了)
  • 写代码:没错,写代码也是我的爱好。只要出门超过半天,我基本都会背着笔记本,随时可能进入“编码模式”。
  • 健身:曾经的爱好。结婚之后就逐渐被抛弃了 🤷,结婚一年涨了10斤。
  • 看电影:后续可能会写影评。
  • 探索新事物和工具:准备开一个主题,专门分享我接触到的各种新玩意儿。
关于我

👋 你好,我是 huojian (火箭)

欢迎来到我的个人博客!建立这个小站的初衷,是想在浩瀚的互联网中拥有一块属于自己的“数字花园”。我经常从各类优秀的博客中汲取养分,现在,我也想成为那个输出和分享的人。

这里没有刻板的文章更新 KPI,更多的是我个人的技术沉淀、学习笔记以及生活碎片的真实记录。

👨‍💻 关于我与我的技术栈

我是一名客户端软件工程师,日常与代码和系统架构打交道。在技术探索的道路上,我享受解决复杂问题带来的成就感,也喜欢折腾各种能提升幸福感的工具。

在这里,你可能会看到我分享以下内容:

  • 💻 开发与架构探讨: 探讨 WPF/C# 领域的开发经验、代码质量优化,以及诸如客户端热修复 (Hotfix) 系统设计等我在实际项目中遇到并解决的挑战。
  • 🛠️ 工作流与跨平台折腾: 记录我游走在 Windows 与 macOS 环境下的效率心得。从外设配置到好用的跨平台开发工具,分享如何打造顺手的生产力环境。
  • 🐳 自托管与数字生活: 我是个“自建服务”爱好者。会不定期掉落关于 Docker 部署、云服务器折腾指南,以及如何搭建属于自己的 RSS 阅读环境等教程。
  • 📝 学习笔记与自我精进: 记录各种技术学习心得。同时,我也在持续死磕英语,努力提升口语和写作能力,告别“哑巴英语”,相关的学习路径和思考也会记录在这里。

💡 我的理念

“Talent is enduring patience.” (才能即是长久的忍耐)

我相信持续输出的力量。无论是深度的技术解析,还是一个简单的开发踩坑记录,亦或是一篇普通的生活随笔,都是打造个人 IP 与技术影响力的基石。

📬 建立连接

非常高兴能在这里与同样喜欢写代码、喜欢阅读的你相遇。如果你对我的文章有共鸣,或者想交流技术与生活,欢迎随时找我:

  • GitHub: @huojian-jan
  • RSS 订阅: 欢迎通过博客右上角的 RSS 订阅我的最新文章。
记录什么?
  • 学习笔记

  • 一些想法:记录日常思考,不一定有结论,更像是一种随手的表达。

  • 旅游与随笔:旅行时的见闻与感受,以及偶尔的文字随笔。