← 返回主页

座舱人员信息提取 · jevCabin

从车载对话中抽取「人物 / 身份 / 座位位置 / 公司品牌」的结构化信息。用类型化决策模型(laya-multilingual)替代 2000-token 巨型 prompt,在 510 条模板构造集(seed=42 构造即标注)上把人名 F1 从 0.793 提到 0.964(追平远端 LLM),同时比旧管线快 27 倍、零 token 成本。

laya-multilingual · mmBERT 322M 纯本地推理 0 token 成本 单条 ~50ms github.com/ranpin/jevCabin

演示

选推理模式与例句分类,点例句看座舱图点亮对应座位。

座舱视图

主驾 副驾 后排左 后排中 后排右
选择一个例句开始

对话输入

例句 · 按场景分类

← 点上面任意例句

提取结果

等待选择例句…
延迟 – 候选 – 选择轮 – 属性轮 – 管线轨迹

⚠️ 上方两种模式跑的是同一套 v5 管线(JS 移植,与 Python 输出 51 条对拍 51/51 逐字节一致), 区别只在推理发生的位置:预录制回放 = 结果由真实 laya-multilingual 在 Apple M4 Pro 上跑出后固化 (2026-10-23 已用 v5 管线逐条重跑);浏览器实时推理 = 模型(~678MB fp16,国内自动走 hf-mirror; 无持久缓存,每次启用需重新下载)下载进你的浏览器后完全本地推理——零服务器、零 token 成本、隐私不出浏览器。 「管线轨迹」展开可见每条例句的中间结果:候选生成、锚点判定(含模型概率)、增量扫描、属性问答与代码门控裁决。

评测结果

测试数据集:自建车载中文信息抽取测试集(无公开基准)——51 条人工标注(真实车载口语风格,覆盖人物/身份/座位/公司四类)、510 条构造扩充集(10 个模板族,seed=42 构造即标注)与对抗子集;下方两表分别在 510 扩充集与同机 51 条上报告。

全部数字可用仓库内 scripts/compare_results.py 对 gold 集离线复算。

表 1 · 扩充集 510 条(10 个模板族,seed=42 构造即标注;laya v1/v3/v4/v5 为同一模型 laya-multilingual,仅管线规则版本不同)
指标laya v1laya v3 laya v4laya v5(当前) qwen3.8-flash(关思考)
人名 P / R / F10.885 / 0.719 / 0.793 0.924 / 0.908 / 0.916 0.958 / 0.931 / 0.944 0.971 / 0.957 / 0.964 0.964 / 0.964 / 0.964
位置 / 身份准确率0.779 / 0.828 0.755 / 0.796 0.799 / 0.885 0.879 / 0.888 0.988 / 0.979
行级全对368/510 (72.2%) 444/510 (87.1%) 462/510 (90.6%) 481/510 (94.3%) 491/510 (96.3%)
表 2 · 三种技术路线的性能对比(同机 51 条,Apple M4 Pro;原始数据 test/results/原始51_*_性能.json,510 条交叉验证与口径见 evaluation.md)
指标旧管线 Qwen2.5-Omni-7B
(LLM 生成,边车→平台)
open-jev
(DeBERTa-v3-large,仅英文)
laya-multilingual v5
(mmBERT-base 322M)
延迟 p500.745s1.353s 0.028s
延迟 p951.424s3.913s 0.051s
吞吐~68 条/分38.8 条/分 1935 条/分
加载 / 内存远端服务4.4s / 0.7GB 6.0s / 2.1GB
每次调用成本1400 prompt + 39 completion tokens 本地机时本地机时

两张表的轴:表 1 回答「提取有多准」——laya 四列是同一个 laya-multilingual(mmBERT-base 322M)模型、只换管线规则版本(v1→v5),v5 F1 0.964 已追平远端 LLM 参照 flash; 表 2 回答「三种技术路线各有多快」——同机 51 条实测,laya 纯本地前向、零 token 成本(flash 为远端 LLM 调用、按 token 计费)。 按模板族分解、分布外对抗子集、性能口径(为何在 51 条上测、510 条交叉验证)与全部复现命令,见 evaluation.md。

方法:类型化决策替代巨型 prompt

车载口语句 2000-token 抽取规则 prompt 巨型 prompt Qwen2.5-Omni-7B JSON 一次输出 p50 0.745s 车载口语句 规则候选生成 CJK 称谓 · 生僻姓 锚点(零模型) 选择轮 · forced choice 全候选同一 softmax 竞争 属性轮 · laya location 13 选项 identity 15 选项 代码层门控 否定剔除 · 证据校验 · 后缀拆分 线索锚点 · 文本绑定 · 品牌就近 JSON persons[…] 证据不足置空 · 防幻觉 p50 0.028s · 快 27× 旧管线 · LLM 生成 新管线 · 类型化决策(v5) 判别式模型 = laya-multilingual(mmBERT-base 322M)· 纯本地前向 · 单次调用并行答全部问题 动画时长按 p50 实测比例(0.745s : 0.028s ≈ 27×)
输入 / 数据 问题(巨型 prompt) 模型推理 代码层门控 输出结果 通用 / 零模型

图 1 · 旧管线(2000-token 巨型 prompt × Qwen2.5-Omni-7B 一次出 JSON)vs 新管线(规则候选 → laya 类型化决策 → 代码层门控),同机 p50 0.745s → 0.028s

旧管线把 2000-token 的抽取规则塞进 prompt 让 LLM 一次输出 JSON; 新管线改成一串封闭选项的判别式问题,由 laya 判别式作答(单次调用内并行答全部问题;管线按锚点→扫描→属性分多轮调用)。

输入输出:输入一句车载口语中文(可含多人、否定句、品牌线索);输出 JSON {"persons": [{"name", "identity", "location", "company"}]}——每个识别出的人物给出身份(15 选项封闭集)、座位(13 选项封闭集)与公司/品牌(v5 起,~90 词词典就近绑定、零模型调用);证据不足的字段置空(防幻觉)。

管线

  • 候选生成:规则抽 CJK 称谓片段(姓氏过滤 + 生僻姓/阿X/称谓锚点),不靠模型
  • 选择轮:所有候选放进同一个 softmax 竞争(forced choice),同一轮调用内定谁是真的
  • 属性轮:对每个赢家问 location(13 选项)/ identity(15 选项)
  • 代码层门控:否定句剔除、身份/位置证据校验、称谓后缀拆分;v5 增线索锚点(介绍/品牌线索直接定锚、跳过模型门)、位置文本绑定(原文座位词覆盖模型左右混淆)、公司/品牌就近绑定(~90 词词典,零模型调用)

v1 → v5 的十个免微调修复

  • v3 否定门控:『不是/别叫我』引导的候选在代码层剔除——laya 的否定判断本身是噪声(被否定 0.71 vs 未否定 0.79,切不开)。否定句族 0.42 → 1.00
  • v3 锚点回退 + 增量扫描:forced choice 对「小X」类名字系统性失效(0.06 vs 同上下文 noul 0.89),置信度含糊时回退普通扫描。多人族 0.38 → 0.85
  • v3 称谓碎片清理:『陈部』⊂『陈部长』剔除,只认 老/部/经/医/师 首字。称谓无品牌族 0.55 → 0.95
  • v4 候选生成扩展:生僻姓/阿X/称谓锚点(X老师)/语气词停用/叠字碎片清理。对抗集表外姓 0.000 → 0.824、ASR 0.878 → 1.000
  • v4 否定门控泛化:前向扩词(并非/当成/算不上…)+ 后向缺席线索(没来/不是我/不在车上…,就近关联不跨人)。真实否定 FP 15 → 1
  • v4 称谓后缀拆分:『小陈同学』→ 小陈+身份同学(仅当原文存在重叠候选)+ 身份后缀抑制 + 裸称谓剔除(bob小姐)。同学边界 0.56 → 0.96、拉丁名 0.72 → 0.96
  • v4 位置证据门:原文无任何位置词时位置回答置空(防幻觉)。位置准确率 0.755 → 0.799
  • v5 介绍线索锚点:『我是/我叫/这是…』紧邻候选时直接定锚、跳过模型门(laya 对『我是小张』类句式 noul 系统性低分)。修自我介绍漏检,命中句选择轮调用归零
  • v5 位置文本绑定:原文与人名确定性绑定的座位词与模型回答冲突时以原文覆盖。位置准确率 0.799 → 0.879(修左右混淆)
  • v5 公司/品牌绑定:~90 词汽车/互联网公司词典 + 就近绑定(『[品牌]的[人名]』),零模型调用、输出新增 company 字段。品牌位置族行级 0.84 → 0.99