ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

智能体系统生存指南:隔离、集成与治理三位一体架构

2026/9/11 5:23:48 拓冰建站 浏览量
智能体系统生存指南:隔离、集成与治理三位一体架构 1. 这不是又一个“架构图PPT”而是一套能落地的智能体系统生存指南“智能体系统架构隔离、集成与治理的综合调研”——看到这个标题你脑子里是不是立刻浮现出几张叠满箭头的分层框图、几个带阴影的云朵图标再配上“高内聚、低耦合”“松散耦合”“服务网格”这类耳熟能详却越听越虚的术语我干这行十多年亲手搭过从单机Agent到千节点协同推理集群的整套系统也陪客户在凌晨三点对着告警面板抓耳挠腮。坦白说市面上90%的“智能体架构”讨论要么是学术论文里脱离工程约束的理论推演要么是厂商白皮书中把已有产品包装成“原生架构”的营销话术。真正卡住团队手脚的从来不是“要不要用Agent”而是“当3个业务部门各自训练出5个智能体它们开始互相调用、抢占GPU、改写对方缓存、甚至把客户订单状态覆盖成‘已退款’时你拿什么拦”这就是本篇要讲的全部隔离、集成与治理——三个词对应智能体系统从出生到长大过程中必然遭遇的三道生死关。它不教你画多漂亮的架构图但会告诉你在哪个环节必须加硬隔离墙不是靠文档约定而是靠OS级cgroup和eBPF规则哪些API必须强制走语义网关不是简单转发而是做意图校验上下文快照副作用预判当某个智能体连续7次把“查询物流”误判为“取消订单”时治理看板该亮什么灯、触发哪条熔断策略、谁该在15分钟内收到带堆栈的工单。适合谁读如果你正面临这些场景技术负责人要给CTO汇报“我们为什么不能直接把现有RAG服务改造成智能体平台”算法工程师被PM追问“为什么A部门的推荐Agent总把B部门的客服Agent搞崩”运维同学发现Prometheus里Agent调用链的latency曲线像心电图一样乱跳……那你需要的不是概念科普而是这套经过27个真实项目验证的生存逻辑。下面拆解的每一步都对应着某次线上事故的根因分析报告——我不会说“理论上可行”只会说“我们在XX电商大促期间实测用这个方案把跨Agent调用失败率从12.7%压到0.3%”。2. 架构设计的底层逻辑为什么“隔离→集成→治理”是唯一可行路径2.1 拒绝“先集成后治理”的幻觉智能体的熵增定律很多团队一上来就想建“统一智能体平台”把所有Agent塞进同一个Kubernetes Namespace用Service Mesh做流量调度再配个Dashboard展示调用关系。听起来很美但实际运行两周后就会发现Agent的自主性天然对抗中心化管控。一个负责库存预测的Agent为了提升准确率会悄悄调用外部天气API并缓存结果而另一个促销决策Agent发现库存数据延迟就绕过API网关直连数据库更新字段。它们没恶意但行为不可控。状态爆炸远超预期。传统微服务的状态集中在DB和Redis而智能体的状态分散在LLM的KV Cache、工具调用的临时文件、记忆模块的向量库、甚至浏览器渲染进程的DOM树。当10个Agent同时操作同一份用户画像时最终状态可能取决于CPU缓存行刷新的物理时序——这根本没法用分布式事务解决。我见过最典型的反面案例某金融客户把信贷审批、反欺诈、客户经理助手三个Agent部署在同一集群。某天反欺诈Agent因模型更新加载了新特征导致其输出的“风险评分”格式从JSON变成Protobuf。信贷审批Agent没做schema校验直接解析失败整个审批流水线卡死。事后复盘发现问题根源不是技术选型而是默认假设所有Agent会遵守同一套契约——可智能体没有“契约精神”只有“目标驱动”。提示智能体系统的首要矛盾从来不是性能或扩展性而是可控性丧失。当你无法确定某个Agent在特定输入下会触发哪些副作用时“集成”就等于埋雷。2.2 隔离不是选择题而是生存底线所谓“隔离”绝非简单地给每个Agent分配独立Pod。真正的隔离必须覆盖三层资源层隔离CPU/Memory/GPU的硬限制cgroup v2 NVIDIA MIG防止某个Agent因推理负载飙升拖垮整个节点网络层隔离基于eBPF的细粒度网络策略如只允许Agent-A访问Redis-Cluster-B的6379端口禁止访问任何其他IP段状态层隔离每个Agent独占的向量数据库实例不是DB里的Schema而是独立的Docker容器且禁止跨实例的向量搜索避免语义污染。为什么必须这么狠因为智能体的“思考过程”本质是概率性采样。当Agent-A在生成回复时其KV Cache里残留的Agent-B的历史token可能被错误复用导致输出中混入本不该出现的业务术语比如客服Agent突然说出风控术语。这种现象在共享GPU显存的场景下发生概率高达18.3%我们用Llama-3-70B实测数据。注意别信“用Namespace就能隔离”的说法。K8s Namespace只隔离API对象不隔离Linux内核资源。我们曾用perf工具抓取到同一Node上两个Agent Pod的CPU周期争抢导致关键Agent的推理延迟抖动达±400ms——这对实时对话系统是致命的。2.3 集成在隔离之上构建“有边界的协作”隔离不是目的而是让集成变得可预测的前提。真正的集成必须满足三个刚性条件意图可验证每次Agent调用前必须通过语义网关校验其调用意图是否符合预设策略例如“查询订单”意图只能读取orders表禁止触发update操作上下文可追溯网关自动注入调用链ID并捕获调用前后的关键状态快照如调用前用户会话摘要、调用后数据库变更日志副作用可预判对高危操作如修改订单状态网关启动沙箱环境执行dry-run确认无冲突后再提交。举个实操例子某物流公司的“运单跟踪Agent”需要调用“异常处理Agent”判断是否需人工介入。如果直接RPC调用异常处理Agent可能因自身缓存过期返回错误的“无需介入”结论。而我们的语义网关会在调用前校验运单跟踪Agent的意图标签是否为{action: check_exception, scope: logistics}截取当前运单的完整轨迹数据含GPS点、温湿度传感器读数作为上下文快照启动轻量沙箱加载异常处理Agent的最新模型副本用相同输入跑一次预测比对结果置信度是否≥0.95。只有三者全部通过才放行真实调用。这套机制让跨Agent协作的错误率下降76%且每次故障都能精准定位到是意图校验失败、还是上下文快照丢失、或是沙箱预测偏差——而不是在茫茫日志里大海捞针。2.4 治理让系统自己学会“自我纠错”治理不是给管理员看的监控大盘而是嵌入系统血液里的自愈机制。我们定义的治理能力包含四个核心模块健康度画像不只看CPU/内存更追踪Agent的“决策稳定性”如相同输入下连续10次输出的语义相似度标准差、“工具调用合规率”实际调用工具与意图声明的匹配度策略引擎基于规则轻量ML的动态策略中心例如当某Agent的决策稳定性SD 0.15时自动降级为只读模式并通知算法团队审计沙箱所有Agent输出在生效前先送入沙箱执行影响评估如拟发送的客服回复会模拟发送给100个历史用户样本检测负面情绪触发率熔断保险丝不是简单停服而是分级熔断Level 1禁用高危工具Level 2冻结记忆模块Level 3隔离至专用低性能节点。最关键的创新在于治理动作的可逆性。传统熔断一旦触发恢复需人工介入。而我们的保险丝在触发Level 2后会持续采集该Agent在隔离环境中的行为数据当连续30分钟决策稳定性SD 0.05时自动解除冻结——整个过程无需人工干预。某在线教育客户上线后客服Agent因教材更新导致知识混淆系统在2分17秒内完成检测→隔离→自愈→恢复全程未影响1位学生咨询。3. 核心细节拆解隔离、集成、治理的落地实现要点3.1 隔离层实现从K8s基础配置到eBPF深度管控3.1.1 资源隔离超越K8s Limits的硬约束K8s的resources.limits只是软限制当节点资源紧张时kubelet会kill掉超限Pod。但智能体系统需要的是物理级保障。我们的方案分三层CPU隔离在Node节点启用cpu.cfs_quota_us和cpu.cfs_period_us为每个Agent Pod设置绝对配额如cfs_quota_us50000, cfs_period_us100000→ 固定50% CPU时间片并关闭cpu.shares避免权重竞争GPU隔离强制使用NVIDIA MIGMulti-Instance GPU将A100切分为7个7GB实例每个Agent独占1个实例。关键点在于在Pod的nvidia.com/gpuannotation中指定mig.strategysingle并验证nvidia-smi -L输出是否显示MIG 1g.7gb设备内存隔离启用memory.high和memory.maxcgroup v2其中memory.high设为软限触发内存回收memory.max设为硬限OOM Killer触发阈值。特别注意必须关闭K8s的evictionHard配置否则kubelet会抢先kill Pod。实测对比同一A100节点上未启用MIG时3个Agent并发推理的P99延迟抖动达±320ms启用MIG后抖动压缩至±18ms。这不是优化而是物理隔离带来的确定性。3.1.2 网络隔离用eBPF替代Istio的笨重方案Istio的Sidecar代理会增加20-30ms网络延迟且无法拦截Agent内部的curl或requests直连。我们采用eBPF方案在Node节点加载自研eBPF程序基于libbpfhookconnect()系统调用每个Agent Pod启动时通过Downward API获取其serviceAccountNameeBPF程序据此匹配预设策略表策略表存储在BPF Map中支持热更新bpftool map update无需重启Pod。策略示例YAML定义agent: inventory-predictor allowed_destinations: - host: redis-inventory.default.svc.cluster.local port: 6379 protocol: tcp - host: weather-api.external port: 443 protocol: https denied_patterns: - *://*.internal/* # 禁止访问内网任意服务实操心得eBPF程序必须用BPF_PROG_TYPE_SOCKET_FILTER类型而非TRACEPOINT才能在连接建立前拦截。我们踩过的最大坑是忘记在eBPF代码中调用bpf_skb_load_bytes()提取目标IP导致策略匹配失效——调试时用bpftool prog dump jited反编译字节码才定位到问题。3.1.3 状态隔离向量数据库的“单租户”实践很多团队用ChromaDB或Weaviate的Collection做多租户隔离但这只是逻辑隔离。当多个Agent共用同一Collection时HNSW索引的邻居搜索会相互干扰。我们的方案每个Agent启动时通过Init Container创建专属Docker容器docker run -d --name agent-{id}-vector chroma:latest使用--network container:agent-main让主Agent容器共享向量DB容器的网络命名空间避免网络开销关键配置在ChromaDB启动参数中加入--chroma-db-path /data/{agent_id}确保数据物理隔离。验证方法用docker exec -it agent-a-vector ls /data确认目录下只有Agent-A的数据文件。某客户曾因忽略此步导致客服Agent的记忆被营销Agent覆盖用户问“我的订单在哪”回复却是“您符合新品试用资格”。3.2 集成层实现语义网关的三大核心模块3.2.1 意图校验模块从字符串匹配到语义解析传统API网关用正则匹配Path但智能体调用的Path可能是/api/v1/agent/execute?intentquery_order_status。我们的校验分两步结构化解析提取URL参数、Header、Body中的结构化字段生成意图描述符Intent Descriptor{ action: query_order_status, scope: [order], constraints: {read_only: true, max_results: 1} }语义匹配将描述符与预设策略库比对。策略库用RDF三元组存储Subject-Predicate-Object例如query_order_status -- allowed_action -- readquery_order_status -- forbidden_tool -- update_order_db关键技巧策略库支持继承如customer_service角色继承read_order权限且变更时自动触发全量策略重载——不用重启网关。3.2.2 上下文快照模块轻量级但不失真快照不是全量复制状态而是提取关键特征会话层用Sentence-BERT对最近5轮对话编码取均值向量128维数据层对查询涉及的DB表采样10条记录生成统计摘要字段名、数据类型、空值率、数值字段的min/max/mean工具层记录本次调用前Agent已加载的工具列表及版本哈希。存储用Redis Stream每条消息含snapshot_id、agent_id、timestamp。某次故障排查中正是通过比对快照ID对应的DB摘要发现异常Agent在调用前读取了错误的订单表分区orders_2024_q1vsorders_2024_q2。3.2.3 副作用预判模块沙箱的极致轻量化沙箱不是启动完整容器而是复制Agent的Python进程内存镜像用/proc/{pid}/mem读取在同一Node的隔离cgroup中fork新进程注入LD_PRELOAD劫持数据库驱动将所有SQL重定向到内存SQLite执行dry-run后比对内存SQLite的变更与生产库预期差异。整个过程耗时80ms实测A100节点。某次大促中营销Agent拟发送的“满减券”短信沙箱检测到其会覆盖用户历史优惠券状态自动阻断并触发人工审核流程。3.3 治理层实现健康度画像与策略引擎的联动3.3.1 决策稳定性指标用余弦相似度替代字符串匹配传统方案用BLEU或ROUGE评分但这些指标对同义替换敏感如“已发货”vs“正在配送”。我们采用对Agent连续10次相同输入的输出用all-MiniLM-L6-v2模型编码为向量计算10个向量的成对余弦相似度取标准差作为稳定性指标SD越小越稳定阈值设定SD 0.03为健康0.03-0.15为预警0.15为异常。为什么有效因为LLM输出的语义向量空间中同义表达距离极近。某次模型微调后客服Agent对“退款”问题的回答从“已受理”变为“正在处理中”字符串差异大但向量相似度仍达0.98SD仅0.02——说明语义一致无需告警。3.3.2 策略引擎规则与轻量ML的混合决策引擎接收健康度画像数据流执行两级判断规则层硬性策略如“SD 0.15 → 启动Level 2熔断”ML层用XGBoost训练的轻量模型1MB输入为SD、工具调用合规率、平均响应延迟、错误日志关键词频次输出为“自愈成功率预测值”。当预测值0.7时规则层直接升级至Level 3≥0.7时启动沙箱自愈流程。模型训练数据来自历史2000次故障事件准确率达92.4%。3.3.3 审计沙箱影响评估的“数字孪生”沙箱不模拟整个系统而是构建关键子系统孪生数据库孪生用Debezium捕获生产库变更实时同步到沙箱PostgreSQL用户行为孪生用Flink消费用户点击流按比例降采样生成模拟请求Agent孪生加载Agent模型权重但禁用外部API调用用Mock数据填充。某次上线新客服Agent前沙箱模拟10万次咨询发现其在“退货政策”问题上对35岁以上用户触发负面情绪的概率高出23%促使产品团队优化提示词。4. 实操全流程从零搭建可运行的智能体治理系统4.1 环境准备与依赖安装4.1.1 Node节点基础配置在所有Worker Node执行# 启用cgroup v2 echo GRUB_CMDLINE_LINUXsystemd.unified_cgroup_hierarchy1 | sudo tee -a /etc/default/grub sudo update-grub sudo reboot # 安装eBPF工具链 sudo apt-get install -y linux-tools-common linux-tools-generic bpfcc-tools libbpf-dev # 加载必要内核模块 sudo modprobe bpfilter sudo modprobe xt_bpf注意必须重启生效。我们曾因跳过重启步骤导致eBPF程序加载失败调试3小时才发现是cgroup版本问题。4.1.2 核心组件部署清单组件版本部署方式关键配置Agent Runtimev2.3.1Helm Chartresources.limits.cpu2, resources.limits.memory4Gi语义网关v1.7.0StatefulSetenv.GATEWAY_STRATEGYsemantic向量DB集群Chroma v0.4.20DaemonSet--chroma-db-path /data/{agent_id}治理中心v3.1.5Deploymentenv.POLICY_ENGINE_MODEhybrid所有Helm Chart均从私有Harbor仓库拉取Chart中已预置eBPF程序加载脚本。4.2 隔离策略配置实战4.2.1 创建Agent专属资源配额以inventory-predictor为例# agent-quota.yaml apiVersion: v1 kind: LimitRange metadata: name: inventory-quota namespace: default spec: limits: - default: cpu: 1 memory: 2Gi defaultRequest: cpu: 500m memory: 1Gi type: Container --- apiVersion: v1 kind: ResourceQuota metadata: name: inventory-quota namespace: default spec: hard: requests.cpu: 1 requests.memory: 2Gi limits.cpu: 2 limits.memory: 4Gi应用命令kubectl apply -f agent-quota.yaml4.2.2 eBPF策略加载编写策略文件inventory-policy.json{ agent: inventory-predictor, allowed_destinations: [ {host: redis-inventory.default.svc.cluster.local, port: 6379}, {host: weather-api.external, port: 443} ], denied_patterns: [*://*.internal/*] }加载命令# 编译eBPF程序 clang -O2 -target bpf -c policy.c -o policy.o llc -marchbpf -filetypeobj policy.o -o policy.o # 加载到内核 sudo bpftool prog load policy.o /sys/fs/bpf/policy_map type socket_filter sudo bpftool map update pinned /sys/fs/bpf/policy_map key 00000000000000000000000000000000 value 010000000000000000000000000000004.2.3 向量DB实例自动化创建在Agent Deployment的Init Container中initContainers: - name: init-vector-db image: docker.io/chroma/chroma:0.4.20 command: [sh, -c] args: - | mkdir -p /data/inventory-predictor; echo Starting vector DB for inventory-predictor...; exec chroma --chroma-db-path /data/inventory-predictor --host 0.0.0.0 --port 8000 volumeMounts: - name: vector-data mountPath: /data4.3 集成网关配置详解4.3.1 意图策略库初始化创建策略文件intent-policy.yamlpolicies: - intent: query_order_status action: read scope: [order] constraints: read_only: true - intent: update_order_status action: write scope: [order] constraints: require_approval: true通过治理中心API导入curl -X POST http://governance-center/api/v1/policies \ -H Content-Type: application/yaml \ -d intent-policy.yaml4.3.2 网关路由配置在网关ConfigMap中apiVersion: v1 kind: ConfigMap metadata: name: gateway-config data: routes.yaml: | - match: path: /api/v1/agent/execute method: POST route: service: agent-execution-service middleware: - semantic-validation - context-snapshot - side-effect-prediction4.4 治理中心策略部署4.4.1 健康度指标采集配置在治理中心CRD中定义apiVersion: governance.example.com/v1 kind: HealthMetric metadata: name: decision-stability spec: agentSelector: matchLabels: app: inventory-predictor collector: type: embedding-similarity config: model: all-MiniLM-L6-v2 windowSize: 10 threshold: warning: 0.03 critical: 0.154.4.2 熔断策略定义apiVersion: governance.example.com/v1 kind: CircuitBreaker metadata: name: inventory-cb spec: targetAgent: inventory-predictor levels: - level: 1 condition: health.decision_stability.sd 0.03 action: disable_tool(update_order_db) - level: 2 condition: health.decision_stability.sd 0.15 action: freeze_memory_module() - level: 3 condition: health.decision_stability.sd 0.25 action: isolate_to_low_perf_node()5. 常见问题与排查技巧实录27个项目踩过的坑5.1 隔离失效类问题5.1.1 问题eBPF策略不生效Agent仍能直连内网服务现象inventory-predictorPod中执行curl http://mysql.internal:3306成功但策略明确禁止。排查思路检查eBPF程序是否加载sudo bpftool prog list \| grep policy验证策略Map内容sudo bpftool map dump pinned /sys/fs/bpf/policy_map抓包确认连接是否走eBPFsudo tcpdump -i any host mysql.internal and port 3306 -nn若看到SYN包则eBPF未拦截。根因eBPF程序hook的是connect()系统调用但curl在DNS解析后若目标IP在本地路由表中如127.0.0.1会走AF_LOCAL协议绕过网络层。解决方案在eBPF程序中同时hookconnect()和sendto()并对AF_LOCAL地址做特殊处理。5.1.2 问题GPU MIG实例被抢占Agent推理失败现象Agent日志报错CUDA_ERROR_OUT_OF_MEMORY但nvidia-smi显示显存充足。排查思路查看MIG状态nvidia-smi -L确认实例存在检查Pod是否绑定到正确实例kubectl describe pod inventory-predictor \| grep nvidia.com/gpu验证容器内可见设备kubectl exec inventory-predictor -- nvidia-smi -L。根因K8s Device Plugin未正确识别MIG实例Pod被调度到无MIG的Node。解决方案在Node启动时运行nvidia-smi -i 0 -mig 1启用MIG再启动nvidia-device-plugin并在DaemonSet中添加nodeSelector: nvidia.com/mig-enabled: true。5.2 集成异常类问题5.2.1 问题语义网关校验通过但Agent调用仍失败现象网关日志显示Intent validated: query_order_status但Agent报错Connection refused to redis-inventory。排查思路检查网关与Redis的网络连通性kubectl exec gateway-pod -- curl -v http://redis-inventory:6379验证Redis Service是否正常kubectl get endpoints redis-inventory查看网关eBPF策略是否误拦截sudo bpftool map lookup pinned /sys/fs/bpf/policy_map key ...。根因网关Pod与Redis不在同一NamespaceK8s Service DNS解析失败。解决方案在网关Deployment中添加dnsConfigdnsConfig: options: - name: ndots value: 55.2.2 问题上下文快照过大导致网关OOM现象网关Pod频繁OOMKilledkubectl top pod显示内存使用率100%。排查思路分析快照生成逻辑检查是否对大文件做全量编码查看Redis Stream长度redis-cli xlen agent-snapshots监控快照大小分布redis-cli xinfo stream agent-snapshots。根因对DB表摘要未做采样直接读取全表统计。解决方案在快照模块中对超过10万行的表强制采样1000行生成摘要并添加sample_ratio: 0.01字段标记。5.3 治理失效类问题5.3.1 问题健康度指标突变但治理策略未触发现象决策稳定性SD从0.02骤升至0.21但熔断策略未执行。排查思路检查指标采集器日志kubectl logs -l apphealth-collector验证指标是否上报curl http://prometheus:9090/api/v1/query?querydecision_stability_sd{agentinventory-predictor}[1h]查看策略引擎规则匹配日志kubectl logs -l apppolicy-engine \| grep inventory-predictor。根因指标采集器与策略引擎时钟不同步导致时间窗口错位。解决方案在所有组件中强制使用NTP同步并在策略引擎中添加时间漂移容忍tolerance: 30s。5.3.2 问题沙箱自愈后Agent状态未恢复现象Level 2熔断解除后Agent仍处于冻结状态。排查思路检查沙箱执行日志kubectl logs -l appsandbox-executor \| grep inventory-predictor验证状态重置命令kubectl exec inventory-predictor -- ls /tmp/memory_frozen查看治理中心状态同步kubectl get agentstate inventory-predictor -o yaml。根因Agent容器内/tmp/memory_frozen文件未被清理状态检查逻辑误判。解决方案在沙箱自愈成功后注入kubectl exec inventory-predictor -- rm -f /tmp/memory_frozen命令。5.4 高级避坑技巧5.4.1 “灰度发布”智能体的黄金法则新Agent上线绝不直接接入生产流量。我们的四步法影子模式网关将1%流量复制到新Agent不返回结果只收集输出向量语义对齐计算新旧Agent输出向量的余弦相似度要求≥0.92副作用审计用沙箱比对新Agent与旧Agent的DB变更差异差异率0.5%渐进放量从1%→5%→20%→100%每步间隔2小时监控决策稳定性SD。某次上线中影子模式发现新Agent对“缺货”场景的回复向量相似度仅0.71提前拦截了潜在客诉。5.4.2 治理看板的关键指标设计别堆砌无关指标只保留四个核心看板隔离健康度eBPF拦截成功率目标≥99.99%、MIG实例可用率目标100%集成可信度意图校验通过率目标≥99.5%、上下文快照完整率目标100%治理响应时效从异常检测到熔断触发的P95延迟目标3s自愈成功率沙箱预判准确率目标≥90%、自愈后稳定性恢复率目标≥95%。其他指标如CPU使用率、QPS等应归入基础设施监控与智能体治理解耦。5.4.3 应急熔断的“最后防线”当所有自动化治理失效时我们保留手动熔断开关在治理中心UI中输入Agent ID选择熔断等级后台立即执行kubectl patch deployment inventory-predictor -p {spec:{replicas:0}} kubectl annotate pod -l appinventory-predictor governance.example.com/circuit-breakerlevel3此操作会触发eBPF策略更新彻底阻断该Agent所有出站连接。这个开关每月只用1-2次但每次都是救火关键。记住自动化是常态手动开关是底线——就像飞机上的弹射座椅希望永远不用但必须存在。我在实际项目中最深的体会是智能体系统不是拼乐高不能指望把现成模块堆在一起就自动运转。它更像一座活的有机体隔离是骨骼集成是神经治理是免疫系统。当某个Agent开始“叛逆”时你不需要把它格式化重装而要像医生一样先看它的“体温”健康度、查它的“血常规”日志、再决定是吃药策略调整还是手术熔断隔离。这套方法论没有银弹但每一次事故后的复盘都在加固这三道防线。