本节目标:用一个你能复现的真实提问,讲清两件事——为什么不能直接问大模型,以及 RAG 怎么补上这块短板。
读完,你脑子里会有一张「六步流水线」的图。
一、直接问的三宗罪
打开任意一个大模型,问它:「贵州茅台 2024 年的营业总收入和归母净利润分别是多少?」
你可能拿到三种结果,没有一种能直接用。
1、模型直接虚构
数字看着合理,实为凭记忆臆造——这就是幻觉 (Hallucination)。
2、知识有截止日期
它说「我的知识截止到某年,无法回答 2024 年」,直接摆烂。
3、无法溯源
它给了个数,可你追问「出自年报第几页」,它答不上来。
在金融场景,这三种都是致命的。
你不可能拿一个「可能是虚构的、还查不到出处」的数字,去写研报、做决策。
根因只有一句话:大模型的知识是训练时「一次性背进去」的。
它既不知道你私有的、最新的资料,也没法告诉你某句话到底来自哪份文档的哪一页。
二、闭卷改开卷
RAG = Retrieval-Augmented Generation,检索增强生成。
一句话讲透它的直觉:回答之前,先去资料库里把相关的几页「翻出来」,连同问题一起交给大模型,让它「看着资料回答」。
类比最直观:
| 不带 RAG | 带 RAG | |
|---|---|---|
| 考试形式 | 闭卷,全凭记忆 | 开卷,允许翻书 |
| 答案来源 | 模型脑子里的记忆(可能记错) | 当场检索到的原文 |
| 能不能溯源 | 不能 | 能,知道答案抄自哪一页 |
| 私有 / 最新数据 | 不知道 | 临时塞进去就知道 |
把大模型从「背书的学生」,变成「会查资料的分析师」。
这就是 RAG 干的事。
三、六步流水线
要实现「开卷」,得先把书做成「可快速翻阅」的样子,再在提问时精准翻页。
整个过程拆成六步。
前四步是离线建库(只做一次),后两步是在线问答(每次提问都走):
逐步拆解,每一步都对应后面一个章节,这里先建立直觉:
| 步骤 | 干什么 | 用本课的话说 |
|---|---|---|
| 1. 解析 | 把 PDF 里的文字、表格、页码读出来 | 年报含大量表格,解析质量直接决定上限<br>→ 第 2 章 数据层 |
| 2. 分块 | 把长文档切成一小片一小片 | 财务表格不能乱切,切碎了数字就失去意义<br>→ 第 2 章 数据层 |
| 3. 嵌入 | 把每片文字变成一串数字(向量) | 让「语义相近」变成「距离相近」,中文年报用中文强嵌入<br>→ 第 3 章 表示与存储 |
| 4. 向量库 | 把向量连同元数据(公司 / 年份 / 页码)存起来 | 一套库兼做向量检索 + 条件过滤<br>→ 第 3 章 表示与存储 |
| 5. 检索 | 把问题转成向量,在库里找最近的几片 | 「茅台 vs 五粮液」得先选对公司,否则检索到错公司<br>→ 第 4 章 检索核心 |
| 6. 生成 | 把检索到的片段塞进 prompt,据此作答并标页码 | 强制标 (公司·年份·页码),查不到就说查不到<br>→ 第 5 章 生成与评估 |
记住这张图。
后面每一章,都是在把这六步里的某一步做深、做对。
四、向量与语义距离
第 3 步的「嵌入」是很多人卡壳的地方,用一句话讲透:嵌入 (Embedding) = 把一段文字映射成一个高维坐标点,意思越接近的文字,坐标离得越近。
举两个例子:
- 「营业收入」和「营收」 → 坐标几乎重合;
- 「营业收入」和「今天天气」 → 坐标离得很远。
于是「找语义最相关的片段」,就变成了一个纯数学问题——在坐标空间里找离问题最近的几个点。
本课用的 BGE-large-zh 模型,会把每段中文映射成一个 1024 维的向量。
检索时(第 5 步),把用户问题也嵌入成同一个空间里的点,算距离、取最近的 Top-K,就是「翻到最相关的那几页」。
五、选型理由
六步流水线是不变的原理。
但每一步用什么工具,是会变的。
本课的选型原则:面向 TS / 全栈受众,主栈用 Mastra,只在 TS 生态薄弱处用 Python 兜底。
| 步骤 | 选型 | 为什么 |
|---|---|---|
| 解析 | MinerU(Python 微服务) | 开源、中文 + 表格最强<br>TS 这块弱,做成 HTTP 服务边界,顺带讲「Python 即服务」 |
| 分块 | Mastra @mastra/rag | 框架原生,结构感知分块 |
| 嵌入 | BGE-large-zh(经 API) | 中文年报必须中文强嵌入,1024 维 |
| 向量库 | Supabase(Postgres + pgvector)·主库 | 一套库同时做向量检索 + 元数据过滤<br>托管免装、跨平台、门槛最低,本课唯一主库 |
| 检索 | Mastra @mastra/pg | 向量相似度 + WHERE 公司/年份 过滤,一条查询搞定 |
| 生成 | DeepSeek(经 Mastra) | 中文好、便宜<br>Mastra 统一接入,换模型不改代码 |
诚实说一句:算法岗 JD 仍以 Python 为主。
但 TS 栈更适合 AI 应用 / 全栈方向,且市场更稀缺。
本课只跟 Mastra 一条主线,避免双栈维护拖慢迭代。
小结
1、直接问大模型有三宗罪
会虚构、知识过期、无法溯源——金融场景里每一条都致命。
2、RAG 把「闭卷」改成「开卷」
先检索相关原文,再让模型看着原文作答。
3、整条链路是六步流水线
解析 → 分块 → 嵌入 → 向量库 → 检索 → 生成。
4、原理不变,工具会变
本课主栈 Mastra (TS),解析用 MinerU 兜底。
下一节,我们先把跑这条流水线的实验台搭起来。