English translation is not available yet. Showing Russian content.

Что такое adversarial retrieval (атака на retrieval компонент RAG)?

Краткий тезис

Adversarial retrieval — это целенаправленная атака на этап поиска документов в RAG-системе. Злоумышленник создаёт специально сконструированные документы, эмбеддинги которых имеют высокую близость (similarity) с широким спектром запросов, так что retrieval всегда возвращает их первыми. В результате LLM видит только вредоносный документ, игнорируя релевантные, что позволяет атакующему контролировать ответ системы. Защита включает регуляризацию similarity, пороговые детекторы и ансамблевые методы.


1. Что такое adversarial retrieval в контексте RAG

Adversarial retrieval (состязательный поиск) — это подкатегория adversarial attacks, нацеленных на компонент retrieval в RAG (Retrieval-Augmented Generation). В отличие от атак на саму LLM (например, prompt injection), здесь атакующий модифицирует базу документов так, чтобы она стала источником дезинформации.

Основная цель — внедрить в векторную базу документ, который будет извлекаться с высокой вероятностью для любого запроса, переопределяя контекст, подаваемый генератору. Атакующий может как контролировать часть документов (например, через отзывы пользователей), так и полностью синтезировать их (если система индексирует открытые данные).


2. Механизм атаки: почему retrieval уязвим

Retrieval в RAG обычно основан на косинусной близости (cosine similarity) между эмбеддингом запроса и эмбеддингами чанков. Чтобы атака сработала, нужно сделать эмбеддинг вредоносного документа близким к эмбеддингам множества разных запросов. Формально:

Пусть (E(q)) — эмбеддинг запроса (q), (E(d)) — эмбеддинг документа (d). Векторная база возвращает документы с максимальным ([text](/wiki/text){sim}(E(q), E(d))). Атакующий хочет найти документ (d^*) такой, что:

[ \forall q \in Q_{[text](/wiki/text){target}} : [text](/wiki/text){sim}(E(q), E(d^*)) > [text](/wiki/text){sim}(E(q), E(d_{[text](/wiki/text){relevant}})) ]

где (Q_{[text](/wiki/text){target}}) — множество запросов, на которые злоумышленник хочет повлиять, а (d_{[text](/wiki/text){relevant}}) — действительно релевантные документы.


3. Градиентная оптимизация для конструирования adversarial документа

Самый мощный метод — градиентная оптимизация в пространстве эмбеддингов. Поскольку embedding encoder — дифференцируемая модель, можно использовать его градиенты, чтобы синтезировать текст, эмбеддинг которого близок к заданному целевому вектору. Алгоритм (упрощённо):

  1. Выбрать целевой вектор (t) (например, средний эмбеддинг по множеству запросов).
  2. Инициализировать случайный текст (токены) (d_0).
  3. На каждой итерации:
    • Вычислить эмбеддинг (E(d_k)).
    • Вычислить loss: (\mathcal{L} = -[text](/wiki/text){sim}(E(d_k), t)) (или MSE с целевым вектором).
    • Взять градиент по токенам: (\nabla_{d_k} \mathcal{L}).
    • Сделать шаг в направлении увеличения близости (например, метод HotFlip или модификация через Gumbel-Softmax для дискретных токенов).
  4. Полученный текст (d^*) будет иметь эмбеддинг, близкий к (t), и, следовательно, будет извлекаться для любых запросов, чьи эмбеддинги лежат рядом с (t).

Важно: на практике эмбеддинги LLM/эмбеддеров часто нормализованы, и расстояние между разными запросами может быть большим. Атакующий может создать несколько вредоносных документов, покрывающих разные кластеры запросов.


4. Последствия атаки

Если атака успешна, система ведёт к:

  • Игнорирование релевантных документов: LLM не получает истинный контекст, ответы становятся неверными.
  • Внедрение дезинформации: атакующий контролирует, какую информацию увидит LLM (например, ложные данные о продукте, политические агитации, фишинговые ссылки).
  • Падение доверия к системе: пользователи перестают доверять ответам, что может разрушить бизнес-ценность RAG.
  • Утечка данных: если атакующий может заставить retrieval вернуть документы, содержащие конфиденциальную информацию (непрямая атака).

Особенно опасна атака в agentic RAG, где агент может самостоятельно выполнять несколько шагов поиска — один вредоносный документ может исказить всю цепочку.


5. Методы защиты

5.1 Регуляризация retrieval (штраф за слишком высокие similarity)

Если документ имеет очень высокую близость ко многим разным запросам (например, >0.95), это подозрительно. Можно модифицировать ранжирование:

[ [text](/wiki/text){score}(q,d) = [text](/wiki/text){sim}(E(q), E(d)) - \lambda \cdot [text](/wiki/text){penalty}(d) ]

где ([text](/wiki/text){penalty}(d)) — например, максимальная близость (d) с случайной выборкой запросов. Если документ аномально близок ко всем, он отодвигается вниз.

5.2 Threshold на similarity

Ввести порог: если similarity > 0.95 (настраиваемый), помечать документ как suspicious и исключать из контекста или требовать дополнительной верификации.

SUSPICIOUS_THRESHOLD = 0.95

def safe_retrieve(query, top_k=5):
    results = vector_db.similarity_search(query, k=top_k * 2)
    filtered = []
    for doc, score in results:
        if score > SUSPICIOUS_THRESHOLD:
            doc.metadata["suspicious"] = True
            continue  # или отправлять на проверку
        filtered.append((doc, score))
    return filtered[:top_k]

5.3 Second opinion (несколько retrieval моделей)

Использовать два или более разных embedding models (например, text-embedding-3-small и bge-large). Если только одна модель высоко ранжирует документ, а другая нет — это признак атаки. Решение: majority vote или консенсус.

МетодПреимуществаНедостатки
Одна модель с порогомПростота, низкая задержкаЛожные срабатывания на естественно похожих документах
РегуляризацияАдаптивно к распределениюСложнее реализовать, требует статистики
Ансамбль моделейВысокая устойчивостьУдвоение стоимости и latency

5.4 Обучение с защитой (adversarial training)

Включить в процесс fine-tuning эмбеддера примеры adversarial документов, чтобы модель училась не придавать им высокую близость. Это сложный, но фундаментальный подход.


6. Пример кода: симуляция атаки (учебная)

Ниже показан концептуальный псевдокод на Python с использованием openai и torch:

import torch
import openai

def adversarial_text(encoder, target_vector, num_steps=100, lr=0.01):
    # Начальный случайный текст (инициализация токенов через Gumbel-Softmax)
    tokens = torch.randint(0, vocab_size, (max_len,))
    tokens = torch.nn.functional.one_hot(tokens, num_classes=vocab_size).float()
    tokens.requires_grad = True

    optimizer = torch.optim.Adam([tokens], lr=lr)

    for step in range(num_steps):
        # Получаем эмбеддинг текста (дифференцируемый)
        emb = encoder(tokens)  # shape: (d_model,)
        loss = -torch.cosine_similarity(emb.unsqueeze(0), target_vector.unsqueeze(0))
        loss.backward()
        optimizer.step()
        # Проецируем на симплекс (чтобы токены были вероятностными)
        tokens.data = torch.softmax(tokens.data, dim=-1)

    # Дискретизация: argmax для получения токенов
    discrete_tokens = torch.argmax(tokens, dim=-1)
    return tokenizer.decode(discrete_tokens)

Важно: такой код работает только в исследовательских целях. Реальные системы требуют доступа к градиентам модели эмбеддинга.


7. Пет-проект для закрепления

Задача: Реализовать простой RAG-чат-бот и провести учебную атаку adversarial retrieval.

Инструменты:

Шаги:

  1. Создать векторную базу с чанками.
  2. Обучить (или взять готовый) эмбеддер.
  3. Написать функцию, которая конструирует adversarial документ методом градиентной оптимизации (используя библиотеку textattack или вручную).
  4. Внедрить этот документ в базу.
  5. Продемонстрировать, что для случайных запросов вредоносный документ всегда в top-1.
  6. Реализовать защиту: порог similarity + second opinion с эмбеддером другой модели.
  7. Измерить hit rate до и после защиты.

Ожидаемый результат:

  • До защиты: атака успешна (HR@1 = 1.0 для любого запроса, релевантные документы не показываются).
  • После защиты: HR@1 возвращается к норме (релевантные документы снова на первом месте).

8. Связь с другими вопросами

ВопросТема
597Что такое agentic RAG и как он работает?
598Какие типы архитектур agentic RAG существуют?
600Как обеспечить безопасность agentic RAG?
590Как вы защищаете RAG от prompt injection?
595Что такое RAG с верификацией фактов (fact-checking)?
605Как детектировать аномалии в поведении AI-агента?

Навигация