☰
拆解 ModelTrace 核心算法:Hellinger 相似度 + 有序块特征如何融合成模型指纹
2026/10/12 4:00:56 网站建设 项目流程

【免费下载链接】ModelTrace

主动探测模型归因

项目地址:https://gitcode.com/gh_mirrors/mo/ModelTrace
点击查看免费下载

ModelTrace 是一个本地运行的主动模型归因工具:它用三条长整数生成挑战提取输出指纹,将 Hellinger 相似度与有序块特征按 0.75 + 0.25 融合成模型指纹,再在全局候选库中判断待测模型属于哪个家族、哪个具体版本。本文面向新手拆解这套"数字指纹"算法的每一步,帮助你理解模型归因背后的完整计算流程。

为什么用"数字"来识别大模型? 🤔

不同的大模型在做"凭第一反应选一个数字"这类无语义任务时,会表现出各自稳定的取值偏好——有的偏爱小数值、有的更分散、有的尾数分布有特点。这些偏好就像"数字 DNA",构成了模型指纹的原始信号。

ModelTrace 的思路是:

  1. 让待测模型连续完成 3 条整数生成挑战;
  2. 把每份回答解析成数字序列,提取两类统计特征;
  3. 与指纹库中每个已知模型的"模型中心"比较,融合打分;
  4. 经校准温度放大后做 softmax,输出具体模型与模型家族的概率。

整套算法的命名是Ordered-block + nuisance-Hellinger(有序块 + 去环境方向的 Hellinger),全部实现集中在 fingerprint.py 的几个常量里:取值范围 1–355、特征维度 355、平滑系数 α=0.5、有序块权重 0.25。

第一步:生成三条"随机数"挑战

挑战由 challenge_suite.py 和 fingerprint.py 共同负责:

  • 长度随机:每条挑战要求输出 292–332 个整数,且明确禁止从 1 计数、等差递增、循环重复等规则化模式;
  • 提示词变体:自动建库时会使用 12 种环境组合(clean/system/user 三种上下文 × json/中文/英文三种输出风格,以及 96/512/2048 词的前缀噪声);
  • 禁止借助工具:明确要求模型不得调用 Python、计算器、API 或外部随机数生成器,保证输出只能来自模型本身。

手动测试模式下,页面会随机生成三条这样的挑战,你只需把完整输出粘贴回来即可。

第二步:解析数字序列,构建两种特征向量

2.1 数字解析:只保留"最长数字串"

parse_numbers 用正则扫出所有数字串,遇到字母分隔符就断开,只保留 1–355 范围内的值,并取最长的一段作为有效序列。一份回答至少要有 80 个数字(或达到要求数量的 55%)才会被计入评分,拒答和严重截断的回答会被直接剔除。

2.2 Hellinger 分布特征:355 维"取值偏好画像"

把序列中每个数字的出现次数统计成 355 维计数向量,再经过 hellinger_feature 两步加工:

  • 拉普拉斯平滑:每个计数加 α=0.5,避免某个取值从未出现导致概率为 0;
  • 开方归一:对比例开方,得到单位向量。

开方这一步就是 Hellinger 距离的由来——相比直接比较频率,它对"数量级差异"不敏感、对"分布形状差异"更敏感,恰好契合"识别偏好形状,而不是输出量"的需求。

2.3 有序块特征:74 维"顺序指纹"

只数频率会丢掉顺序信息。ordered_block_feature 从两个角度补足:

片段做法维度
4 个位置块序列按出现顺序均分 4 段,每段做 1–355 的 16 分箱直方图,平滑后开方归一4 × 16 = 64
尾数分布全部数字按 mod 10 统计个位数字偏好10

合计 74 维。它能捕捉"前半段偏小、后半段偏大"这类位置漂移,以及"偏爱哪些个位数"这类细微习惯。

第三步:建库时先"去噪",消除环境干扰

同一个模型在不同提示风格、不同系统前缀下,数字偏好会整体漂移。如果不去掉这种漂移,归因就会误判"环境差异"为"模型差异"。

bank_builder.py 的fit_robust_artifacts在建库时做了三件事:

  1. 标准化:对每个特征维度计算全库均值和标准差,统一量纲;
  2. 提取干扰基:按 12 种环境分别计算平均偏移,对偏移矩阵做 SVD,取前 2 个主方向构成nuisance_basis(干扰基);
  3. 投影去除:把所有特征投影掉这 2 个方向,剩下的才是"与模型本身相关"的成分;再对每个模型求平均方向并归一化,得到该模型的模型中心(centroid)。

对有序块特征,建库时还会额外保存每个环境下的模型中心(environment_centroids),供归因时做环境模板匹配。拟合结果全部写入 data/unified_bank.json,只保存统计指纹与校准参数,不保存任何原始回答。

第四步:融合打分——0.75 × Hellinger + 0.25 × 有序块

归因时,待测序列分别走两条评分通道:

  • Hellinger 通道(robust_score_counts):特征标准化 → 投影去掉干扰基 → 归一化 → 与全部 13 个模型中心做点积,得到"方向相似度"并做 z 分数标准化;
  • 有序块通道(ordered_block_scores):先计算"环境模板分"(对每个环境的模型中心打分后取逐模型最大值,再标准化),再计算去噪后的"方向分",两者 5:5 合成。

最后按固定权重融合(robust_score_numbers):

融合得分 = 0.75 × Hellinger 通道得分 + 0.25 × 有序块通道得分

两条通道互为补充:Hellinger 主通道看"整体取值形状",有序块通道看"顺序与尾数习惯"。融合后的分数同时与全部模型比较(而非逐家族比较),保证跨 GPT / Claude 家族的归因都在同一标尺上。

第五步:校准温度 β 与最终概率输出

三份回答的融合得分取平均后,还不能直接转成概率——原始分数的差距通常太小。ModelTrace 的做法是温度缩放 + softmax(analyze_outputs):

P(具体模型) = softmax(β × 全局模型得分) P(模型家族) = Σ P(该家族中的具体模型)

关键参数 β 不是拍脑袋定的,而是分组交叉验证学出来的(fit_beta):按"每次留出若干条挑战"的方式反复重训指纹库,在 0.05–12 的对数网格上搜索使负对数似然最小的 β,并分别对 1 / 2 / 3 次查询各存一份。当前统一库的校准结果:

查询次数校准温度 β交叉验证准确率
1 次≈ 6.8495.5%(447/468)
2 次≈ 12.099.6%(466/468)
3 次≈ 12.0100%(156/156)

归因时按实际有效回答数(上限 3)选取对应 β。这就是为什么工具推荐发送三条挑战——回答越多,概率分布越"锐利",判断越可信。

当前库共收录 2 个家族、13 个模型(gpt-5.4 ~ gpt-6-astra,claude-haiku-4-5 ~ claude-opus-5),家族概率即成员模型概率之和;结果中的profile_similarity用 JS 相似度展示待测分布与库内分布的整体接近度,作为辅助参考。

全流程一图流小结 ✅

3 条整数挑战 → 解析最长数字串(≥80 个数字) ├─ Hellinger 特征(355 维)──标准化──去环境方向──比模型中心──→ 0.75 └─ 有序块特征(74 维)──标准化──模板/去噪双分──→ 0.25 ↓ 融合得分(3 份回答取平均)→ β 温度缩放 → softmax ↓ 13 个模型概率 → 家族概率求和 → 归因结论

如何自己跑一遍?

安装依赖后运行python start.py,页面地址为http://127.0.0.1:7860/。不想装后端的用户可以直接打开静态版(static/index.html),它使用 static/fingerprint-core.js 在浏览器本地完成同一套归因计算,与 Python 版逐函数对应。核心源码入口:

  • 指纹提取与归因:fingerprint.py
  • 指纹库构建与概率校准:bank_builder.py
  • 自动建库挑战与环境变体:challenge_suite.py
  • 统一指纹库数据:data/unified_bank.json

注意事项:结果如何正确解读 ⚠️

  • 闭集判断:概率是当前候选库内、均匀先验下的闭集结果,未收录的模型会被归到最相似的现有候选;
  • 系统提示词干扰:官方提示在 Claude Code 等强系统提示环境下测试存在较大偏差,建议避免在该环境测试;
  • 仅供参考:测试结果并非判断模型的决定性证据,建议结合多条回答与多次测试交叉验证。

理解了"分布形状 + 顺序习惯 → 去噪 → 加权融合 → 温度校准"这条主线,你就掌握了 ModelTrace 的核心:它把模型的输出习惯量化成可比较的模型指纹,让模型归因从猜测变成了有校准依据的概率判断。

【免费下载链接】ModelTrace

主动探测模型归因

项目地址:https://gitcode.com/gh_mirrors/mo/ModelTrace
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询