English translation is not available yet. Showing Russian content.
Что такое watermarking для LLM генераций и как его детектировать?
Краткий тезис
Watermarking для LLM — это метод встраивания скрытой сигнатуры в сгенерированный текст путём контролируемого изменения распределения вероятностей токенов. Детекция watermark основана на статистическом тесте, который проверяет, насколько часто встречаются токены из специального «зелёного» списка. Это позволяет надёжно отличать текст, сгенерированный конкретной LLM, от человеческого или текста другой модели, что критически важно для атрибуции контента и безопасности в Agentic RAG-системах.
1. Термин: Watermarking (водяной знак) для LLM
Watermarking — это техника внедрения невидимой метки в выходные данные модели. В отличие от традиционного watermarking в изображениях (где изменяются пиксели), в LLM метка встраивается в распределение токенов — вероятности выбора каждого следующего слова. Изменение настолько мало, что не влияет на качество текста для человека, но детектируется статистически.
Ключевые свойства:
- Незаметность (imperceptibility): текст с watermark неотличим от обычного по смыслу и стилю.
- Робастность (robustness): watermark выдерживает атаки (перефразирование, обрезание).
- Детектируемость (detectability): можно однозначно определить наличие метки.
- Эффективность (efficiency): генерация и детекция не требуют значительных вычислительных ресурсов.
2. Зачем нужен watermarking для LLM?
- Атрибуция контента: определить, какая модель сгенерировала текст (например, при утечке или в судебных разбирательствах).
- Предотвращение злоупотреблений: фейковые новости, спам, фишинг — watermark позволяет отследить источник.
- Отслеживание утечек: если модель используется в закрытой системе, watermark помогает выявить несанкционированное копирование генераций.
- Соответствие регуляциям: законы (AI Act в Европе) требуют маркировки AI-контента.
- Безопасность RAG|Agentic RAG: агент может встраивать watermark в ответы, чтобы доказать их подлинность и предотвратить инъекции.
3. Как работает watermarking: изменение распределения токенов
Основная идея: на каждом шаге генерации мы разделяем словарь на две части — зелёный список (green list) и красный список (red list). Разделение определяется детерминированным хэшем от предыдущих токенов, чтобы детектор мог воспроизвести то же разбиение без доступа к модели. Затем мы увеличиваем логиты (логарифмы вероятностей) для зелёных токенов на некоторую величину delta. В результате модель с большей вероятностью выбирает зелёные токены, и в сгенерированном тексте их доля статистически значимо превышает baseline (например, 50%).
Псевдокод генерации с watermark:
import hashlib
import numpy as np
def generate_with_watermark(prompt, model, tokenizer, green_ratio=0.5, delta=2.0, max_length=100):
tokens = tokenizer.encode(prompt)
for _ in range(max_length):
logits = model(tokens) # shape: [vocab_size]
# хэш последнего токена для детерминированного разбиения
seed = int(hashlib.sha256(str(tokens[-1]).encode()).hexdigest(), 16)
rng = np.random.RandomState(seed)
vocab_indices = list(range(len(logits)))
rng.shuffle(vocab_indices)
split = int(green_ratio * len(vocab_indices))
green_list = vocab_indices[:split]
# увеличиваем логиты для зелёных токенов
logits[green_list] += delta
# семплирование
probs = np.exp(logits) / np.sum(np.exp(logits))
next_token = np.random.choice(len(logits), p=probs)
tokens.append(next_token)
return tokenizer.decode(tokens)
Важно: хэш берётся от предыдущего токена (или от окна предыдущих токенов), чтобы разбиение менялось на каждом шаге и атакующий не мог предсказать зелёный список.
4. Алгоритмы watermarking
Существует несколько подходов, различающихся по способу разбиения словаря и величине смещения.
| Алгоритм | Описание | Преимущества | Недостатки |
|---|---|---|---|
| KGW (Kirchenbauer et al.) | Оригинальный метод: хэш предыдущего токена, green/red list, фиксированное delta. | Простота, высокая скорость, хорошая детекция. | Чувствителен к атакам перефразирования. |
| Aaronson (Aaronson & Kirchner) | Использует Gumbel-max trick для детерминированного выбора с учётом watermark. | Более робастен к атакам, не требует изменения логитов. | Сложнее в реализации, требует доступа к logprobs. |
| Soft watermarking | Малое delta (например, 0.5), почти незаметен. | Высокая imperceptibility. | Низкая робастность, легко разрушается. |
| Hard watermarking | Большое delta (например, 5.0), сильно меняет распределение. | Высокая робастность. | Заметен (текст может стать менее разнообразным). |
| Black-box watermarking | Встраивается через API, используя возвращаемые logprobs. | Не требует доступа к весам модели. | Медленнее, менее надёжен. |
5. Детекция watermark: статистический тест
Детекция основана на гипотезе: если текст сгенерирован моделью с watermark, то доля зелёных токенов в нём будет значимо выше, чем ожидаемое значение green_ratio. Для проверки используется z-тест (нормальное приближение биномиального распределения).
Формула:
z = (observed_green - expected_green) / std
где:
observed_green— количество зелёных токенов в тексте (длиной n токенов, первый токен не учитывается, так как для него нет предыдущего).- expected_green = n * green_ratio
- std = sqrt(n * green_ratio * (1 - green_ratio))
Если z > threshold (обычно 4, что соответствует p-value < 0.0001), watermark считается обнаруженным.
Пример кода детектора:
def detect_watermark(text, tokenizer, green_ratio=0.5):
tokens = tokenizer.encode(text)
n = len(tokens) - 1 # первый токен не имеет предыдущего
if n == 0:
return 0, False
green_count = 0
for i in range(1, len(tokens)):
seed = int(hashlib.sha256(str(tokens[i-1]).encode()).hexdigest(), 16)
rng = np.random.RandomState(seed)
vocab_indices = list(range(tokenizer.vocab_size))
rng.shuffle(vocab_indices)
split = int(green_ratio * len(vocab_indices))
green_list = vocab_indices[:split]
if tokens[i] in green_list:
green_count += 1
expected = n * green_ratio
std = np.sqrt(n * green_ratio * (1 - green_ratio))
z = (green_count - expected) / std
return z, z > 4.0
Важно: детектор должен использовать то же разбиение (тот же хэш-алгоритм и green_ratio), что и генератор.
6. Метрики качества watermarking
- Imperceptibility (незаметность): измеряется через perplexity (перплексия) модели на тексте с watermark и без. Чем меньше разница, тем незаметнее. Также проводят human evaluation.
- Robustness (устойчивость): доля текстов, в которых watermark сохранился после атаки (например, перефразирования). Измеряется как detection rate после атаки.
- Efficiency (эффективность): время генерации и детекции. Watermark не должен существенно замедлять инференс.
- False positive rate (FPR): вероятность ошибочно детектировать watermark в человеческом тексте. Должен быть близок к 0 (например, < 0.001).
7. Атаки на watermarking и устойчивость
| Атака | Описание | Влияние на watermark | Контрмеры |
|---|---|---|---|
| Перефразирование (paraphrasing) | Текст переписывается другой LLM. | Может полностью разрушить watermark, так как меняются токены. | Использовать более робастные алгоритмы (Aaronson), увеличивать delta, встраивать watermark в семантику. |
| Обрезание (trimming) | Удаление первых или последних токенов. | Если обрезано начало, теряется контекст для хэша. | Использовать скользящее окно хэша, встраивать watermark в середину. |
| Вставка/удаление (insertion/deletion) | Случайные изменения текста. | Может сдвинуть хэш-цепочку. | Использовать хэш от нескольких предыдущих токенов (n-граммы). |
| Подмена (spoofing) | Атакующий пытается подделать watermark другой модели. | Требует знания параметров (green_ratio, delta). | Использовать секретный ключ при хэшировании. |
| Атака через другую модель | Генерация текста без watermark, затем добавление watermark поверх. | Сложно, так как нужно точно воспроизвести распределение. | Использовать watermark, встроенный в процесс генерации, а не пост-обработку. |
8. Сравнение методов watermarking (таблица)
| Метод | Imperceptibility | Robustness | Efficiency | Детекция | Сложность реализации |
|---|---|---|---|---|---|
| KGW (hard) | Средняя | Высокая | Высокая | Стат. тест (z) | Низкая |
| KGW (soft) | Высокая | Средняя | Высокая | Стат. тест (z) | Низкая |
| Aaronson | Высокая | Высокая | Средняя | Gumbel-тест | Средняя |
| Black-box | Низкая | Низкая | Низкая | API logprobs | Высокая |
9. Применение в Agentic RAG и безопасность
В контексте Agentic RAG watermarking решает несколько задач:
- Атрибуция ответов агента: каждый вызов инструмента (retrieval, генерация) может встраивать свой watermark, что позволяет отследить, какой компонент системы сгенерировал конкретный фрагмент.
- Обнаружение утечек данных: если агент использует конфиденциальные документы, watermark в ответе поможет выявить несанкционированное распространение.
- Прозрачность для пользователя: watermark может быть автоматически детектирован браузером или плагином, чтобы пометить AI-сгенерированный контент.
- Защита от инъекций: злоумышленник может попытаться внедрить вредоносный текст в ответ агента. Watermark позволяет проверить, что ответ действительно сгенерирован моделью, а не подменён.
10. Пет-проект для закрепления
Задача: Реализовать простую систему watermarking для небольшой LLM (например, GPT-2) и детектор.
Инструменты: Python, transformers, numpy, hashlib.
Шаги:
- Загрузить предобученную модель GPT-2 и токенизатор.
- Реализовать функцию generate_with_watermark(prompt, green_ratio=0.5, delta=2.0), используя хэш от предыдущего токена.
- Сгенерировать 100 текстов с watermark и 100 без (с той же моделью, но без смещения).
- Реализовать детектор detect_watermark(text), возвращающий z-оценку и булево значение.
- Проверить детектор на:
- Оценить imperceptibility: сравнить среднюю perplexity текстов с watermark и без.
- Провести атаку перефразированием: использовать другую модель (например, T5) для переписывания текстов с watermark и проверить, сохранился ли watermark.
Ожидаемый результат: Работающий скрипт, который генерирует текст с watermark и детектирует его с точностью > 99% (z > 4). Анализ влияния на качество (perplexity ухудшается не более чем на 5%) и устойчивость к перефразированию (детекция падает до 50-70% в зависимости от силы атаки).
11. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 359 | Детекция AI-сгенерированного текста |
| 360 | Атрибуция контента в LLM |
| 357 | Безопасность RAG-систем |
| 356 | Adversarial robustness LLM |
| 355 | Фильтрация контента и модерация |
| 350 | Этические аспекты LLM |
12. Навигация
- Предыдущий: 357
- Следующий: 359
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 357
- Следующий: 359
- Индекс: 00. Индекс разборов