Некоторые градированные меры
Для градированных метрик оценки извлечения ключевым является понятие градированной релевантности. В этих метриках извлеченный элемент может обладать разной степенью релевантности, которая выражается через значение rel_i.

🎯 Сниженный кумулятивный прирост (DCG@k)
Сниженный кумулятивный прирост (DCG@k) представляет собой градированную метрику оценки извлечения, учитывающую порядок, которая позволяет измерить полезность извлеченного результата с учетом его позиции в ранжировании. Вычисление происходит по следующей формуле:

В числителе формулы rel_i обозначает градированную релевантность извлеченного результата i, то есть количественную оценку того, насколько релевантен извлеченный фрагмент текста. Знаменатель же включает логарифм от ранга результата i. Это обеспечивает штраф за элементы, расположенные в нижней части списка, подчеркивая важность верхних позиций. Чем выше релевантность результата, тем больше вклад, но чем ниже его ранг, тем меньше итоговый вклад.
Рассмотрим это на простом примере:

В любом случае, основная проблема DCG@k заключается в том, что это сумма по всем релевантным элементам. Следовательно, набор с большим количеством элементов (большим k) или с более релевантными элементами неизбежно даст больший DCG@k. Например, при k=4 значение DCG@4 составит 28.19. Аналогично, DCG@6 будет выше, и так далее. По мере роста k метрика DCG@k обычно увеличивается за счет добавления новых результатов, если только дополнительные элементы не имеют нулевой релевантности. Однако это не всегда указывает на превосходство в производительности извлечения. Напротив, такая особенность создает трудности при сравнении наборов с разными значениями k на основе DCG@k.
Эта проблема успешно решается следующей градированной метрикой, которую мы разберем далее, — NDCG@k. Но прежде необходимо ввести IDCG@k, необходимый для вычисления NDCG@k.
🎯 Идеальный сниженный кумулятивный прирост (IDCG@k)
Идеальный сниженный кумулятивный прирост (IDCG@k), как следует из названия, соответствует DCG в идеальном сценарии, когда набор извлеченных результатов идеально ранжирован по релевантности. Посмотрим, как это выглядит для нашего примера:

Очевидно, для фиксированного k значение IDCG@k всегда равно или превышает любое DCG@k, поскольку оно отражает оценку для идеального извлечения и ранжирования результатов при данном k.
Наконец, теперь можно вычислить нормализованный сниженный кумулятивный прирост (NDCG@k), используя DCG@k и IDCG@k.
🎯 Нормализованный сниженный кумулятивный прирост (NDCG@k)
Нормализованный сниженный кумулятивный прирост (NDCG@k) является нормализованной версией DCG@k, которая устраняет указанную проблему и делает метрику сравнимой для наборов разного размера k. Вычисление NDCG@k происходит по простой формуле:

По сути, NDCG@k измеряет, насколько текущее извлечение и ранжирование близки к идеальному для заданного k. Это дает значение, которое действительно можно сравнивать при разных k. В нашем примере NDCG@5 будет:

В целом, NDCG@k варьируется от 0 до 1, где 1 означает идеальное извлечение и ранжирование результатов, а 0 — полное отсутствие порядка.
Как вычислить DCG и NDCG на Python?
Для расчета этих метрик оценки извлечения сначала требуется задать набор истинных значений, точно так же, как это делалось в первой части при вычислении Precision@K и Recall@K. Отличие в том, что вместо бинарной классификации релевантности (0 или 1) теперь присваивается градированная оценка релевантности; например, от полностью нерелевантного (0) до высоко релевантного (5). Таким образом, набор истинных значений будет включать фрагменты текста с наивысшими градированными оценками релевантности для каждого запроса.
Например, для запроса вроде «Кто такая Анна Павловна?» фрагмент, идеально соответствующий ответу, может получить оценку 3, частично упоминающий нужную информацию — 2, а полностью не связанный — 0.
Используя такие списки градированной релевантности для набора извлеченных результатов, можно вычислить DCG@k, IDCG@k и NDCG@k. Для обработки логарифмических членов применяется библиотека math Python:
import mathСначала можно определить функцию для расчета DCG@k следующим образом:
# DCG@k
def dcg_at_k(relevance, k):
k = min(k, len(relevance))
return sum(rel / math.log2(i + 1) for i, rel in enumerate(relevance[:k], start=1))Аналогичным образом вычисляется IDCG@k. По сути, IDCG@k — это DCG@k для идеального извлечения и ранжирования, поэтому его легко получить, рассчитав DCG@k после сортировки результатов по убыванию релевантности.
# IDCG@k
def idcg_at_k(relevance, k):
ideal_relevance = sorted(relevance, reverse=True)
return dcg_at_k(ideal_relevance, k)Наконец, после получения DCG@k и IDCG@k легко вычислить NDCG@k как их отношение. Более точно:
# NDCG@k
def ndcg_at_k(relevance, k):
dcg = dcg_at_k(relevance, k)
idcg = idcg_at_k(relevance, k)
return dcg / idcg if idcg > 0 else 0.0Как было объяснено, каждая из этих функций принимает на вход список градированных оценок релевантности для извлеченных фрагментов. Например, предположим, что для конкретного запроса, набора истинных значений и тестовых извлеченных результатов получен следующий список:
relevance = [3, 2, 3, 0, 1]Тогда градированные метрики извлечения рассчитываются с помощью функций:
print(f"DCG@5: {dcg_at_k(relevance, 5):.4f}")
print(f"IDCG@5: {idcg_at_k(relevance, 5):.4f}")
print(f"NDCG@5: {ndcg_at_k(relevance, 5):.4f}")Вот и все! Таким образом получаются градированные меры производительности извлечения для конвейера RAG на Python.
Наконец, подобно другим метрикам производительности извлечения, оценки метрики можно усреднить по различным запросам, чтобы получить более репрезентативную общую оценку.
В заключение
Этот пост о градированных мерах релевантности завершает серию публикаций о наиболее распространенных метриках для оценки производительности извлечения в конвейерах RAG. В частности, на протяжении серии были рассмотрены бинарные меры без учета порядка и с учетом порядка, а также градированные меры, что позволило получить всестороннее представление о подходах к этой задаче. Конечно, существуют и другие аспекты для оценки механизма извлечения в конвейере RAG, такие как задержка на запрос или количество отправляемых токенов контекста. Тем не менее, метрики, описанные в этих публикациях, охватывают основы оценки производительности извлечения.
Это дает возможность количественно оценивать, анализировать и в конечном итоге улучшать работу механизма извлечения, что способствует созданию эффективного конвейера RAG, генерирующего осмысленные ответы, основанные на выбранных документах.