Перейти к содержимому
Экосистема AI Vibe

Разборы

Маркировка текста ChatGPT и учебный детектор на TypeScript: три режима доверия к черновику от LLM

Редакция 7 октября 2026 г.

Маркировка текста ChatGPT и учебный детектор на TypeScript: три режима доверия к черновику от LLM

Один абзац от ChatGPT или агента перед коммитом проходит три проверки: watermark ещё читается статистикой слов, синонимы его снимают, локальный детектор молчит. Ни один исход не отвечает на вопрос «писал человек». В демо на TypeScript без облачного API-ключа повторяют ту же схему keyed watermark: семь слотов словаря вместо production textGrain у OpenAI.

ChatGPT и Codex в ЕС: сигнал в словаре, не в невидимых символах

5 октября 2026 года OpenAI описала ответ на правила ЕС о происхождении текста. Для подходящего вывода ChatGPT и Codex в ЕС в ближайшие недели планируется невидимый watermark; в API для выбранных моделей watermark остаётся глобальным opt-in и по умолчанию выключен.

textGrain не прячет скрытые символы и лишние пробелы. Сигнал сидит в том, какие слова выбирает модель; глазами его не увидеть.

Публичного детектора для всех нет. Доступ по заявкам от одобренных исследователей и экспертных организаций, потому что и пропуски, и ложные срабатывания дорого стоят. В тех же документах прямо сказано: если watermark не нашли, это не доказательство ручного текста (короткий фрагмент, правки, перевод, другая модель). Кто гоняет LLM-черновики и AI-код в соло-цикле, не должен трактовать тишину чекера как «значит, мой коммит чистый».

textGrain: transport, synonym swap и порог в 200 токенов

В техотчёте textGrain генерация связывает токены с ключевой псевдослучайностью через optimal transport с Gumbel-стоимостями и KL-регуляризацией; entropy budget ограничивает потерю энтропии при сэмплировании. Детектору по открытому описанию нужны только сгенерированный текст и секретный ключ.

При целевой доле ложных срабатываний 1% OpenAI на блоге приводит для контента вроде psychology примерно ~80% отрывков на 200 токенов и ~95% на 400 токенах. Для математики детектирование заметно ниже: меньше свободы в лексике. На 400 токенах замена 10% слов синонимами снижает детектирование с ~92% до ~66%, а 25% замен опускает показатель до ~17%. Help center добавляет порог: существенный перефраз и перевод могут сделать watermark невосстановимым. По Code of Practice watermark не требуется для выводов короче 200 токенов и для фрагментов кода.

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

Запуск npx tsx watermark.ts: toy-модель, HMAC и swapSynonyms

На Dev.to показывают учебную схему, не textGrain: keyed watermarking того же семейства. Случайные числа управляют сэмплированием, детектор суммирует score и сравнивает с Gamma(n, 1). Форма теста как в отчёте, но без optimal transport, entropy budget и реального токенизатора.

Mock держит семь слотов словаря. Запуск через npx tsx watermark.ts, PRF через HMAC-SHA256 в node:crypto. Watermarked sampling берёт слово с максимальным log(prf) / p (эквивалент r^(1/p)), контекст из последних трёх слов. Атака swapSynonyms меняет долю слов синонимами из того же слота.

На toy-модели в репозитории гоняли 500 прогонов при цели 1% false positive. Для 14 слов чистый watermark даёт 95.6% детектов, при 10% synonym swap остаётся 62.4%, при 25% падает до 25.8%. Rigid (math-like) стиль держится около 18–22%. Это цифры игрушечной модели, не строки из таблицы OpenAI в блоге. Смешивать нельзя.

npx tsx watermark.ts

OpenAI отдельно пишет, что при включённом watermark не видели meaningful change в benchmark scores у своих моделей: распределение слов то же, меняется источник случайности. Для соло-цикла с агентами разумнее фиксировать происхождение текста в момент генерации, пока растёт доля AI-кода и вопрос «откуда этот фрагмент» всплывает в каждом ревью.

Где watermark не помогает ревью LLM-текста и кода

Watermark у OpenAI не устанавливает владение, ответственность, личность пользователя и не проверяет достоверность содержания. Короткие ответы ассистента, коммиты с преимущественно кодом и жёсткий перефраз перед публикацией попадают в зоны, где EU carve-out и деградация synonym swap совпадают с обычным циклом агента.

Логируйте источник (модель, промпт, время) при генерации, а не только постфактум статистику по словам. «Детектор не сработал» не равно ручному авторству: это совпадает с оговоркой OpenAI. Публичный детектор и open-source textGrain в help center описаны как планы без даты релиза; локальный учебный детектор нужен, чтобы понять механику, а не подменить политику провайдера.

textGrain учит не доверять «отполированному» LLM-тексту. Учебный детектор на TypeScript даёт воспроизводимый эксперимент на своей машине, с явной границей между демо и production OpenAI.

Источники

  • Пост Dev.to (watermark/detector на TypeScript, toy-модель, synonym attack): Dev.to (доступ 2026-10-07 UTC)
  • OpenAI, Our approach to EU text provenance rules: https://openai.com/index/eu-text-provenance/ (доступ 2026-10-07 UTC)
  • OpenAI Help Center, Provenance signals in OpenAI-generated content: https://help.openai.com/en/articles/8912793-provenance-signals-in-openai-generated-content (доступ 2026-10-07 UTC)
  • Техотчёт textGrain (PDF): https://cdn.openai.com/pdf/e9508624-d767-41b6-a26d-e34ca798ada6/textgrain-entropy-calibrated-watermarking-for-language-model-text.pdf (доступ 2026-10-07 UTC)