开源openjev-sglang:用Qwen3.6+SGLang复刻Jev接口

开源openjev-sglang:用Qwen3.6+SGLang复刻Jev接口

💡 原文中文,约9300字,阅读约需23分钟。
📝

内容提要

开源项目 openjev-sglang 使用 Qwen3.6-35B-A3B 模型和 SGLang 引擎复刻 TypeSafe 的 Jev 分类 API。其核心是 prefill-only 推理:仅做预填充,直接读取候选标签的概率分布,不生成文本,一次分类只需一个 token。借助 Radix Cache 复用共享前缀,N 个问题仅需 N+1 次预填充、零次解码,速度提升一个数量级。项目部署于 Modal 的 B200,支持 noul、choice、score 三类问题,并返回信心值。

🔎

延伸解读

prefill-only 的适用边界

文章强调 prefill-only 只读取候选标签的 logprob,不生成文本,因此适合分类、评分等决策任务。但作者也指出,若用该路径跑 MMLU-Pro 等复杂推理评测,得分是否接近传统 decode 路径尚无结论。这意味着 prefill-only 可能更擅长浅层意图识别,而非需要多步推理的任务。读者在采用前应明确任务类型,避免将其误用于深度推理场景。

单 token 标签的工程约束

为让 prefill-only 精准读取首 token 概率,openjev-sglang 要求所有候选标签必须是单 token。数字标签如“64”会被分词器拆成两个 token,导致概率混淆,因此项目改用 A-Z 及双字母组合,并在启动时验证每个标签是否为单 token。这层映射对用户透明,但增加了实现复杂度,也限制了标签命名的自由度。

冷启动与成本权衡

项目部署在 Modal 的 B200 上,无请求时实例数为零,但冷启动需拉取数十 GB 权重并捕获 CUDA 图,可能耗时数分钟,期间返回 503。作者通过持久化卷缓存权重和编译缓存来缓解,但 CUDA 图每次启动仍需重建。若想避免冷启动,需设置 min_containers=1,代价是持续计费。读者需根据延迟敏感度与预算做取舍。

信心值的正确理解

每个分类结果附带 confidence 字段,其公式为 1 - H(P)/log(K),反映概率分布的集中程度,而非正确率。文章举例说明,均匀分布时 confidence 为 0,某一选项概率为 1 时为 1。但模型可能在错误选项上极度自信,因此该值不能直接当作校准后的正确性估计。使用时宜将其视为相对置信度,结合业务阈值谨慎解读。

Q&A

openjev-sglang 是什么?它和 TypeSafe 的 Jev 接口有什么关系?

openjev-sglang 是 ekzhang 的开源项目,一个基于开源模型、与 TypeSafe/Jev HTTP API 兼容的推理服务端点。它用开源方案复现 TypeSafe AI 的 Jev(System One)决策模型的接口模式,不涉及 Jev 的闭源模型或训练方法。

prefill-only 推理为什么能只生成一个 token 就完成分类?

prefill-only 跳过 decode 阶段,只做预填充,直接读取模型对预定义选项的概率分布。请求时设置 max_new_tokens=1 并指定候选 token 的 logprob,SGLang 返回这些 token 的对数概率,经 softmax 归一化后得到分类结果,无需生成自然语言文本。

SGLang 的 Radix Cache 在 openjev-sglang 中起什么作用?

Radix Cache 实现前缀缓存,将共享的对话状态(公共前缀)只预填充一次,后续多个问题复用该前缀的 KV 缓存,只计算各自不同的后缀。这样 N 个问题只需 N+1 次预填充、零次解码,速度提升一个数量级。

openjev-sglang 支持哪些问题类型?分别返回什么结果?

支持 noul、choice、score 三类。noul 返回 P(yes) 的二值判断;choice 返回 argmax 和完整概率分布;score 返回加权期望值 Σ(i × Pi),可用于告警阈值或优先级排序。所有类型都基于同一套 prefill-only 机制,区别在于后处理。

为什么 openjev-sglang 用字母而不是数字作为候选标签?

因为 Qwen 分词器会把两位数如“64”拆成两个 token,用数字做标签会导致第一个 token 概率混淆(如“6X”和“6Y”)。项目改用 A-Z 及双字母 AA、AB 等,确保每个候选标签都是单 token,从而保证 prefill-only 精准读取概率。

openjev-sglang 部署在 Modal 上有什么优缺点?

优点:serverless GPU 无请求时实例数为 0,不花钱;有请求时自动调度 B200。缺点:冷启动慢,首次启动可能需数分钟,期间返回 503。优化措施包括将权重和缓存存入 Modal Volume,以及可设置 min_containers=1 保持热实例,但会持续计费。

openjev-sglang 的 confidence 字段是如何计算的?

confidence = 1 - H(P) / log(K),其中 H(P) 是概率分布的香农熵,K 是选项个数。熵越高分布越均匀,信心越低;熵越低信心越高。该值仅反映分布的集中程度,不是校准过的正确率估计。

openjev-sglang 有哪些请求限制?

单请求最多 64 个问题;choice 和 score 每题 2 到 64 个选项;请求体最大 2 MiB;单条分支最多 32768 个 token;总输入最多 262144 个 token;同时处理评估请求最多 16 个;后端并发调用最多 64 个;后端超时 120 秒。超限返回 422、413、529 或 504。

🏷️

标签

➡️

继续阅读