- 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
237 lines
12 KiB
Markdown
237 lines
12 KiB
Markdown
# 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 <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,关键字段)
|
||
|
||
```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']`
|