📑 本页目录(点开跳转)
17 · 实战与挑战项目
⏱ 按项目算,1–4 天 | 🔨 菜单式:做完一个能上线的,比读完十六章有用
🎯 一句话
前面十六章拆开讲了每个零件,这一章把它们装回去 —— 而且是装成一个你敢发给别人用的东西。
⭐ 这个板块和站里其他板块最大的不同:它的验收标准不是「跑通了」,是「别人能用」。 所以每个项目的验收里都有一条:把链接发给一个不认识你代码的人,看他能不能用起来。
🗺️ 怎么挑
| 你的情况 | 从这个开始 |
|---|---|
| 想尽快有个能给人看的东西 | ① 完整聊天应用(2–3 天) |
| 手上有一堆文档想让它能问答 | ② 文档问答(3–4 天) |
| 想练「别把钱烧光」这件事 | ③ 成本控制台(1–2 天) |
| 已经有个能跑的,想让它扛得住 | 挑战 A:压力与降级(2–3 天) |
| 想搞懂线上出问题怎么查 | 挑战 B:故障演练(2–3 天) |
⚠️ 别按顺序全做。 这个板块的项目不像算法题能秒验,做一个到真上线比做三个半成品有价值得多。
① 完整聊天应用 ⏱ 2–3 天
🔗 依赖:03 后端骨架 · 04 调用层 · 05 流式输出 · 06 关系数据库 · 08 认证与多租户 · 09 · 10 · 14 部署
目标:把第 1 章那个两小时版本,补成一个真的能用的产品。
第 1 章末尾列的缺失项,这里逐条补上:
| 第 1 章缺的 | 这里补上 | 在哪一章 |
|---|---|---|
| 没有数据库,刷新就没了 | 对话和消息落库 | 06 |
| 没有登录,谁都能用 | 认证 + 每人只看自己的对话 | 08 |
| 密钥硬编码在代码里 | 环境变量 + 不进版本库 | 13 |
| 没有限流,一个人能打爆 | 三层护栏 | 12 |
| 出错了看不出为什么 | 结构化日志 + request_id | 15 |
验收标准
- ✅ 刷新页面,对话还在
- ✅ 换个浏览器登录另一个账号,看不到第一个账号的任何数据 —— ⭐ 这条要主动去试着越权:直接改 URL 里的对话 ID 访问别人的,必须 403 而不是 200
- ⭐⭐ 首字在 2 秒内出现(不是全部答完才显示)
- ✅ 断网重连后界面不卡死
- ⭐⭐ 把链接发给一个朋友,他不问你任何问题就能用起来
💡 加分:加一个「重新生成」按钮 —— 它会逼你想清楚消息该怎么存(版本?覆盖?分支?), 这是真实产品里第一个会让你重构数据模型的需求。
② 文档问答 ⏱ 3–4 天
🔗 依赖:① 的全部 + 07 向量检索落地 · 11 长任务与队列
目标:用户上传自己的文档,然后能对着它提问。
为什么这个项目值得做:它逼你面对三个第一次做都会栽的问题 ——
- ⭐ 上传和处理必须异步:一个 50 页的 PDF 切分 + embedding 要几十秒, HTTP 请求等不了 → 队列(11 章)
- ⭐⭐ 检索必须带租户过滤:搜的时候只能搜这个用户自己的文档 —— 这正是 07 章说的「过滤 + 向量检索的组合,是专用库和关系库差别最大的地方」
- ⚠️ 处理失败了怎么办:PDF 是扫描件、文件损坏、超大 —— 状态要能让用户看见
验收标准
- ✅ 上传后页面立刻返回,处理进度可见(不是转圈转到超时)
- ⭐⭐ A 用户上传的文档,B 用户提问时绝不会被检索到 —— 这条要写一个自动化测试反复跑,不能靠人工点
- ✅ 处理失败的文档有明确状态和原因,不是永远「处理中」
- ✅ 回答里能标出引用了哪一段原文
- ⭐ 同一个文档上传两次,不会存两份 embedding(幂等,11 章)
③ 成本控制台 ⏱ 1–2 天
🔗 依赖:04 调用层 · 12 限流配额与成本护栏 · 15 可观测性
目标:给你的应用做一个后台页面,看得见钱花在哪。
⭐ 这个项目投入产出比最高 —— 它不新增用户功能,但它是唯一能让你晚上睡着的东西。
要做的 1. 每次 LLM 调用落一条记录:用户、功能、模型、输入/输出 token、估算成本、耗时 2. 一个页面:按天 / 按用户 / 按功能 / 按模型四个维度看 3. 三层护栏都接上(12 章):每用户限流、每用户配额、全局熔断
验收标准
- ⭐⭐ 能回答「昨天这 100 块钱是谁花的、花在哪个功能上」 —— 答不上来就说明记账维度不够
- ✅ 用 for 循环快速打 100 次请求,第 N 次开始返回 429,且
Retry-After有值 - ⭐⭐ 把全局熔断阈值调成 0.01 美元,验证它真的会拦 —— ⚠️ 这一条必须真试。很多人写了熔断但从没验证过它会触发,等到真需要时才发现写错了
- ✅ 超限时前端有明确提示,不是白屏或转圈
🏆 挑战 A:压力与降级 ⏱ 2–3 天
目标:让你的应用在被压和被打断时,坏得体面一点。
要做的实验(每个都要记录现象)
| 实验 | 期望的行为 |
|---|---|
| 并发 50 个流式请求 | 不崩、不互相拖慢到不可用;⚠️ 观察连接池是不是先耗尽(06 章) |
| 把 LLM API 换成一个必定超时的地址 | 请求在超时后干净失败,不是挂到网关超时 |
| 请求进行到一半,客户端断开 | ⭐ 后端感知到并停止调用(05 章)—— 否则你在为没人看的内容付费 |
| 数据库连接断开再恢复 | 应用自动恢复,不用重启 |
| 部署新版本时正好有流式请求在跑 | ⭐ 优雅关闭:旧请求做完,新请求进新实例(14 章) |
验收标准 - ⭐⭐ 每个实验都先写下你预期会发生什么,再去试 —— 预期和实际不一致的地方才是你真正学到的 - ✅ 至少有一个降级路径能真的走通(比如主模型超时后自动换小模型)
🏆 挑战 B:故障演练 ⏱ 2–3 天
🔗 依赖:①的成品 + 15 可观测性 · 16 上线前检查单
目标:⭐ 让别人给你埋一个 bug,你靠日志和追踪把它找出来。
怎么做 1. 找个人(或者让 AI)在你的代码里改一处,制造一个只在特定条件下出现的问题 —— 比如某个用户的对话变慢、某类请求偶发 500、成本莫名其妙涨了 2. 你只能看日志、追踪和监控面板,不能直接看 diff 3. 记录你的排查路径:先看什么、怎么缩小范围、哪一步卡住了
验收标准 - ⭐⭐ 能在 30 分钟内定位到问题所在的那一层(不用精确到行) - ⚠️ 如果找不到,那才是这个项目最大的收获 —— 说明你的可观测性有洞。 ⭐ 把「这次缺了什么信息」补进日志,然后再演练一次 - ✅ 最终能回答三个问题:影响了谁、从什么时候开始、为什么没有告警
💡 这个项目是《模型上线之后》11 · 从告警到根因的应用层版本 —— 那一章讲模型出问题怎么查,这里练的是服务出问题怎么查。
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| 16 · 上线前检查单 | ⭐ 每个项目做完都照着过一遍。它的每一条都给了「怎么验证」,正好当验收清单用 |
| 01 · 第一天:两小时上线 | 项目 ① 就是把那一版补完整。⭐ 回头看那一章末尾列的缺失清单,现在你能逐条划掉了 |
| 12 · 限流配额与成本护栏 | 项目 ③ 的全部依据。⚠️ 全局熔断一定要真触发一次,写了没验证等于没写 |
| ../模型上线之后/index.html | ⭐ 应用能跑之后的下一站:服务健康是本板块,模型准不准是那一套 |
| ../智能体工程教程/17-实战项目.html | ⭐ 对照着做:那边练的是「Agent 的能力怎么设计」,这边练的是「怎么把它变成产品」 |
✅ 检查点
⭐ 这一章的检查点不考知识,考你能不能判断自己做到位了没有。
- 这个板块的项目,验收标准和别的板块最大的不同是什么?
- 项目 ① 里,验证租户隔离该怎么试?为什么不能只看界面?
- 「首字在 2 秒内出现」和「2 秒内答完」是一回事吗?为什么前者才是标准?
- 项目 ② 逼你面对的三个问题分别是什么?
- 为什么说项目 ③ 投入产出比最高?
- 全局熔断该怎么验证?为什么必须真触发一次?
- 挑战 A 里,客户端断开后后端不停会怎样?
- 挑战 B 里如果找不到 bug,该做什么?
👀 答案
- ⭐ 别的板块验收是「跑通了」(最短路是不是真最短、剪枝后根值变没变),这个板块是「别人能用」。所以每个项目的验收里都有一条:把链接发给一个不认识你代码的人,看他能不能用起来。
- ⭐ 主动去试着越权:直接改 URL 里的对话 ID 去访问别人的,必须 403 而不是 200。不能只看界面,因为界面上不显示 ≠ 接口不返回 —— 隔离要做在数据访问层,不是前端过滤(08 章)。
- 不是一回事。 LLM 生成一段长回答本来就要十几秒,「2 秒内答完」做不到;而 ⭐ 首字延迟(TTFT)决定用户觉得它是「在动」还是「卡住了」。这就是为什么流式是必需品不是优化项(05、15)。
- ① ⭐ 上传处理必须异步(几十秒的活 HTTP 等不了 → 队列)② ⭐⭐ 检索必须带租户过滤(这是专用向量库和关系库差别最大的地方)③ ⚠️ 处理失败要有明确状态,不能永远「处理中」。
- 因为它不新增任何用户功能,但它是唯一能让你晚上睡着的东西。AI 应用和普通 Web 应用最大的差别就是每个请求真的花钱,没有成本可见性,一个 bug 就能一夜烧掉预算。
- ⭐⭐ 把阈值调成 0.01 美元,验证它真的会拦。 必须真触发是因为:很多人写了熔断但从没验证过它会触发,等到真需要(线上死循环调 API)时才发现写错了 —— 而那时候已经在烧钱了。
- ⭐ 你在为没有人会看的内容付费。 用户关掉页面了,后端还在调 LLM 生成剩下的几百个 token,钱照花。所以第 5 章要讲断连感知。
- ⚠️ 找不到才是最大的收获 —— 它说明你的可观测性有洞。⭐ 把「这次缺了什么信息」补进日志,然后再演练一次。 最终要能回答三个问题:影响了谁、从什么时候开始、为什么没有告警。
🛑 可以停在这里
⚡ 走神救援
⭐⭐ 这一章把前十六章的零件装回去,而且验收标准和站里别的板块不同 —— 不是「跑通了」,是「别人能用」,所以每个项目都有一条:把链接发给一个不认识你代码的人,看他能不能用起来。① 完整聊天应用(2–3 天):把第 1 章那个两小时版补完整,逐条划掉它列的缺失(数据库/登录/密钥/限流/日志)。验收里最该较真的两条:⭐ 租户隔离要主动去试着越权 —— 直接改 URL 里的对话 ID 访问别人的,必须 403 而不是 200(界面不显示 ≠ 接口不返回,隔离要做在数据访问层);⭐⭐ 首字 2 秒内出现(不是 2 秒内答完 —— 长回答本来就要十几秒,TTFT 决定用户觉得它在动还是卡住了)。💡 加分项「重新生成」按钮会逼你想清楚消息怎么存(版本/覆盖/分支),这是真实产品里第一个让你重构数据模型的需求。② 文档问答(3–4 天):逼你面对三个第一次都会栽的问题 —— ⭐ 上传处理必须异步(50 页 PDF 切分+embedding 要几十秒,HTTP 等不了)、⭐⭐ 检索必须带租户过滤(专用向量库和关系库差别最大的地方)、⚠️ 失败要有明确状态不能永远「处理中」。验收要写自动化测试反复验 A 用户的文档不会被 B 检索到。③ 成本控制台(1–2 天,性价比最高):不新增任何用户功能,但它是唯一能让你晚上睡着的东西。核心验收是 ⭐⭐ 能回答「昨天这 100 块是谁花的、花在哪个功能」(答不上来说明记账维度不够);以及 ⭐⭐ 把全局熔断阈值调成 0.01 美元验证它真会拦 —— ⚠️ 很多人写了熔断从没验证过,等真需要时才发现写错,而那时已经在烧钱。🏆 挑战 A 压力与降级(2–3 天):并发 50 个流式请求看连接池会不会先耗尽、LLM 换成必定超时的地址看是否干净失败、⭐ 客户端断开后端要能感知并停止(否则你在为没人看的内容付费)、部署新版时的优雅关闭。⭐⭐ 方法上最重要的是:每个实验先写下预期再去试,预期和实际不一致的地方才是真正学到的。🏆 挑战 B 故障演练(2–3 天):让别人埋一个只在特定条件出现的 bug,你只能看日志、追踪和监控把它找出来。⚠️ 找不到才是最大收获 —— 说明可观测性有洞,⭐ 把「这次缺了什么信息」补进日志再演练一次。最终要能回答:影响了谁、从什么时候开始、为什么没有告警。⚠️ 最后一条建议:别按顺序全做 —— 这个板块的项目不像算法题能秒验,做一个到真上线,比做三个半成品有价值得多。