大模型决策不稳定?拆出独立决策模型实现毫秒级确定性推理
1. 为什么要把“决策”从大模型里拆出来第一次看到“System One”这个提法我脑子里蹦出来的不是学术概念而是一个很具体的工程痛点我们花了大价钱、堆了海量数据训出来的大模型在真正需要它“拍板”的那一刻往往表现得像个博学但优柔寡断的顾问——它能给你列出十条理由、五种可能却很难干脆利落地告诉你“就选这个别犹豫”。Jev 这个项目想干的事情说白了就是把这层“拍板”的能力从大模型里剥出来单独做成一个模型。这个思路我第一次听到的时候是有点被戳中的因为它解决的不是“模型不够聪明”的问题而是“模型太聪明反而不会做决定”的问题。先把这个概念讲清楚。所谓 System One借的是认知心理学里那套快思考与慢思考的框架。慢思考对应的是我们熟悉的大模型推理过程一步步拆解、反复权衡、自我质疑、来回修正最后给出一个答案。这个过程很强大但也很贵——贵在算力、贵在延迟、贵在它每次都要把整个思考链路跑一遍。而快思考对应的是直觉式的、近乎条件反射的决策看到局面直接给出动作不解释、不纠结、不回头。Jev 的核心主张就是决策这件事不该由那个负责“想”的大模型来兼任而应该交给一个专门负责“选”的小模型。大模型负责理解局面、提取特征、生成候选方案然后把“从候选里挑一个”这个动作交给一个独立的、轻量的、专门训练过的决策模型。这个决策模型不负责解释世界只负责在给定局面下输出一个动作。这个拆分的价值在哪里我举一个实际场景你就明白了。假设你在做一个自动化运维系统服务器负载突然飙升。大模型可以分析日志、定位到是某个服务的内存泄漏、给出三种处理方案重启服务、扩容、限流。这三步它做得很好。但“现在这一秒到底该执行哪一个”这个决策如果也让大模型来拍它可能会因为上下文里多了一句无关的告警而改变主意也可能因为推理链路的随机性而给出不一致的答案。而一个专门的决策模型输入同样的局面特征输出的动作是稳定的、可复现的、毫秒级的。这就是 Jev 想解决的问题把“想”和“选”解耦让决策变成一个独立、稳定、低成本、可复现的模块。它适合谁来参考我认为三类人最该看一是做智能体系统的工程师你们一定被“大模型决策不稳定”坑过二是做实时控制、自动化、游戏 AI 的开发者你们对延迟和确定性有硬要求三是做模型架构研究的人这个拆分思路本身就是一种对“大模型该干什么、不该干什么”的重新划分。2. Jev 的整体设计思路拆解2.1 核心思路决策是一个独立可训练的函数Jev 最根本的设计选择是把决策建模成一个独立的函数而不是大模型输出的一部分。这个函数的形式很简单输入是当前局面的特征向量输出是动作空间上的一个分布或者一个确定动作。为什么这么设计因为一旦决策被独立出来它就可以被单独训练、单独评估、单独优化。你不需要为了改一个决策偏好去重新微调整个大模型你只需要重新训练那个小决策模型。这在工程上意味着迭代速度的质变。我打个比方。大模型像是一个经验丰富的项目经理他能理解需求、拆解任务、写出方案文档。但“今天下午三点这个 bug 到底先修哪个”这种决策如果每次都让项目经理从头分析一遍效率极低。Jev 的做法是项目经理负责把局面讲清楚然后交给一个专门的值班调度员这个调度员只干一件事——根据当前局面从待办列表里挑出下一个该做的。调度员不需要懂业务细节他只需要在大量“局面-动作”的样本上训练过知道什么局面该选什么。这个设计还有一个隐含优势决策模型可以比大模型小几个数量级。大模型动辄几十上百亿参数而一个决策模型可能只需要几百万到几亿参数。参数量小意味着推理快、部署成本低、可以在边缘设备上跑。这对于需要实时决策的场景是决定性的。2.2 为什么不让大模型直接输出动作有人会问大模型本来就能输出动作啊我让它直接说“执行重启”不就行了为什么要多此一举拆出来这个问题我踩过坑。早期我做智能体的时候就是让大模型直接输出动作。结果发现三个致命问题。第一是不一致性。同样的局面你问大模型两次它可能给你两个不同的动作。因为大模型的输出是采样出来的温度参数稍微一动或者上下文里多了一个标点结果就变了。对于决策来说不一致是灾难——你没法做回归测试没法保证系统行为可预测。第二是延迟不可控。大模型输出一个动作背后是完整的推理链路。哪怕你让它“直接回答”它内部还是要跑完整个前向传播。在需要毫秒级响应的场景里这个延迟是不可接受的。第三是决策质量无法单独优化。当决策混在大模型的输出里你想提升决策准确率只能去微调整个大模型。但微调大模型会同时改变它的语言能力、理解能力牵一发动全身。你没法只优化决策而不影响其他。Jev 的拆分把这三个问题一次性解决了。决策模型独立之后一致性由确定性推理保证可以关掉采样延迟由小模型保证决策质量由专门的训练数据保证。这就是“拆出来”的核心收益。2.3 大模型与决策模型的分工边界拆分的关键在于划清边界。Jev 的设计里大模型负责的是感知与表征把原始输入文本、日志、状态、图像描述等转化成决策模型能吃的特征向量。这个转化过程需要理解语义、提取关键信息、压缩冗余这正是大模型擅长的。决策模型负责的是映射把特征向量映射到动作空间。它不做理解不做推理只做映射。这个映射是通过监督学习或者强化学习训练出来的。边界划在这里的好处是大模型的能力可以复用你换一个更强的大模型来做感知决策模型不用动决策模型可以独立迭代你积累了一批新的决策样本重新训练决策模型就行大模型不用动。两个模块解耦各自演进。注意这个边界不是绝对的。有些项目里大模型也会输出一个“候选动作集合”决策模型只负责从候选里排序。这种设计把动作空间的搜索也交给了大模型决策模型只做精排。Jev 的原始设计更倾向于让决策模型直接面对完整动作空间但这取决于你的动作空间大小和训练数据量。3. 核心细节解析与实操要点3.1 特征向量的构造决策模型的“输入长什么样”决策模型能不能训好八成取决于输入特征的质量。Jev 里这一步是由大模型来完成的但具体怎么构造有几个关键决策。最直接的做法是让大模型输出一个固定维度的向量比如取最后一层隐藏状态的平均池化。但实测下来这种做法有两个问题一是维度太高动辄几千维决策模型容易过拟合二是隐藏状态里混杂了大量与决策无关的语言信息。更稳的做法是结构化特征提取。让大模型按照一个预定义的 schema 输出关键字段比如当前状态的关键指标、历史动作序列的摘要、环境约束条件等然后把这些字段拼接成一个低维向量。这个向量可能只有几十到几百维但每一维都有明确含义。我自己的经验是特征构造要遵循“决策相关性优先”原则。问自己这个特征如果变了我的最优动作会不会变如果不会这个特征就不该进决策模型的输入。比如在一个资源调度场景里“当前 CPU 利用率”是强相关特征“当前时间戳的秒数”可能是弱相关甚至无关特征。把无关特征喂进去只会增加决策模型的训练难度。Jev 的参考实现里特征向量的构造是可以通过配置文件定义的。你可以指定哪些字段来自大模型的输出哪些字段来自环境直接读取然后拼接顺序和归一化方式也在配置里写清楚。这个设计很实用因为不同场景的特征需求差异很大硬编码在代码里会很难维护。3.2 动作空间的设计离散还是连续决策模型的输出空间设计是第二个关键决策。Jev 主要面向的是离散动作空间也就是从有限个动作里选一个。这符合大多数决策场景重启/扩容/限流是三选一前进/后退/左转/右转是四选一。离散动作空间的好处是决策模型的最后一层就是一个 softmax输出每个动作的概率取 argmax 或者按概率采样。训练目标也清晰就是交叉熵或者策略梯度。但有些场景的动作是连续的比如控制一个机械臂的关节角度。Jev 对这种情况的处理方式是先离散化再决策。把连续空间切成若干档每档对应一个离散动作。这样做会损失一些精度但换来了决策模型的简化和训练稳定性的提升。如果你的场景对精度要求极高那可能需要用连续动作空间的决策模型但那已经超出 Jev 的原始设计范围了。动作空间的大小也有限制。Jev 的经验值是离散动作数量最好控制在几十到几百之间。动作太多决策模型的输出层会变得很大训练样本的覆盖度也会成问题。如果动作空间天然很大可以考虑分层决策先选大类再选子类。3.3 训练数据的来源从哪搞“局面-动作”样本这是整个项目里最容易被低估的环节。决策模型是监督学习或者强化学习训出来的不管哪种都需要大量“局面-动作”配对样本。这些样本从哪来Jev 提供了三条路径。第一条是日志回放。如果你已经有一个在运行的系统不管是人操作的还是旧模型操作的把历史日志里的“局面”和“当时采取的动作”提取出来就是一批样本。这条路径最省事但样本质量取决于旧系统的决策水平。如果旧系统决策很烂你训出来的决策模型也会继承它的烂。第二条是大模型标注。让大模型在大量局面上给出它认为的最优动作作为训练标签。这条路径的优点是样本生成快缺点是标签质量受大模型决策能力限制。而且大模型决策本身就不稳定标注出来的标签可能自相矛盾。第三条是仿真环境探索。在仿真环境里让决策模型自己试错用强化学习的方式训练。这条路径能突破旧系统和大模型的能力上限但需要仿真环境足够真实且训练成本高。我个人的建议是混合使用先用日志回放快速冷启动再用仿真探索做精调。Jev 的参考实现里有一个数据管道的模块支持从这三种来源读取数据并统一成训练格式这个设计省了不少事。提示训练数据的质量比数量重要。一万条高质量的“局面-动作”样本往往比十万条噪声样本训出来的决策模型更好。在构造数据集时一定要做去重和冲突检测——同样的局面出现两个不同动作要么是局面特征没提取全要么是标签本身有噪声这两种情况都要处理。4. 实操过程与核心环节实现4.1 环境搭建与依赖准备Jev 的参考实现是 Python 为主的核心依赖包括深度学习框架、向量处理库和配置管理库。我建议用虚拟环境隔离避免和系统里的其他项目冲突。python -m venv jev-env source jev-env/bin/activate pip install torch numpy pyyaml深度学习框架选型上Jev 的参考实现同时支持主流框架但决策模型本身很小用哪个框架差异不大。我选的是 PyTorch因为调试方便动态图对决策模型这种结构简单的网络来说更直观。大模型那一侧Jev 不绑定具体模型只要能把局面转成特征向量就行。你可以用本地部署的开源模型也可以调用远端接口。如果追求低延迟建议用本地的小尺寸模型做特征提取因为特征提取本身不需要太强的语言能力。4.2 特征提取模块的实现特征提取模块的职责是接收原始局面描述输出固定维度的特征向量。Jev 的参考实现里这个模块分成两步大模型调用和特征后处理。大模型调用这一步关键是设计好 prompt。你需要让大模型按照一个严格的格式输出关键字段。比如FEATURE_PROMPT 你是一个局面分析器。请分析以下局面并输出 JSON 格式的关键字段 - load_level: 当前负载水平取值 0-10 - trend: 趋势取值 up/down/stable - error_count: 最近一分钟错误数 - resource_pressure: 资源压力取值 0-10 局面描述 {context} 只输出 JSON不要输出其他内容。 拿到大模型的 JSON 输出后后处理模块把字段转成数值向量做归一化然后拼接。归一化很重要因为不同字段的量纲差异很大不归一化的话决策模型会被大数值字段主导。def build_feature_vector(fields): vec [ fields[load_level] / 10.0, 1.0 if fields[trend] up else (-1.0 if fields[trend] down else 0.0), min(fields[error_count] / 100.0, 1.0), fields[resource_pressure] / 10.0, ] return vec这个向量只有四维但每一维都有明确的决策含义。实测下来这种低维结构化特征比高维隐藏状态训出来的决策模型更稳。4.3 决策模型的网络结构与训练决策模型本身的结构可以非常简单。Jev 的参考实现用的是三层全连接网络输入维度等于特征向量维度隐藏层维度 128 和 64输出维度等于动作空间大小。import torch.nn as nn class DecisionModel(nn.Module): def __init__(self, input_dim, hidden_dim, action_dim): super().__init__() self.net nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim // 2), nn.ReLU(), nn.Linear(hidden_dim // 2, action_dim), ) def forward(self, x): return self.net(x)训练目标就是交叉熵给定特征向量让模型输出的动作分布尽量接近标签动作。criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr1e-3) for epoch in range(num_epochs): for features, labels in dataloader: logits model(features) loss criterion(logits, labels) optimizer.zero_grad() loss.backward() optimizer.step()这里有几个实操要点。学习率不要设太大1e-3 是个稳妥的起点因为决策模型小大学习率容易震荡。批次大小可以设大一点256 或 512因为样本之间独立性较强。训练轮数不用太多决策模型很容易过拟合通常几十轮就够了配合早停策略。4.4 推理阶段的确定性保证决策模型训好之后推理阶段最关键的是确定性。也就是说同样的输入必须输出同样的动作。这和大模型的采样式输出完全不同。实现方式很简单推理时关掉 dropout用 eval 模式然后取 argmax 而不是采样。model.eval() with torch.no_grad(): logits model(feature_vector) action torch.argmax(logits, dim-1).item()这个确定性是 Jev 相比“大模型直接决策”最大的工程优势。你可以对决策模型做完整的回归测试准备一批固定的局面特征跑一遍记录输出动作以后每次改模型都跑同样的测试看输出有没有变化。这种可测试性在真实系统里价值极高。注意如果你希望决策保留一定的探索性可以在训练阶段用采样但部署阶段一定要用 argmax。探索是训练的事部署要的是稳定。4.5 与大模型模块的对接最后一步是把决策模型和大模型模块串起来。整体流程是原始局面 - 大模型特征提取 - 特征向量 - 决策模型 - 动作 - 执行。Jev 的参考实现里这个串联是通过一个 orchestrator 模块完成的。它负责调用大模型、构造特征、调用决策模型、返回动作。这个模块的代码量不大但要注意异常处理大模型调用失败怎么办特征字段缺失怎么办决策模型输出异常怎么办我的做法是给每个环节都设默认值。大模型调用失败时用上一次的特征向量兜底特征字段缺失时用该字段的历史均值填充决策模型输出异常时回退到一个保守动作。这些兜底逻辑看起来不起眼但在真实系统里能避免很多事故。5. 常见问题与排查技巧实录5.1 决策模型输出总是偏向某一个动作这是最常见的问题本质是类别不平衡。训练数据里某个动作占了绝大多数决策模型就学会了“无脑选它”因为这样损失最低。排查方法很简单统计训练标签的分布。如果某个动作占比超过 50%基本可以确定是这个问题。解决方法有三种。一是重采样对少数类动作的样本做上采样或者对多数类做下采样。二是加权损失给少数类更高的损失权重让模型不敢忽略它们。三是分层采样在每个批次里保证各类动作都有一定比例。我一般先用加权损失因为改动最小。权重可以按类别频率的倒数来设。class_weights 1.0 / torch.bincount(labels) criterion nn.CrossEntropyLoss(weightclass_weights)5.2 决策模型在训练集上很好在验证集上很差典型的过拟合。决策模型虽然小但如果特征维度高、样本量少照样会过拟合。排查方法是看训练损失和验证损失的曲线。如果训练损失持续下降但验证损失开始上升就是过拟合了。解决方法一是加正则化L2 正则或者 dropout 都行。二是减特征维度把决策无关的特征砍掉。三是加数据如果条件允许多搞点样本。四是早停验证损失开始上升就停。我自己的经验是决策模型的过拟合往往不是模型太复杂而是特征里噪声太多。与其加正则化不如回头检查特征构造把那些“看起来有用但其实没用”的特征删掉。5.3 大模型特征提取不稳定导致决策抖动这个问题很隐蔽。决策模型本身是确定性的但如果大模型输出的特征每次都有细微差异决策模型的输入就变了输出动作也可能跟着变。排查方法固定一个局面反复调用大模型特征提取看输出的特征向量是否一致。如果不一致就是这个问题。解决方法一是降低大模型采样温度特征提取阶段温度设为 0让它尽量确定性输出。二是特征离散化把连续特征切成档位减少细微差异的影响。三是特征平滑对连续特征做滑动平均过滤掉高频抖动。提示特征提取阶段的大模型调用和决策阶段是两回事。特征提取要的是稳定和一致不需要创造性。所以温度设 0、关掉 top-p 采样都是合理的。5.4 动作空间变化后决策模型失效如果你的系统增加了新动作原来的决策模型输出层维度就对不上了必须重新训练。这是离散动作空间的固有局限。Jev 的应对方式是预留动作槽位。在训练时就把动作空间设得比当前需要的大一些预留几个空槽位。将来加新动作时如果新动作能映射到预留槽位就不用重训。但预留槽位也有代价空槽位会分走一部分概率质量可能影响现有动作的决策准确率。所以预留多少要权衡。我的建议是预留 10% 到 20% 的槽位太多会影响性能太少不够用。如果动作空间变化频繁那可能要考虑分层决策或者连续动作空间了离散方案不适合这种场景。5.5 常见问题速查表问题现象可能原因排查方法解决方向输出偏向单一动作类别不平衡统计标签分布加权损失、重采样训练好验证差过拟合看损失曲线正则化、减特征、早停决策抖动特征提取不稳定固定局面反复提取降温、离散化、平滑新动作失效动作空间变化检查输出层维度预留槽位、重训推理延迟高特征提取慢分段计时换小模型、缓存特征决策准确率低特征不含决策信息特征消融实验重新设计特征6. 我对这套拆分思路的几点体会Jev 这个项目最让我认同的地方是它对大模型能力的“克制”。现在很多系统恨不得把所有事情都塞给大模型让它理解、推理、决策、执行一条龙。但实际做下来你会发现大模型在“理解”和“生成”上确实强在“稳定决策”上反而不如一个小而专的模型。把决策拆出来本质上是一种职责分离的设计哲学。大模型做它擅长的感知和表征决策模型做它擅长的映射和选择。两者通过一个明确定义的特征向量接口通信。这个接口一旦定下来两边就可以独立演进。我在实际项目里用过类似的架构最大的感受是调试变得容易了。以前大模型决策出问题你很难定位是理解错了还是决策错了。拆开之后特征提取的问题看特征向量决策的问题看决策模型边界清晰排查效率高了一个档次。当然这套方案也不是万能的。如果你的决策场景极其复杂动作空间巨大或者决策需要深度推理那拆出来的小决策模型可能能力不够。这种情况下可能还是得让大模型来决策或者用大模型加决策模型的两级架构。Jev 的定位是那些决策模式相对固定、动作空间有限、对延迟和稳定性有要求的场景在这个范围内它的价值非常明显。最后分享一个实操小技巧训练决策模型时一定要留一个固定测试集这个测试集不参与任何训练和调参只在最后评估时用。因为决策模型很容易在调参过程中对验证集过拟合只有固定测试集才能反映真实泛化能力。这个测试集不用大几百条样本就够但一定要固定住每次改模型都跑一遍看准确率有没有下降。这个习惯帮我避免了好几次“以为改进了其实退步了”的情况。