Когда переводчик сходит с ума: что такое галлюцинации в NMT
Вы доверяете машинному переводу контракты, медицинские инструкции или техническую документацию? А зря. Современные NMT модели, даже на архитектуре Transformer 2026 года, иногда выдают откровенную чушь, причём с высокой уверенностью. Это и есть галлюцинации - когда модель генерирует текст, не имеющий отношения к исходному предложению.
Проблема в том, что традиционные метрики типа BLEU или TER не ловят эти ошибки. Модель может перевести "The patient has a fever" как "У пациента жар" (правильно) или как "У пациента весёлое настроение" (галлюцинация), и обе фразы получат схожий BLEU score, если в референсах есть похожие слова.
Внимание: галлюцинации особенно опасны в low-resource языках или доменах, где данных мало. Модель, обученная на общих текстах, может "выдумывать" термины в медицинском или юридическом переводе.
Почему это происходит? Отчасти из-за того, что NMT модели - это черные ящики, и их уверенность не откалибрована. Модель может выдавать высокую вероятность для токена, но это не означает, что перевод семантически верен.
Здесь на помощь приходят два подхода: семантическая энтропия и анализ misalignment внимания. Первый измеряет неопределённость в смысловом пространстве, второй смотрит, как модель "смотрит" на исходный текст при генерации.
Внимание, внимание! Как misalignment выдает ложь модели
Механизм внимания в Transformer - это не просто фича, это окно в "мысли" модели. Когда модель переводит, она должна уделять внимание соответствующим частям исходного предложения. Но при галлюцинациях это внимание сбивается.
Misalignment внимания - когда веса внимания между исходными и целевыми токенами не соответствуют семантическим связям. Например, при переводе "I love apples" на русский, внимание должно быть на "love" и "apples". Если модель галлюцинирует и выдает "Я обожаю апельсины", внимание может быть рассеянным или сосредоточенным на нерелевантных токенах.
Анализ этого misalignment стал ключевым методом детекции галлюцинаций. Идея проста: если внимание модели "прыгает" по исходному тексту без логики, или если есть резкие скачки в весах внимания - это красный флаг.
Семантическая энтропия vs. Attention Misalignment: битва методов
Оба метода пытаются измерить неопределённость модели, но с разных сторон.
| Метод | Что измеряет | Плюсы | Минусы |
|---|---|---|---|
| Семантическая энтропия | Разброс в семантическом пространстве для различных генераций | Не зависит от архитектуры, работает с любой моделью | Требует multiple generations, вычислительно дорого |
| Attention Misalignment | Согласованность весов внимания между исходным и целевым текстом | Быстрый, не требует повторных генераций | Зависит от архитектуры с вниманием, может быть шумным |
Семантическая энтропия: вы генерируете несколько вариантов перевода (через sampling) и смотрите, насколько они семантически различны. Если варианты сильно разнятся, модель не уверена, и есть риск галлюцинаций.
Attention misalignment: вы анализируете веса внимания за один проход. Вычисляете метрики, например, дисперсию внимания по слоям или отклонение от идеального выравнивания.
Какой метод лучше? Зависит от контекста. Для реального времени, возможно, attention misalignment быстрее. Для точности - семантическая энтропия.
Пошаговый план: внедряем детектор галлюцинаций в ваш pipeline
Теперь к практике. Вот как вы можете внедрить детектирование галлюцинаций в ваш сервис перевода.
1 Выбор модели и инструментов
На 2026 год, актуальные NMT модели включают обновленные версии Transformer, такие как Transformer-4 от Google, или открытые модели типа NLLB-300 от Meta. Для работы с вниманием, вам нужен доступ к весам внимания модели.
Рекомендую использовать библиотеки типа Hugging Face Transformers (версия 5.0+ на 2026), так как они предоставляют удобный доступ к вниманию.
# Пример загрузки модели и токенизатора
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
model_name = "facebook/nllb-200-3.3B" # Пример, на 2026 может быть новее
model = AutoModelForSeq2SeqLM.from_pretrained(model_name, output_attentions=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)
2 Реализация детектора через attention misalignment
Определим метрику misalignment. Один из простых способов - вычислить дисперсию весов внимания по головам и слоям для каждого целевого токена.
import torch
import numpy as np
def compute_attention_misalignment(attentions, source_length, target_length):
"""
attentions: list of torch.Tensor, каждый тензор имеет форму
(batch_size, num_heads, target_length, source_length)
Возвращает скалярную метрику misalignment.
"""
# Простой пример: средняя дисперсия весов внимания по головам и слоям
all_variances = []
for layer_att in attentions: # для каждого слоя
# layer_att shape: (batch_size, num_heads, target_len, source_len)
for head_att in layer_att[0]: # для каждой головы в batch
# head_att shape: (target_len, source_len)
# Нормализуем веса внимания по исходной последовательности
normalized = head_att / head_att.sum(dim=-1, keepdim=True)
# Вычисляем дисперсию по исходным позициям для каждого целевого токена
variance = torch.var(normalized, dim=-1) # shape: (target_len,)
all_variances.append(variance.mean().item())
return np.mean(all_variances)
# Пример использования
with torch.no_grad():
inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model.generate(**inputs, return_dict_in_generate=True, output_attentions=True)
attentions = outputs.attentions # список внимания по слоям
misalignment = compute_attention_misalignment(attentions, inputs['input_ids'].shape[1], len(outputs.sequences[0]))
print(f"Attention misalignment score: {misalignment}")
Чем выше оценка, тем больше misalignment, и тем выше вероятность галлюцинации. Но нужно калибровать порог на валидационных данных.
3 Реализация детектора через семантическую энтропию
Для семантической энтропии, вам нужно сгенерировать несколько переводов и вычислить их семантическое разнообразие.
from sentence_transformers import SentenceTransformer
import numpy as np
# Модель для эмбеддингов, актуальная на 2026, например, all-MiniLM-L12-v3
embedder = SentenceTransformer('all-MiniLM-L12-v3')
def semantic_entropy(source_text, model, tokenizer, num_samples=10):
"""
Вычисляет семантическую энтропию для исходного текста.
"""
translations = []
for _ in range(num_samples):
# Генерация с sampling
inputs = tokenizer(source_text, return_tensors="pt")
outputs = model.generate(**inputs, do_sample=True, top_p=0.9, max_length=50)
translation = tokenizer.decode(outputs[0], skip_special_tokens=True)
translations.append(translation)
# Получаем эмбеддинги для всех переводов
embeddings = embedder.encode(translations)
# Вычисляем попарные косинусные расстояния
from sklearn.metrics.pairwise import cosine_distances
distances = cosine_distances(embeddings)
# Энтропия как среднее расстояние
entropy = np.mean(distances)
return entropy, translations
# Пример
source = "The patient has a fever."
entropy, samples = semantic_entropy(source, model, tokenizer)
print(f"Semantic entropy: {entropy}")
print(f"Samples: {samples}")
Высокая энтропия означает, что переводы разнообразны, и модель не уверена.
4 Интеграция в pipeline
Теперь объединим оба метода в единый детектор. Вы можете использовать ensemble: если любой из методов превышает порог, помечаем перевод как потенциальную галлюцинацию.
class HallucinationDetector:
def __init__(self, model, tokenizer, embedder, attention_threshold=0.1, entropy_threshold=0.5):
self.model = model
self.tokenizer = tokenizer
self.embedder = embedder
self.attention_threshold = attention_threshold
self.entropy_threshold = entropy_threshold
def detect(self, source_text):
# Attention misalignment
inputs = self.tokenizer(source_text, return_tensors="pt")
outputs = self.model.generate(**inputs, return_dict_in_generate=True, output_attentions=True, max_length=50)
attentions = outputs.attentions
misalignment = compute_attention_misalignment(attentions, inputs['input_ids'].shape[1], len(outputs.sequences[0]))
# Semantic entropy
entropy, _ = semantic_entropy(source_text, self.model, self.tokenizer, num_samples=5)
# Решение
is_hallucination = misalignment > self.attention_threshold or entropy > self.entropy_threshold
return {
"is_hallucination": is_hallucination,
"attention_misalignment": misalignment,
"semantic_entropy": entropy
}
detector = HallucinationDetector(model, tokenizer, embedder)
result = detector.detect("The patient has a fever.")
print(result)
Ошибки, которые сломают ваш детектор (и как их избежать)
Реализация кажется прямой, но есть подводные камни.
- Пороги наугад: Не устанавливайте пороги для misalignment или энтропии без валидации. Используйте размеченные данные с галлюцинациями, чтобы найти оптимальные значения. Если нет данных, симулируйте галлюцинации через adversarial examples.
- Игнорирование домена: Детектор, обученный на новостных текстах, может плохо работать на медицинских. Калибруйте для каждого домена отдельно.
- Слепая вера в внимание: Attention weights могут быть обманчивы. В некоторых архитектурах, внимание не всегда соответствует семантической важности. Всегда проверяйте на реальных примерах.
- Производительность: Семантическая энтропия требует multiple generations, что медленно. Для реального времени, используйте только attention misalignment или кэшируйте эмбеддинги.
Совет: для калибровки порогов, создайте датасет с галлюцинациями. Можно использовать методы из статьи Когда LLM врет: отлавливаем галлюцинации линейкой в векторном пространстве, чтобы генерировать примеры.
Что дальше? Будущее детектирования галлюцинаций
К 2026 году, методы детекции станут более интегрированными в модели. Уже сейчас появляются модели с встроенной калибровкой неопределённости. Возможно, в будущем, NMT модели будут выдавать не только перевод, но и оценку его надежности.
Но пока, вам придется внедрять детекторы самостоятельно. Используйте attention misalignment для скорости, семантическую энтропию для точности, и всегда проверяйте на своих данных.
И помните: машинный перевод - это инструмент, а не истина в последней инстанции. Особенно в критических приложениях, человеческий надзор все еще необходим.
Для тех, кто работает с LLM в других областях, например, для OCR или понимания документов, похожие методы могут быть применены для детекции ошибок. См. От OCR к ADE: полный гайд по автоматическому пониманию документов с помощью AI.