Lesson 01 — 先跑通:你的第一个 RAG
本课目标:20 分钟内跑通一个完整的 RAG,先看到效果,建立全局认知。理论细节后面的课再深入。
1. RAG 到底在解决什么问题?
直接问大模型(比如 GLM-4)会有三个痛点:
| 痛点 | 例子 |
|---|---|
| 幻觉 | 它会一本正经地编造不存在的"事实" |
| 知识截止 | 它的训练数据有截止日期,不知道最近的事 |
| 不知道你的私有数据 | 它不知道你们公司的请假制度、你的产品文档 |
RAG(Retrieval-Augmented Generation,检索增强生成)的思路很朴素: 回答之前,先去你的文档库里"检索"相关片段,把片段塞进提问里,让模型基于真实材料作答。
💡 一个类比:闭卷考试 vs 开卷考试。直接问大模型 = 闭卷(靠记忆,可能记错);RAG = 开卷(允许翻书,答案更靠谱)。
2. RAG 的完整流水线
┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌──────────────┐ ┌──────────┐
│ 用户提问 │ ──▶ │ 问题向量化 │ ──▶ │ 向量检索 │ ──▶ │ 拼接 Prompt │ ──▶ │ 大模型生成│
│ "年假几天?" │ │ (Embedding) │ │ Top-K 片段 │ │ 上下文+问题 │ │ 答案 │
└─────────────┘ └──────────────┘ └─────────────┘ └──────────────┘ └──────────┘
▲
│ 从这里取
┌───────────────────────┐
│ 你的文档 → 向量化 → 存储 │ (提前做好,存进向量库)
└───────────────────────┘
一句话概括:把"问题"和"文档"都变成向量,算谁和谁更近,把最近的几段喂给大模型。
3. 三个核心概念(先有个印象,后面课会深讲)
- Embedding(向量嵌入):把一段文字变成一串数字(向量)。语义相近的文字,向量也相近。这是让计算机"理解"文字相似度的方法。
- 向量检索:在所有文档向量里,找出和"问题向量"最接近的 K 个(Top-K)。本课用 Chroma 这个向量库来做。
- Prompt 拼接:把检索到的文档片段 + 用户问题,按固定格式拼成一段提示词,交给大模型生成答案。
4. 本课代码在做什么
打开同目录的 code.py,你会发现它被拆成了几个函数,每个函数对应流水线的一个环节:
| 函数 | 对应环节 | 干什么 |
|---|---|---|
create_zhipu_client() |
准备 | 用 API Key 初始化智谱客户端 |
embed_texts() |
向量化 | 调 embedding-3 把文本变成向量 |
build_knowledge_base() |
存储 | 把知识文本向量化后存进 Chroma |
retrieve() |
检索 | 把问题向量化,从 Chroma 捞最相关的 K 段 |
generate_answer() |
生成 | 把检索结果拼进 prompt,调 GLM-4 生成答案 |
main() |
串联 | 把上面几步串起来跑一遍 |
重点观察:运行时程序会打印出"检索到了哪些片段"和"模型最终回答"。这是理解 RAG 的关键——你能亲眼看到模型"看到了什么材料"才作答。
5. 跑起来
# 1. 在仓库根目录安装第一课依赖
python -m pip install -r requirements-quickstart.txt
# 2. 配置密钥(把 .env.example 复制成 .env,填入你的 Key)
cp .env.example .env
# 然后编辑 .env,把 ZHIPUAI_API_KEY 换成真实值
# 3. 运行
python rag-lessons/01_getting_started/code.py
跑通后,试着改 code.py 里的 QUESTION,或增删 KNOWLEDGE 列表里的内容,看模型回答怎么变。
💰 省钱提示:智谱的
glm-4-flash模型是免费的。如果想零成本试,可把代码里model="glm-4"改成model="glm-4-flash",效果略弱但不花钱。
下一课 Lesson 02 — 深入 Embedding 我们再拆开讲"向量到底怎么表示语义"。