В современном мире часто встречаются задачи с большим объемом данных, выполнение которых либо невозможно, либо сложно или затратно по времени/ресурсам автоматизировать обычными функциями и методами.
Одним из способов решения для таких случаев является применение AI с использованием RAG.
В этой статье мы постарались привести метрики для оценки качества работы подобных решений.
RAG (Retrieval Augmented Generation) - генерация ответов с использованием внешнего источника данных.
Говоря простым языком, это метод, при котором AI для выдачи ответа на поставленный вопрос использует не только общую базу знаний, на которых был обучен, но и специализированные материалы, которых, как правило, нет в свободном доступе.
В качестве примера допустим, что у вас в компании есть большое количество сотрудников и множество договоров с ними и с контрагентами. В какой-то момент вам понадобилось проверить, во всех ли договорах его положения согласуются с внутренней документацией или же недавними изменениями в законодательстве. Всегда есть риск того, что какой-то из договоров был составлен без соответствующего упоминания таких документов.
Какие есть способы решения поставленной задачи существуют?
Проверить всю документацию вручную;
Автоматизировать процесс проверки.
В первом случае есть очевидные минусы:
большие затраты времени и ресурсов;
человеческий фактор, когда на больших объемах данных ошибки в проверке становятся практически неизбежны.
Поэтому куда предпочтительнее выглядит вариант с автоматизацией.
Как автоматизировать процесс?
Можно пробовать поиск по ключевым фразам по всем документам.
Плюсы:
- Технически возможно осуществить без использования AI;
Минусы:
- Требует максимально полного описания всех возможных вариаций нужных для поиска фраз.
- Как следствие первого минуса, весьма вероятны неполное покрытие документации таким поиском, а также ложноположительные или ложноотрицательные результаты.
Например, одно и то же положение правил внутреннего распорядка или даже просто ссылка на отдельный документ, содержащий такие правила, могут быть представлены в разных документах по-разному.
Автоматизация с помощью AI:
- обучение собственной модели для поиска нужной информации
- использование RAG
Вариант с обучением собственной модели будет нормальным решением только в том случае, если ваши данные не изменяются или изменяются/правятся редко.
В случаях, когда изменения происходят постоянно или часто, обучение новой модели становится слишком затратным по времени и ресурсам.
В таких ситуациях и будет наиболее предпочтительным использование RAG.
Для тестирования качества RAG существует множество метрик. В этой статье остановимся на двух популярных библиотеках: RAGAS и DeepEval.
В RAGAS представлены следующие метрики для оценки качества работы RAG:
Context Precision
Context Recall
Context Entities Recall
Noise Sensitivity
Response Relevancy
Faithfulness
Multimodal Faithfulness
Multimodal Relevance
В DeepEval, в свою очередь, представлены следующие метрики:
Answer Relevancy
Contextual Precision
Contextual Recall
Contextual Relevancy
Faithfulness
Как видно из представленных перечней, в обоих списках есть совпадающие по названию или очень близкие по смыслу метрики. Давайте сравним их и постараемся понять, есть ли между метриками разница, и в чем она заключается. Для метрик, у которых нет аналогов у обеих библиотек, представим описание с реализацией.
Response Relevancy/Answer RelevancyRAGAS
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
В полнном виде код выглядит так:
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import ResponseRelevancy
# Подготовка данных для RAGAS
data = {
"question": questions, # Вопрос пользователя
"answer": answers, # Ответ модели
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def response_relevancy(dataset):
result = evaluate(
dataset=dataset,
metrics=[
ResponseRelevancy()
],
)
return result
DeepEval
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
# Импорт библиотек
import pytest
from deepeval.test_case import LLMTestCase
from deepeval import assert_test
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.dataset import EvaluationDataset
from deepeval.test_case import LLMTestCase
# Подготовка формы для обработки данных
dataset = EvaluationDataset()
# Данные для тестирования
question = question # Вопрос пользователя
answers = answer # Ответ модели
# Формирование тест кейса
test_case = LLMTestCase(input=question, actual_output=answers)
# Добавление тест кейса в набор данных
dataset.add_test_case(test_case)
# Формирование метрики для оценки
metric = AnswerRelevancyMetric(
threshold=threshold, # Пороговое значение
model=model, # Модель для оценки по метрике
include_reason=True) # Формирование причины присвоения того или иного значения
@pytest.mark.asyncio
# Передача параметров для теста
@pytest.mark.parametrize(
"test_case",
dataset.test_cases,
)
# Вычисление результата
async def test_answer_relevancy(test_case: LLMTestCase):
assert_test(test_case, [metric])
Метрика | Response Relevancy | Answer Relevancy |
Описание | На основании ответа от модели формирует вопрос, на который такой ответ мог быть дан. Для получения более стабильных результатов генерируется несколько вариантов вопросов для сравнения с изначальным (по умолчанию, 3) | Сравнивает полученный от модели ответ с изначальным запросом от пользователя на предмет соответствия |
Реализация | Промт для оценки релевантности содержит следующие инструкции: 1. Сформировать вопрос на основе ответа модели. 2. Оценить ответ на предмет уклончивости (если ответ вида “я не знаю”, “я не уверен” и т.д., то такой ответ уклончивый) Присвоить ответу 1, если ответ уклончивый и 0, если ответ четко сформулирован. | Промт для оценки релевантности содержит следующие инструкции: Сформировать утверждения из ответа. Сравнить все утверждения с изначальным вопросом на предмет соответствия Присвоить утверждению статус ‘yes’, ‘no’ или ‘idk’, в зависимости от релевантности утверждения вопросу. Сформировать краткое пояснение о причинах получения того или иного значения метрики Посчитать конечный результат |
Таким образом, главные различия метрик состоят в:
Предметах сравнения. У метрики от RAGAS сравниваются изначальный вопрос со сгенерированными вопросами.
У метрики от deepeval сравниваются изначальный вопрос и утверждения из полученного ответа модели.
Методиках сравнения.
У метрики от RAGAS сравнение происходит посредством вычисления косинусного сходства.
У метрики от deepeval сравнение происходит посредством использования LLM.
Объяснение вердикта по сравнениям.
В метрике от RAGAS объяснения не предусмотрены, поскольку сравнение происходит посредством вычисления косинусного сходства.
В метрике от deepeval присутствуют вердикты по каждому утверждению
Обработка уклончивости и галлюцинаций в ответах:
В метрике от RAGAS уклончивость и галлюцинации в ответе могут привести к автоматическому обнулению результата расчета.
В метрике от deepeval наличие галлюцинаций и уклончивости фиксируется и приводит к снижению итогового результата оценки.
RAGAS
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Происходит подсчет и выдача результатов метрики.
Код для метрики с использованием LLM и без использования переданного контекста.
import asyncio
from ragas import SingleTurnSample
from ragas.metrics import LLMContextPrecisionWithoutReference
# Определение метрики с уточнением LLM для вычисления результата
context_precision = LLMContextPrecisionWithoutReference(llm=evaluator_llm)
# Подготовка данных для RAGAS
sample = SingleTurnSample(
user_input = question # Вопрос пользователя
retrieved_contexts = contexts # Возвращаемый контекст
response = answer # Ответ модели
)
# Вычисление метрики
async def context_precision_without_reference(sample):
result = await context_precision.single_turn_ascore(sample)
return result
asyncio.run(run_context_precision_without_reference(sample))
Код для метрики с использованием LLM и переданным контекстом
import asyncio
from ragas import SingleTurnSample
from ragas.metrics import LLMContextPrecisionWithReference
# Определение метрики с уточнением LLM для вычисления результата
context_precision = LLMContextPrecisionWithReference(llm=evaluator_llm)
# Подготовка данных для RAGAS
sample = SingleTurnSample(
user_input = question # Вопрос пользователя
retrieved_contexts = contexts # Возвращаемый контекст
reference = reference # Переданный контекст
)
# Вычисление метрики
async def context_precision_with_reference(sample):
result = await context_precision.single_turn_ascore(sample)
return result
asyncio.run(run_context_precision_with_reference(sample))
Код для метрики без использования LLM
import asyncio
from ragas import SingleTurnSample
from ragas.metrics import NonLLMContextPrecisionWithReference
# Определение метрики
context_precision = NonLLMContextPrecisionWithReference()
# Подготовка данных для RAGAS
sample = SingleTurnSample(
retrieved_contexts = contexts # Возвращаемый контекст
reference_contexts = reference # Переданный контекст
)
# Вычисление метрики
async def context_precision_without_LLM(sample):
result = await context_precision.single_turn_ascore(sample)
return result
asyncio.run(context_precision_without_LLM(sample))
DeepEval
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
# Импорт библиотек
import pytest
from deepeval.test_case import LLMTestCase
from deepeval import assert_test
from deepeval.metrics import ContextualPrecisionMetric
from deepeval.dataset import EvaluationDataset
from deepeval.test_case import LLMTestCase
# Подготовка формы для обработки данных
dataset = EvaluationDataset()
# Данные для тестирования
question = question # Вопрос пользователя
ground_truths = expected_answer # Ожидаемый ответ
contexts = contexts # Возвращаемый контекст
# Формирование тест кейса
test_case = LLMTestCase(input=question, expected_output=ground_truths,
retrieval_context=contexts)
# Добавление тест кейса в набор данных
dataset.add_test_case(test_case)
# Формирование метрики для оценки
metric = ContextualPrecisionMetric(
threshold=threshold, # Пороговое значение
model=model, # Модель для оценки по метрике
include_reason=True) # Формирование причины присвоения того или иного значения
@pytest.mark.asyncio
# Передача параметров для теста
@pytest.mark.parametrize(
"test_case",
dataset.test_cases,
)
# Вычисление результата
async def test_contextual_precision(test_case: LLMTestCase):
assert_test(test_case, [metric])
Метрика | Context Precision | Contextual Precision |
Описание | Сравнивает возвращенный контекст с изначальным вопросом и проверяет, каков процент релевантного контекста во всех возвращенных с помощью RAG контекстах. | Сравнивает возвращенный контекст с изначальным вопросом и проверяет, насколько высоко в выдаче оказались релевантные вопросу контексты. Подсчитывается итоговым положением релевантных контекстов в выдаче |
Модификации | с использованием LLM без использования LLM | с использованием LLM |
Реализация | 1. Основная реализация с LLM 2. Модификация с эталонным контекстом 3. Модификация без использования LLM | Промт для оценки релевантности содержит следующие инструкции: Сформировать список возвращенных из контекста элементов. Сравнить все элементы с ожидаемым ответом Присвоить элементу статус ‘yes’ или 'no' в зависимости от релевантности утверждения вопросу. Сформировать краткое пояснение о причинах получения того или иного значения метрики Посчитать конечный результат |
Таким образом, главные различия метрик состоят в:
В количестве возможных модификаций. Три варианта метрики у RAGAS и одна у DeeepEval.
Различии методик сравнения у разных модификаций. Если в основной реализации у RAGAS схожая методика с DeepEval, то другие модификации уже используют эталонный контекст, а также расстояние Левенштейна (есть и другие опции сравнения) для варианта без использования LLM.
Объяснение вердикта по сравнениям.
В метрике от RAGAS объяснения не предусмотрены, поскольку сравнение происходит посредством вычисления расстояния Левенштейна (есть и другие опции сравнения) для варианта без использования LLM. При использовании LLM в RAGAS также предусмотрено объяснение вердикта.
В метрике от deepeval присутствуют вердикты по каждому утверждению.
RAGAS
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Происходит подсчет и выдача результатов метрики.
import asyncio
from ragas import SingleTurnSample
from ragas.metrics import LLMContextRecall
# Определение метрики с уточнением LLM для вычисления результата
context_precision = LLMContextRecall(llm=evaluator_llm)
# Подготовка данных для RAGAS
sample = SingleTurnSample(
user_input = question # Вопрос пользователя
retrieved_contexts = contexts # Возвращаемый контекст
reference = reference # Переданный контекст
)
# Вычисление метрики
async def context_recall_with_LLM(sample):
result = await context_recall.single_turn_ascore(sample)
return result
asyncio.run(context_recall_with_LLM(sample))
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Происходит подсчет и выдача результатов метрики.
import asyncio
from ragas import SingleTurnSample
from ragas.metrics import NonLLMContextRecall
# Определение метрики
context_recall = NonLLMContextRecall()
# Подготовка данных для RAGAS
sample = SingleTurnSample(
retrieved_contexts = contexts # Возвращаемый контекст
reference_contexts = reference # Переданный контекст
)
# Вычисление метрики
async def context_recall_without_LLM(sample):
result = await context_recall.single_turn_ascore(sample)
return result
asyncio.run(context_recall_without_LLM(sample))
DeepEval
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
# Импорт библиотек
import pytest
from deepeval.test_case import LLMTestCase
from deepeval import assert_test
from deepeval.metrics import ContextualRecallMetric
from deepeval.dataset import EvaluationDataset
from deepeval.test_case import LLMTestCase
# Подготовка формы для обработки данных
dataset = EvaluationDataset()
# Данные для тестирования
question = question # Вопрос пользователя
ground_truths = expected_answer # Ожидаемый ответ
contexts = contexts # Возвращаемый контекст
# Формирование тест кейса
test_case = LLMTestCase(input=question, expected_output=ground_truths,
retrieval_context=contexts)
# Добавление тест кейса в набор данных
dataset.add_test_case(test_case)
# Формирование метрики для оценки
metric = ContextualRecallMetric(
threshold=threshold, # Пороговое значение
model=model, # Модель для оценки по метрике
include_reason=True) # Формирование причины присвоения того или иного значения
@pytest.mark.asyncio
# Передача параметров для теста
@pytest.mark.parametrize(
"test_case",
dataset.test_cases,
)
# Вычисление результата
async def test_contextual_recall(test_case: LLMTestCase):
assert_test(test_case, [metric])
Метрика | Context Recall | Contextual Recall |
Описание | Показывает, сколько релевантных документов было приведено на заданный вопрос | Вычисляет, представлены ли ключевые элементы, релевантные вопросу пользователя, в приведенном контексте выше нерелевантных |
Модификации | с использованием LLM сравнивает количество утверждений из переданного контекста и возвращенного контекста относительно общего количества утверждений в ответе без использования LLM сравнивает количество релевантных контекстов относительно общего числа приведенных контекстов | с использованием LLM |
Реализация | 1. Основная реализация с LLM 2. Модификация с эталонным контекстом 3. Модификация без использования LLM | Промт для оценки релевантности содержит следующие инструкции: Составить список выданных в ответе модели утверждений на предмет релевантных и нерелевантных приведенному контексту Сформировать краткое пояснение о причинах получения того или иного значения метрики Посчитать конечный результат |
Таким образом, главные различия метрик состоят в:
В количестве возможных модификаций. Три варианта метрики у RAGAS и одна у DeeepEval.
Различии методик сравнения у разных модификаций. Если в основной реализации у RAGAS схожая методика с DeepEval, то другие модификации уже используют эталонный контекст, а также расстояние Левенштейна (есть и другие опции сравнения) для варианта без использования LLM.
Объяснение вердикта по сравнениям.
В метрике от RAGAS объяснения не предусмотрены, поскольку сравнение происходит посредством вычисления расстояния Левенштейна (есть и другие опции сравнения) для варианта без использования LLM. При использовании LLM в RAGAS также предусмотрено объяснение вердикта.
В метрике от deepeval присутствуют вердикты по каждому утверждению.
RAGAS
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import faithfulness
# Подготовка данных для RAGAS
data = {
"question": questions, # Вопрос пользователя
"contexts": contexts, # Возвращаемый контекст
"reference": references # Переданный контекст
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def check_faithfulness(dataset):
result = evaluate(
dataset=dataset,
metrics=[
faithfulness
],
)
return result
DeepEval
Реализация в Python:
Сначала идет подготовка данных для дальнейшей обработки. Ниже в примере представлен пример данных со всеми возможными параметрами.
Далее идет конвертация данных в форму для обработки.
Наконец, происходит подсчет и выдача результатов метрики.
# Импорт библиотек
import pytest
from deepeval.test_case import LLMTestCase
from deepeval import assert_test
from deepeval.metrics import FaithfulnessMetric
from deepeval.dataset import EvaluationDataset
from deepeval.test_case import LLMTestCase
# Подготовка формы для обработки данных
dataset = EvaluationDataset()
# Данные для тестирования
question = question # Вопрос пользователя
contexts = contexts # Возвращаемый контекст
answers = answer # Ответ модели
# Формирование тест кейса
test_case = LLMTestCase(input=question, actual_output=answers,
retrieval_context=contexts)
# Добавление тест кейса в набор данных
dataset.add_test_case(test_case)
# Формирование метрики для оценки
metric = FaithfulnessMetric(
threshold=threshold, # Пороговое значение
model=model, # Модель для оценки по метрике
include_reason=True) # Формирование причины присвоения того или иного значения
@pytest.mark.asyncio
# Передача параметров для теста
@pytest.mark.parametrize(
"test_case",
dataset.test_cases,
)
# Вычисление результата
async def test_faithfulness(test_case: LLMTestCase):
assert_test(test_case, [metric])
Метрика | Faithfulness (RAGAS) | Faithfulness (DeepEval) |
Описание | Показывает количество утверждений в ответе модели, которые соответствуют приведенному контексту | Показывает, соответствует ли ответ модели приведенному контексту |
Модификации | с использованием LLM | с использованием LLM |
Реализация | Промт для оценки содержит следующие инструкции: Получить ответ, возвращенный контекст и вопрос. Разбить ответ и вопрос на отдельные утверждения Определить, относится ли каждое утверждение из ответа приведенному контексту. Если относится, то присвоить результат 1, если нет, то 0 Вычислить итоговый результат | Промт для оценки релевантности содержит следующие инструкции: Разбить ответ модели на утверждения Вычислить, относится ли каждое из утверждений к приведенному контексту. Если относится, то присвоить значение 'yes', если не относится, то присвоить значение 'no', если невозможно дать ни положительного, ни отрицательного ответа, присвоить значение 'idk' Посчитать конечный результат |
Таким образом, главные различия метрик состоят в:
В количестве опций для оценки утверждений. У RAGAS только два возможных значения, в то время как у DeeepEval таких значений три.
Объяснение вердикта по сравнениям.
В метрике от RAGAS объяснения не предусмотрены, поскольку сравнение происходит посредством вычисления расстояния Левенштейна (есть и другие опции сравнения) для варианта без использования LLM. При использовании LLM в RAGAS также предусмотрено объяснение вердикта.
В метрике от deepeval присутствуют вердикты по каждому утверждению.
Метрика показывает, какой процент сущностей из переданного контекста присутствует в возвращенном контексте. Рассчитывается как отношение количества сущностей в приведенном контексте к общему числу сущностей в переданном контексте.
где
RE - набор сущностей в переданном контексте
RCE - набор сущностей в возвращенном контексте
Реализация
1. Происходит разбивка текста на независимые неповторяющиеся сущности.
2. Сравниваются множества сущностей в переданном и возвращенном контекстах
3. Вычисляется итоговое значение метрики.
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import ContextEntityRecall
# Подготовка данных для RAGAS
data = {
"contexts": contexts, # Возвращаемый контекст
"reference": references # Переданный контекст
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def check_context_entity_recall(dataset):
result = evaluate(
dataset=dataset,
metrics=[
ContextEntityRecall()
],
)
return result
Метрика показывает процент нерелевантных утверждений относительно общего количества утверждений в ответе.
Реализация
Происходит разбивка ответа на утверждения
Каждое утверждение оценивается на предмет релевантности вопросу.
Вычисляется итоговое значение метрики.
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import NoiseSensitivity
# Подготовка данных для RAGAS
data = {
"question": questions, # Вопрос пользователя
"answer": answers, # Ответ модели
"contexts": contexts, # Возвращаемый контекст
"reference": references # Переданный контекст
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def check_noise_sensitivity(dataset):
result = evaluate(
dataset=dataset,
metrics=[
NoiseSensitivity()
],
)
return result
Метрика показывает фактическое соответствие ответа модели и возвращенного контекста.
Ответ считается правдивым, если все его утверждения могут быть получены из возвращенного контекста (текста или картинок).
Реализация
Ответ модели сравнивается с возвращенным контекстом (текстом и картинками) на предмет фактического соответствия.
Если ответ фактически соответствует контексту, ему присваивается значение 1, в противном случае 0.
Происходит подсчет итогового результата.
import asyncio
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import MultiModalFaithfulness
from datasets import Dataset
from ragas import evaluate
# Подготовка данных для RAGAS
data = {
"user_input": question, # Вопрос пользователя
"response": answer, # Ответ модели
"retrieved_contexts": contexts # Возвращенный контекст
# (текст или картинки)
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def check_multimodal_faithfulness(dataset):
result = evaluate(
dataset=dataset,
metrics=[
MultiModalFaithfulness()
],
)
return result
Метрика показывает, насколько ответ модели соответствует возвращенному контексту.
Реализация
Ответ модели сравнивается с возвращенным контекстом (текстом и картинками) на предмет соответствия.
Если ответ соответствует контексту, ему присваивается значение 1, в противном случае 0.
Происходит подсчет итогового результата.
import asyncio
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import MultiModalRelevance
from datasets import Dataset
from ragas import evaluate
# Подготовка данных для RAGAS
data = {
"user_input": question, # Вопрос пользователя
"response": answer, # Ответ модели
"retrieved_contexts": contexts # Возвращенный контекст
# (текст или картинки)
}
# Конвертация данных
dataset = Dataset.from_dict(data)
# Вычисление метрики
def check_multimodal_relevancy(dataset):
result = evaluate(
dataset=dataset,
metrics=[
MultiModalRelevance()
],
)
return result
Метрика показывает, насколько контекст релевантен изначальному запросу.
Реализация
Происходит разбиение контекста на утверждения.
Каждое утверждение оценивается на предмет релевантности вопросу. Если утверждение релевантно, ему присваивается значение 'yes', в противном случае присваивается значение 'no'
Происходит итоговый подсчет метрики.
# Импорт библиотек
import pytest
from deepeval.test_case import LLMTestCase
from deepeval import assert_test
from deepeval.metrics import ContextualRelevancyMetric
from deepeval.dataset import EvaluationDataset
from deepeval.test_case import LLMTestCase
# Подготовка формы для обработки данных
dataset = EvaluationDataset()
# Данные для тестирования
question = question # Вопрос пользователя
contexts = contexts # Возвращаемый контекст
# Формирование тест кейса
test_case = LLMTestCase(input=question, retrieval_context=contexts)
# Добавление тест кейса в набор данных
dataset.add_test_case(test_case)
# Формирование метрики для оценки
metric = ContextualRelevancyMetric(
threshold=threshold, # Пороговое значение
model=model, # Модель для оценки по метрике
include_reason=True) # Формирование причины присвоения того или иного значения
@pytest.mark.asyncio
# Передача параметров для теста
@pytest.mark.parametrize(
"test_case",
dataset.test_cases,
)
# Вычисление результата
async def test_contextual_relevancy(test_case: LLMTestCase):
assert_test(test_case, [metric])
Как видно из указанного выше описания, все метрики RAGAS и DeepEval, несмотря на свою схожесть, имеют свои плюсы и минусы, и, как следствие, могут быть эффективно использованы в подходящей для этого ситуации.
Поскольку область применения AI становится все шире, требуется и большое разнообразие метрик для оценки качества работы AI-продуктов.
В этой статье мы рассмотрели лишь часть применяемых метрик, касающихся работы с RAG. В следующих публикациях постараемся рассказать о других имеющихся на данный момент метриках и принципах их работы.