
أداة فريدة لتحديد بصمة نماذج اللغات الكبيرة (Large Language Models) بناءً على مُرمِّزاتها (tokenizers) وسلوكها.

يُبصم مكدس الخدمة الكامن خلف نقطة نهاية محادثة متوافقة مع OpenAI.
يسجّل محاسبة المُرمِّز (tokenizer)، وإزاحة القالب المخفية، ونصوص التحقق، وشكل JSON/SSE، وقبول الأدوار، والحدود المسماة، وترويسات البوابة. لا يُحمّل الأوزان، ولا يخزّن مفاتيح API، ولا يسأل النموذج عن هويته.
| الاستيراد | lm_fingerprint |
| سطر الأوامر | lm-fingerprint |
| ما هو | مسابير بنية تحتية مُرقّمة ضد /chat/completions. مكتبة تركيبية دون اتصال. تحقق محلي من مُرمِّز Hugging Face (بدون أوزان). |
| ما ليس هو | ليس هجوم تدرج. ليس كسر حماية. ليس هوية خريطة ترميز (tokprint). ليس “أي ثنائي يعمل على هذا المنفذ” (Julius). |
للاستخدام المصرح به فقط: نقاط نهاية تملكها، ومختبرات تتحكم بها، وبرامج مكافآت ضمن النطاق، واختبارات اختراق مكتوبة. انظر SECURITY.md.
--api-key-envيسمّي متغير بيئة. المفتاح لا يُسجَّل أبدًا.
المحادثة المتوافقة مع OpenAI واجهة شائعة. vLLM وSGLang وبوابة مختبر وبائع إعادة بيع يمكنهم جميعًا التحدث عبر /chat/completions. حقل model هو تسمية فقط. يمكن للمضيف تبديل الخلفية، أو تغليف المُرمِّز، أو وضع موجّه في المقدمة. مسابير الشخصية تتحرك عندما يتحرك نظام التلقين.
ما يبقى ثابتًا هو السباكة: كيف يعدّ الخادم الرموز، وكم عدد رموز القالب المخفية التي يضيفها، والنثر الذي كتبه مُتحقِّقه، ولهجة SSE، والأدوار التي يقبلها، والرقم الذي يذكره عندما يكون max_tokens مبالغًا فيه، وترويسات Server / المزود.
هذا هو السؤال الذي يجيب عنه هذا الدليل: أي مكدس يعالج مسار المحادثة هذا؟ ليس أي نقطة تفتيش، وليس أي عملية مرتبطة بالمنفذ، وليس من كتب إكمالًا.
ModelPrint طرح السؤال نفسه في المتصفح بتسعة مسابير. هذه الحزمة هي شكل سطر الأوامر والمكتبة: مسابير مُرقّمة، ومكتبة قابلة للتسجيل، وأدلة زوجية، وانجراف، ومسار مُرمِّز محلي لا يستدعي أبدًا واجهة برمجة تطبيقات استدلال مستضافة.
البصمة سجل JSON مُرقّم لقيم المسبار values. يجب أن يُعيد كل مسبار القيمة نفسها عند ضرب نفس المكدس مرتين. الطوابع الزمنية والمعرّفات ووقت الاستجابة والمفاتيح تُزال.
حسابات المُرمِّز تعيد استخدام نصوص 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 فقط. لا يوجد --api-key.
client.py HttpTransport, InProcessTransport, redact_secrets
probes.py 23 صف ProbeSpec (tokenizer / errors / shape / roles / limits / proxy)
engine.py تشغيل المجموعة ← Fingerprint
schema.py schema_version=1, probe_suite_version=lm-fingerprint-probes-v1
similarity.py تطابق تام موزون، تغطية، ثقة، ترتيب مكتبة، انجراف
library.py تسجيل / مطابقة. الصفوف المضمّنة تجهيزات تركيبية
synthetic.py مكدسات داخل العملية للاختبارات وللمكتبة المرفقة
hf.py AutoTokenizer محلي + ملف تحقق مسمّى. بلا أوزان
localmap.py التزام encode-pipeline-v2 (tokenizer.json بلغة rust)
proof.py هوية ModelPrint المقاسة بتسعة مسابير
report.py تقارير نصية
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).
بايثون 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، ولا واجهات برمجة تطبيقات إنتاج. اختبارات HF المحلية تُتخطى إذا لم يكن المُرمِّز مخزّنًا مؤقتًا.
pip install -e ".[hf]" # transformers, لـ 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
لا تمرّر المفتاح في سطر الأوامر. لا تجلود واجهات برمجة تطبيقات إنتاج لملء مكتبة عامة.
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. JSON الأقدم wireprint-fingerprint / stackprint-fingerprint ما يزال يُحمَّل.
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 لا يُحمّل الأوزان أبدًا ولا يستدعي Inference مستضافًا أبدًا.--api-key-env. يجب ألا تحتوي القطع الأثرية على sk- أو Authorization.scripts/repro.py هو بوابة المنتج. لا تدّعي النجاح إلا إذا شغّلته للتو.MIT. انظر LICENSE. نصوص مُرمِّز ModelPrint تبقى MIT (unclecode/modelprint) وبايتًا-بالبايت.
| تمتلك | ما يمكنك ملاحظته | ما تفعله هذه الأداة |
|---|
| رابط أساسي متوافق مع OpenAI ومصرح به + مفتاح | محادثة HTTP: الاستخدام، الأخطاء، الترويسات، SSE | fingerprint / compare / match / drift |
| ملفات مُرمِّز محلية | encode وchat_template | fingerprint-hf / verify-hf. الأوزان تبقى على القرص |
| لا شيء سوى host:port | لافتة / /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 | نص مُولَّد، أو سلالة، أو رموز مزروعة |