(1)《三年面试五年模拟》AIGC / LLM / AI Agent 算法工程师与开发工程师求职面试秘籍,独家资源见 WeThinkIn/AIGC-Interview-Book,欢迎 Star!
(2)AIGC / LLM / AI Agent 算法岗与开发岗求职面试内推学习社群,涵盖 AIGC、LLM 大模型、AI Agent、传统深度学习、自动驾驶、机器学习、计算机视觉、自然语言处理、强化学习、大数据挖掘、具身智能、元宇宙、AGI 等方向的最新面试干货与核心知识,欢迎加入(https://t.zsxq.com/DZRng)!
论文标题:Open-Jev Judgments on CallScreenBench: Calibrated One-Pass Scam Screening with a Small Language Model
论文作者:Scam.ai(Reality Inc.),通讯作者Simiao Ren
发表时间:2026年9月21日
目录
- 一、Jev与开源复现的来龙去脉
- 二、同一解码器的三种读出方式
- 三、LoRA配方、辅助意图问题与温度缩放
- 四、CallScreenBench留出集对照表
- 五、挂断规则回放与64.5毫秒延迟
- 六、配方消融、鲁棒性与论文的诚实声明
- 七、JevLite本地训练与推理实践
- 八、总结与思考
本文要点
(1)JevLite是Scam.ai团队用Qwen3-4B加LoRA复现的Jev式类型化决策读出,一次前向只读A、B两个答案标签的logit,温度缩放softmax后直接当P(scam),全程不生成文本。
(2)在41个留出CallScreenBench场景、577次逐轮决策上,三种子集成AUROC0.974,ECE 0.052,相对MiniMax-M3判官在预注册0.02边界下非劣,合法来电零误报,同一挂断规则下平均早1.14轮做出决策。
(3)单张RTX 3090上每次决策64.5毫秒,比同骨架生成JSON答案的微调版快4.9倍,同一通电话上每追加一个问题只多21.8毫秒。
(4)论文自己说清了短板,收益在读出方式和校准,微调ModernBERT编码器没有显著更差,配方选择时接触过测试集,所有来电者都是合成的,不主张架构新颖性。
(5)文末按论文方法节整理LoRA配置、CE加Brier损失、温度拟合和transformers最小读出代码。
2026年9月21日,Scam.ai团队把一篇十三页的论文挂上arXiv,编号2609.23959。我把HTML版、PDF版和参考文献里几个开源Jev复现仓库对了一遍,数字以论文表2、表3、表4为准。论文承诺发布代码、LoRA适配器和82通测试电话,截稿时还没有公开仓库。
题目里的Open-Jev要先说清。这篇论文没有调用TypeSafe AI的Jev本体,只是借它的接口形状,在开源小模型Qwen3-4B上复现了同一种读出方式,取名JevLite,然后拿去做诈骗电话逐轮筛查。
结果是41个留出场景、577次逐轮决策上三种子集成AUROC0.974,校准误差0.052,合法来电零误报,单张RTX 3090每次决策64.5毫秒。论文在摘要末尾自己补了一句,收益在读出和校准,准确率上一个微调过的ModernBERT编码器没有显著更差。
一、Jev与开源复现的来龙去脉
Jev是TypeSafe AI于2026年9月15日发布的决策模型,公司叫它System One模型。创始人Diogo Almeida此前在OpenAI做研究,公司拿了DCVC领投的4000万美元种子轮。Jev不生成文本,输入一段state和若干事先声明类型的问题,一次前向并行返回每个问题的答案和概率分布。
问题类型有三种原语。Noul回答是非,返回一个0到1的概率;Choice在声明的选项里挑一个,返回每个选项的概率和一个置信度;Score在有序等级上打分。定价是输入每百万token 0.042美元,输出免费,官方给的延迟区间是70到500毫秒。
模型是闭源的。TypeSafe在博客里提到新架构、并行采样器和一种叫RLCD的训练方法,这几样都没有论文。这篇论文的相关工作一节写得直白,截稿时不存在任何对Jev的独立评测。
开源社区很快动手复现接口。论文引了五个仓库,SemIf和openjev-sglang在冻结解码器上做前缀读出,Bespoke Nimble微调解码器,Laya用编码器。mini-Jev的结论是读答案字母的效果和语法约束JSON相当,让模型自己写概率数字则会塌掉。
这些仓库都没有在诈骗电话上评测过,也没有报告逐轮校准。
这就是这篇论文的位置。作者在Scam.ai做电话反诈,手里有自己的CallScreenBench基准和上万通蜜罐真实来电,他们想知道Jev这种接口是否适合逐轮、毫秒级、要给出可信概率的来电筛查。论文明说不主张任何架构新颖性,贡献在应用和评测口径。
二、同一解码器的三种读出方式
论文表1把三种读法并排放在一起,权重、转录文本渲染和问题都一样,都是Qwen3-4B加LoRA,只有损失目标、读取位置和是否解码不同。
第一种是先前诈骗电话工作的做法,对整段JSON答案做下一token损失,推理时逐token生成{"scam": "yes"}再解析。每个输出token一次前向,大约8次。输出是自由文本,可能格式错误,也没有概率,答案里写的数字只是更多的生成文本。
第二种用同一套权重,推理时把前缀{"scam": "强制喂进去,读下一token分布里yes和no两个token的概率,重归一化后再做温度缩放。这就是ShieldGemma公开自己分数的方式。只要一次前向,但训练目标从没直接对准过这个分布。
第三种是JevLite,也就是Jev那条路。选项声明成单token标签A和B,损失只加在这两个标签的logit上,在允许标签内做softmax,用交叉熵加Brier分数训练。训练的量和读出的量是同一个量,一次前向,输出在构造上只能落在声明的选项里,校准本身就是目标的一部分。
读出公式很简单,取最后一个位置上标签token的logit,除以温度T,只在允许的K个标签上做softmax。主问题里K等于2,P(scam)就是A的概率。提示词见附录A,转录文本一行一句,前缀是Caller和Secretary,问题是这位来电者是在对被叫者实施诈骗或欺诈,而非合法来电,答案只写一个字母。
三、LoRA配方、辅助意图问题与温度缩放
训练细节集中在方法节和附录A。LoRA秩16,alpha 32,dropout 0.05,挂在Qwen3-4B所有注意力和MLP投影上。有效批大小16,每卡4条乘4步梯度累积,20步预热后线性衰减,bf16权重与激活,标签logit用fp32读出,最大长度2048,训练一轮,学习率5e-5。
训练样本的构造方式值得单独说。训练通话里每个来电者回合结束时的前缀都是一条样本,标签用整通电话的真值。模型因此学的是拿眼下已有的证据答题,这和推理时逐轮重问是一致的。
另外加了两个辅助意图问题。一个问来电者是否推销自己的回拨渠道或劝阻独立核实,一个问是否索要PIN、一次性验证码这类秘密。标签由MiniMax-M3当教师在训练集和验证集前缀上打出来,教师概率在0.3到0.7之间的样本丢掉。真值为合法的灰色场景损失权重给2。
温度T每个模型一个,在验证集前缀上最小化负对数似然拟合。训练时T固定为1。作者训了三个只有种子不同的模型,把各自温度缩放后的P(scam)取平均,表2里的JevLite指的就是这个三种子集成。三个种子的logit相关系数在0.987以上,AUROC落在0.969到0.977之间。
论文写明,真实部署会用单模型,所有延迟数字都是单模型的。同一通电话上的多个问题共享转录前缀,前缀编码一次缓存起来,每个问题只追加自己的短后缀。
数据来自CallScreenBench的48个核心场景,24个诈骗、15个合法、9个灰色,灰色场景有指定的一侧真值。按场景切成40个训练、8个验证,对应3187和650条逐轮决策。验证集很小,论文里所有温度和阈值都压在这650条上。
测试集是另外41个只用于评测的场景,用基准自带的来电者MiniMax-Text-01和两个脚本化秘书各生成一通,一个拖延一个顺从,共82通电话、577次回合末决策。
测试场景没有在训练或验证里出现过,但18个测试原型全部在训练里出现过。论文说这是同一批诈骗原型的新实例,没有留出整个原型。
四、CallScreenBench留出集对照表
先把论文表2里的数放到一起。除JevLite外其余都是单模型。ECE用十个等宽箱,Brier乘100,延迟是单卡RTX 3090批大小1的中位数,判官那一栏是8并发下的远程API墙钟时间,每次决策大约108个推理token。
| 系统 | AUROC(%) | 准确率(%) | ECE(%)↓ | Brier(×100)↓ | 合法来电准确率(%) | p50延迟(ms) |
|---|---|---|---|---|---|---|
| JevLite(三种子集成) | 97.4 | 92.7 | 5.2 | 6.1 | 100.0 | 64.5 |
| LLM判官(MiniMax-M3) | 94.7 | 87.0 | 5.4 | 9.5 | 82.3 | 1946(API) |
| ModernBERT-large | 93.8 | 88.9 | 2.7 | 8.2 | 100.0 | 29.7 |
| ModernBERT加辅助头 | 94.8 | 90.6 | 4.2 | 6.9 | 100.0 | 14.0 |
| Qwen3生成式微调,解析标签 | 87.5 | 89.2 | 10.7 | 10.7 | 100.0 | 317 |
| Qwen3生成式微调,标签token读出 | 95.0 | 89.2 | 5.0 | 8.1 | 100.0 | 未单独计时 |
| 零样本Qwen3-4B | 69.1 | 55.1 | 17.0 | 28.0 | 90.2 | 64.5 |
三个单种子的平均是AUROC 97.2、准确率92.3、ECE 4.7、Brier 6.3。两栏Qwen3生成式微调是同一个模型的两种读法。两个编码器延迟差一倍多,论文注明是在不同主机负载下分开测的,架构完全一样。
微调读出是这件事能成的原因。JevLite比零样本读出的同一骨架高出28.3个百分点AUROC,区间18.6到39.2。零样本Qwen3-4B的ECE是17.0,论文的说法是没为这种读出训练过的模型,答案概率很自信但不可靠。
对判官的配对差是加2.7个百分点,区间从负1.1到6.5。下界在负2的边界上方0.9个百分点,所以是非劣,没有更好。三个单种子分别是加3.1、2.3、2.4,全都过线,其中两个只多出千分之几,部署单模型的话就踩在判据边上。论文还提醒,非劣只对一个判官成立,而MiniMax-M3属于写这批电话、又打辅助标签的同一个模型家族。
对编码器的配对差是加3.6,区间负0.9到11.4,不显著。对加了辅助头的编码器是加2.6,区间负2.3到10.5,这才是公平比较,因为它看到了同样的教师标签。校准上JevLite和判官差不多,ECE配对差负0.002,把判官也在验证集上做温度缩放后,判官ECE到4.9,Brier 9.6,差值仍不显著。
最清楚的差别在合法来电上。JevLite和两个编码器把所有合法来电的决策都判对了,判官只判对82.3%,配对差17.7个百分点,区间0.8到36.0。这是对判官的所有配对差里唯一一个区间不含零的,但它只压在12个场景上,论文自己把它标成探索性结果。灰色来电上判官更好,可灰色/合法只有3个场景,灰色/诈骗5个,差异都不显著。
五、挂断规则回放与64.5毫秒延迟
为了展示筛查器实际会怎么做,论文回放了一条候选规则,连续两个来电者回合P(scam)都过阈值就挂断。阈值在验证集上分别拟合,JevLite是0.92,判官是0.97。
两套系统挂掉的诈骗侧电话差不多,40对41,分母都是52,合法侧30通电话都没挂错。在两者都挂断的36通里,JevLite平均早1.14轮做出决策,区间0.55到1.67,早于判官的有25通,同一轮6通,更晚5通。代价是少抓了一通。
论文把这条规则明确写成示意,不选定工作点,附录D还补了一句,阈值的验证最优区间很窄,拟合温度变动零点零几,测试集上的计数就会动。他们建议部署前在真实数据上重新拟合温度和阈值。
延迟这块,一次决策中位数64.5毫秒,p95是110.5毫秒。和判官API比是中位数快30倍、p95快52倍,但论文承认这个倍数混进了模型大小、网络排队、思维链生成和更长的提示词。同机公平的比较对象是同骨架的生成式微调,它必须解码一段JSON,中位数317毫秒,读出方式快4.9倍。
同一通电话上每多问一个问题,在共享前缀上只加21.8毫秒。五个问题一起问168.7毫秒,各自重新编码要321.6毫秒,argmax在1500次决策里只变了6次。编码器还要快,29.7毫秒,但它只能回答训练时见过的问题。
决策时机上,第一个来电者回合结束时准确率已经到0.854,第二轮到0.927。在秘书说完话之后立刻问不亏,可在来电者一句话说到一半时问要付代价。只对种子0在流式前缀上评分,话说一半时准确率0.888,回合末是0.927,掉了3.8个百分点,集中在第一轮。
六、配方消融、鲁棒性与论文的诚实声明
表3的消融给了四行。两轮、学习率1e-4的三种子集成测试AUROC 93.4,改成一轮、5e-5的单模型就到97.2,加灰色权重仍是97.2但ECE从5.0跳到9.8,再加意图问题成为JevLite后是97.4,准确率从89.9到92.7。论文的结论是短配方拿走了几乎全部排序收益,灰色权重和意图问题加的是准确率,且在种子噪声之内。
灰色家族的准确率只压在5个和3个场景上,跨种子能差到30个百分点左右。所以所有灰色来电上的差异都不能当真。
模型选择的过程是这篇论文最坦白的一段。在写下选择规则之前,大约十个配方已经在测试集上打过分。规则是至少两个种子上平均测试AUROC最高,且合法来电准确率不低于0.97。只有两个配方合格,单种子平均0.972对0.930。因此头条配方带着测试集暴露,点估计有赢家诅咒式的膨胀。
鲁棒性也不完美。种子0和1平均,把两个选项顺序交换会翻转2.6%的决策,区间0.2到5.8。换一句训练里没见过的问题措辞会翻转5.2%,30次翻转里28次朝着合法一侧。附录E点明这是可被利用的方向,一个快速校准的P(scam)也是骗子调脚本的快速评分器。
训练里没见过的问题上,微调模型在抽取类问题上比零样本好,说了具体金额加0.013,给了回拨号码加0.041,两者都接近上限。判断类问题反而退步,紧迫感减0.062,同情心减0.113。
为了把微调和读出方式分开,论文在基础配方上训了配对分支,同骨架、同数据、同LoRA预算、同调度,只有种子0,不加灰色权重和意图问题。表4的结果如下。
| 分支 | 读出方式 | AUROC | 准确率 | ECE↓ | 合法来电 | 温度T | p50延迟(ms) |
|---|---|---|---|---|---|---|---|
| A生成式微调 | 解析标签 | 0.875 | 0.892 | 0.107 | 1.000 | 未报告 | 317 |
| A生成式微调 | 口头置信度 | 0.914 | 0.896 | 0.069 | 1.000 | 未报告 | 与上共享解码 |
| A生成式微调 | 标签token概率 | 0.950 | 0.892 | 0.050 | 1.000 | 4.06 | 与上共享解码 |
| B读出,只用CE | 标签logit | 0.970 | 0.910 | 0.076 | 0.994 | 5.24 | 约63.6 |
| B读出,基础配方 | 标签logit | 0.972 | 0.894 | 0.050 | 1.000 | 3.88 | 63.6 |
| C线性分类头 | 线性头 | 0.962 | 0.927 | 0.055 | 1.000 | 5.18 | 80 |
三个结论。买到准确率的是微调本身,解析标签0.892和读出0.894一样准,线性分类头0.927还更高。普通微调自己给不出可信概率,解析标签当0/1算ECE 0.107,让它写置信度时几乎每次都写0.95或1.0,排序AUROC只有0.914。
第三条最有意思。把同一个普通微调用Jev的方式读,从标签token取概率再配验证集温度,AUROC 0.950、ECE 0.050,只比专门训过这种读出的0.972低一点。它缺的是格式保证和延迟,317毫秒对63.6毫秒。Brier项在两个种子上各买到一点校准,排序没变。
论文的总结句是,这种读出是普通解码器上的一种训练和读出选择,它带来有保证的输出空间、一个能用的概率和一次前向,并没有带来更高的准确率。
七、JevLite本地训练与推理实践
论文承诺发布代码、LoRA适配器、逐决策预测和82通测试电话,截稿时还没有仓库。下面的配置和代码按论文方法节与附录A整理,软件版本论文给的是Python 3.12.3、torch 2.10.0+cu128、transformers 4.57.6、peft 0.19.1。骨架权重在Hugging Face的Qwen/Qwen3-4B。
先是LoRA配置,对应论文的秩16、alpha 32、dropout 0.05、全部注意力和MLP投影。
frompeftimportLoraConfig lora_cfg=LoraConfig(r=16,lora_alpha=32,lora_dropout=0.05,target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"],task_type="CAUSAL_LM",)提示词按附录A照抄。系统消息是You are a fast, calibrated call-screening judge,转录文本超过6000字符从左侧截断,保证最近几轮和问题总在。
SYSTEM="You are a fast, calibrated call-screening judge"PROMPT="""Phone call transcript so far (the Secretary answers calls on the owner's behalf): {transcript} Question: Is this caller attempting a scam or fraud against the person being called, rather than making a legitimate call? A: yes B: no Answer with the single letter only."""训练损失只作用在A、B两个标签的logit上,交叉熵加Brier,训练时温度为1。灰色/合法样本权重2通过weight传进来。标签logit按论文用fp32算。
importtorchimporttorch.nn.functionalasFdeftyped_decision_loss(logits,label_ids,target,weight=None):z=logits[:,-1,label_ids].float()# 最后位置上A、B两个标签的logitp=torch.softmax(z,dim=-1)# 训练时T=1,只在允许标签内归一化ce=F.cross_entropy(z,target,reduction="none")onehot=F.one_hot(target,z.shape[-1]).float()brier=((p-onehot)**2).sum(-1)loss=ce+brierifweightisnotNone:loss=loss*weightreturnloss.mean()训练循环用普通的peft加transformers即可,有效批16,20步预热后线性衰减,一轮,学习率5e-5,最大长度2048。每通训练电话的每个来电者回合前缀单独成一条样本,标签用整通电话真值。两个辅助意图问题各自成一条样本,问题文本换掉,标签来自教师模型。
温度在验证集前缀上拟合,目标是负对数似然最小。论文表4给出的几个拟合值在3.88到5.24之间,早先草稿把网格上限卡在5,CE-only和线性头两个分支撞到了上限,正式版改成不设上限的网格。
fromscipy.optimizeimportminimize_scalardeffit_temperature(val_logits,val_labels):z=torch.as_tensor(val_logits,dtype=torch.float32)# 形状[N, 2],验证集标签logity=torch.as_tensor(val_labels)nll=lambdaT:F.cross_entropy(z/T,y).item()returnminimize_scalar(nll,bounds=(0.05,50.0),method="bounded").x推理读出是全篇最短的一段。一次前向,取最后位置A、B的logit,除以温度做softmax,A的概率就是P(scam)。enable_thinking=False是Qwen3聊天模板的开关,论文没写这一项,这里按逐轮筛查的用途关掉思考模式。
fromtransformersimportAutoTokenizer,AutoModelForCausalLMfrompeftimportPeftModel BASE,ADAPTER,T="Qwen/Qwen3-4B","path/to/jevlite_lora",3.88tok=AutoTokenizer.from_pretrained(BASE)model=AutoModelForCausalLM.from_pretrained(BASE,dtype=torch.bfloat16,device_map="cuda")model=PeftModel.from_pretrained(model,ADAPTER).eval()label_ids=[tok.encode(x,add_special_tokens=False)[0]forxin("A","B")]@torch.no_grad()defp_scam(transcript:str)->float:messages=[{"role":"system","content":SYSTEM},{"role":"user","content":PROMPT.format(transcript=transcript[-6000:])}]text=tok.apply_chat_template(messages,tokenize=False,add_generation_prompt=True,enable_thinking=False)ids=tok(text,return_tensors="pt").to(model.device)z=model(**ids).logits[0,-1,label_ids].float()returntorch.softmax(z/T,dim=-1)[0].item()逐轮筛查就是每次来电者说完一轮,把新的转录前缀喂进p_scam。论文回放的规则是连续两轮P(scam)不低于阈值就挂断,JevLite的阈值在验证集上拟合为0.92。这个阈值和温度都要在自己的数据上重拟合,论文附录D写得很明确。
多问题共享前缀那21.8毫秒,靠的是把转录前缀的KV缓存留住,每个问题只追加自己的问题后缀。用transformers的past_key_values可以做到,论文没给实现,这里不展开。
八、总结与思考
这篇论文做了一件很朴素的事,把Jev那种一次前向读概率的接口搬到开源4B模型上,在一个逐轮、毫秒级、要概率的任务里跟LLM判官、编码器和生成式微调放在同一张表上比。表上的数字不难看,AUROC 0.974,合法来电零误报,早1.14轮挂断,64.5毫秒。
但作者自己给出的建议比数字更有用。固定问题就用编码器。ModernBERT一次决策14到30毫秒,ECE更低,排序上没有显著更差。解码器读出只在需要运行时用自然语言临时提问时才值它的价钱,而论文自己没能证明任何一个运行时问题改善了筛查结果。
配方选择接触过测试集,这一点值得所有想复现的人先记住。单种子对判官的非劣有两个只多出千分之几,换一个随机种子就可能不过线。判官和来电者、教师标签又是同一家模型,非劣是对一个特定判官成立的。
所有来电者都是MiniMax-Text-01合成的,测试原型全部在训练里见过。论文说下一步自然是拿自家上万通蜜罐真实来电测,并留出整个诈骗原型。这一步没做之前,这篇论文的数字只能说明合成基准上的相对关系。
对国内做反诈或客服质检的团队,这篇论文有两个可以直接拿走的东西。一是读法,手头已有的生成式微调模型可以不重训,直接从标签token读概率再配一个验证集温度,AUROC从0.875拉到0.950。二是评测口径,除了AUROC,把ECE、合法来电误报率和决策时机一起报出来,这三项恰恰是先前诈骗电话论文普遍不报的。
参考链接
- 论文原文 arXiv 2609.23959 v1,2026年9月
- CallScreenBench基准论文 arXiv 2608.01033,2026年8月
- 骨架权重 Qwen/Qwen3-4B
- Jev官方博客 Introducing System One Models and Jev,2026年9月15日
- Jev官方文档 docs.typesafe.ai
- 论文引用的开源Jev复现 SemIf、openjev-sglang、Bespoke Nimble、mini-Jev、TypeSafe官方LLM适配器