惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fox-IT International blog
Recent Announcements
Recent Announcements
D
Docker
IT之家
IT之家
B
Blog
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
量子位
C
Check Point Blog
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 司徒正美
李成银的技术随笔
美团技术团队
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
L
LangChain Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
T
Tailwind CSS Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
小众软件
小众软件
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
M
Microsoft Research Blog - Microsoft Research
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog

Все публикации подряд на Хабре

Как приоритизировать регрессионные проверки, когда сжаты сроки релиза Электронные транспортные накладные: технический разбор нововведений 2026 года для логистов, разработчиков и бизнеса Хабру 20 лет — зовём вас отметить это к нам Домой iPad как инструмент разработчика в эпоху агентного программирования Inspector v3: как я сделал свой центр управления Kubernetes на старом ноутбуке Как мы осваивали производство гибко-жёстких печатных плат: от проб и ошибок к рабочей технологии 30 лет мы внедряли в России Ansys. А потом он ушёл — и пришлось садиться писать собственный CAE для аддитивной печати Цифровой рубль и цифровой чек Облако под защитой от DDoS: чем On-Demand отличается от Always-On Распродажа в издательстве «Питер» Почему современный стадион больше похож на ЦОД, чем на арену Машина, которая учится думать Запихнули игровую приставку в короб и в первый же месяц продали на 3 млн Игровой ноутбук vs игровой ПК за те же деньги: что изменилось в 2026 году ГИС для Minecraft. Часть 1 Смена старого оборудования на новое убирает огромные затраты на его эксплуатацию — но куда девать всё это старое? Project Manager 2026: как AI-инструменты меняют профессию SLA как инструмент, а не отчёт. Часть 1. Как подружить бизнес и инженеров через общие цифры Послания от ангелов и первый шаг к компьютерам: стеганография Средневековья и Ренессанса Что новенького есть в CSS в 2026 году? Хватит мучить ChatGPT. Почему ваш промпт не сработает Как и зачем мы писали семантический слой для ИИ аналитики – SLayer Маленькая EVPN/VXLAN-фабрика без тупика: как мы запускали площадку в Амстердаме Репликация по DDIA: что я понял, только когда сам сломал прод RAG без downtime: настраиваем инкрементальное обновление документов на Qdrant и LangChain Тени истории: война машин. Как «Энигма» и «Фиалка» определили исход Второй мировой войны Как ускорить распознавание объектов нейросетями среди множества классов, не жертвуя памятью и точностью Как я хотел две странички для SAMBA и NFS, а сделал полноценную панель управления NAS на 20+ страницах Kubernetes для баз данных? CloudNativePG делает PostgreSQL по-настоящему Cloud-Native Как мы анализировали поведение пользователей Яндекс Музыки на 50 млн событий Как я разработал PoC-конструктор для приложений Android Стек российского сисадмина в 2026 Как я сделал обычную посудомоечную машину умной, с Home Assistant/ESPHome Контент-завод в 2026 году: разбор автономных систем, который отговорит вас это покупать I just want an agent. Часть 2. Как мы построили виртуальную команду для разработки ИИ-агентов Прототип игры с помощью Flowith: личный опыт и ограничения AI-инструмента Что вы не знаете об альтернативных документах, удостоверяющих личность Программные модули в DATAREON Platform: выносим повторяющуюся логику в C# функции Не прячьте интерфейс в код: защищаем внешний вид как промобразец, изобретение и товарный знак Могут ли взрослые учить язык как дети? Технология многовидового представления в nanoCAD BIM Строительство DRAйверы для GPU: как Kubernetes научился выделять устройства через стандартный API Рубрика эксперименты (в дизайне): наш опыт генерации и проверки гипотез Как повысить KPI сотрудников с помощью ИИ-агентов Визуализация данных как язык XXI века: от аналитики к сторителлингу Gradle под капотом: как перестать страдать и заставить сборку летать На что предприниматели делают ставку для роста в кризис? Результаты исследования Go-to-Market Academy Улучшить качество фото — задача на 1 минуту в SpeShu.AI Анти-кейс: внедрили Битрикс24, через полгода клиент вернулся на самописную CRM. Разбор ошибок Браузеры подстраиваются под большие сайты Почему ломается ваш AI-агент — и почему смена модели обычно его не чинит Распределённая система мониторинга и аналитики присутствия людей в инфраструктурных объектах без использования камер Почему российские компании остаются на серой Jira [Перевод] Тонус в реактивных системах Факап инженера АСУ ТП, как мы перепутали физические COM-порты на подстанции Как уместить DOOM в QR-код Cache is hard — почему инвалидация кэша — это проблема согласованности, а не производительности Щелевая коррозия: порча нержавейки и «ржавые» имплантаты — почему это происходит? Строим первую линию техподдержки на n8n за 250$ в месяц. Часть 2 Покопались в .cursorrules на GitHub и нашли там волка-фурри, Star Trek и 28.7% копипасты Не наступайте на наши грабли, если собираетесь использовать Temporal Как создать дебат-клуб в компании: пошаговое руководство от бизнес-тренера Как экономят на метановых автозаправках Самодельный elgato-like макропад. Часть 1, железная Всё есть код, или зачем внедрять GitOps в разработку Как получить root на Urovo DT40 Pro (CT48): Android 12 (Проверено на практике) C# мне нравится больше Java. Но в банковском enterprise мне всё равно понадобилась Java Биткоин на Московской бирже — что это? Как мы переводим миллионы iOS-пользователей на новое приложение каждые несколько месяцев Кейс. Zero Bug Policy: как мы снизили бэклог багов в 4 раза за месяц Shadow AI: 80% сотрудников уже пишут в ChatGPT. Почему мы делим задачи на красные, зелёные и серые Попытка пересмотреть ограничения рынка тяжелых БАС: нужен ли вообще кому-то легкий и дешевый электромотор Менеджер, который хакнул систему. И что AI на самом деле умножает Spec-driven development в микросервисах, часть 2: как archspec делает контекст сервисов явным Запись в Kubernetes: как контроллеры учились не перезаписывать друг друга Игровой движок 2.5D, короткие тренировки для ПК-пользователей –и еще 8 российских стартапов MCP в системе управления проектами: как поручить ИИ работу с корпоративными данными Бэклог болей: как hh работает с тем, что не нравится пользователям brec: контролируемая обратная совместимость протокола AI обнулил benchmark и пытался шантажировать инженера. И почему это решаемо Почему пластиковый корпус оказался в 3 раза дороже металлического Как спроектировать API, которое не придется переписывать через полгода Трекинг посетителей на fisheye-камерах: задача “со звездочкой” Красивый скриншот вашего кода. Большое обновление Я создаю проекты без единого созвона с командой Content Pipeline в MonoGame: почему я его не использую Гемблинг партнерки: Как выбрать, ТОП 5 в 2026 За пределами LLM, часть 2: якорная таблица Кэли, которая не является ни полем, ни моноидом Pixverse купить подписку: для чего нужна Пиксверс подписка, как выбрать тариф и оплатить в рублях Meshy AI нейросеть: как создавать 3D-модели из текста и изображений в Меши АИ на русском бесплатно Skywork AI: как использовать Скайворк АИ нейросеть на русском бесплатно, работать с промтами и создавать видео Технотекст 8: победа естественного интеллекта Capacitor: от веба к мобильным приложениям. Часть 4. Интегрируем локальный LLM в проект 20 лет видеокарт в цифрах: как росли FLOPS и TDP и кто вёл в дуэли NVIDIA vs AMD (+ открытый датасет на 13 500 GPU) Архитектура крипто-сканера для биржи: Open Interest, Funding Rate, EMA и MACD в реальном времени @tanstack/vue-table: почему я почти отказался от этого… WHERE превращает ваш LEFT JOIN в INNER JOIN. И никто вам об этом не скажет Гравитация не существует. Вы задали 454 вопроса о времени. Вот ответы с уравнениями Эйнштейна Конец бесплатного кремния: как Google AI Studio превратилась из рая для инженеров в симулятор смены аккаунтов Свой AI-агент из почты, systemd и LLM
Как определить LLM под капотом чат-бота: учебный эксперимент по black-box fingerprinting
Pronomuos · 2026-05-26 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение6 мин

Охват и читатели0

Введение

Когда мы тестируем LLM-приложение в режиме black box, мы видим только интерфейс: отправили сообщение — получили ответ. При этом модель под капотом может быть любой: DeepSeek, Qwen, GLM, Mistral, Llama, Claude, GPT, Gemini или локальная fine-tuned модель. Для обычного пользователя это часто неважно. Для security-тестирования — важно.

В AI cybersecurity это часть reconnaissance: перед тем как оценивать устойчивость приложения к prompt injection, jailbreak-попыткам, утечкам системного промпта или ошибкам в RAG-слое, полезно понимать, какая модельная семья работает внутри. Разные модели по-разному отвечают на странные Unicode-строки, mixed-language запросы, вопросы о собственной идентичности, спорные утверждения и безопасные отказы.

Я попробовал воспроизвести идею статьи LLMmap: Fingerprinting For Large Language Models в упрощённом виде: собрать одинаковые probe-промпты с нескольких моделей OpenRouter и проверить, можно ли отличать модели по совокупности ответов.

Что такое LLM fingerprinting

LLM fingerprinting — это попытка определить модель или модельную семью по наблюдаемому поведению. Аналогия из классического security — OS fingerprinting: мы не видим операционную систему напрямую, но можем отправлять сетевые пакеты и смотреть, как система отвечает.

С LLM всё похоже: probe prompt → black-box chatbot → response

Один ответ почти ничего не доказывает. Модель может галлюцинировать, скрывать своё имя, быть обёрнута system prompt'ом или работать через RAG. Поэтому более надёжная идея — использовать не один вопрос вроде «какая ты модель?», а набор разных probe‑запросов и смотреть на поведение в совокупности.

В LLMmap эта идея формулируется как активный fingerprinting: отправляем заранее подобранные запросы, собираем пары (query, response), а затем классифицируем модель по получившемуся behavioural trace.

В оригинальной статье авторы сообщают, что LLMmap определяет 42 версии LLM с точностью выше 95% при использовании всего 8 взаимодействий. Важно: это результат их полноценного research setup — с большим набором моделей, специальной процедурой выбора probe-запросов, train/test разделением по prompting configurations и обученной inference model. В этом проекте я не пытаюсь заявить такую же точность. Цель ниже скромнее: сделать учебную MVP-реплику идеи и проверить, появляется ли похожий сигнал на маленьком датасете.

Цель проекта

  1. Выбрать несколько фиксированных моделей в OpenRouter.

  2. Подготовить набор probe-промптов в стиле LLMmap.

  3. Собрать ответы всех моделей на одинаковые промпты.

  4. Разделить данные на train / validation / test.

  5. Проверить, сможет ли LLM-судья определить модель по нескольким ответам из test.

Модели

В текущем MVP использовались 4 модели OpenRouter с фиксированными model ID, без latest-алиасов:

Label

OpenRouter model ID

Семейство

deepseek_v4_flash

deepseek/deepseek-v4-flash

DeepSeek

qwen3_6_flash

qwen/qwen3.6-flash

Qwen

glm_5

z-ai/glm-5

GLM / Z.ai

mistral_medium_3_5

mistralai/mistral-medium-3-5

Mistral

Категории probe-промптов

Вместо обычного benchmark'а «математика / код / перевод» я использовал 6 категорий, вдохновлённых LLMmap-style подходом.

Всего в датасете 36 промптов: по 6 промптов на категорию.

Категория

Кол-во

Зачем нужна

banner_grabbing

6

Прямые вопросы о модели и разработчике

meta_information

6

Вопросы о cutoff, обучающих данных, ограничениях

alignment_refusal

6

Безопасные проверки стиля отказа

weak_alignment

6

Спорные или чувствительные утверждения без вредных инструкций

malformed_multilingual

6

Смешанные языки, странный ввод, необычная структура

prompt_wrapper

6

Обёртки, имитирующие влияние внешних инструкций

Примеры того, что здесь интересно измерять:

  • отвечает ли модель на прямой вопрос «кто ты?» или уходит в общую формулировку;

  • как модель объясняет свои ограничения;

  • насколько формален или подробен отказ;

  • как модель обрабатывает смешение языков;

  • насколько устойчиво следует формату;

  • добавляет ли лишние дисклеймеры;

  • как меняется стиль при “обёрнутых” запросах.

Как собирались данные

Для каждой модели каждый промпт запускался 4 раза. Параметры генерации были общими для всех моделей.

Итоговый размер полного набора: 4 модели × 36 промптов × 4 повтора = 576 строк JSONL

Одна строка JSONL — это один ответ одной модели на один prompt в одном repeat:

{
  "run_id": "openrouter_mvp_001",
  "sample_id": "qwen3_6_flash__banner_001__rep_0",
  "provider": "openrouter",
  "model_id": "qwen/qwen3.6-flash",
  "label": "qwen3_6_flash",
  "model_family": "qwen",
  "prompt_id": "banner_001",
  "prompt_category": "banner_grabbing",
  "prompt": "...",
  "system_prompt_id": "default_neutral_ru",
  "temperature": 0.7,
  "top_p": 1.0,
  "max_tokens": 512,
  "repeat_index": 0,
  "response": "...",
  "split": "train",
  "usage": {
    "prompt_tokens": null,
    "completion_tokens": null,
    "total_tokens": null
  },
  "error": null
}

Train / validation / test split

Поэтому split сделан по prompt_id: все повторы одного prompt остаются в одной выборке.

Текущая схема:

train: 24 prompt_id
val:    6 prompt_id
test:   6 prompt_id

В val и test лежит по одному prompt на каждую из 6 категорий. При 4 моделях и 4 повторах test содержит: 4 модели × 6 test prompt’ов × 4 повтора = 96 строк

Как оценивалось качество

В этом MVP я не обучал отдельный sklearn/embedding-классификатор. Оценка сделана через few-shot LLM-as-judge baseline.

Схема такая:

  1. Из train-части берутся few-shot примеры ответов известных моделей.

  2. Для каждой истинной модели из test берётся набор её ответов.

  3. LLM-судье показываются few-shot примеры и test-ответы.

  4. Судья должен вернуть predicted_label.

Судья по умолчанию — openai/gpt-4o-mini

Важно: это не оценка по каждой строке test. Это multi-probe оценка: судья получает не один ответ, а несколько ответов одной и той же неизвестной модели.

Для одного прогона с trials=10 и четырьмя моделями получается: 10 trials × 4 модели = 40 решений судьи.

Результаты

В одном из прогонов результат получился таким:

micro accuracy ≈ 0.975
macro accuracy ≈ 0.975

На первый взгляд это число похоже на результат уровня LLMmap, где авторы говорят о точности.

Матрица ошибок:

true \ pred

deepseek_v4_flash

qwen3_6_flash

glm_5

mistral_medium_3_5

deepseek_v4_flash

10

0

0

0

qwen3_6_flash

1

9

0

0

glm_5

0

0

10

0

mistral_medium_3_5

0

0

0

10

То есть из 40 решений была одна ошибка: один раз ответы qwen3_6_flash были отнесены к deepseek_v4_flash. Остальные модели в этом прогоне были определены без ошибок.

На первый взгляд результат высокий. Но его нужно интерпретировать аккуратно.

Что он показывает:

  • на маленьком closed-set наборе поведенческие различия действительно заметны;

  • multi-probe подход работает лучше, чем попытка угадывать по одному ответу;

  • даже простой LLM-as-judge baseline может извлекать полезный сигнал из ответов.

Чего он не показывает:

  • что модель можно всегда определить с точностью 97.5%;

  • что метод устойчив к другим system prompt'ам;

  • что он будет работать на десятках моделей;

  • что он обобщается на production-чат-боты с RAG, guardrails и post-processing;

  • что это полноценная реализация LLMmap.

Ограничения

1. Мало моделей

Сейчас в MVP 4 модели. Это достаточно для демонстрации, но мало для полноценной статьи с сильными обобщениями. Следующий шаг — расширить набор до 6–10 моделей и добавить больше близких пар внутри одной семьи.

2. Маленький test set

В test всего 6 prompt_id. Лучше увеличить число test-промптов и запускать несколько разных split'ов.

3. Возможен bias судьи

LLM-судья может иметь свои предпочтения и скрытое знание о стиле моделей. Для более честной оценки нужно сравнить несколько судей и добавить классический ML baseline.

4. Нет open-set сценария

Сейчас задача closed-set: судья выбирает одну из известных моделей. В реальности модель может быть неизвестной. Для этого нужен класс unknown или отдельный open-set scoring.

Как развивать проект дальше

Самые полезные следующие шаги:

1. Расширить модели

2. Проверить устойчивость к system prompt

Сейчас используется один нейтральный system prompt. Следующий шаг — собрать несколько конфигураций:

нейтральный ассистент
корпоративный support bot
краткий technical assistant
строгий JSON-only assistant

Это приблизит эксперимент к реальным LLM-приложениям, где модель почти всегда обёрнута системной инструкцией.

3. Добавить open-set режим

Выводы

Эксперимент показал, что даже простой набор probe-промптов уже позволяет извлекать заметный behavioral fingerprint LLM-моделей. На небольшом closed-set наборе из 4 моделей few-shot LLM-судья смог определить модель по нескольким test-ответам с высокой точностью в одном прогоне.

Главный практический вывод: спрашивать «какая ты модель?» недостаточно. Гораздо полезнее собирать набор ответов на разные типы запросов: self‑identification, metadata, alignment, multilingual, malformed input и prompt wrappers. Именно совокупность ответов даёт сигнал.

Репозиторий

Ссылка на репозиторий с реализацией