@mate_mattt: 做了一套真实可运行的 RAG 项目 和 Notebook RAG 实战课,对 RAG 进行像素级拆解: Markdown 切分 → FTS5 / BM25 → Embedding 向量检索 → 混合召回 RRF → Cross-Encod…
摘要
这是一个从零学习本地RAG检索核心的实战项目,包含Notebook和真实可运行代码,覆盖Markdown切分、BM25、Embedding向量检索、混合召回RRF、Cross-Encoder重排等完整流程,并配有评测指标。
查看缓存全文
缓存时间: 2026/07/12 19:00
做了一套真实可运行的 RAG 项目 和 Notebook RAG 实战课,对 RAG 进行像素级拆解: Markdown 切分 → FTS5 / BM25 → Embedding 向量检索 → 混合召回 RRF → Cross-Encoder 重排 → Evidence Card。 不是只讲概念。每一课都有真实数据、代码、运行结果和评测指标;从 15 篇文档切到 210 个 Chunk,再看召回与重排如何变化。 读完并跑一遍,你会把 RAG 检索的核心骨架真正串起来,再配合上 AI 就能搭建自己的 RAG 系统。
开源 Notebook :https://github.com/mate-matt/rag-memory-lab…,如果觉得有帮助,点点 star,这是我写过最累人的手把手教学文章。
mate-matt/rag-memory-lab
Source: https://github.com/mate-matt/rag-memory-lab
RAG Memory Lab
一个从零学习本地 RAG 检索核心的实战项目。它不调用外部生成服务、不需要 API Key;你可以逐节运行 Notebook,观察 Markdown 如何被切分、索引、召回、重排,并最终变成可追溯的证据卡。
配套阅读
两篇文章与本仓库的 01–07 课一一对应:文章负责串联思路与概念,Notebook 负责运行代码、观察真实数据和验证结果。
Markdown 文档
→ Chunk 切分
→ FTS5 / BM25 + 本地 Embedding
→ RRF 混合召回
→ Cross-Encoder 重排
→ Evidence Card(原文与来源)
你会学到什么
| 课程 | Notebook | 主题 |
|---|---|---|
| 01 | 01_markdown_parser_and_sentence_splitter.ipynb | Markdown 结构感知切分与长度兜底 |
| 02 | 02_sqlite_fts5_and_bm25.ipynb | SQLite FTS5、倒排索引与 BM25 |
| 03 | 03_embeddings_numpy_milvus_and_fts_comparison.ipynb | 本地 Embedding、NumPy、Milvus Lite 与检索对比 |
| 04 | 04_retrieval_evaluation.ipynb | Recall、Precision、Hit Rate、MRR 与人工标注评测集 |
| 05 | 05_hybrid_retrieval.ipynb | RRF:融合 BM25 与向量召回 |
| 06 | 06_reranking.ipynb | Cross-Encoder 重排:从候选中精排 |
| 07 | 07_evidence_cards.ipynb | Evidence Card:来源、标题路径与检索轨迹 |
环境要求
- macOS、Linux 或 Windows(建议使用 Python 3.11)
- uv:Python 环境与依赖管理工具
- 首次运行可联网:会下载两个公开的本地模型权重;之后会复用本机缓存
- 推荐至少 8 GB 内存。CPU 可以运行;第 6 课的重排在 CPU 上会更慢
项目的原始资料已经随仓库提供,不需要另行下载。模型权重不会被提交到仓库,也不需要任何密钥。
从零启动
在项目根目录执行:
# 1. 安装锁定版本的依赖,并创建 .venv
make setup
# 2. 注册 Jupyter 内核(只需一次)
make kernel
# 3. 启动 JupyterLab
make lab
浏览器打开后,选择 RAG Memory Lab 内核,并按 notebooks/01_... 到 notebooks/07_... 的顺序逐节运行。
如果没有
make,把 Makefile 中对应命令的uv run ...部分直接复制到终端运行即可。
一键运行真实数据链路
下面的顺序很重要:后一步会读取前一步生成的本地文件。
# 1. 15 篇 Markdown → 210 个左右的 Chunk
make chunk-real
# 2. 构建 SQLite FTS5、Embedding、NumPy 文件与 Milvus Lite 索引
make vector-real
# 3. 评测单路召回
make eval-retrieval
# 4. 用 RRF 做混合召回并评测
make eval-hybrid
# 5. 用本地 Cross-Encoder 重排混合候选并评测
make eval-rerank
# 6. 生成包含原文、来源与排名轨迹的 Evidence Card
make build-evidence
常用的 Notebook 自动执行命令也已提供。例如:
make run-01
make run-03
make run-06
run-02 至 run-07 依赖已注册的 RAG Memory Lab 内核,因此请先执行一次 make kernel。
项目结构
rag-memory-lab/
├── knowledge-base/openai-cookbook/ # 公开 Markdown 原料、上游版本和许可
├── notebooks/ # 01–07:可交互学习课
├── src/ # 可复用的真实流水线代码
├── artifacts/
│ └── evaluation/retrieval-goldens.jsonl # 人工标注的评测集(版本化)
├── assets/diagrams/ # 课程与文章使用的结构图
├── Makefile # 常用命令入口
├── pyproject.toml # Python 3.11 依赖定义
└── uv.lock # 可复现的依赖锁文件
artifacts/chunks、artifacts/indexes、artifacts/vectors 和大部分评测结果都是运行产物,默认被 Git 忽略。克隆仓库后按上述顺序运行即可重新生成它们。
源码地图
| 文件 | 作用 |
|---|---|
src/chunking.py | 使用 LlamaIndex 的 MarkdownNodeParser 与 SentenceSplitter 切分 Markdown,并保存完整元数据 |
src/run_chunking.py | 真实数据入口:生成 chunks.jsonl、文档统计与抽样审查文件 |
src/fts5_index.py | 建立 SQLite 普通 chunks 表与 FTS5 虚拟表,并执行 BM25 搜索 |
src/vector_search.py | 本地 Embedding、NumPy 余弦相似度、Milvus Lite 索引与查询 |
src/run_vector_index.py | 从 Chunk 构建 FTS5、向量文件与 Milvus Lite 索引 |
src/evaluation.py / src/run_evaluation.py | 读取 Goldens,计算 Recall@K、Precision@K、Hit@K、MRR |
src/hybrid_search.py / src/run_hybrid_search.py | 用 Reciprocal Rank Fusion(RRF)融合 BM25 与向量排序 |
src/reranker.py / src/run_reranking.py | 用本地 Cross-Encoder 对混合候选精排 |
src/evidence.py / src/run_evidence.py | 把重排结果包装为可追溯的 Evidence Card |
数据、模型与许可
- 原始语料位于
knowledge-base/openai-cookbook,是 OpenAI Cookbook 的一个固定公开快照。其目录内保留SOURCE.json、上游 revision 和原始 MIT License;再分发时请一并遵守。 - 本项目代码、Notebook 和自制图示使用根目录的 MIT License。
- 首次运行会按需下载
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2(向量化)与BAAI/bge-reranker-v2-m3(重排)这两个公开模型到本机缓存。它们不包含在仓库中。
常见问题
make vector-real 报找不到 chunks.jsonl?
先运行 make chunk-real。
评测或重排报找不到向量、FTS5 数据库?
先运行 make vector-real。
第一次运行很慢或需要网络?
这是在下载公开模型权重。下载完成后会优先使用本机缓存。
我只想学习,不想跑完整流水线?
执行 make setup && make kernel && make lab,直接从第 01 课开始;Notebook 中有小样本和真实数据示例。
相似文章
@GitHub_Daily: 想搞懂 RAG 到底怎么回事,网上的教程不是跳步骤就是直接调云端 API,中间过程看不见。 RAG from Scratch 把整条链路拆成十来个小实验,每一步都用本地模型跑,没有黑盒。 从文本分块、向量化、检索到最终生成,代码都摆在面前…
介绍开源项目 RAG from Scratch,通过分步骤的本地代码实验完整拆解 RAG 链路,涵盖文本分块、向量化、检索、重排序与查询重写等进阶策略,帮助开发者从底层理解 RAG 实现。
@Ryrenz: 兄弟们,又挖到一个宝藏课程:7 周从零搭出一套生产级 RAG 系统 GitHub 上 7.7k stars,全程动手写代码,不是幻灯片课 市面上的 RAG 教程大多直奔向量检索,demo 能跑,但是上线就崩。 这门课走的是公司里真实的路径…
一个GitHub上7.7k stars的7周课程,从零搭建生产级RAG系统,涵盖Docker、FastAPI、混合检索、LangGraph agentic RAG和Telegram bot,全程动手写代码。
@GYLQ520: PixelRAG 来自伯克利 SkyLab 等团队,开源可玩。 它的思路很直接,不再靠 HTML 或文本解析,而是把网页、PDF 直接截成截图,用视觉索引做 RAG 检索。 表格、图表、布局这些 HTML 解析会丢掉的东西,全保留下来了。…
PixelRAG 是来自伯克利SkyLab等团队的开源项目,通过将网页和PDF截图为截图并用视觉索引进行检索,提高RAG准确率并显著降低AI Agent的token成本。
通过实际代码了解 RAG 的一切
作者宣布为开源 RAG 框架 RAG Me Up 提供以教育为先的文档,通过代码和可运行示例解释 RAG 概念。
@tom_doerr: 构建RAG系统的分步指南笔记本 https://github.com/langchain-ai/rag-from-scratch…
一个从头构建RAG系统的分步笔记本系列,涵盖索引、检索和生成,并附有视频播放列表。