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 先检索到文档片段:
再让大模型看着这段答:
我们公司报销上限是多少?RAG 先检索到文档片段:
《财务制度》第 3 条:单次报销上限为 3000 元…再让大模型看着这段答:
根据《财务制度》第3条,单次报销上限为 3000 元。(✅ 准确、有依据、能溯源到是哪份文档)RAG 一并解决了大模型的三个软肋
① 知识有限→ 检索你的私有/最新资料补上;② 爱幻觉→ 有资料垫底,不用瞎编;③ 不可溯源→ 能告诉你"这答案来自哪份文档第几条"。这就是为什么企业做 AI 问答几乎都用 RAG。
L03
RAG 六步流水线(全课主线图)
要实现"先找、再答",RAG 内部分成两个阶段、六个步骤。这张图是整门课的骨架——后面每一天都在讲其中一步,请记牢:
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 的六步流水线对起来看,你就明白每天在学什么了:
每一行代码 → 对应流水线的哪几步 → 在第几天讲。这就是你的"课程表"。
读法:看不懂细节没关系。今天只要记住"这 5 行 = 六步流水线的封装"这个骨架——后面每天钻进一格,学完再回来看这 5 行,会有"原来如此"的通透感。
L06
core + 集成插件:框架怎么组织
🤔 各家的 LLM/向量库/文档格式都不同,框架怎么办?
你可能用 OpenAI 或通义、用 Chroma 或 Pinecone 向量库、读 PDF 或 Notion……组合无穷。框架不可能把所有情况写死在一起。
💡 解法:核心骨架 + 可插拔插件
LlamaIndex 拆成两部分:
llama-index-core(框架骨架,定义"读文档""嵌入""检索"这些抽象接口 + 一套能跑的默认实现)+ 300+ integrations(各家的具体实现,如 OpenAI 嵌入、Chroma 向量库、PDF 读取器)。📝 一个真实项目的"配方"
+
+
+
+
→ 想把 OpenAI 换成通义?只改中间两行,业务代码不动。
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 是什么、有哪些字段、它们之间怎么互相"记住关系"。