Код Senior RAG обновлено

Отбор контекста через MMR

Условие

Реализуйте mmr(query_sims, doc_sims, k, lam):

  • query_sims[i]: сходство документа i с запросом;
  • doc_sims[i][j]: сходство документов i и j;
  • жадно выбирайте k документов: на каждом шаге берите невыбранный i с максимальным lam * query_sims[i] - (1 - lam) * max(doc_sims[i][j] по выбранным j); для первого шага штраф 0;
  • при равенстве (сравнивайте значения, округлённые до 9 знаков) берите меньший индекс.

Верните индексы в порядке выбора. Если документов меньше k, выберите все.

Примеры

mmr([0.9, 0.88, 0.5], [[1, 0.95, 0.1], [0.95, 1, 0.1], [0.1, 0.1, 1]], 2, 0.5) // [0, 2]
mmr([0.9, 0.88, 0.5], [[1, 0.95, 0.1], [0.95, 1, 0.1], [0.1, 0.1, 1]], 2, 1) // [0, 1]
mmr([0.3, 0.7], [[1, 0], [0, 1]], 5, 0.7) // [1, 0]

Как подойти

Подсказки: 1
  1. Штраф кандидата: максимум сходства с уже выбранными, max(..., default=0.0).

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.