EventTwin v2.5 · 中文同事件判定器
TL;DR (EN) — EventTwin judges whether two event descriptions refer to the same real-world event (cross-document event coreference / news deduplication) with temperature-calibrated probabilities. v2.5 adds true long-text judgment: 12k article pairs (400/900/1800-char tiers × same-event / subtle-hard-negative / cluster-card combinations, key facts buried at random positions, 79-event-type corpus spanning sports/entertainment/science/civic/international news) trained at max_len 2048. Result: pos AUROC 0.950 (family record), ECE 0.055 (family's best), overall 0.986, truth-based false-merge 2.4% (family's lowest single model) — and on a held-out set of 2,218 fresh-seed long pairs, subtle same-action-different-stage negatives are judged at 100% accuracy (predecessor: 42%). Protocol note: short pairs keep the 200-char truncation; long-article pairs should be fed full-length. Prior profiles remain as tags (v2.4 / v2.3 / v2.2 / v2.1 / v2.0 / v1.x). Data: EventTwin-Data.
这个模型做什么
输入两个中文事件描述,输出**"同一现实事件"的概率**(0-1,已校准)。用于新闻流式 聚类的核心判定:"这两条报道说的是同一件事吗"——同一动作的不同媒体报道=同事件; 同产品两次调价/宣布与交割=不同事件。
⚠️ 输入协议(v2.x 必读)
v2.0 的官方推理协议:每侧文本截断到 200 字符,再套 Qwen3-Reranker 官方模板, 取序列末位 yes/no 双 logit,除温度 T=0.7324 后 softmax(v2.5)。
长文输入(v2.5 新):v2.5 训练时 max_len=2048,长文对(新闻正文×正文 / 正文×簇卡)应 全文输入(每侧 ≤1800 字实测最优),不要套 200 字截断——200 字协议仅适用于短句对 (v2.0 实测长对截断损失 ~9pt,v2.5 全长输入下 400/900/1800 字三档 held-out acc ≥0.998)。
import torch, json
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("MaYiding/EventTwin")
tok.padding_side = "left" # ★ 左 padding
model = AutoModelForCausalLM.from_pretrained("MaYiding/EventTwin").eval()
T = 0.854 # calibration.json
PFX = ("<|im_start|>system\nJudge whether the Document meets the requirements based on the "
"Query. Only give me the judgment and do not output any other words or explanations. "
'The judgment should be "yes" or "no".<|im_end|>\n<|im_start|>user\nQuery: ')
SFX, SFX2 = "\nDocument: ", "\nJudgment: <|im_end|>\n<|im_start|>assistant\n"
yes_id = tok("yes", add_special_tokens=False)["input_ids"][0]
no_id = tok("no", add_special_tokens=False)["input_ids"][0]
def same_event_prob(a: str, b: str) -> float:
a, b = a[:200], b[:200] # ★ 200 字截断(官方协议)
inp = tok(f"{PFX}{a}{SFX}{b}{SFX2}", return_tensors="pt", truncation=True,
max_length=512, add_special_tokens=False)
with torch.no_grad():
la = model(**inp).logits[:, -1, :].float() # ★ 左 padding 下 -1 即末位
two = torch.stack([la[:, no_id], la[:, yes_id]], dim=-1)
return float(torch.softmax(two / T, dim=-1)[0, 1])
same_event_prob("小米YU7正式上市,售价25.35万元起,共推出三款车型",
"小米发布YU7系列 售价25.35万起") # ≈ 0.93
为什么必须截断:实测同一权重,全文输入(均长 135 字、9% 超 200 字)总体 AUROC 0.834,200 字截断 0.963(+13pt)——长尾证据/范围后缀会让 decoder 分心(与判定模型 普遍的 context-rot 现象同族)。训练数据文本本身均长 ~135 字,截断即回到训练分布。 批量推理与级联路由示例:GitHub inference_v2.py。
版本对比:v1.x 家族 vs v2.0 - v2.5
基准 = 1,000 对双教师确认金标(EventTwin-Data); v1.x 系列为 568M encoder 基座(bge-reranker-v2-m3),v2.x 为 4B decoder 基座 (Qwen3-Reranker-4B)。所有版本可从本仓库获取(v2.5 = main;v2.4/v2.3/v2.2/v2.1/v2.0/v1.2/v1.1/v1.0 为 tag)。
判别力
| 指标 | v1.0 | v1.2 | v2.1(tag) | v2.3(tag) | v2.4(tag) | v2.5(main) |
|---|---|---|---|---|---|---|
| 总体 AUROC | 0.909 | 0.903 | 0.983 | 0.985 | 0.983 | 0.986 |
| 灰带 AUROC(最难层) | 0.866 | 0.793 | 0.982 | 0.982 | 0.979 | 0.982 |
| pos AUROC(措辞多样同事件) | 0.767 | 0.847 | 0.926 | 0.938 | 0.924 | 0.950(纪录) |
| 总体 ECE | 0.187 | 0.261 | 0.076 | 0.094 | 0.057 | 0.055(最佳) |
| 与教师一致率 | 0.796 | 0.718 | 0.951 | 0.969 | 0.962 | 0.960 |
| 基座 / 参数 | 568M | 568M | 4B | 4B | 4B | 4B |
(v2.2 0.985/v2.0 0.963/v1.1 0.895/v1.3 0.902 已略;完整数据见 GitHub 训练档案。)
置信分带行为(级联生产口径)
真值口径(按 1,000 对终版金标真值统计):
| 指标 | v2.1(tag) | v2.3(tag) | v2.4(tag) | v2.5(main) |
|---|---|---|---|---|
| 误自动并率(真负例≥0.9 / ≥0.95) | 2.9% / 2.8% | 2.8% / 2.8% | 3.3% / 3.3% | 2.4% / 2.2% |
| 自动并覆盖(真正例≥0.9) | 91.3% | 95.4% | 95.0% | 92.9% |
| 漏并率(真正例≤0.1) | 1.7% | 0.0% | 0.8% | 1.7% |
| 灰带升级率(0.1-0.9,难例分层集) | 13.4% | 23.7% | 4.0% | 3.8% |
双流量画像:
| 流量画像 | 模型 | 误并 | 漏并 | 升级率@默认 |
|---|---|---|---|---|
| 最坏情形(benchmark 分层难例) | v2.3 | 2.8% | 0.0% | 23.7% |
| v2.4 | 3.3% | 0.8% | 4.0% | |
| v2.5 | 2.4% | 1.7% | 3.8% | |
| 自然难度(生产 val 口径) | v2.3 | 0.4% | 0.4% | 9.5% |
| v2.4 | 0.4% | 0.4% | 4.1% | |
| v2.5 | 0.25% | 0.5% | 3.5% |
v2.5 是家族首个"误并最低 + 升级率最低 + 判别力纪录"三项兼得的版本。代价:漏并从 v2.3 的 0% 回到 1.7%(金标)——漏并零容忍场景用 v2.3;均衡与长文场景用 v2.5。
生产阈值建议:v2.5 的校准特性与 v2.4 不同,推荐默认档回到 [0.1, 0.9](生产 esc 3.5% / FM 0.25% / miss 0.53%);预算紧可抬 t_low 至 0.2(esc 1.3%、miss 1.2%)。 t_high 保持 0.9。长文对全文输入(见上方协议说明)。
长文能力(v2.5 新,held-out 真泛化)
换种子全新生成的 2,218 对长文(400/900/1800 字 × 同事件/微差硬负/簇卡):
| 类型 | v2.5 | v2.4 |
|---|---|---|
| 同事件长文×长文 | 0.992 | 1.000 |
| 微差负例(同动作词仅阶段差) | 1.000 | 0.417 |
| 长文×簇卡(正/负) | 1.000 / 1.000 | 1.000 / 0.471 |
| 全体 | 0.9977 | 0.7809 |
v2.4 会把"同主体同动作、仅计划vs已完成"的长文对高置信误并(负例均分 0.61);v2.5 完全免疫(负例均分 0.035)——这是 v2.5 的核心增量能力。
选型建议
- v2.5(main)· 综合旗舰:pos 0.950 纪录 + ECE 0.055 最佳 + 误并双画像最低 + 升级率 3.8% + 唯一支持真长文输入(1800 字/侧 held-out acc 0.998+)——默认之选;
- v2.3(tag)· 零漏并档:金标漏并 0.0%(v2.5 为 1.7%)——漏并零容忍或纯短句 对抗流量用;
- v2.4(tag)· 校准果断档:v2.5 的直接前身,多数指标被 v2.5 覆盖,保留作对照;
- v1.2(tag)· 零误并闸门 / v1.0(tag)· 轻量独立(568M);
- v2.2(tag):覆盖极致 96.7%;v2.1/v2.0:历史档案。
对照参考:教师(商业判定 API,闭源)0.998 / ECE 0.062;通用 embedding-8B 0.977 但 ECE 0.563(分数不可当概率用)。
v2.5 训练方法
- 基座(历代相同):Qwen/Qwen3-Reranker-4B
- LoRA(r=32) + 权重合并发布
- 长文数据(本版核心):12,015 对长文事件对——4 类配对(长文×长文同事件 / 长文×长文 微差硬负 / 长文×簇卡正 / 负)× 3 长度档(400/900/1800 字/侧),虚构事件覆盖 79 类 事件类型(体育/文娱/科技/社会/国际/民生全谱系),关键事实在文中位置随机埋点(考验 事件中心性而非头部启发式),微差负例=同主体同对象同动作词仅阶段不同(计划/宣布 vs 已完成),GLM 边界规则判官过滤(不一致即弃)
- 其余数据:v2.4 全量(精化标签 37k + 四象限 + 合成 12k + 边界 9.2k + hardneg 8.4k)
- 协议升级:训练 max_len 1152→2048(batch 2 + 梯度检查点,24G 单卡 55k 步 ~9h)
- 温度后校准:T=0.7324
v2.5 基准结果
| 层 | n | AUROC | ECE |
|---|---|---|---|
| OVERALL | 1000 | 0.9859 | 0.055 |
| 灰带(最难) | 300 | 0.9824 | — |
| pos(措辞多样同事件) | 300 | 0.9503(纪录) | — |
| 长文 held-out(全新种子) | 2218 | — | acc 0.9977 |
版本说明
公开版本号与内部迭代代号解耦:v1.0=v8 / v1.1=v9 / v1.2=v10a / v2.0=v15_4b_merged / v2.1=v23b / v2.2=v24b / v2.3=v26 / v2.4=v29 / v2.5=v32_4b_merged。MAJOR 位 = 换基模或代际跃升;MINOR 位 = 同基模数据/配方升级。v2.5 的方法论遗产:长文数据同时 提升了短对金标(v29→v31 的"以金标换生产"滑坡被逆转)——跨长度档的数据是天然正则化器。
局限(如实)
- 漏并 1.7%(v2.3 为 0%):真灰带的同事件对会落到低分带——漏并零容忍用 v2.3;
- 覆盖 92.9%(v2.3 95.4%):更多同事件对落入中分带而非 ≥0.9;
- 输入协议分长度:短句对用 200 字截断(训练分布),长文对全文——混用会各损失数个点;
- 域偏移:虽已拓到 79 类事件类型,训练语料仍为虚构合成事件+企业新闻域;
- 4B 权重 8GB(CPU 不可用);长文推理延迟约为短对的 3-6 倍。
引用
@misc{eventtwin-2026,
title = {EventTwin: A Calibrated Chinese Cross-Encoder Family for Same-Event Judgment},
author = {Ma, Yiding},
year = {2026},
url = {https://huggingface.co/MaYiding/EventTwin},
note = {v2.0: Qwen3-Reranker-4B + distillation + multi-register synthesis; data: MaYiding/EventTwin-Data}
}
许可
Apache 2.0(基座 Qwen3-Reranker-4B 与 bge-reranker-v2-m3 均为 Apache 2.0)。 训练与评测数据在 EventTwin-Data(CC BY-NC 4.0)。