# 18 · 读地图:用框架拆解陌生系统 > 一句话点题:**会设计的人,首先要会「读」——对着一张陌生的架构图,用同一套问题把「为什么这么连」一层层剥出来。AI 系统看着新,可这套读图动作一个字都不用改。** --- > **🎯 实战篇第 1 章 · 本章只练一件事** > > **不设计、不写代码**——只练**逆向读图**:拿到一张架构说明,能说出约束、灵魂路径、关键取舍、先死在哪。 > > | 读完你应该能 | 本章怎么练 | > |---|---| > | 用四步法读任何模板,不从头读到尾 | 第一节:方法 + 读图笔记模板 | > | 跟着示范走通一遍 | 第二节:RAG 知识库(**示范**,约 15 分钟) | > | 自己填一张读图笔记 | 第三节:AI 对话产品(**10 分钟练习**) | > | 换一个系统独立完成 | 第四节:课后作业 | > > **为什么实战篇拿 AI 系统开刀?** 因为它们正是大多数人「最不熟、最容易被术语唬住」的陌生系统——而读图法恰恰是用来对付陌生的。下一章(19)起,我们会**正向设计**一个 AI 智能客服;本章先用它的「近亲」练眼:学会读,才谈得上设计。 --- ## 一、方法与工具:四步 + 三问 + 一页笔记 [07 章](07-从0到1设计一个系统.md) 是**正向**:约束 → 方案 → 图。本章是**逆向**:图 → 反推约束与取舍。 ``` 设计: 约束 ──▶ 方案 ──▶ 图 读图: 图 ──▶ 约束 ──▶ 取舍 ──▶ 「换约束还会这样吗?」 ``` **认字 vs 读懂**:认字是「有向量库、有编排层、有 GPU」;读懂是对每个框能答**三问**([02 框架](02-架构师的思考框架.md) 的逆向): 1. 它在服务哪个**质量属性**或**约束**? 2. 它**放弃了**什么? 3. 规模涨 100 倍,**这里会先裂**吗? **四步读图**(口诀:**本质 → 全景 → 取舍 → 死穴**)。读仓库里任意一张 [模板](../templates/README.md) 时,可按段对照:需求与约束 → 全景图与数据流 → 关键决策 → 瓶颈与误区。 | 步骤 | 你在干什么 | |---|---| | ① 抓本质 | 功能需求 + 质量属性 + 硬约束 | | ② 看全景 | 灵魂数据流是哪条(跟一条请求走完) | | ③ 挖取舍 | 2~3 个「选了 X,放弃 Y」 | | ④ 找死穴 | 第一个规模化瓶颈 + 一个常见反模式 | **读图笔记模板**(示范、练习、作业都填这一张): ``` 系统名: _______________ ① 本质 · 一句话业务: · 质量属性(最重的 2 条): · 硬约束(1 条): ② 全景 · 灵魂路径(一句话): ③ 取舍(至少 2 条) · 选了 ___ / 放弃 ___ / 因为约束 ___ · 选了 ___ / 放弃 ___ / 因为约束 ___ ④ 死穴 · 先死在哪: · 常见反模式(我见过的一种): ``` > **AI 系统读图,只多盯三个新约束**(都来自 [17 章](17-大模型时代的架构判断.md),后面几章会反复用):**成本**(每次调用都在烧 token)、**非确定性**(同样输入未必同样输出)、**上下文**(模型的工作内存有限且昂贵)。读 AI 地图时,在「质量属性」和「取舍」里多问一句:这块是在省钱、在防胡说,还是在管上下文? --- ## 二、示范:跟着读「RAG 知识库」(约 15 分钟) > **是什么**:把你自己的文档切块、向量化、建索引,用户提问时**先检索出最相关的几段塞进 prompt**,让大模型「开卷考试」——基于你的资料作答,而不是凭训练记忆瞎编。 > > **读图目标**:填完上面笔记模板。下面按四步走;**不必背 RAG 细节**,要背的是**读图动作**。 ### ① 抓本质 → 填笔记「本质」栏 | | 要点 | |---|---| | **功能** | 文档接入、切块+向量化、检索(向量+关键词)、重排、组装上下文生成**带引用**的答案 | | **质量属性(主线)** | **检索质量**(找不准模型必胡说) · **可溯源**(答案能指回原文) · **成本**(切块/检索/生成三段都烧钱) | | **硬约束** | 检索质量决定回答上限;上下文窗口塞不下全部资料;检索到的内容是**不可信输入**(可能藏注入) | ✅ **这一步结束,你应该能说出**:这不是「问一个更聪明的模型」,而是「让模型开卷考试——功力八成在检索」。 ### ② 看全景 → 填笔记「全景」栏 ``` 离线: 文档 → 解析 → 切块 → 向量化 → 写入向量库(块向量+来源) 在线: 提问 → ①向量+关键词召回 ②重排选 top-K → ③组装 prompt → LLM → 带引用答案 ``` 跟一条「我们的退款政策是几天?」:问题向量化 → 向量库召回 ~20 块 → **重排**精选 3~5 块 → 拼进 prompt → 模型照着写答案 + 附「依据:政策文档 3.2 节」。 | 图上的关键块 | 在服务什么 | |---|---| | 离线建库(切块+向量化) | 把资料变成**可检索**的形态 | | 召回 + 重排(两阶段漏斗) | **检索质量**:先广后精 | | 引用来源 | **可溯源**(可信、可核实) | | 把检索结果当不可信文本 | 防**提示注入** | ✅ **这一步结束,你应该能说出灵魂路径**:「离线把资料组织好 → 在线把对的资料找出来 → 模型照着写」,而不是「把问题直接丢给模型」。 ### ③ 挖取舍 → 填笔记「取舍」栏(示范写 2 条) | 决策 | 选了 | 放弃 | 因为 | |---|---|---|---| | RAG vs 长上下文 vs 微调 | **RAG(临时检索)** | 把资料全塞进 prompt 的简单 | 资料多、要常更新、要溯源——长上下文又贵又「迷失在中间」 | | 纯向量 vs 混合检索 | **混合(向量+关键词)+ 重排** | 纯向量的实现简单 | 向量擅长语义、却对产品型号/人名等精确词不灵 | (另两条你读图时常见:**切块怎么切**是检索质量的隐形开关;检索结果**永远当不可信输入**。) ✅ **这一步结束,你应该能写出**:至少 2 条「选了/放弃/因为」。 ### ④ 找死穴 → 填笔记「死穴」栏 | 先死在哪 | 破解方向 | |---|---| | 检索质量差 → 模型跟着胡说 | 混合检索 + 重排 + **持续评测召回**(面试/生产高频) | | 向量规模、embedding 成本涨上来 | 向量库分片 + 增量更新(只重算变化的块) | 反模式举例:检索拉胯却怪「模型太笨」;切块拍脑袋(太大噪音多 / 太小丢上下文);不给引用。 ✅ **四步走完,你应该有一张完整的读图笔记。** > **架构智慧**:RAG 的图再花哨,记住一句——**RAG 的上限 = 检索的上限(garbage in, garbage out)。** 模型只是最后「读着资料写答案」的环节,八成功力在「把对的资料找出来」。其它框都是为这句服务。 > > 📎 需要更多细节(切块、重排、Contextual Retrieval)时,再翻 [RAG 知识库模板](../templates/rag-knowledge-base/README.md)。 --- ## 三、10 分钟练习:AI 对话产品(设计 ↔ 读图) 这一节**不是第二篇长文**。你带着**半页材料** + **读图笔记模板**,自己填;最后对答案。 > **为什么挑它?** 因为它就是下一章我们要**正向设计**的 AI 智能客服的「母体」。先把它读懂,第 19 章动手设计时你会快一倍。 ### 材料 A:MVP 版怎么搭(摘要) | | MVP 怎么定的 | |---|---| | 范围 | 要:多轮对话、流式输出 · **不要**(先砍):RAG、自建 GPU、工具调用 | | 全景 | 客户端带着历史 → 薄薄一层编排 → **直接调某个模型厂商的 API** → SSE 流式吐字 | | 成本 | 按调用付费,先不优化——**先验证有没有人用** | ### 材料 B:成熟期「成品地图」要点(摘要) | | 成品地图怎么定的 | |---|---| | 灵魂部件 | **推理服务(GPU)**——最贵最稀缺,整套架构都在「喂饱、用满、用省」它 | | 全景 | 网关(鉴权/限流/维持流式连接)→ 编排层(组装上下文+安全+Agent 循环+计费)→ {会话存储 / RAG 检索 / 工具沙箱 / 推理服务} | | 省钱三件套 | **连续批处理**(GPU 不空转)、**prompt 缓存**(重复前缀不重算)、**模型路由**(简单问题给小模型) | | 死穴 | GPU 被打满→首字延迟飙升;上下文越长单请求越吃显存;**成本本身就是瓶颈** | ### 你的任务(计时 10 分钟) 1. 用**材料 B**,按四步填一张**AI 对话产品读图笔记**(先别看下面参考答案)。 2. 回答**对照三问**(先自答,再展开答案)。 **对照三问:** 1. 为什么这类系统几乎一定选**流式输出(SSE)**,而不是憋完整答案再返回? 2. 为什么说「成本」在这里是**第一天就要管**的架构议题,而普通网站可以「先上线再优化」? 3. MVP 直接调 API,成熟期却要自建 GPU + 连续批处理——是 MVP 错了吗?
参考答案:AI 对话产品读图笔记(示例) ``` 系统名: AI 对话产品(成熟期成品地图) ① 本质 · 一句话: 把一个昂贵的「推理大脑」(LLM)包装成可对话、能流式、能用工具的产品 · 质量属性: 首字延迟(TTFT)极低;生成吞吐高;每千 token 成本越低越好 · 硬约束: GPU 又贵又缺(头号约束);上下文窗口有限;推理是有状态计算(KV cache 吃显存) ② 全景 · 灵魂路径: 网关维持流式连接 → 编排层组装上下文+安全 → 推理服务把多请求拼批喂 GPU → token 一个个 SSE 回传 ③ 取舍 · 选了 流式 SSE / 放弃 一次性返回 / 因为 感知延迟比真实总延迟更重要 · 选了 连续批处理+prompt缓存+模型路由 / 放弃 每请求单独算的简单 / 因为 GPU 是头号稀缺资源,成本即毛利 ④ 死穴 · 先死在哪: GPU 集群被打满 → 请求排队 → 首字延迟飙升 · 反模式: 当普通 CRUD 网站设计、不做流式、每轮重算全部历史从不缓存、不记 token 账 ```
参考答案:对照三问 **1. 为什么几乎一定流式?** 一次性返回要让用户盯着空白屏幕等十几秒,体验灾难;流式让首字 1 秒内就出,**感知延迟**骤降。代价是连接管理、重试恢复更复杂——但值。 **2. 为什么成本第一天就管?** 普通网站「多一次请求几乎不要钱」,这里**多生成 1000 字就是实打实的 GPU 成本**。不优化(缓存/路由/批处理),毛利直接为负。所以省钱从第一天就是架构议题,不是上线后的优化项。 **3. MVP 错了吗?** 没错,是**约束不同**。 | 约束 | 选 | |---|---| | 还在验证有没有人用(MVP) | 直接调 API — 最快上线,别自建 GPU | | 已有稳定流量、成本压毛利(成熟) | 自建 GPU + 批处理 + 路由 — 把单 token 成本打下来 | **先有人用,才谈得上省钱**——这正是第 20 章「演进剧本」的主线。
**和材料 A(MVP)不一致时怎么说?** 先问:**现在到底在解决哪个问题?** 验证需求 → 调 API 合理;成本压毛利 → 才自建。不是谁错,是**约束随阶段变了**。 --- ## 四、课后作业:换一个系统,15 分钟 任选 [`templates/`](../templates/README.md) 里**没读过**的一个(建议先在 AI 系统里挑): - **[AI Agent / 工作流平台](../templates/ai-agent-platform/README.md)** —— 第 22 章会正向设计它,先读眼熟。 - **[模型推理服务](../templates/inference-serving/README.md)** —— 把上面「推理服务」那个框放大特写。 - 想找对照,也可挑一个**经典系统**(支付、在线票务)感受「AI 系统 vs 经典系统的读图,动作一模一样」。 步骤照旧: 1. 合上「关键决策」段。 2. 用第一节的**读图笔记模板**填空。 3. 打开模板对照——不一样不要紧,能说清**约束不同**即可。 --- ## 🎯 随堂检验 --- ## 本章小结 - **本章只练逆向读图**,产出物是**一页读图笔记**,不是设计方案。 - **四步 + 三问**:本质 → 全景 → 取舍 → 死穴;AI 系统再多盯三个新约束:**成本 / 非确定性 / 上下文**。 - **RAG = 示范**:灵魂路径「离线建库 → 在线检索 → 模型照着写」;一句话——**RAG 的上限 = 检索的上限**。 - **AI 对话产品 = 10 分钟练习**:半页材料 + 自填笔记 + 对照三问;重点练「MVP 调 API 与成熟期自建 GPU 的差异 = 约束随阶段变」。 - **作业**:任选一个模板(建议 AI Agent / 推理服务),15 分钟填笔记。 > **承上启下**:你已经会**读**别人的 AI 地图了。下一章 [19 · 完整设计演练:中等复杂度系统](19-完整设计演练中等复杂度系统.md) 换你**正向画图**——用 [07 章](07-从0到1设计一个系统.md) 的八步,从 0 设计一个「能查单、能退款」的 **AI 智能客服**:既要管 AI 的新约束(防胡说、烧钱、非确定),又要扛经典硬约束(钱不能错)。读图练眼,设计练手。