大模型什么都懂,但它没读过你的课本、你的笔记、你公司的文档。RAG 就是给它配一个「开卷考场」:先从你的资料里检索相关内容,再让它照着回答。这学期小强要做出一个能读 PDF、能查网页、能查数据库的私人知识库——从此 AI 回答问题,句句有出处。
从文档解析、向量库、检索重排到完整 RAG 系统与效果评估,做出能读你自己的 PDF / 网页 / 数据库的私人知识库。
用故事和生活类比打开这学期的大门,先「知其所以然」再学语法。
大模型什么都懂,但它没读过你的课本、你的笔记、你公司的文档。RAG 就是给它配一个「开卷考场」:先从你的资料里检索相关内容,再让它照着回答。这学期小强要做出一个能读 PDF、能查网页、能查数据库的私人知识库——从此 AI 回答问题,句句有出处。
先翻书(检索)找到那一页,再答题(生成),不许凭记忆瞎编。
检索+生成整本教材太大塞不下,切成一口一块才好检索与拼接。
chunk 切分意思相近的话,在向量地图上也挨得近;「开心」和「快乐」是邻居。
语义空间初赛(召回)先选 20 篇,复赛(精排)再挑最好的 5 篇。
两段筛选RAG与知识库应用 —— 共 12 课时,全部知识点一网打尽。
def rag_answer(question, knowledge_base):
chunks = split(knowledge_base) # ① 切块
vecs = [embed(c) for c in chunks] # ② 向量化
top = rank_by_similarity(
question, vecs, top_k=5) # ③ 检索+重排
context = "\n".join(top) # ④ 拼上下文
prompt = f"根据以下资料回答:\n{context}\n问题:{question}"
return llm(prompt) + cite(top) # ⑤ 生成+引用回答:Python 由 Guido 于 1991 年发布……
[来源: python-history.pdf 第2页]# 任何格式 → 纯文本 → 切成合适大小的块
doc = "Python是一种解释型语言。" * 3 # 假装是一篇 PDF
def chunk(text, size=30, overlap=5): # 30字一块,重叠5字
return [text[i:i+size] for i in range(0, len(text), size - overlap)]
chunks = chunk(doc)
print("文档总长:", len(doc), "字 → 分成", len(chunks), "块")
print("块1:", chunks[0][:30] + "…")
print("分块心法:块太大检索不准,块太小丢上下文,重叠防切断语义")文档总长: 57 字 → 分成 5 块
块1: Python是一种解释型语言。Python是一种解释型语言。…
分块心法:块太大检索不准,块太小丢上下文,重叠防切断语义# "语义GPS":意思近的句子距离也近
import numpy as np
def cosine(a, b): # 余弦相似度
return np.dot(a, b) / (
np.linalg.norm(a) * np.linalg.norm(b))
v1 = embed("我今天很开心")
v2 = embed("我今天很高兴")
v3 = embed("明天会下雨")
print("开心 vs 高兴:", round(cosine(v1, v2), 3))
print("开心 vs 下雨:", round(cosine(v1, v3), 3))开心 vs 高兴: 0.94
开心 vs 下雨: 0.31import numpy as np
def cos(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
q = np.array([0.9, 0.8, 0.1]) # 问题「怎么装 Python」
d1 = np.array([0.95, 0.7, 0.0]) # 文档A:安装教程
d2 = np.array([0.1, 0.2, 0.9]) # 文档B:蟒蛇习性
print("与文档A相似度:%.3f ← 相关!" % cos(q, d1))
print("与文档B相似度:%.3f ← 无关" % cos(q, d2))
print("进阶:BM25 关键词打分 + 语义向量召回 → Rerank 重排")与文档A相似度:0.995 ← 相关!
与文档B相似度:0.144 ← 无关
进阶:BM25 关键词打分 + 语义向量召回 → Rerank 重排# RAG = 先查资料再回答,让 AI 「开卷考试」
# 五步流水线:
pipeline = [
"① 加载:读取 PDF/网页 → 切块",
"② 向量化:每块转成 embedding 存入向量库",
"③ 检索:用户问题 → 找最相关的 Top-K 块",
"④ 拼装:问题 + 检索到的资料 → 组成 Prompt",
"⑤ 生成:LLM 基于资料作答(可标注出处)",
]
for step in pipeline:
print(step)
print("价值:知识可随时更新、能答私有数据、少幻觉")① 加载:读取 PDF/网页 → 切块
② 向量化:每块转成 embedding 存入向量库
③ 检索:用户问题 → 找最相关的 Top-K 块
④ 拼装:问题 + 检索到的资料 → 组成 Prompt
⑤ 生成:LLM 基于资料作答(可标注出处)
价值:知识可随时更新、能答私有数据、少幻觉# 常见病 → 常用药:
fixes = [
("检索不到", "改小分块 / 混合检索(BM25+向量) / 查询改写"),
("检索到但排序差", "加 Rerank 重排模型"),
("答案缺出处", "Prompt 里要求『仅根据资料回答并引用编号』"),
("资料太长爆窗口", "Top-K 调小 / 压缩摘要后再拼"),
("多轮对话指代不清", "先做问题改写『它指的是什么』"),
]
for symptom, cure in fixes:
print(f"症状:{symptom}\n 处方:{cure}")症状:检索不到
处方:改小分块 / 混合检索(BM25+向量) / 查询改写
症状:检索到但排序差
处方:加 Rerank 重排模型
症状:答案缺出处
处方:Prompt 里要求『仅根据资料回答并引用编号』
症状:资料太长爆窗口
处方:Top-K 调小 / 压缩摘要后再拼
症状:多轮对话指代不清
处方:先做问题改写『它指的是什么』# 让图片和文字躺进同一个向量空间
# 步骤:图片 → CLIP 编码 → 向量;文字 → 同空间向量
# 检索时:问题(文字) 也能搜到 相关图片
schema = {"知识库": ["产品手册.pdf", "示意图.png", "FAQ.docx"],
"统一编码": "全部转成同维度向量",
"检索": "问题 → 同时命中文字块和图片",
"生成": "多模态 LLM 看图作答"}
for k, v in schema.items():
print(f"{k}:{v}")
print("应用:『这个报错截图是什么意思?』")知识库: ['产品手册.pdf', '示意图.png', 'FAQ.docx']
统一编码: 全部转成同维度向量
检索: 问题 → 同时命中文字块和图片
生成: 多模态 LLM 看图作答
应用:『这个报错截图是什么意思?』# 解决「模型知识停在训练那天」的问题
flow = [
"① 触发:用户问了一个时效性问题",
"② 爬取:实时抓取相关网页(带 UA、限速)",
"③ 清洗:去标签留正文 → 切块",
"④ 检索:新块与老知识库一起参与召回",
"⑤ 生成:答案标注来源与时间",
]
for s in flow:
print(s)
print("加分项:缓存已爬内容 + 定时增量更新 + 失效检测")① 触发:用户问了一个时效性问题
② 爬取:实时抓取相关网页(带 UA、限速)
③ 清洗:去标签留正文 → 切块
④ 检索:新块与老知识库一起参与召回
⑤ 生成:答案标注来源与时间
加分项:缓存已爬内容 + 定时增量更新 + 失效检测# 用户说人话 → 模型写 SQL → 查库返回
user_q = "数学不及格的同学都有谁?"
sql = llm(f"把问题转成SQL,表schema:{schema}\n"
f"问题:{user_q}")
# 生成:SELECT name FROM scores
# WHERE subject='数学' AND score < 60
rows = db.query(sql)生成 SQL:SELECT name FROM scores WHERE subject='数学' AND score<60
结果:[('小刚', 55), ('小丽', 58)]# 指标三件套:检索准不准 + 答案对不对 + 引用真不真
metrics = {
"召回率 Recall@K": "该找到的资料,找到了几条",
"忠实度 Faithfulness": "答案是否忠于检索资料(不瞎编)",
"答案相关性": "答没答到点子上",
}
# 自动化:准备 20 个标准问题 + 标准出处,脚本跑分
for k, v in metrics.items():
print(f"{k}:{v}")
print("人工盲测:把两个版本答案打乱给评委,投票谁更好")召回率 Recall@K:该找到的资料,找到了几条
忠实度 Faithfulness:答案是否忠于检索资料(不瞎编)
答案相关性:答没答到点子上
人工盲测:把两个版本答案打乱给评委,投票谁更好# 材料题:给一大段材料 + 任务 → 考 Prompt 设计
# 万能模板:角色 + 任务 + 材料 + 格式 + 约束
template = """你是{role}。
请阅读以下材料:"""{material}"""
任务:{task}
要求:
- 严格基于材料,不使用外部知识
- 以 JSON 输出:{{\"answer\": \"…\", \"evidence\": \"原文出处…\"}}"""
print(template.format(role="阅读理解专家",
material="(1000字材料……)",
task="总结三个核心观点"))
print("\n评分点:是否引用原文、格式是否规范、有无幻觉")你是阅读理解专家。
请阅读以下材料:"""(1000字材料……)"""
任务:总结三个核心观点
要求:
- 严格基于材料,不使用外部知识
- 以 JSON 输出:{"answer": "…", "evidence": "原文出处…"}
评分点:是否引用原文、格式是否规范、有无幻觉# 需求:上传课件 → AI 出题/答疑/划重点
features = {
"知识库": "把 14 学期课件切块入库",
"出题模式": "根据某章内容生成 5 道选择题 + 答案解析",
"苏格拉底模式": "不直接给答案,反问引导学生想",
"错题本": "记录答错的知识点,重点复习",
}
for k, v in features.items():
print(f"{k}:{v}")
print("技术栈:文档分块 + 向量检索 + LLM + 简单 Web 界面")知识库: 把 14 学期课件切块入库
出题模式: 根据某章内容生成 5 道选择题 + 答案解析
苏格拉底模式: 不直接给答案,反问引导学生想
错题本: 记录答错的知识点,重点复习
技术栈:文档分块 + 向量检索 + LLM + 简单 Web 界面每个知识点都要落到能跑、能玩、能演示的作品上。
期末项目是整学期知识点的综合检验场:综合运用。学生将独立完成需求拆解 → 功能实现 → 调试打磨 → 上台演示的完整闭环。
| 课次 | 主题 | 趣味项目 | 知识点 |
|---|---|---|---|
| 1 | RAG是什么 | 让AI读你的文档 | 检索增强生成原理 |
| 2 | 文档处理 | PDF转文本 | 文档加载、解析、分块 |
| 3 | 向量数据库 | 语义搜索入门 | Embedding、向量存储 |
| 4 | 检索策略 | 找得更准 | 相似度计算、重排序 |
| 5 | 完整RAG系统 | 私人知识库问答 | RAG完整流程 |
| 6 | RAG优化 | 回答更准确 | 检索优化、生成优化 |
| 7 | 多模态RAG | 图片也能问答 | 图文混合检索 |
| 8 | 网页爬虫+RAG | 实时信息问答 | 网页抓取、动态更新 |
| 9 | 数据库+RAG | 结构化数据问答 | Text-to-SQL |
| 10 | RAG评估 | 谁的知识库更好 | 评估指标、自动化测试 |
| 11 | LMCC初赛精讲2 | 材料题专项 | Prompt设计实战 |
| 12 | 期末项目 | 课程学习助手 | 综合运用 |
把一学期的知识点串成体系,看清来路与去向。
◀ 上一章:六年级 上学期 · 大模型原理与Prompt工程
下一章 ▶:七年级 上学期 · AI Agent与应用开发
从文档解析、向量库、检索重排到完整 RAG 系统与效果评估,做出能读你自己的 PDF / 网页 / 数据库的私人知识库。
结业时你将带走:1 个完整大模型产品 + LMCC 认证 + 从想法到上线的全栈能力。
避开高频易错点,再用速查表把语法焊进肌肉记忆。
chunk = 整章 5000 字
# 检索粒度太粗,噪声大chunk 300~500 字
配合 50 字重叠搜「2024年」毫无结果
# 向量不认精确词向量检索 + 关键词检索
两路召回取并集top_k = 1
# 唯一一块还不相关top_k = 5~10
+ 相似度阈值过滤感觉回答变好了
# 到底好了多少?建评估集:
问题/标准答案/打分维度| 功能 | 写法 | 一句话理解 |
|---|---|---|
| 文本分块 | split(每块300~500字, 重叠50) | 切块是检索质量的地基 |
| 向量化 | embeddings.encode(文本) | 文字 → 语义坐标 |
| 相似度 | cosine(A, B) | 余弦越接近 1 越相似 |
| 向量库 | FAISS / Chroma | 亿级向量毫秒搜 |
| 两路召回 | 向量 + 关键词 → 合并去重 | 混合检索 |
| 重排序 | rerank 对 top20 精排 | 复赛评委再筛一轮 |
| 答案带引用 | 回答末尾附 [来源1][来源2] | 句句有出处 |
| 评估维度 | 忠实度 / 相关性 / 完整性 | 三把尺子量质量 |
按 A / B / C 三档难度自主选择:保底完成 A 组,学有余力挑战 B、C 组。