@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 中有小样本和真实数据示例。
相似文章
@Ryrenz: 兄弟们,又挖到一个宝藏课程:7 周从零搭出一套生产级 RAG 系统 GitHub 上 7.7k stars,全程动手写代码,不是幻灯片课 市面上的 RAG 教程大多直奔向量检索,demo 能跑,但是上线就崩。 这门课走的是公司里真实的路径…
一个GitHub上7.7k stars的7周课程,从零搭建生产级RAG系统,涵盖Docker、FastAPI、混合检索、LangGraph agentic RAG和Telegram bot,全程动手写代码。
@tom_doerr: 构建RAG系统的分步指南笔记本 https://github.com/langchain-ai/rag-from-scratch…
一个从头构建RAG系统的分步笔记本系列,涵盖索引、检索和生成,并附有视频播放列表。
@Ryrenz: 想让 AI 基于你自己的资料回答,不用从头写 RAG。这 5 个开源应用装上就能把文档变成能问答的知识库。 1、RAGFlow — 重排版理解的 RAG 引擎,83.8k star 对复杂文档的版面理解做得深,表格、长报告都能拆得准,回答…
推荐5个开源RAG工具(RAGFlow、AnythingLLM、Onyx、Khoj、kotaemon),可零代码将文档变成可问答的知识库,各具特色。
@XiaohuiAI666: 你的 RAG 实现方法是错误的! 传统 chunk 缺乏知识边界、版本信息和元数据,导致检索上下文缺失、版本混杂、权限控制困难。 作者提出的新方法以 IdeaBlock(问题-答案+治理字段)替代 chunk,实现结构化知识单元。 不改检…
作者提出以IdeaBlock(问题-答案+治理字段)替代传统chunk来改进RAG知识单元,已开源Blockify工具,可减少40倍语料、3倍token并提升2.3倍相关性。
@ando_w: https://x.com/ando_w/status/2075468963098546520
本文介绍如何将单轮RAG升级为Agentic RAG,通过让LLM自主决定多次检索和调用工具,解决复合问题的多步推理。提供了基于Qwen3.7-Max的代码示例和实现思路。