做这行久了会碰到一种挺割裂的场面一边是各种场合都在聊 AGI另一边真正落到代码里的东西往往只是三块互不来往的拼图——一个训好的深度学习模型、一套强化学习训练脚本、一个塞满三元组的知识库。这三块单独拿出来都能跑出漂亮的指标拼在一起就开始互相拖后腿。我前后参与过几个把深度学习、强化学习与知识表示往同一个系统里塞的项目踩的坑比写过的模型还多。这篇就把这三根柱子拆开讲它们各自解决 AGI 路上的什么障碍、为什么不能互相替代、选型和参数怎么定、工程上怎么接起来、出了问题从哪儿查。不管你在做具身智能、对话系统还是决策类应用只要目标不是“在一个固定榜单上刷分”而是“换个场景还能用”这里面的东西大概率能直接用上。1. 三根柱子各自站在什么位置1.1 单一模型的“专才陷阱”到底卡在哪很多人对 AGI 的第一反应是“更大的模型”。这个判断只说对了一小半。我见过太多在固定测试集上做到 95 分以上的模型换一批采集设备、换一种光照条件、换一个用户群体分数直接掉到 60 出头而且掉得毫无规律。这不是模型不够大是它学到的东西本质上是数据分布里的相关性不是可迁移的机制。相关性在分布内足够用一旦输入的组合方式超出训练时见过的范围模型就等于在裸奔。真正卡住我们的通常是四件事第一是跨任务迁移一个在图像上训好的表征能不能直接拿去做控制第二是少样本适应只给几个例子能不能改行为第三是长程规划几十步之后的目标能不能倒推回当前动作第四是可控与可解释出错了能不能定位到具体环节。这四件事分别对应深度学习、强化学习、知识表示三块能力缺一块就会在某个环节上死掉而且是那种“demo 能跑、上线就崩”的死法。我印象最深的一次是某团队做的一条装配线抓取流程视觉模型识别零件的准确率 98%强化学习策略在仿真里成功率 92%知识库里有完整的零件工艺约束。三者单独看都够用串起来之后整体成功率只有 61%。查了两周才发现视觉模型输出的位姿误差分布和策略训练时的假设不一致策略在仿真里从没见过 3 毫米以上的系统性偏移而知识库里的约束又只在最后一步做校验前面的误差早就累积到无法挽回。这就是典型的“三块都好、合起来不行”。1.2 三者各自补的是哪块短板把三者的职责摊开来看会清楚很多。深度学习负责把原始信号压成有语义的表征解决的是“看懂”的问题强化学习负责在序列决策中优化长期回报解决的是“做对”的问题知识表示负责把领域约束、事实、规则外显地存下来并支持查询推理解决的是“不犯错”和“说得清”的问题。三者不是替代关系是不同抽象层上的分工。技术支柱主要解决的问题典型失效模式缺失后的后果深度学习高维感知、表征压缩、模式泛化分布外崩、对抗脆弱、黑盒难解释系统无法处理原始信号只能依赖人工特征强化学习序贯决策、长期回报优化、探索奖励作弊、样本效率低、训练发散系统只能做单步预测无法闭环行动知识表示事实存储、约束校验、可追溯推理本体设计僵化、脏数据放大错误、维护成本高系统无法保证一致性错误无法定位这张表我建议每个做系统设计的人都存一份。它的用处不是分类是在系统出问题时快速定位该往哪个方向查。举个例子如果你的系统在长尾场景上表现差先看深度学习的表征是不是没覆盖到如果系统在简单场景下也做出明显不合理的动作序列先看强化学习的奖励函数是不是被钻了空子如果系统输出的结论和已知事实冲突那基本就是知识表示环节没接上约束校验。1.3 三种耦合形态选哪种取决于你要什么工程上把三者接起来主流有三种形态选错了后面全是返工。第一种是端到端式用一个大模型吃掉感知和决策再用偏好数据做对齐微调。好处是链路短、迭代快、不需要手工设计中间表示坏处是可控性差、出错无法定位、知识更新只能靠重新训练。适合场景相对封闭、错误代价低的消费级应用。第二种是模块化管线感知模型、决策策略、知识库各管一段中间用明确定义的接口传递结构化数据。好处是可解释、可局部替换、知识库能热更新坏处是接口设计成本高、误差会逐级放大、端到端调优困难。适合工业、医疗这类对可追溯性要求高的场景。第三种是混合式用模型当“调度器”把工具调用、检索、规则引擎当成外部能力接进来。这是目前工程上最讨巧的做法模型负责理解意图和拆解任务具体的精确计算、事实查询、约束校验交给外部模块。代价是你得设计一套足够鲁棒的工具描述和调用协议还要处理模型调用失败时的降级路径。我个人的经验是只要系统里存在“必须精确”的环节混合式基本是唯一可行的选择。2. 深度学习表征的地基也是最容易被误用的部分2.1 表征学习真正解决了什么在深度学习普及之前做图像或者语音任务绝大部分精力花在手工设计特征上。那套方法的瓶颈很明确特征是人根据已有经验想出来的人的想象力边界就是系统的能力边界。深度学习的价值不在于“层数多”而在于它把特征设计这件事变成了可优化的目标——网络自己去找对下游任务最有用的中间表示。这个转变带来的直接后果是归纳偏置的转移。卷积网络把“局部性”和“平移等变”写进了结构里所以它在图像上样本效率极高Transformer 把“任意位置可交互”写进结构里所以在长序列和跨模态上更灵活但代价是它对数据量的需求大得多。你在选结构的时候本质上是在选“我愿意提前告诉模型多少先验知识”。先验给得多数据少也能训先验给得少就得拿数据和算力去补。我见过最常见的误用是手上只有几万条数据却直接上一个没有强先验的大结构然后抱怨模型效果不行。这种情况下正确的做法不是加大模型而是换回带强先验的结构或者引入预训练权重做初始化。预训练的本质就是把别人在海量数据上学到的表征借过来你只在自己的小数据上做微调。这条路径在小数据场景下的性价比远高于自己从零训一个大模型。2.2 结构、参数量与数据量的配比怎么定配比这件事有经验公式可循虽然不精确但能帮你在动手前避开明显不合理的方案。业界比较公认的一条粗略规则是训练 token 数大约取参数量的 20 倍左右是比较均衡的点低于这个比例模型欠训练高于这个比例收益递减。这个比例不是铁律但它能快速帮你判断“我这个数据量配这个模型是不是浪费”。任务类型推荐结构参数量级建议数据量备注小样本图像分类带预训练权重的卷积网络10M–50M每类 20–100 张冻结主干只训分类头中等规模图像检测卷积主干 轻量检测头20M–80M1 万–10 万张优先做数据增强而非加参数通用文本理解预训练编码器微调100M–1B1 万–50 万条标注标注质量比数量重要多模态对齐双塔结构 对比学习100M–1B百万级图文对负样本构造是关键大规模生成解码器结构预训练1B–70B百亿 token 以上需要分布式训练与检查点管理这张表里的数字是经验区间不是标准答案。真正的判断依据是你先跑一个小规模的基线看验证集指标随数据量增长的曲线是否还在上升。如果加数据曲线还在明显涨说明模型容量还没吃满可以先加数据如果曲线已经平了加数据没意义该考虑换结构或者加容量。这个“先画曲线再决策”的习惯比任何参数表都管用。2.3 训练过程的关键参数与计算过程参数配置这块我把常用的组合整理成了一份可以直接抄的配置。下面这段是 YAML 形式的训练配置适用于中等规模的有监督训练optimizer: name: adamw betas: [0.9, 0.95] weight_decay: 0.1 eps: 1.0e-8 scheduler: type: cosine warmup_ratio: 0.02 # 前 2% 步数线性升温 min_lr_ratio: 0.1 # 衰减到峰值的 10% training: batch_size: 512 seq_len: 4096 grad_clip: 1.0 precision: bf16 grad_accum_steps: 4 max_steps: 50000 seed: 1234学习率的定法有一个被广泛使用的线性缩放规则基准学习率对应基准 batch当 batch 放大 k 倍时学习率也放大约 k 倍。比如基准是 batch 256 配 3e-4你现在用 batch 512就可以试 6e-4。但这条规则在 batch 特别大时会失效超过某个临界点后再放大 batch 反而需要降低学习率所以别机械地套放大之后先跑几百步看 loss 曲线有没有异常抖动。总训练量的计算很简单但要算清楚很多人到训练到一半才发现数据不够总 token 数 batch_size × seq_len × max_steps 512 × 4096 × 50000 ≈ 1.05 × 10^11 ≈ 105B tokens如果你的语料只有 30B token那要么把 max_steps 降到 15000 左右要么接受多轮重复训练。多轮重复不是绝对不行但第二轮之后收益会明显衰减超过四轮基本就是在记忆了。我一般会先把“语料总量除以单轮消耗”算出来再决定步数这个顺序不能反。梯度裁剪阈值设 1.0 是个比较稳妥的起点bf16 混合精度下如果频繁触发裁剪说明梯度确实在爆炸得回去查学习率或者数据里的异常样本。AdamW 的 weight decay 设 0.1 对大模型是常规做法小模型上可以适当降到 0.01 到 0.05避免过度正则化导致欠拟合。提示warmup 比例不要照搬别人的数字。小数据微调时 warmup 2% 足够从零预训练时可能需要 0.5% 到 2% 之间反复试。warmup 太短容易在最初几百步把参数带偏太长则浪费训练预算。2.4 一个可以复现的小实验验证表征是否真的可迁移光看论文没用我建议每个人都自己做一次表征迁移的对照实验这样你对“预训练有没有用”会有肌肉记忆。做法很简单拿一个中等规模的数据集准备三组配置——从零训练、加载预训练权重后冻结主干只训分类头线性探针、加载预训练权重后全量微调。三组用相同的评估集和相同的评估脚本记录准确率和达到目标精度所需的标注样本量。我实测下来的典型结果是线性探针的最终准确率比全量微调低 5 到 10 个百分点但它在每个类别只有几十个样本时的表现远好于从零训练全量微调在样本充足时最优但样本少于某个阈值时会明显过拟合验证集曲线比训练集早很多个 epoch 就开始掉头。这个实验最大的价值不是得出某个数字而是让你对自己的数据规模有明确的判断——知道什么时候该冻结、什么时候该放开。实验里有个容易忽略的细节线性探针阶段一定要把 BatchNorm 或者 LayerNorm 的参数也一起冻结否则归一化层会跟着你的小数据一起偏移探针的结果会失真。我第一次做的时候就忘了这一步结果线性探针的表现忽好忽坏折腾了半天才定位到原因。3. 强化学习把“会做事”这件事接进来3.1 状态、动作与奖励的设计取舍强化学习落地失败八成死因在建模阶段不在算法。状态设计的第一原则是马尔可夫性——当前状态要包含做决策所需的全部信息。听起来是废话实际做的时候经常出问题比如机械臂控制只给了关节角度没给角速度智能体就没法判断自己是在加速还是减速策略会在两个动作之间来回横跳。动作空间的选择更实际。连续动作空间用确定性策略或者高斯策略离散动作空间用分类分布混合空间要拆成两段分别处理。动作的尺度也很关键如果关节力矩的范围是 ±100 牛米而你直接把这个量级的数值喂给网络梯度会很不好看标准做法是先把动作归一化到 [-1, 1]输出时再按物理量程缩放。奖励设计是我见过最多坑的地方。稀疏奖励的问题是学不动密集奖励的问题是容易被钻空子。举个真实发生过的例子某团队做一个推动物体的任务为了加速收敛在物体靠近目标位置时给了额外奖励。结果智能体学会了把物体推到目标附近然后停住不动因为“靠近”这个条件已经满足而“到达”需要更精细的控制风险更高收益更低。这就是典型的奖励作弊。我的做法是奖励分三层底层是任务完成的一次性奖励给得大但要稀疏中层是过程引导用势函数形式的差分奖励而不是绝对值奖励这样理论上不改变最优策略顶层是约束惩罚违反安全约束直接给大负值。下面是一个奖励函数的骨架def compute_reward(state, action, next_state, info): r 0.0 # 1) 任务完成奖励稀疏但权重大 if info[task_success]: r 100.0 # 2) 势函数差分引导不改变最优策略 phi_now -info[distance_to_goal] phi_prev -info[prev_distance_to_goal] r 0.5 * (phi_now - phi_prev) # 靠近加分远离扣分 # 3) 约束惩罚 if info[collision]: r - 10.0 r - 0.01 * float((action ** 2).sum()) # 动作幅度正则 # 4) 时间惩罚抑制磨蹭 r - 0.05 return r势函数差分这一招值得多说一句。它的数学性质是如果把奖励写成 Φ(s) − Φ(s) 的形式最优策略不变。这意味着你可以在不扭曲任务目标的前提下给智能体提供“往哪个方向走是对的”的稠密信号。很多教程里那种“离目标越近奖励越高”的绝对值写法恰恰是奖励作弊的源头。3.2 算法选型的边界在哪算法选型不要迷信最新论文先看你的场景特征动作是离散还是连续、能不能在线交互、样本预算多少、要不要用历史数据。算法动作空间样本效率适用场景主要风险DQN 系离散中等动作数少于几百的离散决策高估、难以扩展到连续PPO离散/连续中等偏低大规模并行仿真、需要鲁棒策略对超参敏感、样本利用率低SAC连续较高真实设备、样本昂贵温度参数调节、训练不稳定行为克隆 微调通用高有人类示范数据分布偏移、示范质量依赖强离线强化学习通用高只有历史日志、不能在线试错分布外动作外推误差大我个人的选择顺序是有示范数据就先做行为克隆拿到一个能跑的策略再用在线强化学习微调没有示范数据但仿真便宜就上 PPO 大规模并行真实设备上样本极贵优先考虑 SAC 或者离线方法。这个顺序不是理论最优但它能让你在最短时间内拿到一个可用的基线避免一上来就陷在调参里出不来。3.3 训练不发散的几个实操抓手PPO 是我用得最多的算法也是超参最需要讲究的。下面这套配置在多个任务上表现比较稳ppo_config { gamma: 0.99, gae_lambda: 0.95, clip_ratio: 0.2, num_epochs: 10, # 每批数据重复利用轮数 minibatch_size: 4096, learning_rate: 3e-4, # 线性退火到 1e-6 entropy_coef_start: 0.01, # 前期探索后期退火到 0 value_loss_coef: 0.5, max_grad_norm: 0.5, num_envs: 64, rollout_steps: 2048, }几个参数背后的逻辑值得展开。clip_ratio设 0.2 是经验值它的作用是限制每次更新时新旧策略的比值范围防止一次更新把策略带太远导致崩掉。如果你的任务奖励尺度很大可以适当放宽到 0.3如果训练中策略频繁崩坏先往下调到 0.1 试试。gae_lambda控制优势估计的偏差与方差权衡。设 1.0 就是蒙特卡洛估计方差大但无偏设 0 就是单步时序差分方差小但偏差大。0.95 是常用折中长程任务可以往 0.98 调短程密集奖励任务可以往 0.9 调。num_envs和rollout_steps决定了每批数据的量。批量太小优势估计噪声大策略更新方向不稳批量太大同一批数据重复利用的次数相对变少样本效率下降。我的经验是让单批数据量至少覆盖 20 个以上的完整回合这样优势估计才比较可信。这个数字要自己算如果平均回合长度是 200 步那 rollout_steps 至少要 4000。观测归一化是个容易被跳过但影响巨大的细节。不同维度的观测数值量级可能差几个数量级比如位置是米级、速度是毫米每秒级如果不做归一化网络会偏向数值大的维度。标准做法是用滑动平均和方差在线更新并且在推理时使用训练时的统计量绝不能重新计算。注意评估和训练必须用同一套归一化统计量。我见过一个项目评估脚本里重新计算了观测的均值和方差结果同一个模型在评估环境里的成功率和训练日志差了 30 个百分点排查了三天才发现是归一化不一致。3.4 仿真到现实的落差怎么处理仿真里训练好的策略搬到真机上掉点几乎是必然的问题只在于掉多少。常用的对策有四类。域随机化是最直接的在仿真里随机化摩擦系数、质量、延迟、传感器噪声让策略见过足够多的变体。代价是随机化范围设太宽策略会变得保守什么都学不好设太窄又覆盖不到真实分布。系统辨识更精细先在真机上采集一批激励数据拟合物理参数再把仿真参数对齐。这条路径的仿真保真度最高但需要额外的硬件和数据采集流程。动作平滑和延迟建模是两个常被忽略的点。真机执行器有响应延迟仿真里如果不建模策略就会学到“动作立即生效”的假设上真机后表现为震荡。我的处理方式是在仿真里加一个随机的动作队列延迟范围从 0 到 3 个控制周期同时给动作加一阶低通滤波。最后一类是对称性和一致性约束。很多物理系统本身有对称性比如左右对称的机械结构如果仿真里破坏了这种对称性策略会学到不对称的行为。加数据增强或者一致性正则能缓解。这块的经验是仿真环境本身的质量比算法的选择重要得多先把仿真器调准再去调算法。4. 知识表示让系统记住、约束、说得清4.1 符号、向量与混合表示怎么选知识表示这块有个经典的路线之争显式的符号表示三元组、逻辑规则、本体和隐式的向量表示嵌入、模型参数。符号的好处是精确、可推理、可审计坏处是构建成本高、覆盖面有限、对模糊概念不友好。向量的好处是表达能力强、能处理相似性、容易和神经网络结合坏处是难以保证一致性、无法解释、更新困难。我的判断标准很简单看这个知识需不需要“精确”。工艺参数、合规条款、设备拓扑这类东西错一位就是事故必须用显式表示用户的模糊偏好、语义相似度、风格倾向这类东西用向量表示更合适。真实系统里两者都要关键是把边界划清楚而不是纠结哪个更先进。混合表示的典型做法是底层用属性图或者三元组存事实和约束上层用向量索引做语义检索中间用实体链接把两边对齐。查询时先用向量检索召回候选再用符号约束做过滤和校验最后把结果拼成结构化上下文喂给模型。这个顺序很重要先召回再约束能避免约束条件过严导致召回为空。4.2 知识图谱的构建流程与质量关卡构建一条完整的知识链路我一般分五步走每一步都有对应的验收标准不达标不往下走。第一步是本体设计。定义实体类型、关系类型、属性及其取值约束。这一步要克制不要一上来就设计几百个类型先用二三十个覆盖核心业务后面按需扩展。本体设计得太细抽取阶段就全是噪声太粗后面查询又表达不了。我通常的做法是先拿一批真实查询反推需要哪些类型和关系这样设计出来的本体直接可用。第二步是信息抽取。规则和模型双通道并行是性价比最高的规则处理格式规整的数据比如表格、日志、结构化文档模型处理非结构化文本。两条通道的产出要走同一套后处理包括去重、类型校验、置信度打分。低置信度的结果不要直接入库先进待审核队列。第三步是实体对齐。同一实体在不同来源里的写法可能完全不同简称、别名、错别字、大小写混用都要处理。做法是先做字符串归一化和编辑距离匹配拿到高置信对再用向量相似度召回候选最后人工抽检。这一步的准确率直接决定知识库的可用性宁可少对齐也不要错对齐错一个实体可能污染一整片关系。第四步是融合与冲突消解。同一个属性有多个来源给出不同值时要定优先级规则。常用的规则组合是来源可信度优先、时间戳新的优先、有明确出处引用的优先。冲突无法自动消解时打上标记保留多个值并记录来源让下游知道这里存在不确定性。第五步是质量校验。用约束语言定义一批必须满足的规则比如“某类实体的某属性必须存在”“某关系的两端类型必须匹配”“数值必须在合理区间内”定期跑全量校验把违规记录打出来。这一步看着繁琐但它能在脏数据进入推理链路之前拦住大部分问题。环节关键动作验收标准常见失败原因本体设计从真实查询反推类型与关系覆盖 80% 以上典型查询设计过细导致抽取噪声大信息抽取规则与模型双通道并行抽样准确率高于 90%只用一个通道长尾覆盖差实体对齐归一化 相似度召回 抽检错对齐率低于 1%阈值设太松批量错配融合消歧来源可信度与时间戳规则冲突全部有记录可追溯直接覆盖丢失来源信息质量校验约束规则全量定期跑违规率持续下降规则写得太宽形同虚设4.3 检索增强把外部知识接进推理链路光有知识库不够得让模型在生成时用得上。这条链路的每个环节都有讲究我按实际影响从大到小说。切片策略是第一位的。按固定长度硬切会把一个完整的语义单元劈成两半检索出来的片段读起来没头没尾。更好的做法是按结构切文档有标题层级就按层级切表格按行切同时带上表头代码按函数切。每个切片要带上足够的上下文元信息比如所属章节路径、来源、更新时间。召回策略上纯向量检索对语义相似但用词不同的查询友好对精确术语和编号类的查询反而容易漏。我的做法是向量检索和关键词检索并行跑然后做结果融合。融合时不能简单按分数相加两边的分数分布不在一个尺度上得先各自归一化再加权。重排环节经常被省略但它对最终质量影响很大。召回 50 条再重排到 5 条比直接召回 5 条的效果通常好一截。重排模型可以比召回模型重因为它只处理少量候选。上下文拼装是最后一步也是容易翻车的一步。拼太多会超出上下文窗口还会让模型注意力分散拼太少信息不全。我的经验是把最相关的放最前面和最后面中间放次相关的因为模型对首尾位置的注意力更强。同时给每个片段打上编号和来源标记方便最终输出时回链引用。提示知识库更新后向量索引必须同步重建否则会出现“文档改了但检索还是旧内容”的诡异现象。把索引重建做成更新流程里的强制步骤不要依赖人工记得。4.4 一致性与可解释性怎么落地一致性这块光靠模型自觉是不可能的必须有外部校验。我的做法是在生成之后加一道约束检查把输出里提到的实体、数值、关系抽出来和知识库比对冲突的直接拦截并触发重生成。这道检查会牺牲一点响应速度但对于任何涉及数值和事实的场景都是必须的。可解释性的实现路径是保留推理痕迹。具体来说记录每一次检索召回了哪些片段、每个片段的相关性分数、模型的输出引用了哪些片段。当用户质疑结论时能直接把这些证据链摆出来。这套东西在工程上不难难的是从第一天就把它设计进去事后补会很痛苦因为你的数据结构里根本没有留位置。5. 三者融合的工程实现5.1 系统分层与数据流把三根柱子拼成一个系统我习惯按四层来划分感知层、决策层、知识层、执行层。感知层跑深度学习模型把原始信号转成结构化观测决策层跑策略网络输入观测和知识层给的约束输出动作知识层负责事实查询、约束校验、上下文组装执行层负责把动作变成真实世界的操作并回收反馈。数据流的关键在于每一层的输出格式必须是明确约定的。感知层输出的是带置信度的结构化字段不是一堆浮点数决策层接收的是观测向量加上一组约束条件知识层接收的是自然语言查询或者结构化查询返回带来源标记的结果。这些接口一旦定下来就写进文档并配契约测试任何一方改格式都要走变更流程。 层次 输入 输出 主要技术 关键指标 |---|---|---|---| | 感知层 | 原始传感器数据 | 结构化观测 置信度 | 深度学习模型 | 单帧延迟、置信度校准 | | 决策层 | 观测 约束 | 动作序列 价值估计 | 强化学习策略 | 任务成功率、动作平滑度 | | 知识层 | 查询请求 | 事实、约束、上下文 | 图存储 向量检索 | 召回率、冲突率、延迟 | | 执行层 | 动作序列 | 执行结果 异常 | 控制接口 | 执行精度、异常率 |5.2 分阶段训练与联调顺序训练顺序搞错会导致大量返工我推荐的顺序是先训表征再做行为克隆热启动然后强化学习微调最后接知识约束做联合评估。这个顺序的理由是每一阶段都建立在前一阶段的稳定输出之上避免同时调多个变量。第一阶段训表征的时候评估标准是下游任务的线性探针精度不需要考虑决策。第二阶段用人类示范或者仿真里的脚本策略做行为克隆目标是拿到一个“能跑完流程但不一定最优”的策略这一步的评估标准是完成率而不是回报。第三阶段用强化学习在仿真里优化回报评估时要盯住策略有没有偏离物理合理性比如动作幅度突变、状态越界。第四阶段把知识约束接进来重点看加了约束之后成功率掉了多少如果掉太多说明约束设计得过于严格或者和策略的行为模式冲突。联调阶段最容易出问题的是版本错配。感知模型更新了输出格式决策策略还在按老格式解析知识库的关系类型改了名查询语句全部失效。我的做法是给每个模块的输出加一个版本号联调时先跑一遍全链路的冒烟测试任何一环版本不匹配直接报错退出不要让它带着错误数据往下跑。5.3 评估体系别只看单一指标融合系统的评估必须多维度单看任务成功率会掩盖很多问题。维度具体指标目标方向说明任务效果成功率、平均回报越高越好分场景统计别只看总体泛化能力新分布上的成功率衰减衰减越小越好至少准备两套分布外测试集样本效率达到目标精度所需交互数越少越好与基线方法对比知识准确性事实冲突率、引用命中率冲突率越低越好需要人工抽检响应性能端到端延迟、吞吐满足业务要求分位数比平均值更有意义成本单次推理算力、存储越低越好含知识库维护成本我特别想强调分布外测试集这一项。很多团队只在同分布测试集上评估上线后才发现系统对输入的一点扰动就崩。准备两套分布外测试集其实不难一套通过改变采集条件构造一套通过对抗性扰动构造。前者测的是鲁棒性后者测的是边界行为。这两套集子上的表现比总体成功率更能说明系统能不能用。5.4 算力与成本估算怎么做估算这件事我建议动手算别拍脑袋。以一个 7B 参数模型、训练 1T token 为例前向加反向的计算量经验公式是 6 乘以参数量乘以 token 数总 FLOPs 6 × 7 × 10^9 × 1 × 10^12 4.2 × 10^22再按硬件的有效算力折算。假设单卡峰值算力是 3.12 × 10^14 FLOPS实际利用率取 40%则单卡有效算力约 1.25 × 10^14 FLOPS。所需卡时卡秒数 4.2 × 10^22 / 1.25 × 10^14 ≈ 3.36 × 10^8 秒 卡天数 3.36 × 10^8 / 86400 ≈ 3890 卡·天也就是 100 张卡跑一个多月或者 400 张卡跑十天左右。这个数字只是训练不含数据预处理、评估、调参重跑的消耗。实际项目里我一般在这个基础上乘 2 到 3 倍作为预算上限因为返工几乎不可避免。推理侧的成本估算逻辑不同主要看 QPS 和单次推理的 token 数。把输入输出 token 总数乘以单 token 的计算量再除以硬件吞吐就能得到单次请求的成本乘上日请求量就是日成本。知识库的存储和检索成本单列向量索引的内存占用通常是原始文本的几倍到十几倍这一块容易被低估。6. 常见问题与排查技巧实录6.1 训练不收敛类问题速查现象优先排查常见根因处理方式loss 完全不降数据与标签是否对齐标签错位、路径错配打印一批样本人工核对loss 前期正常后期突变学习率与数据异常学习率过大、脏样本降学习率、扫描异常样本loss 变 NaN数值精度bf16 溢出、除零开梯度裁剪、加 eps、定位具体算子训练集好验证集差正则与数据量过拟合、验证集泄漏加正则、检查划分逻辑指标抖动幅度大批量大小与学习率批量太小、学习率过高增大批量、降学习率、开梯度累积推理速度远慢于预期输入长度分布长尾超长输入统计长度分布、加截断策略这张表我建议打印出来贴在显示器边上。绝大多数训练问题都能在前三行找到对应剩下的靠日志和可视化定位。有个细节值得单独说loss 曲线抖动大不一定是学习率的问题也可能是数据加载器的随机性设计有问题。比如用了不设种子的随机裁剪每个 epoch 的样本难度差异很大曲线自然抖。我一般会先固定所有随机种子跑一次如果抖动明显减小就说明是数据侧的随机性不是优化侧的问题。6.2 奖励作弊与策略退化的识别奖励作弊的典型信号是回报指标一直在涨但你看一眼实际行为录像发现智能体在做一件完全不符合你意图的事。这时候不要再调参了回去看奖励函数。排查方法是把奖励的各个分项拆开单独打日志看哪一项在异常增长。如果发现某个引导项贡献了绝大部分回报那基本就是它被钻了空子。策略退化的另一个信号是动作熵骤降。智能体在某个早期阶段就锁定了单一动作模式之后再也不探索。这通常是因为熵系数退火太快或者优势估计的方差太小导致梯度信号消失。处理方式是把熵系数退火曲线拉长或者在优势估计里加一点噪声保持探索。还有一种隐蔽的情况是评估环境本身有 bug。我遇到过一次评估脚本里的回合重置逻辑写错了导致智能体实际上是在一个几乎不会失败的简单状态下被评估成功率虚高到 99%。所以当你看到好得不太真实的结果第一反应应该是去查评估代码而不是庆祝。6.3 知识库脏数据放大错误的链路知识库里的错误数据危害不是线性放大的而是通过检索和生成两重放大。一条错误的事实被检索到模型会在生成时引用它并且用看似合理的语言包装用户很难分辨。更麻烦的是如果这条错误事实被反复引用它会在后续的数据回流里被当成正确样本形成闭环污染。阻断这条链路的关键是在入库环节设卡而不是在输出环节补救。我的做法是三条所有入库数据必须带来源和采集时间冲突数据不覆盖而是并存标记为待裁决定期做抽样人工核对核对结果反过来修正抽取规则。第三条最重要因为抽取规则的缺陷只能通过人工反馈发现纯自动化流程会一直重复同样的错误。还有一个实用技巧给知识库加一个“新鲜度”维度。超过一定时间没被任何查询命中的条目降权处理长期未被命中且无来源引用的条目进入待清理队列。这条规则能自动清理掉大量过期和错误的历史数据。6.4 联调阶段最耗时的接口问题融合系统里最耗时的往往不是算法是接口。我列几个高频问题。第一类是数值精度不一致感知层输出 float32决策层按 float16 接收小数点后几位被截断导致策略输入和训练时不一致。这类问题表现为“仿真里好的策略上真机就抖”排查时容易被误判成动力学差异。第二类是坐标系和单位。图像坐标、世界坐标、关节坐标混用米和毫米混用弧度与角度混用。我的做法是在接口定义里强制写单位后缀比如distance_m、angle_rad字段名不带单位的一律不通过评审。这个规矩看着啰嗦但它挡掉的 bug 比任何测试都多。第三类是时序问题。感知有延迟决策按固定频率跑知识查询是异步的三者时间戳对不齐。处理方式是在数据包里带上采集时间戳决策层按时间戳做对齐和插值不要假设数据是同时到达的。第四类是异常处理缺失。任何一个模块返回空值或者超时整条链路就卡住。必须在每个接口上定义好降级行为感知失败时用的是上一帧还是默认值知识查询超时时是跳过约束还是拒绝执行。这些策略要提前定不能等线上出事再补。我在实际项目里体会最深的一点是融合系统的复杂度不在任何单一技术上而在它们之间的缝隙里。每一块单独看都是成熟方案接起来之后冒出来的问题九成都是接口、时序、精度、版本这类“工程细节”。所以我的建议是与其把时间花在追最新的算法不如先把接口契约、版本管理、冒烟测试这三件事做扎实它们对最终效果的贡献往往比换一个更强的模型更大。再说一个后续可以扩展的方向把知识层的约束从“输出后校验”前移到“决策时约束”。现在的做法大多是先生成再检查效率低而且检查不出来就只能重来。如果在策略的动作采样阶段就把物理和业务约束编码进去比如用动作掩码或者约束投影能省掉大量无效尝试。这个方向在工程上已经有比较成熟的实现路径值得在自己的系统里试一次。