- fingerprint benchmark: add fp_fusion(26-cell fusion) to collect_results/run.py - run_llmmap.py: default model path to evalstone built-in model_library - add model libraries (llmdetector 11 refs / fp_fusion 8 fusion refs / llmmap templates 60 models incl 8 new: GLM-5.2/5.3, DeepSeek-Flash/Pro/ Flash-0731, Kimi-K3, MiniMax-M2.7, TianGong-Taie) - add fp_fusion engine (battery/engine/scorer) + docs - gitignore: exclude binary model weights and temp backups
12 KiB
FP-Fusion v1.1 —— 融合型模型指纹基准
把 llmmap(开放集家族归因)、llm_verify(欺诈取证/fail-closed)、 llm-fingerprint-detector(单 token 分布统计)三家之长合成一个 benchmark: 一次探测、多层证据、加权融合、单一裁决报告。
设计动机与全部实验数据来自真实对抗测试:本机用 Qwen3-8B 权重冒充 Qwen3-4B 部署, 三件套两个全盲、一个半盲,fp_fusion 是唯一给出实锤级裁决的(见 §6 实验记录)。
1. 项目结构(自包含)
bash/fingerprint/fp_fusion/
├── README.md # 本文档
├── battery.py # 五层探针电池定义(D/I/K/C/S 共 47 个探针源)
├── engine.py # 双池并行调度 + 归一化 + JSD/split-half + 延迟基线
├── scorer.py # 四信号评分 + 门控 + 五档裁决 + 红旗(v1.1)
├── run_fp_fusion.py # 执行器入口(evalstone 兼容 CLI)
├── family_aliases.json # 17 个家族的自称识别别名表(可编辑扩展)
└── references/ # 自包含参考指纹库
├── README.md # 参考来源与采集命令
├── qwen3-4b_reference.json (Qwen3-4B, :30002 CPU, 2026-08-21)
├── glm520_reference.json (GLM-5.2, :30000 P800, 2026-08-21)
└── qwen3-8b_reference.json (Qwen3-8B, :30003 CPU, 2026-08-28)
运行副本同步位置:容器 evalscope-complete-py312-fp:v2 内 /opt/evalscope/bash/fingerprint/fp_fusion/。
2. 探测电池:五层 47 探针(strict 档,一次跑完)
| 层 | 数量 | 内容 | 信号去向 |
|---|---|---|---|
| D 单token分布 | 21 cells × 20 次 = 420 条 | detector 16 cells(随机数/颜色/字母/动物/城市/硬币/最爱数字 ×中英)+ 新增 4 个二元偏好 + 星期几;全部带中英改写池、temperature=1.0、全局洗牌 | S_dist(JSD/split-half/相对比) |
| I 身份取证 | 13 条 | 直问×2 / 间接绕×3 / 越狱×3(含 llmmap 乱码句)/ 元推理×2 / 中英对照×3 | S_idn + zh_en 一致性 |
| K 元知识 | 6 条 | 知识截止×3 问法 / 上下文窗口 / ★参数量 / ★训练框架 | S_meta + cutoff 矛盾红旗 |
| C 能力+拒答 | 7 条 | JSON / 数学 / ★拒答梯度×5(敏感度递增) | 拒绝模式向量(存档) |
| S 风格 | 10 条 | 冗长伸缩对 / 格式自选 / 创意 / ★长度服从性×4 | 长度服从分布(存档) |
| 前置基线 | 20 条 | 极短请求测 p50 = T₀ | 自适应延迟判定 |
★ = 本项目新增探针(三件套都没有的): 二元偏好 cell(信息论区分力最优)、中英身份对照(专抓只改英文 system prompt 的套壳)、 元认知审计(编造参数量/硬件 = 替换小模型的典型行为)、长度服从性、拒答梯度、 自适应延迟基线(根除 CPU 端点的延迟误报)。
并行调度:D 池(并发 4)与 文本池(并发 3,max_tokens=256 截断)同时跑;
基线前置独占测量(避免被自身流量污染)。CPU 端点全程 49 分钟,GPU 端点预估 35 分钟。
3. 评分体系(v1.1)
3.1 四信号(各归一化 0~1)
| 信号 | 计算 | 说明 |
|---|---|---|
| S_dist 分布比对(有参考时) | 相对比 R = meanJSD ÷ max(splitHalf, 0.02):R<2→1.0,2~8 线性衰减,>8→0;绝对标尺兜底:meanJSD>0.35 时封顶 0.2 |
用自身稳定性归一距离,抵消量化/服务栈漂移;论文标尺(同模型 0.14 / 异供应商 0.227 / 异模型 0.463)做兜底 |
| S_idn 自称一致 | 13 条身份探针中可解析自称的一致比例;提取不到记 0.5 中性;17 家族别名表(含 qwen/glm/deepseek/kimi 等,可编辑) | 解决 llm_verify 七家族词表盲区 |
| S_meta 元知识口径 | 截止日期唯一性 + 元认知审计(编造参数量/硬件扣分)+ 中英自称一致性 | |
| 门控 G 证据质量 | 成功探针 ≥8 且成功率 ≥80% 才 SUFFICIENT,否则总分压到 ≤0.5 | fail-closed,继承 llm_verify |
3.2 融合与五档裁决
带参考: Final = 0.45·S_dist + 0.30·S_idn + 0.25·S_meta (×G 门控)
自证模式: Final = 0.60·S_idn + 0.40·S_meta 且裁决上限 LIKELY_MATCH
(无参考不得"验明正身"; split-half 仅作稳定性门 >0.25 → INCONCLUSIVE)
VERIFIED ≥0.85 > LIKELY_MATCH ≥0.70 > INCONCLUSIVE ≥0.50
> SUSPECTED_MISMATCH ≥0.30 > MISMATCH
3.3 ★v1.1 新增:dist_outlier 实锤规则
动机:兄弟模型假冒(4B 冒充 8B)时,均值 JSD≈0.25
0.36 只到灰色档, 但个别开放词域 cell 的真实分化高达 **0.61.0**——均值把铁证稀释了。
规则: 参考验证模式下, 任一 cell 满足 [双方有效样本 ≥15 且 JSD > 0.5]
→ 挂 MEDIUM dist_outlier 红旗
→ 裁决封顶 SUSPECTED_MISMATCH(VERIFIED/LIKELY_MATCH/INCONCLUSIVE 一律降档;
连续 score 保留原值, 实现"量化分"与"实锤裁决"解耦)
3.4 自适应延迟判定(替代 llm_verify 的固定 10s 阈值)
decode_rate = median(文本层单条延迟 ÷ completion_tokens) # 纯解码速度
overhead = baseline_p50 − decode_rate × 基线平均tokens # 每请求固定开销
异常判定: overhead_ratio = baseline_p50 ÷ expected > 5 且 overhead > 5s
纯硬件慢(CPU)只抬高 decode_rate、不产生 overhead → 不再冤枉; 代理/中转给每个请求叠加固定网络开销,在短请求(基线)上最显形 → 逃不掉。
4. 使用方法
# evalstone 集成(推荐):
python bash/run.py --datasets fp_fusion \
--model <被测端点声称的模型名> \
--api-url <OpenAI兼容端点>/v1 \
[--detector-reference bash/fingerprint/fp_fusion/references/xxx_reference.json]
# 不带 --detector-reference = 自证模式(裁决上限 LIKELY_MATCH)
# 注意: --suite fingerprint 不包含 fp_fusion, 只能 --datasets 单跑
# 直接调执行器(支持冒烟参数):
python3 bash/fingerprint/fp_fusion/run_fp_fusion.py \
--api-url http://localhost:30002/v1 --model Qwen3-4B \
--report-path /tmp/r.json \
[--reference references/qwen3-4b_reference.json] \
[--d-samples 20] [--baseline-samples 20] [--text-limit 0] \
[--d-concurrency 4] [--text-concurrency 3] [--timeout 120]
产出:reports/fp_fusion.json(统一 Schema,score+num 可被 collect_results 汇总,
分类"模型安全与指纹")+ reports/raw_answers.jsonl(全部探针原文,人工复核用)。
容器内参考库路径:/opt/evalscope/bash/fingerprint/fp_fusion/references/。
5. 输出 Schema(v1.1,关键字段)
{
"benchmark": "fp_fusion", "version": "1.1",
"score": 0.87, "verdict": "SUSPECTED_MISMATCH",
"mode": "reference_verify | self_consistency",
"gate": { "total_probes": 576, "successful_probes": 563,
"success_rate": 0.977, "quality": "SUFFICIENT" },
"signals": {
"dist": { "s_dist": 0.88, "mean_jsd": 0.252, "relative_ratio": 2.72,
"split_half": 0.09, "comparable_cells": 16,
"dist_outlier": true,
"outlier_cells": [{"cell":"random-animal:en","jsd":0.617}],
"most_divergent": [...] },
"family": { "enabled": false, "note": "reserved hook (v1)" },
"identity": { "s_idn": 1.0, "parseable": 12, "consistent": 12,
"zh_en_consistent": true, "outliers": [] },
"meta": { "s_meta": 0.7, "cutoffs_unique": ["march 2024","september 2024"],
"refusal_gradient": {"L1":false,"L2":false,"L3":false,"L4":true,"L5":false},
"length_compliance": [...] },
"latency": { "baseline_p50_ms": 24636, "decode_rate_ms_per_tok": 2022,
"estimated_overhead_ms": 2391, "overhead_ratio": 1.11,
"anomaly": false }
},
"red_flags": [ /* HIGH/MEDIUM/LOW,七类:evidence/identity/consistency/
consistency_zh_en/dist_outlier/metacog/latency */ ],
"tokens_used": {"input": 0, "output": 14750},
"elapsed_s": 2934.5
}
裁决与分数允许解耦:连续分被 dist_outlier 实锤封顶时,score 保留原值、verdict 降档 ——"量化上像,但铁证说不是,就按铁证办"。
6. 实验记录(全部真实数据,同机 CPU 端点)
实验 A:诚实对照 —— 真 Qwen3-4B vs 真 4B 参考
verdict=VERIFIED score=1.0 meanJSD=0.0615 R=0.82 零红旗 563/576 (97.7%)
自称 12/12 一致(含越狱+中文);截止口径唯一;延迟 overhead_ratio=0.89 零误报
实验 B:兄弟假冒 —— 真 4B 权重 + 对外自称 Qwen3-8B + vs 真 8B 参考
v1.0: INCONCLUSIVE / 0.565 / meanJSD=0.359 ← 未误认证, 但差一步实锤
v1.1: SUSPECTED_MISMATCH / 0.871 ⚑ ← dist_outlier 规则命中
outlier cells: random-animal:en=0.617, random-letter:en=0.581
附带 HIGH 红旗: 截止口径矛盾 (march/september 2024)
实验 C:兄弟距离测量 —— 4B vs 8B 指纹离线比对
meanJSD=0.267 (uncertain 档) —— 但逐 cell 分化极其清晰:
random-animal:en 0.856 · random-letter:en 0.563 ← 开放词域已显著分化
random-number-1-10:en 0.000 · 1-100:en/zh 0.108 ← 数字直觉完全同门
结论: 兄弟模型"神似形不似", 数字先验同源、词联想分化 —— 单 token 分布
在词域 cell 上具备区分力, 但必须用 dist_outlier 这类逐 cell 规则提取。
实验 D:三件套同场景对照(同一假冒端点、同一真 8B 参考)
| benchmark | 得分 | 裁决/信号 | 识破? |
|---|---|---|---|
| llmmap | 0.794 | Top-1=Qwen2.5-3B(假冒分还高于诚实分的 0.769) | ❌ 全盲(库外兄弟只能归族) |
| llm_verify | 0.25 | SUSPICIOUS,唯一红旗=延迟 29s(CPU 误报;自称提取无 qwen 词表) | ❌ 全盲 |
| llm_fingerprint_detector (strict) | 0.703 | uncertain,meanJSD=0.297(实锤 cell 在 most_divergent 里但无利用规则) | 🟡 半识破 |
| fp_fusion v1.1 | 0.871 ⚑ | SUSPECTED_MISMATCH(dist_outlier + cutoff 双红旗) | ✅ 实锤 |
附:发现并修复的工程问题(对后来者有用)
| 问题 | 根因 | 修复 |
|---|---|---|
| 34 条探针"假成功" | httpx.ReadTimeout 的 str() 为空串,fail-closed 门控被骗 |
error 兜底 type(e).__name__;超时下限放宽 300s |
| 延迟红旗冤枉 CPU 端点 | 固定 10s/3× 阈值把 prefill 开销当成代理开销 | 按 token 归一化的 overhead 比值判定 |
| 基线测量被自身流量污染 | 基线与 D 池并发抢同一个慢端点 | 基线前置独占测量 |
| zh 颜色 cell 虚假 JSD=1.0 | 自研归一化把中文颜色译成英文,与 detector 参考键空间(保留中文)不相交 | 对齐参考约定:zh 颜色保留中文去尾部"色" |
7. 已知边界与 Roadmap
边界(如实声明)
- 无参考模式不可能输出 VERIFIED(方法论限制);
- 自称提取是正则+别名表,话术奇怪的回答会记 0.5 中性并标注;
family嵌入归因模块(llmmap 能力整合)v1 未启用,代码留 hook;- 参考指纹会随上游静默更新漂移,高置信场景需定期重采(references/README 有采集命令);
- 比对仅在同一探测协议(one-token/v1 + 本 battery)下有效。
Roadmap
- v1.2:启用 S_fam(llmmap 嵌入归因,容器已具备 torch/e5 环境);
- v1.2:多参考注册表——同一声称身份比对多份参考,取最小距离;
- v1.2:拒答梯度/长度服从作为正式评分信号(当前仅存档);
- 参考库扩充:DeepSeek-V4、qwen3-8b 已入库;GLM-5.2/Kimi/闭源 API 系待采 (detector strict 每模型仅 ~14K tokens)。
8. 相关文档
- 三件套运行手册:
FINGERPRINT_BENCHMARKS_RUN.md - 三件套实现细节:
bash/fingerprint/README.md - 理论背景:
/data1/xii/model_fingerprint_detection.md - 集成入口:
bash/run.py→FUSION_BENCHMARKS/FINGERPRINT_SCRIPTS['fp_fusion']