Day 01 / 共 20 天 · 第 1 周 RAG 全景与数据摄入

项目全景:从一个痛点讲起

今天不急着讲源码。我们先从"一个真实的麻烦"出发,一步步推出:为什么要有 RAG、RAG 到底分几步、LlamaIndex 怎么把这几步变成几行代码。看完你会拿到一张"课程地图"——后面 19 天每天都在这张图上的某一格。

📍 你在整门课的位置(这条链会贯穿全部 20 天,每天开头都会点亮你所在的格子)
Day 1 全景· 读→切→嵌→存(W1-2)· 检索→合成(W3)· Agent/Workflow(W4)
L01

先看一个真实痛点

🤔 场景:你想让 AI 回答"公司内部文档"里的问题 你有 1000 份公司文档(产品手册、规章制度、历史邮件),想做个"问它就答"的机器人。你直接去问 ChatGPT:"我们公司的报销上限是多少?"——它会怎么回答?
📝 直接问大模型 → 会发生什么 你问:我们公司报销上限是多少?
大模型答:一般公司报销上限在 500~2000 元不等……(😰 它根本没见过你的文档,只能瞎猜/说套话,甚至一本正经地编一个数字——这叫"幻觉")
💡 一句话本质 大模型很聪明,但它只知道训练时见过的公开知识,不知道你的私有数据、也不知道最新信息。要让它回答你的问题,得想办法"把相关资料喂给它一起看"。

这个"想办法把资料喂给它"的完整方案,就是本课的主角——RAG,而 LlamaIndex 是实现 RAG 最流行的框架(README.md:"an open-source framework to build agentic applications")。

L02

RAG:给大模型"开卷考试"

🤔 怎么让它"看着资料答"? 最朴素的想法:把 1000 份文档全塞进提示词,连问题一起发给大模型。问题是——塞不下(大模型一次能读的字数有限,1000 份文档几百万字,远超上限),而且贵又慢(按字数收费)。
💡 RAG 的核心主意:先找、再答 RAG(Retrieval-Augmented Generation,检索增强生成)= 不全塞,而是"先检索出和问题最相关的几段,再把这几段 + 问题一起喂给大模型生成答案"。好比考试时不用背整本书,而是"允许翻书,先翻到相关那页,再看着答"——开卷考试
📝 RAG 的效果 → 对比 L01 你问:我们公司报销上限是多少?
RAG 先检索到文档片段:《财务制度》第 3 条:单次报销上限为 3000 元…
再让大模型看着这段答:根据《财务制度》第3条,单次报销上限为 3000 元。(✅ 准确、有依据、能溯源到是哪份文档)
RAG 一并解决了大模型的三个软肋知识有限→ 检索你的私有/最新资料补上;② 爱幻觉→ 有资料垫底,不用瞎编;③ 不可溯源→ 能告诉你"这答案来自哪份文档第几条"。这就是为什么企业做 AI 问答几乎都用 RAG。
L03

RAG 六步流水线(全课主线图)

要实现"先找、再答",RAG 内部分成两个阶段、六个步骤。这张图是整门课的骨架——后面每一天都在讲其中一步,请记牢:

① 离线建库(只做一次,把文档变成"可检索的知识库") ② 在线查询(每次提问都走一遍) Reader·Day3 切块Parser·Day4 嵌入Embed·Day6 存索引Index·Day7-9 📚 知识库 问题用户提问 检索相关片段Retriever·Day11 LLM 合成答案Synth·Day12-13 ✅ 答案含出处
RAG 全流程:紫色是"离线建库"(把文档变知识库),蓝色是"在线查询"(每次提问走一遍)。每格标了对应的教学日。
为什么要"切块"和"嵌入"这两个怪步骤?(先建立直觉,Day 4/6 细讲) 切块:整份文档太大、主题太杂,检索时找"整本书"不如找"相关那一段"精准——所以先切成小块。嵌入:计算机不懂文字"意思相近",但懂数字。嵌入把每段文字变成一串数字(向量),让"意思相近"变成"数字相近",检索就能用数学算相似度了。这两步是 RAG 最"反直觉"的地方,今天先记住"为什么",后面看"怎么做"。
L04

5 行代码跑通整条流水线

上面六步听着复杂,但 LlamaIndex 把它封装到了极致——经典的"5 行 RAG"

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data").load_data()   # 第①步:读
index = VectorStoreIndex.from_documents(documents)       # 第②③④步:切+嵌+存(一行全包了!)
query_engine = index.as_query_engine()                   # 组装"问答引擎"
response = query_engine.query("公司报销上限是多少?")     # 第⑤⑥步:检索+合成
print(response)                                          # → 根据《财务制度》第3条…
💡 为什么能这么短? 因为 LlamaIndex 把"合理的默认选择"都内置了——默认用 OpenAI 嵌入、默认切块大小、默认向量库。新手 5 行跑通,高手能替换其中任何一环。本课就是带你看清"每一行下面藏着什么、怎么替换"。
L05

拆开这 5 行 = 本课地图

把上面 5 行和 L03 的六步流水线对起来看,你就明白每天在学什么了:

SimpleDirectoryReader("data").load_data() 读文档 → Document(Day 3) VectorStoreIndex.from_documents(docs) 切块(Day4)+嵌入(Day6)+存索引(Day7-9) index.as_query_engine() 组装 检索器+合成器(Day 12) query_engine.query("...") 检索(Day11)+合成答案(Day13)
每一行代码 → 对应流水线的哪几步 → 在第几天讲。这就是你的"课程表"。
读法:看不懂细节没关系。今天只要记住"这 5 行 = 六步流水线的封装"这个骨架——后面每天钻进一格,学完再回来看这 5 行,会有"原来如此"的通透感。
L06

core + 集成插件:框架怎么组织

🤔 各家的 LLM/向量库/文档格式都不同,框架怎么办? 你可能用 OpenAI 或通义、用 Chroma 或 Pinecone 向量库、读 PDF 或 Notion……组合无穷。框架不可能把所有情况写死在一起。
💡 解法:核心骨架 + 可插拔插件 LlamaIndex 拆成两部分:llama-index-core(框架骨架,定义"读文档""嵌入""检索"这些抽象接口 + 一套能跑的默认实现)+ 300+ integrations(各家的具体实现,如 OpenAI 嵌入、Chroma 向量库、PDF 读取器)。
📝 一个真实项目的"配方" llama-index-core(骨架)
+ llama-index-llms-openai(用 OpenAI 当大模型)
+ llama-index-embeddings-openai(用 OpenAI 嵌入)
+ llama-index-vector-stores-qdrant(用 Qdrant 存向量)
+ llama-index-readers-file(读本地文件)
→ 想把 OpenAI 换成通义?只改中间两行,业务代码不动。
这就是本课"只读 core"的原因 core 定义了所有抽象接口和主流程——把 core 吃透,300 个集成插件就一通百通(它们只是"填空"某个抽象接口)。所以我们花 20 天精读 core,集成用到时点名即可。
L07

目录地图 = 20 天课程表

llama-index-core/llama_index/core/ 的每个子目录,几乎对应本课的一天:

core/
  schema.py       核心数据结构 Document/Node     → Day 02(一切的基础)
  readers/        读数据                          → Day 03  ┐
  node_parser/    切块                            → Day 04  ├ 离线建库(W1)
  ingestion/      摄入管道(把读切嵌串起来)      → Day 05  ┘
  embeddings/     嵌入(文字→向量)               → Day 06  ┐
  indices/        索引                            → Day 07/10├ 索引存储(W2)
  storage/ vector_stores/  存储                   → Day 08/09┘
  retrievers/     检索器(找相关片段)            → Day 11  ┐
  query_engine/   查询引擎(端到端问答)          → Day 12  │
  response_synthesizers/  合成答案                → Day 13  ├ 检索查询(W3)
  postprocessor/ prompts/ llms/  精排/提示/大模型 → Day 14/15┘
  workflow/ agent/ chat_engine/ memory/  智能体   → Day 16-18┐
  callbacks/ instrumentation/ evaluation/  观测评估→ Day 19  ┴ Agent/生态(W4)
读法:这不是"目录列表",是你的学习路线。每天开头的"进度定位条"会告诉你今天在这张图的哪一格、和前后怎么衔接——保证你永远知道"我在整条链的哪一步"。
L08

今日小结 + 动手

🧠 今天你应该能回答(都是大白话,不涉细节)

  • 直接问大模型"公司内部问题"为什么会翻车?(它没见过你的数据)
  • RAG 的核心主意是什么?(先检索相关片段,再让 LLM"开卷"答)
  • RAG 六步流水线是哪六步?哪些是离线、哪些是在线?
  • 为什么要"切块"和"嵌入"?(精准检索 + 让计算机能算语义相似)
  • "5 行 RAG"对应六步的哪几步?core 和 integrations 怎么分工?

✋ 动手(把地图看一遍)

cd /Users/bitmart/work/codes/github/llama_index
head -40 README.md
# 对照 L07 的地图,看看每个目录真实存在
ls llama-index-core/llama_index/core/
ls llama-index-integrations/ | head    # 感受一下 300+ 集成的规模
明天预告 · Day 02:进入六步流水线的地基——数据结构。所有数据在 LlamaIndex 里都叫 Document/Node,就像"面粉是一切面食的原料"。Day 02 拆 schema.py:Document 和 Node 是什么、有哪些字段、它们之间怎么互相"记住关系"。