lm-detector:开源 LLM 模型指纹检测工具上线
基于 ModelTrace 的 LLM 指纹检测器,通过三组整数挑战比对输出分布,识别 API 背后的真实模型。
lm-detector 是一个面向大模型 API 的「指纹检测」开源项目,通过向目标接口发送三组整数生成挑战,比较模型的输出分布差异,从而推断其背后的模型身份。项目同时提供 Web 界面与 CLI 工具,共享同一套算法和正式参考数据库,适合在多模型混用场景下做来源核验。
核心能力
检测器通过三条固定挑战向目标模型采样,再把回答与正式参考库比对,给出候选排名与置信度。Web 端为 React 单页应用,CLI 端基于 Bun + TypeScript 并使用 Ink TUI 展示进度与排名。两端共用 shared/ 中的挑战、响应解析、评分与建库逻辑,结果一致。
- 支持的接口:Chat Completions、Responses(OpenAI 风格)以及 Anthropic Messages,均覆盖 JSON 与 SSE 流式输出。
- 并行策略:可选择三条挑战并行或顺序执行,每轮三条采样全部完成后再进入下一轮。
- 旧入口保留:
bun run detect:legacy仍提供 Codex 登录与 trace 等历史能力。
算法与数据
指纹识别建立在以下数据之上:
data/unified_reference.jsonl:参考回答、提示词与模型标签。data/unified_bank.json:由参考回答派生的指纹库。data/shared_detector.json:冻结的排名、核验参数与温度校准层。data/enrollment-suite.json:固定采样挑战集。
shared/shared-detector.ts 负责计算候选排名、核验分数与置信度,浏览器 Worker、主线程回退与 CLI 复用同一份实现。置信度是校准层在闭集上的归一化概率,不含库外概率,也不能独立证明后端身份。参考样本不得包含固定评估集的回答,核验器与校准层缺失时会回退到基础排名或未校准的核验读数。
采样与建库
采样 CLI 要求显式声明模型、家族、提供方、来源渠道与允许返回的模型 ID,使用固定挑战生成请求并保存原始响应与失败记录。--resume DIR 可在已有目录上续采,成功挑战自动跳过;enroll 子命令用于去重与重建指纹库,也支持在采样时加 --enroll 自动入库。原始参考数据来自 ModelTrace 提交 60949ef522a84f66b1236b459308b48028d36949,各条样本保留 provenance,但来源标签仅代表采集记录,不作为上游身份的独立认证。
部署与运行
项目以 Bun workspace 组织,需要 Bun 1.4.2。常用命令包括 bun install --frozen-lockfile、bun run dev、bun run typecheck、bun run build 和 bun run preview。api/ 与 functions/ 分别作为 Vercel 与 Cloudflare Pages 的入口,共用 server/proxy.ts,请求与 API Key 通过同源 /api/proxy 转发到用户填写的 HTTPS 地址,代理不持久化密钥。Web 端只读取随构建发布的数据库,不提供浏览器建库或 IndexedDB 覆盖;偏好与 API Key 保存在 localStorage。npm 包 lmfpd 通过 npx lmfpd@latest 运行,支持 Node.js 22+ 与 Bun 1.4.2+,主分支更新后由发布工作流自动更新 latest 标签。详细配置见仓库中的部署文档。
