evalstone/FINGERPRINT_BENCHMARKS_RUN.md
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

398 lines
24 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.

# 指纹 / 模型安全三件套:功能详解 + 运行手册llmmap · llm_verify · llm_fingerprint_detector
> 本文档说明已接入 evalstone 的三个指纹 / 模型安全 benchmark。
> 三者**不经过 EvalScope 数据集管线**,由 `bash/fingerprint/` 下的独立执行器直接探测被测端点,
> 但产出与 EvalScope 同构的报告,`collect_results.py` 可像普通 benchmark 一样汇总进 CSV/Excel。
> 相关代码入口:`bash/run.py` 的 `--suite fingerprint` / `ALL_FINGERPRINT``bash/run.py:138`)。
> 理论说明见 `/data1/xii/model_fingerprint_detection.md`,实现注意见 `bash/fingerprint/README.md`。
---
## 目录
- [0. 三件套是什么30 秒版)](#0-三件套是什么30-秒版)
- [1. 功能详解 / 识别粒度:识别"模型"还是"模型家族"](#1-功能详解--识别粒度识别模型还是模型家族)
- [2. 支持哪些模型(三件套各自的能力边界)](#2-支持哪些模型三件套各自的能力边界)
- [3. 线上公开数据 / 别人测过的数据](#3-线上公开数据--别人测过的数据)
- [4. 前置条件](#4-前置条件)
- [5. 一条命令跑完三个fingerprint 套件)](#5-一条命令跑完三个fingerprint-套件)
- [6. 单独跑某一个(含各工具独立用法)](#6-单独跑某一个含各工具独立用法)
- [7. 参数速查表](#7-参数速查表)
- [8. 输出与结果汇总](#8-输出与结果汇总)
- [9. 实测示例](#9-实测示例)
- [10. 常见坑 / 排障](#10-常见坑--排障)
- [11. 参考](#11-参考)
---
## 0. 三件套是什么30 秒版)
| benchmark | 工具仓库 | 一句话定位 | 得分含义0~1 |
|---|---|---|---|
| `llmmap` | [LLMmap](/data1/xii/LLMmap) | **模型身份识别**"这段回答是哪个模型写的?"open-set 检索) | 无 `--expected-model` 时 = 距离置信度;有 = Top-1 身份严格匹配 flag1.0/0.0 |
| `llm_verify` | [llm-verify](/data1/xii/llm-verify) | **API 欺诈检测**"这个 API 是不是在骗我?"(红旗+裁决) | `NO_FRAUD_SIGNALS`=1.0 / `INCONCLUSIVE`=0.5 / `SUSPICIOUS`=0.25 / `FRAUD_DETECTED`=0.0 |
| `llm_fingerprint_detector` | [llm-fingerprint-detector](/data1/xii/llm-fingerprint-detector) | **单 token 分布验证**"它是不是它声称的那个模型?"JSD 比对) | `max(0, 1-meanJSD)`;无参考时跑"自一致"模式(采两次互比) |
共同核心思想:把被测端点当成"未知模型",靠**固定的探测问题 + 回答模式**来认出它 / 判断它有没有撒谎,
而不是相信模型自称的身份。
---
## 1. 功能详解 / 识别粒度:识别"模型"还是"模型家族"
这是三个工具**本质区别**的地方。先给结论,再逐个展开:
| 工具 | 能识别**精确模型** | 能识别**模型家族** | 本质工作方式 |
|---|---|---|---|
| **LLMmap** | ✅ 模板库内的模型可精确指认 | ✅ 库外模型可"归族"(最邻近检索,通常落在同家族/同规模附近) | open-set 无监督检索52 个模板 + 预训练编码器) |
| **LLM Verify** | ❌ 不回答"是谁" | ❌ 不做身份/家族归因 | 只判"行为与声称是否一致"+ 收集欺诈信号 |
| **llm-fingerprint-detector** | ✅ 有参考时精确验证"是不是某模型" | 🟡 可通过距离分档看出"家族亲疏" | 与给定参考做二值比对match/uncertain/mismatch不做 open-set 检索 |
### 1.1 LLMmap —— 模型与家族都能识别
- **工作流程**:发 8 条固定指纹查询identity/probe/越狱等)→ 收集回答 → 用预训练编码器把"查询+回答"编码成 384 维指纹向量 → 与 52 个已知模板做 open-set 距离检索 → 输出 Top-K距离越小越像
- **精确识别**:当被测模型**在 52 个模板库内**时,能精确指认到具体模型名(如 `meta-llama/Meta-Llama-3.1-8B-Instruct`)。
- **家族归因**:当被测模型**不在库内**(如全新模型)时,退化为 open-set 最近邻——输出距离最近的 Top-K通常落在**同家族 / 同规模**的模型上,即"归族"。本机实测Qwen3-4B库外→ Top-1 = `Qwen/Qwen2.5-3B-Instruct`Qwen 家族),距离 13.9 vs 次近 50.9,断层明显。
- **想精确识别库外模型**:跑 `add_new_template.py` 入库(无重训,但每模型要 N×8 次完整生成CPU 上很慢)。入库前只能归族,不能精确指认。
- **本机评估精度**`python test_model.py ./data/pretrained_models/default -k 3` 可在作者测试集上评估 Top-K 准确率。
### 1.2 LLM Verify —— 不做身份识别,只做欺诈裁决
- **工作流程**:对端点跑 32 条取证探测identity / capability / fingerprint 三套件)→ 收集回答文本 + 延迟 + token 用量 + 错误 → 多路信号分析(身份一致性 / 知识截止一致性 / 能力边界 / 代理信号 / 相似性)→ 汇总红旗(按严重级排序)→ 裁决。
- **识别粒度**:它**不回答"这模型是谁"**,也**不做家族归因**。它的输出是"这个端点有没有在骗人"
- 例如红旗下"自称 gpt-4而请求的是 Qwen3-4B"——它只能发现"声称与请求不符",不能告诉你是哪个模型;
- 它能做的是**交叉比对**:多个声称"不同型号"的端点是否其实是**同一个底层模型**(相似度>阈值判为同一)。
- **裁决等级fail-closed**`FRAUD_DETECTED`(0.0) / `SUSPICIOUS`(0.25) / `INCONCLUSIVE`(0.5) / `NO_FRAUD_SIGNALS`(1.0)。证据不足**绝不判清白**:至少 8 条成功探测且成功率≥80% 才算证据充分。
### 1.3 llm-fingerprint-detector —— 验证"是不是它",不做开放集识别
- **工作流程**:对端点采样**单 token 输出分布**(随机数字/颜色/字母/动物/抛硬币等 16 个 cell中英文`temperature=1.0``max_tokens=16`、关隐藏思考)→ 与**参考指纹**逐 cell 算 JSD → 按论文基线尺度给出 match/uncertain/mismatch。
- **识别粒度**
- 它不做 open-set 检索,**必须给一个参考指纹**才能下结论("它是不是参考那个模型"
- 距离本身能体现**家族亲疏**:论文公开基线上,同模型 JSD≈0.14、同模型不同 provider≈0.227、不同模型≈0.463。本机实测Qwen3-4B vs qwen3-30b同族=0.271Qwen3-4B vs llama=0.682、vs kimi=0.600(异族)。
- **无参考时的"自一致模式"**evalstone 默认):采两次互比,看端点**自己稳不稳定**——能暴露"聚合器轮换后端",但**不能证明身份**。
---
## 2. 支持哪些模型(三件套各自的能力边界)
### 2.1 LLMmap —— 内置 52 个模板(全列表)
模板文件:`LLMmap/data/pretrained_models/default/templates.json`,共 **52 个模型**
| 家族 | 模型 |
|---|---|
| **Qwen** | Qwen2-1.5B / 7B / 72B-Instruct、Qwen2.5-0.5B / 3B-Instruct |
| **Llama** | Llama-2-7B-chat、Llama-3-8B / 70B-Instruct、Llama-3.1-8B / 70B-Instruct、Llama-3.2-1B / 3B-Instruct、Llama-3-8B-Gradient-1048k、Llama-2-7B-32K |
| **GPT/ClaudeAPI 采样)** | gpt-3.5-turbo、gpt-4-turbo-2024-04-09、gpt-4o-2024-05-13、claude-3-opus/haiku/sonnet |
| **Gemma** | gemma-2b / 7b / 1.1-2b / 1.1-7b / 2-9b / 2-27b |
| **Phi** | Phi-3-mini / medium (4k/128k)、Phi-3.5-mini / MoE |
| **Mistral/Mixtral** | Mistral-7B-Instruct v0.1/v0.2/v0.3、Mixtral-8x7B-v0.1 |
| **其他** | aya-23-8B/35B、zephyr-7b-beta、Nous-Hermes-2-Mixtral、Smaug-Llama-3-70B、granite-3.0/3.1-8b、internlm2_5-7b-chat、Falcon3-7B/10B、Phi-3 系、openchat-3.5/3.6、SOLAR-10.7B、EuroLLM-1.7B 等 |
- **支持新增**:库外模型先用"归族";要精确识别就 `add_new_template.py <名字> <类型> --num_prompt_confs N` 入库(类型 0=HF / 1=OpenAI / 2=Anthropic
- 注意 LLMmap0.2 是 PyTorch 重制版,`add_new_template` 目前主要支持 HF 后端。
### 2.2 LLM Verify —— 无模型库,任意兼容端点
- **没有任何模型库/模板**。只要能连上的 OpenAI / Anthropic / 兼容端点,`model_configs` 里加一行就能测(`provider``openai` / `anthropic` / `suspect` / `generic``protocol` 自动推断)。
- "支持哪些模型"= **全部**,代价是它不识别身份,只管欺诈信号。
- 想横向对比时,官方建议用免费层拿官方基线:**Gemini**15 RPM 免费)、**Mistral**(试用额度)、**Groq**、**OpenRouter**(部分模型免费)。
### 2.3 llm-fingerprint-detector —— 11 个内置参考 + 任意模型自采
内置参考(`node dist/cli.js references` 列出论文公开数据集采样2026-07-08 采集15 cells
| 内置 reference id也直接可作 `--detector-reference` |
|---|
| `mistralai/mistral-small-3.2-24b-instruct` |
| `moonshotai/kimi-k2` |
| `deepseek/deepseek-chat` |
| `meta-llama/llama-3.1-8b-instruct` |
| `qwen/qwen3-30b-a3b-instruct-2507` |
| `openai/gpt-4o` · `openai/gpt-4o-mini` · `openai/gpt-4.1-mini` |
| `google/gemini-2.5-flash` |
| `z-ai/glm-4.5` |
| `anthropic/claude-sonnet-4.5` |
- 之外任意模型:只要用 `fingerprint --out xxx.json` 对可信端点采一份**同协议参考**,立刻就能验证(每模型约 100~400 次单 token 请求)。
- 本机已备同协议参考:`qwen3-4b_reference.json`Qwen3-4B`glm520_reference.json`GLM-5.2)。
- 注意:这 11 个内置参考用**论文协议**采样,与本机 `one-token/v1` 协议对比**仅指示性**`protocolMismatch` 标志)。
---
## 3. 线上公开数据 / 别人测过的数据
| 工具 | 公开论文 | 公开数据集 | 在线 Demo / 他人测试数据 |
|---|---|---|---|
| **LLMmap** | ✅ [arXiv:2407.15847](https://arxiv.org/pdf/2407.15847)**USENIX Security 2025**Pasquini 等) | 🟡 论文方法公开,作者测试过当时 50+ 模型;本仓库自带 52 模板 + 预训练模型 + 测试集可本地复现(`test_model.py -k 3` 评估 Top-K 精度) | ❌ 无官方在线 Web 工具;仓库内 `results/` 是本机自测数据 |
| **LLM Verify** | 🟡 开源项目 README 附**真实案例演示**(调查 opuscode.pro 等模型转卖站) | ❌ 无公开测试数据集;裁决靠本地跑 32 条探测 + 你的基线端点 | 🟡 无在线服务版;可用免费层 API 自建官方基线 |
| **llm-fingerprint-detector** | ✅ [arXiv:2607.10252](https://arxiv.org/abs/2607.10252)"One Token Is Enough"Bruckner | ✅ **Zenodo 公开数据集**DOI [10.5281/zenodo.21278557](https://doi.org/10.5281/zenodo.21278557)CC-BY-4.0,含 11 个模型的单 token 采样数据,即内置参考的来源);论文代码 DOI 10.5281/zenodo.21278793 | ✅ **在线 Web 版**[tosea.ai/free-tools/llm-api-fingerprint-checker](https://tosea.ai/free-tools/llm-api-fingerprint-checker)(纯浏览器运行,免费免安装);**论文公开基线**:同模型 JSD≈0.14 / 同模型异 provider≈0.227 / 不同模型≈0.463 |
> 一句话:想引用"别人测过的数据"——LLMmap 看 USENIX Security 25 论文detector 有 Zenodo 公开数据集 + 在线网页工具可直接试LLM Verify 没有公开数据,但自带真实转卖站案例分析。
---
## 4. 前置条件
### 4.1 需要的东西
| 项 | 容器内(推荐,零配置) | 宿主机直接跑 |
|---|---|---|
| 代码仓库 | 镜像内置:`/opt/evalscope` | `/data1/eval/evalstone` |
| 三个工具仓库 | 镜像内置:`/opt/fptools/{LLMmap,llm-verify,llm-fingerprint-detector}` | `/data1/xii/{LLMmap,llm-verify,llm-fingerprint-detector}` |
| LLMmap 解释器 | `LLMMAP_PYTHON=/usr/local/bin/python3`(已烘入) | `/root/miniconda3/envs/llmmap/bin/python`torch+transformers+e5 缓存) |
| LLM Verify 解释器 | `LLMVERIFY_PYTHON=/usr/local/bin/python3`(已烘入) | `/root/miniconda3/envs/llmverify/bin/python`fastapi+httpx |
| detector 运行时 | Node ≥18.17`DETECTOR_NODE=node`(已烘入) | 任意 Node仓库已 `npm run build` |
| 参考指纹 | `/opt/fptools/llm-fingerprint-detector/*_reference.json` | 同 schema 的 json |
> 容器镜像:`evalscope-complete-py312-fp:v2`自包含load 后零配置)。
> 容器以 **host 网络**运行,因此容器内直接访问 `localhost:30000` / `localhost:30002` 等宿主机端点即可。
### 4.2 进入容器(如果走容器跑法)
```bash
docker run -d --name fp --network host evalscope-complete-py312-fp:v2 bash
docker exec -it fp bash
cd /opt/evalscope
```
---
## 5. 一条命令跑完三个fingerprint 套件)
```bash
python bash/run.py --suite fingerprint \
--model <被测端点的模型名> \
--api-url <OpenAI 兼容端点>/v1
```
示例(容器内,测 CPU 上的 Qwen3-4B 测试端点 :30002
```bash
cd /opt/evalscope
python bash/run.py --suite fingerprint \
--model Qwen3-4B \
--api-url http://localhost:30002/v1
```
套件 = `llmmap` + `llm_verify` + `llm_fingerprint_detector` 三个依次跑完,
每个跑完自动写报告并刷新 summary`results/<model>.xlsx/.csv`)。
---
## 6. 单独跑某一个(含各工具独立用法)
### 6.1 llmmap —— 这模型是谁?
**evalstone 集成方式:**
```bash
python bash/run.py --datasets llmmap \
--model Qwen3-4B --api-url http://localhost:30002/v1
```
- 发送 8 条指纹查询 → 编码回答 → 与 52 模板 open-set 检索 → Top-K。
- `--expected-model`已知真实身份时score 变严格匹配 flag1.0/0.0
```bash
python bash/run.py --datasets llmmap \
--model GLM-5.2-w4a8-p800-2 --api-url http://localhost:30000/v1 \
--expected-model GLM-5.2-w4a8-p800-2
```
**工具独立用法**`/data1/xii/LLMmap`,环境 `llmmap`
```bash
cd /data1/xii/LLMmap
PY=/root/miniconda3/envs/llmmap/bin/python
# ① 交互式:人工发查询、粘贴回答
$PY main_interactive.py --inference_model_path ./data/pretrained_models/default
# ② 非交互:回答文件每行一条(8条) → 识别 Top-K
$PY run_identify.py answers.txt -k 6 --device cpu
# ③ 自动:对本地 HF 模型一条龙(发查询→收回答→识别)
$PY run_real_identify.py --model_dir /data1/models/Qwen3-4B \
--k 6 --device cpu --save_answers qwen_answers.txt
# ④ 入库新模型(精确指认库外模型)
$PY add_new_template.py my-new-model 0 --num_prompt_confs 100
# ⑤ 在作者测试集上评估 Top-K 精度
$PY test_model.py ./data/pretrained_models/default -k 3
```
已知坑:`LLMmap/llm.py` 的 HF 后端强制要求 `HUGGINGFACE_API_KEY`(本地也给假 key入库慢CPU 200 次生成几小时)。
### 6.2 llm_verify —— 这个 API 是不是在骗我?
**evalstone 集成方式:**
```bash
python bash/run.py --datasets llm_verify \
--model Qwen3-4B --api-url http://localhost:30002/v1
```
- 跑 32 条取证探测 → 红旗 → 裁决。可选 `--protocol``--suites``--bench-timeout`
**工具独立用法**`/data1/xii/llm-verify`,环境 `llmverify`FastAPI 服务):
```bash
cd /data1/xii/llm-verify
/root/miniconda3/envs/llmverify/bin/python -m uvicorn src.main:app --host 0.0.0.0 --port 8000
# 或: benchmarker serve --host 0.0.0.0 --port 8000
```
```bash
B=http://localhost:8000
# ① 单套件identity | capability | fingerprint
curl -s -X POST $B/api/v1/benchmarks/ -H "Content-Type: application/json" -d '{
"name": "GLM identity", "prompt_suite": "identity",
"model_configs": [{"model_name": "GLM-5.2-w4a8-p800-2", "provider": "suspect",
"api_key": "dummy", "api_base_url": "http://localhost:30000/v1"}]}'
# ② 深度分析(最常用:三套件全跑 + 红旗 + 裁决)
curl -s -X POST $B/api/v1/analysis/deep -H "Content-Type: application/json" -d '{
"name": "GLM 全量", "suites": ["identity","capability","fingerprint"],
"model_configs": [{"model_name": "GLM-5.2-w4a8-p800-2", "provider": "suspect",
"api_key": "dummy", "api_base_url": "http://localhost:30000/v1"}]}'
# ③ 探测明细 / 行为指纹
curl -s "$B/api/v1/results/<run_id>"
curl -s "$B/api/v1/results/<run_id>/fingerprint?model_name=GLM-5.2-w4a8-p800-2"
# ④ 两个 run 对比(同一套件下)
curl -s -X POST $B/api/v1/results/compare -H "Content-Type: application/json" \
-d '{"run_a":"<id>","run_b":"<id>"}'
```
`model_configs` 字段:`model_name` / `provider`(openai|anthropic|suspect|generic) / `api_base_url`(带 `/v1`) / `api_key`(本地可空/dummy) / `protocol`(留空自动推断)。
`api_key` 为空时服务会从 env`SUSPECT_API_KEY`/`OPENAI_API_KEY`evalstone 集成自动填占位 key。
### 6.3 llm_fingerprint_detector —— 单 token 输出分布验证(重点)
**evalstone 集成方式**(两种模式二选一):
```bash
# A. 自一致模式(默认)——只证明"端点稳定",不证明身份
python bash/run.py --datasets llm_fingerprint_detector \
--model Qwen3-4B --api-url http://localhost:30002/v1
# B. 参考验证模式——验证"是不是它声称的模型",测身份必须用这个
python bash/run.py --datasets llm_fingerprint_detector \
--model Qwen3-4B --api-url http://localhost:30002/v1 \
--detector-reference /data1/xii/llm-fingerprint-detector/qwen3-4b_reference.json \
--detector-preset strict
```
**工具独立用法**`/data1/xii/llm-fingerprint-detector`Node`npm run build`
```bash
cd /data1/xii/llm-fingerprint-detector
export LLM_FINGERPRINT_API_KEY=dummy # 本地端点无鉴权
node dist/cli.js references # ① 列出 11 个内置参考
node dist/cli.js fingerprint --base-url http://localhost:30000/v1 \
--model GLM-5.2-w4a8-p800-2 --preset standard --out ref.json # ② 采样指纹
node dist/cli.js verify --base-url http://localhost:30000/v1 \
--model GLM-5.2-w4a8-p800-2 --preset standard --reference ref.json # ③ 验证
node dist/cli.js compare a.json b.json --json # ④ 离线比较两份指纹
```
- **判定标尺**meanJSDbase 2`match ≤ 0.25 < uncertain ≤ 0.35 < mismatch`CLI 退出码 `0=match, 2=mismatch, 3=uncertain, 4=insufficient, 1=error``score = max(0, 1-meanJSD)`
- **`--detector-reference` 三类来源**:①本地同协议 json`qwen3-4b_reference.json` / `glm520_reference.json`);②内置 id上表 11 个,如 `deepseek/deepseek-chat`,仅指示性);③自采(`fingerprint --out my_ref.json`)。
- 选项:`--preset quick(4×15)/standard(8×25)/strict(16×25)``--cells`/`--samples``--concurrency``--timeout`(ms)、`--api-key-env`
- `data/reference-fingerprints.sample.json` 是多模型合集(`models` 数组),**不能**直接当单模型 reference 用。
---
## 7. 参数速查表fingerprint 相关)
| 参数 | 默认值 | 说明 |
|---|---|---|
| `--suite fingerprint` | — | 一次跑三个指纹 benchmark |
| `--datasets <名>` | — | 只跑某一个(`llmmap` / `llm_verify` / `llm_fingerprint_detector` |
| `--model` | `DeepSeek-V4-Flash-Int8` | 被测端点暴露的模型名 |
| `--api-url` | `http://localhost:30000/v1` | OpenAI 兼容端点(必须带 `/v1` |
| `--tools-root` | env `FP_TOOLS_ROOT`,默认 `/data1/xii` | 三个工具仓库的父目录 |
| `--llmmap-python` | env `LLMMAP_PYTHON` | LLMmap 执行器解释器 |
| `--verify-python` | env `LLMVERIFY_PYTHON` | LLM Verify 执行器解释器 |
| `--detector-node` | env `DETECTOR_NODE`,默认 `node` | detector 的 Node 可执行文件 |
| `--detector-reference` | 无 | 参考指纹 JSON 或内置 id缺省 = 自一致模式 |
| `--detector-preset` | `standard` | `quick` / `standard` / `strict` |
| `--expected-model` | 无 | 仅 llmmap已知真实身份score 变严格匹配 flag |
| `--fingerprint-timeout` | 120 | 单请求超时(秒) |
| `--folder-name` | `--model` | 顶层输出目录名(`output/<folder-name>/...` |
| `--seed` | 42 | 报告路径里的 seed |
> 指纹探测(三个执行器)始终给请求注入 `chat_template_kwargs.thinking=false` 关闭思考链,
> 与 `run.py --thinking` 无关,无需也无法用该参数控制。
---
## 8. 输出与结果汇总
每个 benchmark 产出与 EvalScope 同构的报告:
```text
output/<folder-name>/<benchmark>/seed_<seed>/reports/<benchmark>.json
```
报告至少含 `score``num`,另有各自附加字段:
| benchmark | 报告附加字段 |
|---|---|
| llmmap | `score_mode``top1`name+distance`topk` |
| llm_verify | `verdict``successful_probes``avg_latency_ms``red_flags[]` |
| llm_fingerprint_detector | `mode`reference_verify / self_consistency`verdict``mean_jsd``split_half_jsd``reference``most_divergent[]` |
另外:
- 计时备份:`output/<folder-name>/active_time/<benchmark>__<model>.json`
- 每个 benchmark 跑完run.py 自动重写汇总 `results/<model>.xlsx` / `.csv`(指纹类归入分类 **"模型安全与指纹"**)。
- 想只做汇总不重跑:`python bash/collect_results.py --output-dir output/Qwen3-4B --model Qwen3-4B`
---
## 9. 实测示例
以下为 Qwen3-4B @ CPU 测试端点 `:30002` 的实测结果,可直接对照:
```
分类 Benchmark 得分 实测时间(h) 总样本数
模型安全与指纹 llmmap 0.7690 0.08 8 ← Top-1=Qwen/Qwen2.5-3B-Instruct家族归因距离 13.9 vs 次近 50.9
模型安全与指纹 llm_verify 0.0 0.06 32 ← FRAUD_DETECTED自称 gpt-4 + 平均延迟 29.5s 红旗)
模型安全与指纹 llm_fingerprint_detector 0.92 0.07 4 ← 自一致 match, meanJSD≈0.076
```
> llm_verify 的 0.25仅延迟红旗→SUSPICIOUS与 0.0多一条身份红旗→FRAUD_DETECTED
> 取决于目标端点当时的行为属正常波动CPU 端点延迟高导致的延迟红旗是预期现象。
> detector 的 0.92 是自一致结果,**想证明身份请带 `--detector-reference` 重跑**。
---
## 10. 常见坑 / 排障
| 现象 | 原因与处理 |
|---|---|
| detector 报 `unsupported formatVersion undefined`,且路径指向 `package.json` 之类 | `--detector-reference` 传的不是单模型指纹 JSON传成了目录 / package.json / 多模型合集 `data/reference-fingerprints.sample.json`)。改传单模型同协议 json`formatVersion:1` + `model` + `cells`,如 `qwen3-4b_reference.json`)或内置 reference id。自验`node dist/cli.js compare <ref> <ref> --json`,合法时 `meanJsd=0, verdict=match` |
| 自一致模式 match 但没法下身份结论 | 正常,自一致只测稳定性。需带 `--detector-reference` 做参考验证 |
| `LLM Verify` 全部探测失败 | api_key 为空时 httpx 会拒绝空 Bearer 头;执行器会自动填占位 key。若仍失败检查端点的 `/v1` 路径与 `--fingerprint-timeout` 是否过小 |
| llmmap 直接 0 分报错 | 超过一半查询失败时执行器判 0 分并报错避免用空回答算出假距离。CPU 端点慢可调大 `--fingerprint-timeout` |
| CPU 端点上 llm_verify 出延迟红旗 | 预期现象(如 29.5s 平均延迟),不是镜像缺陷 |
| `detector CLI not built` | 工具仓库未 `npm run build`;镜像内已构建,宿主机需自行 `cd llm-fingerprint-detector && npm run build` |
| 容器里找不到 tools | 镜像内 `FP_TOOLS_ROOT=/opt/fptools`;宿主机用 `--tools-root /data1/xii`(默认) |
| 全局 `HF_HUB_OFFLINE=1` 导致其他组件异常 | 镜像已把 e5 嵌入模型缓存烘入llmmap 在进程内部自行离线,不要全局开 HF_HUB_OFFLINE |
| LLMmap 想精确识别库外模型却只"归族" | 需先 `add_new_template.py` 入库(无重训,但很慢);入库前只能归族 |
---
## 11. 参考
- 实现与坑:`bash/fingerprint/README.md`
- 理论说明 / 框架对比 / 扩展性:`/data1/xii/model_fingerprint_detection.md`
- 集成入口:`bash/run.py``ALL_FINGERPRINT` / `SUITES['fingerprint']` / `run_fingerprint_benchmark`
- 汇总:`bash/collect_results.py`(分类"模型安全与指纹"
- LLMmap 论文arXiv:2407.15847USENIX Security 2025 llm-fingerprint-detector 论文arXiv:2607.10252 + 公开数据集 DOI 10.5281/zenodo.21278557 + 在线版 tosea.ai/free-tools/llm-api-fingerprint-checker