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 — дифференцируемая модель, можно использовать его градиенты, чтобы синтезировать текст, эмбеддинг которого близок к заданному целевому вектору. Алгоритм (упрощённо):
- Выбрать целевой вектор (t) (например, средний эмбеддинг по множеству запросов).
- Инициализировать случайный текст (токены) (d_0).
- На каждой итерации:
- Вычислить эмбеддинг (E(d_k)).
- Вычислить loss: (\mathcal{L} = -[text](/wiki/text){sim}(E(d_k), t)) (или MSE с целевым вектором).
- Взять градиент по токенам: (\nabla_{d_k} \mathcal{L}).
- Сделать шаг в направлении увеличения близости (например, метод HotFlip или модификация через Gumbel-Softmax для дискретных токенов).
- Полученный текст (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.
Инструменты:
- langchain, chromadb, openai или sentence-transformers
- небольшой датасет (например, 100 документов по темам)
Шаги:
- Создать векторную базу с чанками.
- Обучить (или взять готовый) эмбеддер.
- Написать функцию, которая конструирует adversarial документ методом градиентной оптимизации (используя библиотеку textattack или вручную).
- Внедрить этот документ в базу.
- Продемонстрировать, что для случайных запросов вредоносный документ всегда в top-1.
- Реализовать защиту: порог similarity + second opinion с эмбеддером другой модели.
- Измерить 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-агента? |
Навигация
- Предыдущий: 598
- Следующий: 600
- Индекс: 00. Индекс разборов