端到端安全门:pre-gen、during-gen、post-gen 三检查点·全书收官 本节摘要:pre-gen、during-gen、post-gen——三个检查点,一个 verdict,每请求一条审计轨迹。本赛道 8286 节各发一片(分类学、输入检测器、评估框架、输出分类器、规则引擎),真实安全门须把它们组装起来,在请求生命周期的正确时机运行,在它们分歧时决定动作,并产出评审者周一早上能读的轨迹。组装就是这节课。
本节摘要:pre-gen、during-gen、post-gen——三个检查点,一个 verdict,每请求一条审计轨迹。本赛道 82~86 节各发一片(分类学、输入检测器、评估框架、输出分类器、规则引擎),真实安全门须把它们组装起来,在请求生命周期的正确时机运行,在它们分歧时决定动作,并产出评审者周一早上能读的轨迹。组装就是这节课。门坐三个检查点:pre-gen 在模型被调前跑检测器,高置信攻击直接拦、否则挂旗给下游;during-gen 在模型吐 token 时跑流式过滤,缓冲块、命中禁用短语即早终止(prefix-injection 仅靠 post-gen 抓不到);post-gen 在模型完成后跑分类器路由器与规则引擎,门把它们的 verdict 与 pre-gen 信号聚合,施最终动作。配套确定性 mock LLM(流式、三种脚本人格),demo 跑 82 节全部固定样例加良性提示,自终止退出码 0,每请求一条
RequestTrace。这不仅是安全赛道的收官,也是全书从第 1 章到第 20 章的最后一节——过渡段做完整学习路径的回顾。
对应原课程:Phase 19 · Lesson 87 ·
end-to-end-safety-gate(原英文phases/19-capstone-projects/87-end-to-end-safety-gate/docs/en.md)。本节属第 20 章「毕业项目」的安全赛道(Track I),是本赛道与全书的收官。
阅读完本节,你应当能够:
terminated_early。RequestTrace,让评审者周一早上可读、可归因回归到某检查点。本赛道 82~86 节各发一片:分类学、输入检测器、评估框架、输出分类器、规则引擎。真实安全门须组装它们,在请求生命周期的正确时机运行,在它们分歧时决定动作,产出评审者周一早上能读的轨迹。组装就是这节课。
门坐三个检查点。Pre-gen 在模型被调前跑:83 节检测器看提示,要么放行、要么高置信攻击直接拦、要么挂旗给下游层权衡。During-gen 在模型吐 token 时跑:流式过滤缓冲块,若禁用短语出现即早终止流(prefix-injection 仅靠 post-gen 抓不到时这一层兜底)。Post-gen 在模型完成后跑:85 节分类器路由器与 86 节规则引擎检视完整输出,门把它们的 verdict 与 pre-gen 信号聚合,施最终动作。
门自终止:82 节分类学的每条固定样例端到端跑,门发每请求轨迹,demo 退出码 0,不管门是否拦下每条攻击。要点是可观测性与结构正确,不是满分。
聚合器组合四个严重度信号:检测器置信(83 节)、token 过滤触发(布尔)、分类器最高严重度(85 节)、规则最高严重度(86 节)。聚合函数是确定性表:
| 信号状态 | 动作 |
|---|---|
| 任一 high 严重度 | block |
| 任一 medium 严重度 | redact |
| 任一 low 严重度 | warn |
| 全 none + 检测器置信 < 0.5 | allow |
| 检测器置信 0.5~0.85,无其他信号 | warn |
Block 返拒绝;redact 发分类器编辑后文本并应用规则修复器;warn 发原样加软提示;allow 发原样。每请求发 RequestTrace,含 request_id、prompt、pre_gen(检测器 verdict)、during_gen(token 过滤触发)、post_gen(分类器动作 + 规则报告)、final_action、final_output、latency_ms。
是流式抽象。mock LLM yield 块(默认每块 4 token);过滤缓冲至多两块,对已知续写 token(Sure, here is the procedure、step 1: take 等)跑正则扫;命中即终止迭代器,返回标 terminated_early=True 的部分输出。下游聚合器把早终止当 medium 严重度信号。
按提示分键:拒绝可识别攻击(返 I cannot ...),作答良性提示(返通用有用串)。对一小撮攻击(尤其输入管道未抓的编码花招)产部分有害续写,故意留给 during-gen 过滤抓。这正合设计:门的价值在分层防御,demo 展示各层正确交互。
class SafetyGate: def __init__(self, detector, classifier_router, rules_engine, llm_stream): self.detector, self.router, self.rules = detector, classifier_router, rules_engine self.llm = llm_stream def handle(self, prompt, request_id): t0 = time.perf_counter() pre = self.detector.detect(prompt) # 83 节 if pre.confidence >= 0.85: # 高置信直接拦 return self._trace(request_id, prompt, pre, None, None, "block", POLICY_REFUSAL, t0) chunks, during = [], {"terminated_early": False} for chunk in self.llm.stream(prompt): # during-gen if self._forbidden(chunk): during["terminated_early"] = True; break chunks.append(chunk) output = "".join(chunks) if during["terminated_early"]: return self._trace(request_id, prompt, pre, during, None, "redact", output, t0) post_c = self.router.run(output) # 85 节 post_r = self.rules.evaluate_all(output) # 86 节 action = aggregate(pre, during, post_c, post_r) # 聚合表 return self._trace(request_id, prompt, pre, during, (post_c, post_r), action.verb, action.output, t0)
code/safety_gate.py 定义 SafetyGate,经相对文件路径导入前课的检测器、分类器路由器、规则引擎;code/mock_llm_stream.py 定义带三种脚本人格(clean、attacker-honest、attacker-lazy)的流式 mock LLM;code/main.py 把 82 节语料端到端跑过门,写 outputs/gate_trace.json。demo 跑全部 50 条分类学固定样例加 10 条良性提示,轨迹小结报:block、redact、warn、allow、早终止数、每类结局拆分、平均延迟。数字不是要点,每请求轨迹才是要点。
业界对比:NVIDIA NeMo Guardrails(输入/对话/输出三 Rails)、Lakera Guard(分层检测)、Azure AI Content Safety(过滤管道)、Llama Guard 2/3(输入输出分类)都是「多检查点 + 聚合 + 审计轨迹」形状。它们的共识与本节一致:pre-gen 输入检测、during-gen 流式过滤(防 prefix-injection)、post-gen 输出分类+规则、确定性聚合表、每请求可读轨迹。差别在分层 granularity 与是否用神经分类器,但三检查点+聚合+轨迹形状一致。
outputs/gate_trace.json:每请求一条 RequestTrace,是评审者周一早上读的工件,也是把回归归因到某检查点的根据。SafetyGate + 聚合表:三检查点+确定性聚合,任何后端可搬入;门的主交付是轨迹格式与组装逻辑。运行 python3 main.py:demo 加载一切、端到端跑、打印小结表、写轨迹工件,退出码 0,字面意义上自终止——每请求跑到完成或早终止,门走向下一条。
82~86 各发一片,本节组装,不新增安全原语。五节课加这一节,就是真实团队在采纳 Lakera/NeMo 前会自建的安全带微缩:分类学定词表、检测器查输入、评估框度量和校准、分类器查输出、规则引擎执契约、门三检查点组装。抽象已对脚本化攻击验证,失败模式已演练。
policy-check 在 pre-gen 前对原始系统提示跑,拒绝针对已知内部工具名的提示。RequestTrace:request_id/prompt/pre_gen/during_gen/post_gen/final_action/final_output/latency_ms,评审者周一可读、回归可归因。全书收尾:从第 1 章到第 20 章的完整学习路径
你刚读完的这节,是整部《AI Engineering from Scratch》的最后一节。从第 1 章的第一行代码,到这里的端到端安全门,是一条从「单个神经元怎么工作」到「整套生产 AI 系统怎么上线、怎么评估、怎么分布式训练、怎么防住对抗」的完整弧线。让我们回望这条路径。
第一篇·基础(第 1~5 章):你从 Python 与数学地基起步,理解了张量、自动微分、梯度下降——为什么一个损失函数沿梯度走能学会东西。你写下了第一个从零的神经网络,看见反向传播不过是链式法则的工程化。线性代数、概率统计、优化理论不再是抽象符号,而是「模型为什么能学」的机制。
第二篇·模型(第 6~11 章):你从 MLP 走到 CNN,看见卷积如何用参数共享捕捉局部模式;走到 RNN/Transformer,看见注意力如何让序列建模摆脱循环。你手写了多头自注意力、transformer 块、GPT 组装,理解了「scale is all you need」背后每个组件为何如此。你学了预训练与微调:SFT 把基座变成助手,DPO/RLHF 把助手对齐到人类偏好。提示工程教会你:模型字面执行指令,你的每个 token 都是激活函数。
第三篇·数据与评估(第 12~14 章):你看见数据是模型质量的上界——清洗、标注、增广、合成数据决定了模型能学到什么。你学了 RAG,理解检索为何是「让模型用上训练后知识」的最简路径。你构建了评估框架:precision/recall/MRR/nDCG 给检索打分,faithfulness/answer relevance 给答案打分,困惑度/ECE/Brier 给模型自报置信打分。你明白「不能度量就不能上线」。
第四篇·Agent 与生产(第 15~20 章):你从单轮对话走到 Agent——工具调用、规划执行、验证门、沙箱运行。你学了多模态:视觉编码器、ViT、投影层、跨注意力融合。你构建了端到端流水线:从数据到 SFT 到 DPO 到服务,从代码迁移到 GitHub issue 到 PR。你学了分布式训练:集合通信、DDP、ZeRO、流水线并行、分片检查点——把不可能塞进单卡的模型切到 N 卡。最后,在本章这 85 个毕业项目里,你把前面的一切拧成产品级系统,并用安全赛道收尾:越狱分类学、提示注入检测、拒绝评估、内容分类器、宪法规则、端到端安全门。
贯穿全书的工程心法:① 从零实现一次,再用框架——你只有亲手写过 ring allreduce,才能推理 ZeRO 为何不损吞吐;② 度量先于优化——你只有先有 recall@k 评估,才能比较分块策略;③ 分层防御——你只有把检测、分类、规则、门各做独立可测,才能在它们分歧时聚合;④ 可复现是入场券——temperature=0、固定种子、确定性 mock,让你能客观比较改动;⑤ 组装即证明——单段赢不算赢,端到端跑通并验证不变量才算交付。
下一步:这部书是地基,不是天花板。真正的成长发生在你把这里的每一个毕业项目,变成自己产品里跑的代码、自己团队里用的评估、自己集群里训的模型。带着「从零实现过一次」的理解去用 DeepSpeed、LangChain、vLLM、NeMo——你会发现自己看得见每个抽象背后的东西,看得见该改哪里、该信哪里、该怀疑哪里。这不是终点,是你作为 AI 工程师真正开始的起点。
谢谢你走到这里。Go build.