
बड़े भाषा मॉडलों (Large Language Models) की उनके टोकनाइज़र और व्यवहार के आधार पर फ़िंगरप्रिंटिंग के लिए अद्वितीय उपकरण।

OpenAI-संगत चैट एंडपॉइंट के पीछे के सर्विंग स्टैक का फ़िंगरप्रिंट तैयार करता है।
यह टोकनाइज़र लेखांकन, छिपे हुए टेम्पलेट ऑफ़सेट, सत्यापन गद्य, JSON/SSE आकार, भूमिका स्वीकृति, नामित सीमाएँ, और गेटवे हेडर रिकॉर्ड करता है। यह वेट लोड नहीं करता, API कुंजियाँ संग्रहीत नहीं करता, या मॉडल से यह नहीं पूछता कि वह कौन है।
| आयात | lm_fingerprint |
| CLI | lm-fingerprint |
| यह क्या है | /chat/completions के विरुद्ध संस्करणित इन्फ्रास्ट्रक्चर प्रोब। ऑफ़लाइन सिंथेटिक लाइब्रेरी। स्थानीय Hugging Face टोकनाइज़र सत्यापन (कोई वेट नहीं)। |
| यह क्या नहीं है | ग्रेडिएंट हमला नहीं। जेलब्रेक नहीं। एनकोड-मैप पहचान नहीं (tokprint)। “इस पोर्ट पर कौन सा बाइनरी है” नहीं (Julius)। |
केवल अधिकृत उपयोग: ऐसे एंडपॉइंट जो आपके हैं, प्रयोगशालाएँ जिन्हें आप नियंत्रित करते हैं, दायरे में बाउंटियाँ, लिखित पेंटेस्ट। SECURITY.md देखें।
--api-key-envएक पर्यावरण चर का नाम देता है। कुंजी कभी लॉग नहीं होती।
OpenAI-संगत चैट एक सामान्य वायर है। vLLM, SGLang, एक प्रयोगशाला गेटवे, और एक रिसेलर सभी /chat/completions बोल सकते हैं। model फ़ील्ड एक लेबल है। होस्ट बैकएंड बदल सकता है, टोकनाइज़र लपेट सकता है, या सामने राउटर बैठा सकता है। पर्सनैलिटी प्रोब तब हिलते हैं जब सिस्टम प्रॉम्प्ट हिलता है।
जो स्थिर रहता है वह प्लंबिंग है: सर्वर टोकन कैसे गिनता है, वह कितने छिपे हुए टेम्पलेट टोकन जोड़ता है, उसके वैलिडेटर ने जो गद्य लिखा, SSE बोली, कौन सी भूमिकाएँ स्वीकार करता है, जब max_tokens बेतुका हो तो वह कौन सी संख्या बताता है, Server / प्रदाता हेडर।
इस टूल का उत्तर यही है: इस चैट पाथ को कौन सा स्टैक संभाल रहा है? कौन सा चेकपॉइंट नहीं, पोर्ट से कौन सी प्रक्रिया बंधी है नहीं, किसी कम्प्लीशन को किसने लिखा नहीं।
ModelPrint ने ब्राउज़र में नौ प्रोब के साथ यही सवाल पूछा। यह पैकेज CLI और लाइब्रेरी रूप है: संस्करणित प्रोब, एनरोल करने योग्य लाइब्रेरी, युग्म-वार साक्ष्य, ड्रिफ्ट, और एक स्थानीय टोकनाइज़र पथ जो कभी होस्टेड Inference API को कॉल नहीं करता।
एक फ़िंगरप्रिंट प्रोब values का एक संस्करणित JSON रिकॉर्ड है। प्रत्येक प्रोब को एक ही मान लौटाना चाहिए जब एक ही स्टैक दो बार हिट हो। टाइमस्टैम्प, अनुरोध आईडी, विलंबता, और कुंजियाँ हटा दी जाती हैं।
टोकनाइज़र गिनतियाँ ModelPrint 1.0.0 टेक्स्ट (MIT, unclecode/modelprint) का पुन: उपयोग करती हैं, बाइट-सटीक, एक एक-वर्ण "a" बेसलाइन घटाकर ताकि छिपा टेम्पलेट रद्द हो जाए। वे चार संख्याएँ एनकोड मैप (T) का एक प्रक्षेपण हैं। बराबर गिनतियों का मतलब (T_1 \equiv T_2) नहीं है। GPT-2 और OPT उन पर टकराते हैं; रस्ट पाइपलाइन हैश नहीं टकराता।
hf_identity (केवल स्थानीय HF पथ) उस पाइपलाइन प्रतिबद्धता और चैट-टेम्पलेट हैश का SHA-256 है। समान (T) और समान टेम्पलेट मेल खाते हैं (tiny-gpt2 / gpt2)। यह परिवार + टेम्पलेट है, चेकपॉइंट नहीं।
लेआउट:
src/lm_fingerprint/
cli.py argparse. --api-key-env only. No --api-key.
client.py HttpTransport, InProcessTransport, redact_secrets
probes.py 23 ProbeSpec rows (tokenizer / errors / shape / roles / limits / proxy)
engine.py run suite → Fingerprint
schema.py schema_version=1, probe_suite_version=lm-fingerprint-probes-v1
similarity.py weighted exact-match, coverage, confidence, library rank, drift
library.py enroll / match. Packaged rows are synthetic fixtures
synthetic.py in-process stacks for tests and the shipped library
hf.py local AutoTokenizer + named validation profile. No weights
localmap.py encode-pipeline-v2 commitment (rust tokenizer.json)
proof.py measured ModelPrint 9-probe identity
report.py text reports
data/library.json
एक ही प्रोब सूट में दो पथ:
live endpoint local Hub tokenizer (optional [hf])
| |
HttpTransport.chat HfChatTransport
POST /chat/completions encode / chat_template for counts
| synthetic profile for errors/shape
+------------------+----------------------+
|
engine.run_probes
|
Fingerprint (JSON, keyless)
|
compare | match | drift | enroll
प्रोब लेखन: docs/PROBES.md। मॉड्यूल मानचित्र: docs/ARCHITECTURE.md।
एक मैच साझा इन्फ्रास्ट्रक्चर है। एक प्रयोगशाला एक स्टैक पर दो चेकपॉइंट परोस सकती है। एक राउटर अपने स्वयं के त्रुटि रैपर के साथ उत्तर दे सकता है। गिनती का सहमत होना (T) की पहचान नहीं है।
Python 3.10+। कोर रनटाइम मानक लाइब्रेरी है।
git clone https://gitlab.com/WattoCyber/lm-fingerprint.git
cd lm-fingerprint
pip install -e ".[dev]"
PYTHONPATH=src python3 scripts/repro.py
REPRO_OK की अपेक्षा करें। वह गेट ऑफ़लाइन है: कोई GPU नहीं, कोई प्रोडक्शन API नहीं। यदि टोकनाइज़र कैश नहीं है तो स्थानीय HF परीक्षण छोड़ दिए जाते हैं।
pip install -e ".[hf]" # transformers, for fingerprint-hf / verify-hf
lm-fingerprint list-probes
lm-fingerprint list
list पैकेज्ड स्टैक प्रिंट करता है: openai-chat-strict, glm-compat, router-openai, permissive-compat। वे फिक्स्चर हैं, स्क्रैप किए गए प्रदाता नहीं। बिना नेटवर्क के उनमें से दो की तुलना करें:
from lm_fingerprint.client import InProcessTransport
from lm_fingerprint.engine import fingerprint_endpoint
from lm_fingerprint.similarity import compare_fingerprints
from lm_fingerprint.synthetic import SYNTHETIC_STACKS, handler_for
def fp(stack_id):
t = InProcessTransport(handler_for(stack_id), headers=SYNTHETIC_STACKS[stack_id].headers)
return fingerprint_endpoint(t, model=f"synthetic/{stack_id}", base_url=f"inprocess://{stack_id}")
print(compare_fingerprints(fp("openai-chat-strict"), fp("router-openai"))["note"])
एक ही शब्द टोकनाइज़र, अलग त्रुटियाँ और हेडर। स्कोर लगभग 0.58 रहता है। ModelPrint की चार गिनतियाँ मेल खाती हैं; यह टूल उसे साझा स्टैक नहीं कहता।
lm-fingerprint fingerprint \
--base-url https://your-lab.example/v1 \
--model the-label \
--api-key-env OPENAI_API_KEY \
--out lab.json
lm-fingerprint match --fingerprint lab.json
lm-fingerprint enroll --fingerprint lab.json --stack-id my-lab --library my-lib.json
कुंजी कमांड लाइन पर पास न करें। सार्वजनिक लाइब्रेरी भरने के लिए प्रोडक्शन API को स्क्रैप न करें।
lm-fingerprint fingerprint-hf --model sshleifer/tiny-gpt2 --local-files-only
lm-fingerprint verify-hf --local-files-only
गिनतियाँ apply_chat_template से आती हैं जब टेम्पलेट मौजूद हो, अन्यथा encode(..., add_special_tokens=False) से। त्रुटि वर्गीकरण एक नामित सिंथेटिक प्रोफ़ाइल (डिफ़ॉल्ट openai-chat-strict) से आता है ताकि रन ऑफ़लाइन रहे। रिमोट हैंडल (https://, api://, …) अस्वीकार कर दिए जाते हैं।
lm-fingerprint list-probes
lm-fingerprint list [--library PATH]
lm-fingerprint fingerprint --base-url URL --model MODEL --api-key-env VAR [--out PATH]
lm-fingerprint fingerprint-hf --model HANDLE [--profile NAME] [--local-files-only]
lm-fingerprint verify-hf [--models a,b,c] [--local-files-only]
lm-fingerprint prove [--local-files-only]
lm-fingerprint compare --a a.json --b b.json
lm-fingerprint match --fingerprint a.json [--library PATH]
lm-fingerprint drift --baseline old.json --current new.json
lm-fingerprint enroll --fingerprint a.json --stack-id ID --library PATH
lm-fingerprint export --fingerprint a.json
कोई --api-key फ़्लैग नहीं है। पुराने wireprint-fingerprint / stackprint-fingerprint JSON फिर भी लोड होते हैं।
from lm_fingerprint import (
StackLibrary,
compare_fingerprints,
fingerprint_endpoint,
fingerprint_hf,
match_library,
)
from lm_fingerprint.client import HttpTransport
fp = fingerprint_endpoint(HttpTransport(url, api_key=key), model="x", base_url=url)
hit = match_library(fp, StackLibrary.load())
local = fingerprint_hf("sshleifer/tiny-gpt2", local_files_only=True)
schema_version = 1, probe_suite_version = lm-fingerprint-probes-v1।
तुलना: दोनों ओर ok और stable प्रोब पर भारित सटीक-मिलान। कॉन्फिडेंस score × coverage है। लाइब्रेरी मैच certainty (exact / strong / possible / unknown) और दूसरे पड़ोसी तक का अंतर रिपोर्ट करता है।
फिर से चलाएँ:
lm-fingerprint prove --local-files-only
वही अवशेष ModelPrint जैसा (probes/index.js में नौ प्रोब)। उनका README स्कोरिंग नियम है: मेल खाते फ़िंगरप्रिंट साझा इन्फ्रास्ट्रक्चर साबित करते हैं, पहचान नहीं।
विवरण: docs/PROOF.md।
fingerprint-hf कभी वेट लोड नहीं करता और कभी होस्टेड इन्फ़रेंस को कॉल नहीं करता।--api-key-env से आती हैं। आर्टिफैक्ट्स में sk- या Authorization नहीं होना चाहिए।scripts/repro.py उत्पाद गेट है। जब तक आपने अभी इसे नहीं चलाया, हरा होने का दावा न करें।MIT. LICENSE देखें। ModelPrint टोकनाइज़र टेक्स्ट MIT (unclecode/modelprint) और बाइट-सटीक बने रहते हैं।
| आपके पास क्या है | आप क्या देख सकते हैं | यह टूल क्या करता है |
|---|
| एक अधिकृत OpenAI-संगत बेस URL + कुंजी | चैट HTTP: उपयोग, त्रुटियाँ, हेडर, SSE | fingerprint / compare / match / drift |
| स्थानीय टोकनाइज़र फ़ाइलें | encode और chat_template | fingerprint-hf / verify-hf। वेट डिस्क पर रहते हैं |
| केवल एक host:port | Banner / /health / /api/tags | दायरे से बाहर। Julius उपयोग करें |
| फ़ील्ड | अर्थ |
|---|
kind | lm-fingerprint |
target.model / target.base_url_host | जिसे इंगित किया गया। केवल होस्ट; कोई कुंजी नहीं |
features.tokenizer_norm | चार ModelPrint-श्रेणी की गिनतियाँ (अंग्रेज़ी, चीनी, कोड, इमोजी) |
features.template_offset | छिपे हुए सर्विंग-टेम्पलेट का आकार |
probes.<id>.value | तुलनीय सेल। स्थिर होना चाहिए |
probes.<id>.weight | समानता में योगदान |
keys_stored | हमेशा false |
weights_loaded | हमेशा false |
| परीक्षण | ModelPrint | यह टूल |
|---|
एक ही टोकनाइज़र, अलग स्टैक (openai-chat-strict बनाम router-openai) | टोकनाइज़र 4/4 + टेम्पलेट मैच | स्कोर 0.58, साझा लेखांकन लेबल |
gpt2 बनाम facebook/opt-125m | चार गिनतियाँ और टेम्पलेट टकराते हैं | encode_commitment अलग करता है |
| Qwen2 / 2.5 / 3 | टोकनाइज़र 4/4 टकराते हैं; टेम्पलेट अलग करता है | hf_identity अलग करता है |
tiny-gpt2 बनाम gpt2 | मैच (समान (T)) | मैच (आवश्यक) |
| प्रोब सेट | 9 | 23 + HF एनकोड/टेम्पलेट प्रतिबद्धताएँ |
logprobs, स्ट्रीम आकार, सिस्टम भूमिका | विचारों के रूप में सूचीबद्ध | शामिल |
| उपकरण | उद्देश्य |
|---|
| ModelPrint | वही अवशेष, ब्राउज़र, नौ प्रोब |
| tokprint | स्थानीय एनकोड-मैप परिवार आईडी। gradient-untangler में रहता है |
| gradient-untangler | स्थानीय वेट के माध्यम से ग्रेडिएंट |
| Julius | पोर्ट पर कौन सा सर्वर सॉफ़्टवेयर है |
| TokenPrint / LLMmap / UTF | जनित टेक्स्ट, वंशावली, या प्रत्यारोपित टोकन |