主题
第 23 周 · Day 7:总收官——把 23 周装进一张面试速查卡
手册任务:最终复盘 + 心态调整。整理所有笔记,写一份"面试速查卡",当日产出:速查卡。 本篇就是那张卡。设计目标只有一个:面试前 30 分钟,从第一条扫到最后一条,23 周的东西在脑子里全部归位。
今日目标
- 以本卡为索引过一遍全部笔记:能脱口而出的划掉,说不利索的做标记
- 十条"为什么"逐条口头回答,每条压在 30 秒内说完
- 把卡里属于你的部分换进去:自己的项目例子、自己踩的坑,速查卡才有你的指纹
概念讲解:为什么收官之作是一张卡
第 1 周 Day 7 讲过一个判断:识别不等于提取。教程摆在面前都认得,合上就说不出来。23 周前这个毛病叫"泛型我看懂了",今天它叫"都学过,就是说不利索"。面试是纯提取现场:对面没有教程给你认,只有问题等你答。
速查卡是这 23 周提取训练的最后一轮。写卡时你对全部笔记做最后一次筛选,规则就一条:面试大概率会问、但你还没法脱口而出的,进卡。已经秒答的不用进,进了浪费 30 分钟额度;从没搞懂的也不进,今天补不完了,认了,把力气花在救得回来的上面。
卡的使用场景锁定"面试前 30 分钟",这决定了两件事:长度必须半小时过完,超了就删;每个词条只负责唤起你已有的记忆,不负责教你新东西。所以它是索引,不是课文。
本篇给你的是骨架。今天的任务是把肉换成你自己的。
动手任务:把卡变成你的卡
第一步:逐条过卡(40 分钟)。 35 个词条逐个口头说,能秒答的删,卡壳的标出来回读对应周的教程。
第二步:往答案里塞你的例子(20 分钟)。 十条"为什么"的答案,每条换上你项目里的具体经历。"我们当时遇到的问题是……"比背出来的通用答案强十倍,面试官分得出来。
第三步:落地到设备(10 分钟)。 卡存手机、打印一份;checklist 第 4 项今天就把链接、设备测掉,别留到面试当天早上。
速查卡·一:核心概念一句话版(35 条)
工程底座
| 词条 | 一句话版 |
|---|---|
| 泛型约束 | T extends X 给泛型划下限。要在函数里访问传入值的具体属性就必须加,否则编译器不知道 T 上有没有这个属性。 |
| 事件循环 | JS 单线程的并发方案:同步代码跑完后按队列轮询回调,微任务(Promise)优先、宏任务(setTimeout、I/O)靠后。 |
| DI(依赖注入) | 依赖不从函数里 new 出来,而是从外部传入。换来实现可替换、测试可注入 mock。NestJS 的地基。 |
| Pydantic | Python 的运行时校验库:用类型注解声明模型,数据进出不合规则拒绝。FastAPI 请求解析和响应序列化的底座。 |
| asyncio | 单线程事件循环调度协程:碰到 await 的 I/O 就切走干别的,回来再继续。一个线程顶上万个并发连接。 |
| SSE | 基于 HTTP 的服务端单向推流,EventSource 自带断线重连。LLM 逐 token 输出的标配,因为只需要单方向推。 |
| RSC | React Server Components:组件在服务端执行,序列化后发给浏览器,不占客户端 bundle,数据获取和密钥留在服务端。 |
后端与数据
| 词条 | 一句话版 |
|---|---|
| 事务 + 索引 | 事务把一组写操作捆成原子单元,要么全成要么全回滚;索引用 B+ 树换查询速度,代价是写入变慢、占空间。慢查询第一反应:explain 看走没走索引。 |
| JWT 双 token | access 短寿命(分钟级)放请求头,refresh 长寿命(天级)只用来换新 access。泄露 access 的损失窗口小,用户又不用反复登录。 |
| 缓存三件套 | Cache-Aside 最常用:读先查缓存,miss 查库回填;写先更库、再删缓存。缓存挂了系统照样跑,这叫旁路。 |
| 分布式锁 | 多实例下用 Redis SET NX 加过期时间抢锁,保证同一时刻只有一个实例执行关键段;业务比锁先结束时要有续期机制。 |
| 幂等 | 同一请求执行一次和 N 次结果相同。手段:唯一请求 ID 加去重表、版本号乐观锁、状态机挡重复流转。下单、支付必须有。 |
| 多租户隔离 | 租户数据互相不可见。三档:共享表加行级安全(RLS)最常用、独立 schema、独立库最硬最贵,按合规要求选档。 |
交付与可观测
| 词条 | 一句话版 |
|---|---|
| Docker 多阶段构建 | 编译阶段用全量镜像装工具链,运行阶段只 COPY 产物进精简镜像。体积从 GB 级降到百 MB 级,攻击面也小。 |
| CI | push 或 PR 自动触发测试和构建:坏代码进不了主干,问题在合并前暴露。 |
| CD | CI 的产物自动部署到测试或生产:发布从人肉脚本变成流水线,可回滚、可审计。 |
| 结构化日志 | 日志写成带字段的对象(trace_id、user_id、level)而不是自由文本,日志平台才能按字段过滤聚合。 |
| 四黄金指标 | 延迟、流量、错误率、饱和度。Google SRE 的最小监控集,任何服务先有这四个再谈别的。 |
Agent 核心
| 词条 | 一句话版 |
|---|---|
| Function Calling | 模型不执行任何东西,只输出"调哪个函数加什么参数"的结构化 JSON,执行权在你的代码。模型点菜,应用炒菜。 |
| 结构化输出 | 用 JSON Schema 约束模型输出,保证下游能 parse。是 Function Calling 的底层机制,也是 Agent 间通信的地基。 |
| ReAct | Reason 加 Act 的循环:思考一步、调一次工具、读结果、再思考,直到给出最终答案。几乎所有 Agent 的执行骨架。 |
| LangGraph 四概念 | State(全局共享状态)、Node(改状态的函数)、Edge(固定流转)、Conditional Edge(按状态动态选路)。用图和状态机建模流程。 |
| Checkpointer | 每步执行后把 State 持久化到外部存储(如 Postgres):会话可恢复、可回放调试,多轮记忆也架在它上面。 |
| interrupt | 把图暂停在某个节点,等外部输入(人工审批、补充信息)后从断点继续。Human-in-the-loop 的标准做法。 |
| 多 Agent | 一个大脑拆成多个职责单一的 Agent,supervisor 调度或手递手传递:上下文不再互相污染,可并行可扩展。但单 Agent 够用就别拆。 |
| RAG 全链路 | 文档、切块、embedding、向量库、检索 top-k、重排、拼上下文、生成。答案质量的上限在检索,不在生成。 |
| Hybrid 检索 | 向量召回管语义、BM25 管关键词,双路并行后用 RRF 融合。专有名词和精确匹配这些向量搞不定的场景靠 BM25 补。 |
| 重排序 | 用 cross-encoder 对初筛出的几十条精排出前几条。准但慢,所以只排不检。检索求召回,重排求精度。 |
| 评估三层 | 组件级(检索命中率、忠实度)、链路级(端到端答案质量)、系统级(延迟、成本、线上指标)。每层都要有数字,没数字的优化是玄学。 |
| LLM-as-judge | 用强模型按 rubric 给输出打分,解决人工评估贵和慢。两个前提:评分标准写清楚,定期抽样人审校准防漂移。 |
| MCP 三原语 | tools(模型可调的函数)、resources(模型可读的数据)、prompts(可复用的提示模板)。Agent 连外部的标准接口,人称 AI 应用的 USB-C。 |
| 记忆四分类 | 短期(当前上下文)、长期(跨会话持久化)、情景(带时间的经历)、语义(沉淀的事实与偏好)。落地:短期靠 State,长期靠向量库加结构化画像。 |
生产化
| 词条 | 一句话版 |
|---|---|
| 模型路由 | 按任务难度和成本把请求分给不同档位:分类抽取走小模型,复杂推理走旗舰,网关层统一调度,成本能砍一个量级。 |
| 死循环防御 | Agent 循环失控要分层兜底:环检测(识别重复状态和重复调用)、单步超时、预算上限在前,recursion_limit 硬上限是最后防线。 |
| 语义缓存 | 请求先 embedding,和历史问题比相似度,过阈值直接返回缓存答案,省 token 省延迟。阈值定低会答非所问,宁缺勿滥。 |
速查卡·二:高频"为什么"速答(10 条)
1. 为什么选 LangGraph,不裸调 API? 裸调 API 就是自己写一个 while 循环,循环、分支、人工介入、断点恢复全要自己造。LangGraph 用图显式建模流程,State 集中管理,条件路由、interrupt、checkpointer 都是一等公民,生产级复杂流程的工程量小一个量级。
2. 为什么向量库用 pgvector,不上专用向量库? 数据库本来就是 Postgres,pgvector 一个扩展装完,向量、业务表、元数据同库,事务和权限直接复用,运维零新增。专用库要到亿级向量、超高 QPS 才有优势,到那个规模再迁不迟。
3. 为什么流式输出用 SSE 不用 WebSocket? LLM 流式只需要服务器往客户端单方向推 token。SSE 基于 HTTP:不用升级协议、过代理无障碍、自带重连。WebSocket 的双向能力和连接管理成本,这个场景用不上。
4. 为什么评估先行? 没有评估集,改一版 prompt、换个模型,说不出是好是坏,等于蒙眼调参。先攒几十上百条测试样本建基线,之后每个改动跑一遍,优化才有方向和证据。顺序反了,前面全白干。
5. 为什么加一层 BFF? 后端接口按领域切,前端要的屏按页面拼。BFF 替前端聚合、裁剪、重组接口,一个页面一次请求;前端迭代不用等后端排期。代价是多一跳延迟、多一层维护。
6. 为什么补知识用 RAG 不用微调? 知识要频繁更新、要溯源、要控权限,这三件事微调都不擅长:注入事实贵、易幻觉、给不出引用来源。微调改的是行为和风格,知识常变走 RAG,风格和能力才考虑微调。
7. 为什么检索后还要重排,直接多召回一些不行吗? 初检(bi-encoder)快但粗,cross-encoder 逐对精算相关性、准但慢,只能处理小候选集。多召回等于往 prompt 里塞更多平庸内容,稀释注意力还贵。分工是:向量粗筛几十条,重排取三五条。
8. 为什么 access token 不做长效,加个黑名单不行吗? 黑名单要求每次请求查一次 Redis,JWT 无状态的优势就没了,等于把状态加回来还多一套设施。双 token 用短寿命自然过期替代吊销:泄露窗口分钟级,成本为零。
9. 为什么写库后是删缓存,不是更新缓存? 并发写时"更新缓存"容易把旧值覆盖回缓存,且缓存值常是查询算出来的结果,更新逻辑复杂。删除是懒加载:下次读 miss 用库里的新值回填,最多多一次查询,保证最终一致。
10. 为什么拆多 Agent,单 Agent 多挂工具不行吗? 工具一多,说明书全挤在一个上下文里,模型选工具的准确率往下掉。拆成职责单一的 Agent,各自上下文干净,还能并行。代价是通信开销,所以单 Agent 能解决就别拆。
速查卡·三:数字速记
| 数字 | 含义 |
|---|---|
| 25 | LangGraph recursion_limit 默认值 |
| 15~30 | 生产环境 recursion_limit 建议区间,宁可收紧别放开 |
| >80% | LLM-as-judge 与人工标注的一致性标准,低于这条线 judge 不可信 |
| 3% | 评估门禁:评估集分数跌幅超过 3% 就拦下这次发布 |
| 10% | 在线采样:线上流量抽 10% 进评估管道,盯真实效果 |
| 0.95 | 语义缓存相似度阈值,达到才命中,低于它宁可不缓存 |
| 90 秒 | 自我介绍时长,练到卡着秒说完 |
| 5 题 | 反问环节备好的提问数,用掉 3 题还有余量 |
面试里能随口报出具体数字的人不多,这张表是便宜的分。
速查卡·四:面试当天 checklist(8 项)
- 速查卡过一遍:就是本篇,30 分钟,从一扫到五,标记过的词条多停一眼
- 架构图手画一遍:纸笔默画简历上那个系统的图,节点、边、数据流,10 分钟,边画边说出声
- 数字表过一遍:第三节那八行
- 设备与链接备好:线上提前测摄像头、麦克风、耳机,会议链接存进日历;线下确认路线,提前 10 分钟到
- 90 秒自我介绍出声练一遍:掐表,最后留一遍给自己听
- 反问 5 题带好:团队在做什么、技术栈、这个岗位怎样算成功、入职第一个月的期待、面试官本人的感受
- 简历和 JD 对一遍:每条经历备好 2 分钟展开,JD 关键词和你的项目对得上
- 心态:你是做过真系统的人。对面问的每一块你都真踩过坑,这不是壮胆,是 23 周换来的事实
速查卡·五:毕业寄语
写在第 161 天
23 周前的 Day 1,你在琢磨 T extends 到底约束了什么;今天你在拆多 Agent 的拓扑、定评估门禁。从一行泛型到一套真系统,这条弧线是一天一天写出来的,没有捷径的那部分,你全走完了。
但真正的学习现在才开始。工作里的坑不按教程顺序出现,模型会换代,框架会更名,带得走的只有这 23 周练出的习惯:动手、复盘、用输出逼出理解。
速查卡会过时,你不会。去工作里继续写你的第 24 周吧。毕业快乐。
常见踩坑
把速查卡当新教材背。 卡是索引不是课文。看着词条能顺嘴说两句就过,卡壳的才回读教程。面试前夜还在逐字背,说明筛选没做。
面试前夜熬夜刷题。 30 分钟过完卡就去睡。反应速度和思路清晰比多记三个词条值钱,睡够的人赢熬夜的人。
卡越写越厚。 进卡标准是"会问但说不出",不是"重要就放进来"。半小时过不完的卡就不是速查卡,删。
延伸阅读
- 第 1 周 Day 7:周复盘方法论:提取训练从那天开始,今天收尾
- 第 23 周总览:本周前六天的八股笔记、模拟面试反馈,是这张卡的原料
23 周,161 天,到此收口。