☰
不生成文本的AI:Jev模型如何实现毫秒级实时决策
2026/10/13 13:33:01 网站建设 项目流程

我以前一直觉得,只要是大语言模型,不管任务多复杂,最后都得靠“吐一段文本”来收尾。这个思路在聊天、写作、总结这些场景里没毛病,但一旦到了需要做决策的实时系统里,就特别别扭。打字生成一段推理过程,然后再从文本里解析出结果,又慢又贵,偶尔还会因为一段漂亮话把真正该做的动作带偏。直到我接触了一个叫 Jev 的新型模型,它干脆不生成文本,输入状态之后直接输出一个决策向量,整个推理在 10 毫秒上下就能跑完。这篇文章就围绕这个“不生成文本的 AI”说说 Jev 模型是什么、它怎么和 Kahneman 那套 System 1 / System 2 思维模型结合成一个决策工作流,以及我在实际接入业务系统时踩过的坑。

这个 Jev 模型解决的并不是“能不能聊天”的问题,而是“要不要这么快做决定”的问题。它面向的是那些高频、重复、延迟敏感的决策场景——比如物流路径选择、广告出价、库存调度、机器人避障。传统做法是让大模型“想清楚再回答”,但很多决策根本不需要那么大动干戈,也不应该等 2 秒以上。于是就有了两段式架构:一个快速反射式的 Jev 负责日常决策,一个慢速但更强的大模型负责复杂兜底。这本质上就是心理学里 System 1 和 System 2 的工程化版本。我接下来会从原理讲到实现,再讲实测中的教训,希望能给正在做类似实时决策系统的朋友一些参考。

1. 从 token 到行动:传统 AI 实时决策的三个瓶颈

1.1 自回归生成是一条昂贵的主干道

只要用过生成模型就会明白,文本是“一个 token 一个 token”蹦出来的。这个过程的天然特点是:你没法跳过中间步骤直接拿到结论。一个 800 token 的规划,在普通推理卡上动辄要 15 到 40 秒。如果是聊天,这个速度可以接受;但如果是物流调度线上的一次路径选择,或者交易系统里的一次出价判断,等你把一段完整的 reasoning 输出完,机会窗口早就过去了。我以前在某公司的调度模拟项目里测试过,一个 7B 级别的模型在生成 400 token 的决策依据时,耗时接近 8 秒,而同样的状态给 Jev 做前向推理,只需要 9 毫秒。差距是三个数量级。

更麻烦的是,自回归的耗时不是线性的。输入越长,前置 prefill 越慢;输出越长,后续 decode 越占显存。实时决策场景里通常还伴随高并发,假设你每秒有 500 次决策请求,每次都要生成 600 token,那光是推理吞吐就把资源撑爆。让大模型去承担“每一票”的决策,在成本上就不是一个可规模化的事。Jev 走的是完全不同的路子:它不做 token 级的逐步生成,而是把“当前状态”映射成“动作表示”的一次性计算。这就好像你开车看到红灯,不会先在心里写一篇“前方出现红灯,根据交通法规应当停车”的说明文,然后逐字念完再踩刹车。你是直接踩下去的。

1.2 文本不是给机器读的指令,是给人类看的中间产物

第二个瓶颈源自一个反直觉的事实:很多决策系统要求大模型输出 JSON、YAML 或者特定格式的命令,然后再用正则或别的解析器去抠字段。这个习惯我能理解,因为文本是可读的,方便调试。但可读性和可靠性往往是矛盾的。我遇到过模型在 JSON 里多打一个逗号、把数字位数字写成中文单位、甚至一本正经地生成了一个完全不存在但格式合法的指令。解析层越严格,失败率越高;失败以后你要重试,重试又带来额外的延迟。

这里的问题不是模型不够聪明,而是我们在逼一个为“生成自然语言”设计的模型去承担结构化数据序列化的职责。Jev 的做法直接绕开了这个环节:它的输出不是字符串,而是一个固定维度的向量。你可以把这个向量理解成一个“动作的嵌入表达”,业务侧再用一个轻量映射层把它转成具体动作 id、数值参数或策略概率。没有中间文本,就没有解析错误。这不是小优化,而是把故障面整体削掉了一大块。我们上线 Jev 之后,格式相关错误从原来每千次请求 3 到 5 例降到了接近零。

1.3 成本放大的背后,是“不必要推理”造成的幻觉

还有一个常被低估的问题是:你在短决策链路里塞进大模型,会把链路上每一步的误差都放大。为了得到一个可靠的结论,大家喜欢加 System prompt、few-shot examples、甚至让模型“一步步思考”。然而每一次生成都伴随着概率采样,生成得越长,整体落到一个错误分支的概率就越高。更麻烦的是,这些模型很容易一本正经地描述一个完全错误的决策理由。从产品视角看,用户看模型还能给出“理由充分”的建议,其实它已经在瞎编了。

Jev 的思路是“能给够”而不是“给很多”。它的训练目标不是下一个词的概率,而是让输出向量在动作空间里尽可能靠近正确决策。没有冗长的推导路径,模型犯错的空间也就更窄。当然,这不代表它不会犯错,只是整体错误的概率被压缩了。换句话说,当你在一个对延迟和准确性都敏感的系统里,用大模型去生成“决策理由”再反推动作,其实是把本该留给领域逻辑的容错预算白白花在了文本生成上。

2. Jev 模型内部:不吐 token 的推理管道

2.1 架构:把“思考”折叠成一次前向传播

Jev 不是一个全新的模型家族,它的架构更像是一个“经过裁剪的决策头 + 预训练编码器”的组合。我复现和部署的版本大概是这样的:输入端先走一个共享编码器,它可以是已经训练好的通用表示模型,负责把状态特征转成一段向量。这个向量随后被送入一个轻量决策头,经过两到三层 MLP,最后输出成一个 64 维或 256 维的动作向量。整个过程完全没有 tokenizer,没有词表,也没有解码器。

这个设计的关键在于“折叠”。大模型把推理过程展开成了几千个 token,Jev 则是把推理过程压缩在向量空间的一次变换里。你可以想象成:大模型是一个写报告的人,Jev 是一个听到问题就直接在表格里填答案的熟练工。对于确定性较强的决策任务,这种处理是够的。那“思考”去哪了?思考其实被编码进了模型的训练过程和数据里。换句话说,模型在训练时已经见过海量“状态到动作”的映射,在线推理时不需要再从头推导一遍。

值得一提的是,Jev 的输出向量不是铁板一块的 one-hot。它的每个维度承载着一定的语义含义,并且保留连续空间信息。这意味着你可以计算两个动作向量之间的距离,可以做最近邻检索,也可以在向量之上叠加一个小型策略头。我们在项目里就保留了这层连续表达,后面做在线强化学习时省了大事。

2.2 训练目标不是“下一个词”,是“下一个动作”

既然不走文本生成,Jev 的训练目标就是纯粹的决策导向。我们实际用了三个目标函数的组合。第一项是行为克隆,输入一段状态序列,模型直接学习预测真实业务动作,损失函数就是预测动作向量和真实动作向量之间的均方差,或者等价于一个分类交叉熵。第二项是对比学习,让相同状态下产生的好动作向量在空间里靠近,差动作向量尽量远离。第三项是一个价值头,让模型顺带估计当前状态的价值,方便后面做决策置信度调整。

具体来说,损失函数可以写成三项加权和:

[ L = \lambda_1 \cdot L_{\text{clone}} + \lambda_2 \cdot L_{\text{contrast}} + \lambda_3 \cdot L_{\text{value}} ]

在实践中,(\lambda_1) 最大,通常为 1.0;(\lambda_2) 为 0.3 左右;(\lambda_3) 为 0.1 左右。对比项不需要太强,否则会把动作表示的空间搞得过度分散,反而影响最后映射层。训练数据不只是最终决策结果,还要带着动作之间的优劣排序。这有点像推荐系统里用同一个用户的不同反馈做 pair 训练,重点不在“一步到位”,而在“把空间结构摆对”。

很多技术朋友一听“不生成文本”就想当然认为这是一个没有“智能”的模型。其实这恰好在选项:Jev 的智能不在于措辞,而在于表示。如果训练数据足够充分、动作空间设计得合理,它能抓住很多隐藏的模式。我们在模拟库存调度任务里,它的表现在高频动作上已经接近一个大模型的水平,推理耗时却低了两个数量级。

2.3 为什么叫 Jev?“Just Enough Value”的取舍思路

这个模型名字我后来才理解到位。Jev 是“Just Enough Value”的缩写,翻译过来就是“只给够用的价值”。它不追求输出一整套解释、一份报告、一个长计划,它只给出当前决策最有用的那个向量。这个理念特别适合“小区分动作”的场景:你不需要向一家物流调度系统解释“为什么要走这条高速”,你只需要告诉它“走这条路,置信度 0.83”。

这套取舍有一个前提,就是业务侧已经有一个外部决策框架,知道拿到 Jev 给出的向量之后怎么使用。Jev 的角色是感知与判断的“压缩包”,而不是一个完整的业务大脑。如果什么都让模型自己解释,那就退回到大模型那套逻辑上去了。所以我一直跟团队说,部署 Jev 之前先想清楚:你的系统缺的到底是“理解”还是“行动”?如果是前者,继续用大模型;如果是后者,Jev 才是对得上的那个工具。

3. System 1 决策工作流:快思维是主轴,慢思维当兜底

3.1 两段式推理:从“一个模型干所有事”到“两个系统接力”

谈到决策系统设计,避不开两位学者的那套理论,只不过大多数人没把它工程化。System 1 负责直觉型快速反应,特点是不假思索;System 2 负责复杂推理,特点是缓慢且耗能。Jev 就是被部署成 System 1 的角色,而一个增强推理的大模型作为 System 2 的兜底。

整个工作流是这样的:请求进来之后,先经过一个状态标准层,整理成统一的数值特征。然后直接交给 Jev,Jev 输出动作向量和对应的置信度。如果这个置信度高于某个设定阈值,系统立刻采用这个动作,不经过任何文本生成。如果置信度不够,系统才把请求转给大模型,让大模型生成详细的计划或决策理由。这样做的效果是:日常高频请求大部分由 Jev 一秒钟几百次地消化,只有小部分“疑难杂症”会升级到慢速通道。

在“某智能物流路径规划”的模拟项目里,这个分流比例大概在 92% 和 8%。也就是说,92% 的请求都在 10 毫秒内被消化了,只有 8% 需要交给 System 2 再处理。这一下把整个系统的平均响应时间从 900 毫秒压到了 65 毫秒。用户根本感知不到背后发生了两阶段分流,因为那 8% 的慢速请求在业务上通常本来就不着急。

3.2 置信阈值:校准“反射”的灵敏度

System 1 如果用得太猛,会把所有请求都变成“盲反应”;如果用得太怂,System 2 又会频繁触发,前功尽弃。所以置信度阈值是这个工作流里最需要花时间调的超参数。我见过很多团队直接把阈值设成 0.9,看起来稳妥,结果 40% 的请求都漏到了大模型上,延迟一下就上去了。我也见过粗放地设到 0.6,Jev 倒是跑得飞快,但错误决策数明显上升。

比较科学的做法是用验证集去画一个“决策代价曲线”:横轴是 Jev 置信度阈值,纵轴是“综合代价 = 延迟代价 + 误判代价 + 大模型调用成本”。你会发现这条曲线通常是一个 U 形。在阈值过低的位置,误判代价很高;在阈值过高的位置,调用成本与延迟代价上升。我们的项目最终把阈值定在 0.74 附近,同时针对不同动作类型做差异化:比如“改路线”这种低风险动作允许 0.65,而“切支付通道”这种高风险动作必须 0.9 以上。

值得强调的是,Jev 输出的“置信度”一开始未必是真实概率,会存在校准误差。要真正用起来,还得在业务的实际状态分布上重新校准一次。最简单的办法是温度缩放:把 Jev 输出的 logits 先除以一个温度参数,再经过 softmax,最后用既能靠排序也能靠绝对阈值判断。温度参数用同一批验证数据去搜索,一两轮就能收敛。

3.3 异步重算:不等慢系统,但也别让错误过夜

只靠一个阈值不可能把所有错误都拦下来。我们后来加了一层异步重算机制,效果很好。具体来说:Jev 先做出快速决策并立即执行,与此同时,后台会有一个轻量级的“校验模型”或规则引擎重新评估这个动作。如果评估结果与 Jev 的决定冲突,系统会生成一条告警,并且在下一次调度窗口做修正。

这种机制特别适合那些“即使错了也不会立刻造成不可逆损失”的场景。例如物流路径规划中,你选了 A 路径,跑了 5 公里后发现问题,重新切到 B 路径,损失只是几公里的燃油和时间,不算灾难。相比之下,交易系统里如果决策错误可能几秒钟内就造成损失,那异步校验就不够,需要上同步护栏。归根到底,System 1 与 System 2 的搭配不是固定的,而是根据业务容错度设计的两条速率带。缓冲区越厚,越快和越慢就能共存得越从容。

4. 上线实操:从模型导出到业务接入的四个步骤

4.1 状态输入的统一化:让 Jev 不挑食

Jev 对输入的要求比大模型严谨得多。大模型能消化自然语言,甚至你给它一段乱糟糟的日记它也能应付;Jev 不行,它需要确定性的、定长的数值特征。所以我们做的第一步是把业务状态固化成一张状态表:哪些是连续量、哪些是分类量、哪些是 ID 类特征,统统收拢成统一特征向量。

以我做的物流项目为例,输入状态包括车辆位置、当前时间、路况指数、天气类型、剩余油量、历史目的地分布等。连续量做 min-max 归一化或 z-score 标准化,分类量做整数编码后再进 embedding 层,ID 类特征也要做 hash 编码。重点是最开始就要维护一个“特征版本”,不然上线以后改了一个字段,Jev 的特征分布突然变化,你还以为模型坏了。我们为此专门写了一个特征 schema 的校验,上线时如果发现输入向量的维度不匹配,就直接拒绝服务,而不是让它硬跑。宁可报错,也不要让模型在一个错位状态上安静地输出一个错误决策。

4.2 推理服务的工程化:batching、量化和预热

模型再快,服务端写得烂,也一样会拖成乌龟。这一节我说说上线细节。Jev 的前向计算本身很轻,但高并发下有个隐含瓶颈:单条样本的推理和批量推理吞吐差出好几倍。我们用动态 batching 把并发请求攒到 8 到 16 条再一起过模型,P95 延迟反而比单条推理还低,因为 GPU 利用率上去了。如果只有 CPU 环境,那就用静态批处理加多线程,效果稍差,但也能把单核延迟控制在 20 毫秒内。

接着是量化。我们把决策头和编码器分别做了 INT8 量化,精度损失不到 0.3%,但推理速度又提了接近一倍。实际部署时,我们把前几层编码器保留成 FP16,只有后面的 MLP 决策头用 INT8,因为前面几层对数值敏感,后面输出层对量化比较耐受。模型导出后必须做一次“预热”:加载参数后随机喂一批样例跑几十轮,让显存分配、CUDA kernel、实时优化都先就位,否则线上第一个请求大概率会撞上一个 200 毫秒级别的冷启动。

4.3 日志、监控和“剪映版解释”

很多团队一听说模型不生成文本,第一反应是“没法 debug 了”。这是一个误区。文本确实不见了,但替代品是更结构化、更适合工程追踪的信号。我们把 Jev 的输入特征摘要、输出动作向量、置信度、最终选定动作、是否触发 System 2 兜底,全部落到结构化日志里。线上看板里最核心的两个图:一个是动作向量的分布变化,一个是置信度分布变化。动作向量分布一旦发生肉眼可见的偏移,通常意味着线上状态分布变了,该补数据重训了。

如果非要解释,比如“为什么 Jev 给这个用户推了优惠券”,可以做一个近似解释层:把当前状态的动作向量与训练集中几个已知原型动作做相似度对比,找到最接近的样本,再把样本的关键特征差异展示出来。这有点像你没法让一个骑手解释为什么他下意识不走近路,但你知道他过去遇到的相似路况。我们管这种解释叫“剪映版解释”,它不是因果证明,但是一个让业务方放心的锚点。

4.4 灰度发布和大模型兜底开关

Jev 上线从来不搞一把梭。我们的标准流程是:先在影子模式下把 Jev 的决策与原有规则引擎的决策并行记录,离线对比差异;差异小于阈值后再切 5% 的真实流量,并保留大模型兜底开关。这个兜底开关不是人手去拨,而是由 Jev 自己的置信度决定是否触发。置信度低于阈值时自动走 System 2,置信度高于阈值但业务规则引擎认为有重大冲突时,也能强走 System 2。

我们一开始对这套开关设计嗤之以鼻,觉得“阈值还不够用吗”。结果某次线上出现数据回流污染,Jev 的置信度虚高,错误决策一路绿灯。后来我们加了一个独立的规则引擎作为“总闸”,每次 Jev 的决策都得先过一遍校验规则,命中红灯就直接拦下。自那以后,我们才真正放心把下线按钮交给系统,而不是靠人肉盯守。

5. 实测效果与调优记录:三个没想到的坑

5.1 模式折叠:Jev 把九成请求压到同一个动作

第一次看到 Jev 在验证集上的表现还不错,我们就匆匆部署到模拟环境,结果不到一天就发现异常。所有请求的决策动作都聚集在某一个动作附近,模型成了“复读机”。后来分析,问题出在训练目标的分布上:数据里高频动作占了近一半,模型学到的最优解就是“无脑输出高频动作”,因为这样平均损失最低,但真实决策价值等于零。这是典型的模式折叠。

修复手段有三种。第一,把训练数据按动作类型做重采样,让低频但关键的动作不至于被淹没。第二,在对比学习损失里加熵正则项,让动作向量的熵不要掉到太低。第三,给损失的类别加权,低频动作的权重提高。这三个都做了之后,Jev 的动作分布才恢复正常,在高频动作和低频动作之间取得了像样的平衡。这里的关键教训是:你不能只看平均损失,要定期看动作分布图,模型尤其容易学出“一个安稳但没用的捷径”。

5.2 在线分布漂移:凌晨三点集体失灵

第一次线上故障记录很典型:凌晨三点到六点,模型准确率突然掉了 12 个百分点。开始我们怀疑是服务资源不够,排查以后发现是一条特征出了问题——这个特征在夜间呈现完全不同的分布,而训练集里几乎没有覆盖半夜的样本。这给了我一个很重要的提醒:Jev 不仅对“当前状态”敏感,对“状态分布”更敏感。白天训练出来的经验并不能平移到凌晨,物流场景里夜间路况、订单密度、司机状态都和白天天差地别。

解决办法是在线加入一个分布漂移检测器:每个小时计算当前输入特征分布与训练集分布的 MMD 或 KL 距离,一旦超过阈值就发告警。同时建立夜间数据的滚动微调流程,每周补一批带标签数据。这个动作做完之后,再也没出现“凌晨集体失灵”的事故。我觉得大多数人第一次做这类模型时都会踩这个坑,因为离线测评往往只用一个固定测试集,线上动态变化根本不会暴露出来。

5.3 “慢半拍”的 System 2 其实是最好的老师

还有个反直觉的发现:我们原本把 System 2 的兜底调用视为一种“不得已的成本”,后来发现,每次兜底调用都天然生成了一组高质量的标注数据——模型在复杂的、置信度低的状态下给出的决策,恰恰是最值得补充进训练集的新样例。于是我们故意把阈值往下调了 5 个百分点,让每 10 次请求里有 1 到 2 次主动去问“慢系统”。这批数据经过人工或规则校验后,回流增量训练,密切周后期 Jev 的置信度分布显著提升了,覆盖率也从 88% 升到 93%。

这说明一个画面:System 2 不只是一个兜底,其实是一个“数据发生器”。快速模型长期能力提升离不开慢速模型在关键时刻的“带头示范”。这也让我重新理解了“工作流”这三个字——它不是一个静态管道,而是一个反馈闭环。快慢分工的价值最终会落到“快系统越用越聪明”上,而不是永远靠着慢系统当拐棍。

6. Jev 的边界:适合组件的活,别让它当大脑

6.1 开放任务、复杂推理和小样本创意,它都不擅长

我见过最普遍的错误认知是“Jev 能代替大模型做一切决策”。事实上,Jev 把一切决策简化为一个向量的能力,也意味着它放弃了对不确定性的精细建模、对常识的深度推理、以及对新问题的灵活适应。让它去写一段押韵的文案、做一次多步数学推理、或者理解一段长篇小说里的隐含线索,都是强人所难。它适合的是那些已经被业务规则框定好、动作空间有限、状态可以数值化的任务。

我打一个不算恰当的比方:Jev 更像一个训练有素的守门员,它能根据球的路线做出一秒以内的扑救反应,但它不适合当教练来布置一套长达 40 分钟的战术。守门员动作高度固化,战术需要规划和多步推理。所以做技术选型时,先确认你的问题到底是一个“扑救”还是一个“布阵”。是前者,Jev 是很好的选项;是后者,别硬上。

6.2 低成本不意味着免检:审计和可回退的重要性

由于 Jev 在推理中不产生文本,有些团队会顺手把它归类为“黑盒”,然后放松审计要求。这是大忌。就算它跑得快、成本低,它依然是一个可能犯错的模型,而且正因为犯错时没有解释文本,错误更容易“静默通过”。我们最终在系统里加入了三层审计:第一层是每次决策的输入输出 snapshot 落库;第二层是独立的规则引擎做冲突检查;第三层是定期抽样把 Jev 的决策交给人工复核。人工复核只查 1% 的样本,但这一条线足以让整个系统具备“可申诉、可回放、可纠正”的能力。

合规方面,如果你想在金融、医疗这类高度管制的场景里用 Jev 做决策,必须先搞清楚一个核心问题:如果用户投诉,你能提供怎样的证明材料。光靠“置信度 0.8”很难说服监管。所以尽量在 Jev 之上设计一层“可解释代理”:记录对该决策贡献最大的特征、相似样本、备选动作及差异,再拼接成一份文档,至少让审计者知道这不是一个凭空出现的动作。

6.3 下一步可以玩的方向

Jev 这套架构真正有意思的地方在于,它为一类被大模型光芒盖住的问题重新打开了工程空间。我的下一步规划有两条线。其一是把 System 2 大模型产出的高质量数据,通过蒸馏方式直接回流到 Jev,让它逐步覆盖更多的决策场景,降低兜底调用率。其二是把 Jev 的动作向量作为上下文信息喂给 System 2,让慢系统做决策时拥有快速系统的“直觉结果”作为参考,形成一条双向通道。

如果你也正要接类似的决策系统,我特别建议你从两个小实验开始:第一,拿三个月的历史业务日志训练一个最小版 Jev,和原来的规则引擎做离线对比;第二,人为构造一些“幽灵状态”,比如凌晨数据、极端堵车、库存为零,验证模型会不会静默失败。做通这两条,你再决定是否把它放到线上,心里就会踏实很多。我的经验是,这类“不生成文本的 AI”真正可怕的地方,不是它在某些复杂任务上不够聪明,而是它在大规模低延迟场景下跑得太稳,让人慢慢失去了对它的警惕。保持一个兜底开关,永远是对的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询