# FP-Fusion v1.1 —— 融合型模型指纹基准 > 把 llmmap(开放集家族归因)、llm_verify(欺诈取证/fail-closed)、 > llm-fingerprint-detector(单 token 分布统计)三家之长合成一个 benchmark: > **一次探测、多层证据、加权融合、单一裁决报告。** > > 设计动机与全部实验数据来自真实对抗测试:本机用 Qwen3-8B 权重冒充 Qwen3-4B 部署, > 三件套两个全盲、一个半盲,fp_fusion 是唯一给出实锤级裁决的(见 §6 实验记录)。 --- ## 1. 项目结构(自包含) ```text 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 端点预估 3~5 分钟。 --- ## 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 融合与五档裁决 ```text 带参考: 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.6~1.0**——均值把铁证稀释了。 ```text 规则: 参考验证模式下, 任一 cell 满足 [双方有效样本 ≥15 且 JSD > 0.5] → 挂 MEDIUM dist_outlier 红旗 → 裁决封顶 SUSPECTED_MISMATCH(VERIFIED/LIKELY_MATCH/INCONCLUSIVE 一律降档; 连续 score 保留原值, 实现"量化分"与"实锤裁决"解耦) ``` ### 3.4 自适应延迟判定(替代 llm_verify 的固定 10s 阈值) ```text decode_rate = median(文本层单条延迟 ÷ completion_tokens) # 纯解码速度 overhead = baseline_p50 − decode_rate × 基线平均tokens # 每请求固定开销 异常判定: overhead_ratio = baseline_p50 ÷ expected > 5 且 overhead > 5s ``` 纯硬件慢(CPU)只抬高 decode_rate、不产生 overhead → 不再冤枉; 代理/中转给每个请求叠加固定网络开销,在短请求(基线)上最显形 → 逃不掉。 --- ## 4. 使用方法 ```bash # evalstone 集成(推荐): python bash/run.py --datasets fp_fusion \ --model <被测端点声称的模型名> \ --api-url /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,关键字段) ```jsonc { "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 参考 ```text 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 参考 ```text 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 指纹离线比对 ```text 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']`