ruoxi_sun 4f274c2c32 add fingerprint model library & fp_fusion integration
- 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
2026-09-03 02:38:35 +00:00

237 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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_distJSD/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<21.02~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_MISMATCHVERIFIED/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. 输出 Schemav1.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唯一红旗=延迟 29sCPU 误报;自称提取无 qwen 词表) | ❌ 全盲 |
| llm_fingerprint_detector (strict) | 0.703 | uncertainmeanJSD=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_famllmmap 嵌入归因,容器已具备 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']`