MMR и разнообразие выдачи
Топ-k по чистой близости часто возвращает почти дубликаты: несколько кусков про одно и то же забивают контекст и не добавляют информации. MMR — простой жадный алгоритм, который балансирует релевантность и новизну одним параметром λ, и умение объяснить этот баланс — частый вопрос про RAG на собеседовании.
Интуиция
Представь: пользователь спрашивает «расскажи про плюсы и минусы удалённой работы». Ретривер честно возвращает топ-5 самых близких к запросу чанков — и все пять оказываются про экономию времени на дороге, потому что именно эта мысль ярче всего представлена в базе. Формально релевантность высокая, а по сути мы отдали LLM пять перефразировок одного тезиса. Про минусы и про командную работу — ни слова, хотя такие чанки в базе есть, просто чуть дальше по близости.
Проблема в том, что близость к запросу и полезность набора — разные вещи. Хороший набор из k документов должен быть не только релевантным, но и разнообразным (diverse): лучше пять разных граней темы, чем пять копий одной. Особенно это важно, когда куски базы частично дублируют друг друга — а в реальных корпусах near-дубликаты есть почти всегда.
Как это работает: формула MMR
MMR (Maximal Marginal Relevance, максимальная маргинальная релевантность) — жадный отбор. Мы строим итоговый список по одному документу: на каждом шаге выбираем тот, который максимизирует компромисс между близостью к запросу и новизной относительно уже выбранных:
Здесь sim(q, d) — близость документа к запросу (релевантность), а второе слагаемое — штраф за похожесть на самый близкий из уже отобранных документов. Параметр λ ∈ [0, 1] задаёт баланс:
- λ = 1 — чистая релевантность: штраф выключен, MMR берёт топ-k по близости и может собрать весь кластер дубликатов.
- λ = 0 — чистое разнообразие: релевантность игнорируется, отбор гонится только за непохожестью и легко утащит нерелевантное.
- На практике λ ≈ 0.5–0.7 — релевантность ведёт, но новизна не даёт набрать копий.
Дедупликация near-duplicate — частный случай MMR: даже при высоком λ второе слагаемое обнуляет ценность документа, почти совпадающего с уже выбранным.
Когда разнообразие помогает, а когда мешает
MMR — не бесплатная добавка, а размен, и включать его надо осознанно:
- Разнообразие важно для широких и многогранных вопросов: «расскажи про X со всех сторон», обзоры, сравнения плюсов и минусов, сборка контекста для длинного ответа. Здесь k копий одной мысли — прямая потеря.
- Разнообразие мешает узким фактовым вопросам: «какой порт по умолчанию у PostgreSQL?». Тут важна точность топ-1, а искусственное «разбегание» может подсунуть менее релевантный документ вместо верного. При маленьком λ легко утянуть нерелевантное.
По месту в пайплайне MMR — это переупорядочивание и отбор поверх уже найденных кандидатов, родственник реранкинга: реранкер уточняет релевантность каждого документа, MMR — оптимизирует полезность набора. Разнообразие бывает и на уровне генерации (сэмплирование, несколько ответов), но в RAG чаще всего его наводят именно на этапе отбора контекста.
- «Что делает параметр λ в MMR?» — балансирует релевантность (λ→1, риск дублей в выдаче) и новизну/разнообразие (λ→0, риск нерелевантности); на практике λ ≈ 0.5–0.7.
- «Зачем разнообразие в RAG?» — топ-k по чистой близости часто набивает контекст near-дубликатами; MMR отдаёт LLM разные грани темы вместо копий одного тезиса.
- «Когда MMR вредит?» — на узких фактовых вопросах, где важна точность топ-1; тогда λ держат высоким или отключают MMR.
- «Чем MMR отличается от реранкера?» — реранкер уточняет релевантность каждого документа отдельно, MMR оптимизирует состав набора с учётом уже выбранного (marginal relevance).