В современном мире часто встречаются задачи с большим объемом данных, выполнение которых либо невозможно, либо сложно или затратно по времени/ресурсам автоматизировать обычными функциями и методами.
Одним из способов решения для таких случаев является применение 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 Relevancy
RAGAS
Реализация в 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 наличие галлюцинаций и уклончивости фиксируется и приводит к снижению итогового результата оценки.
Context Precision/Contextual Precision
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 присутствуют вердикты по каждому утверждению.
Context Recall/Contextual Recall
RAGAS
LLM-Based Context Recall
Реализация в 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))
Non LLM Based Context Recall
Реализация в 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 присутствуют вердикты по каждому утверждению.
Faithfulness/Faithfulness
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 присутствуют вердикты по каждому утверждению.
Context Entities Recall
Метрика показывает, какой процент сущностей из переданного контекста присутствует в возвращенном контексте. Рассчитывается как отношение количества сущностей в приведенном контексте к общему числу сущностей в переданном контексте.
где
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
Noise Sensitivity
Метрика показывает процент нерелевантных утверждений относительно общего количества утверждений в ответе.
Реализация
Происходит разбивка ответа на утверждения
Каждое утверждение оценивается на предмет релевантности вопросу.
Вычисляется итоговое значение метрики.
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
Multimodal Faithfulness
Метрика показывает фактическое соответствие ответа модели и возвращенного контекста.
Ответ считается правдивым, если все его утверждения могут быть получены из возвращенного контекста (текста или картинок).
Реализация
Ответ модели сравнивается с возвращенным контекстом (текстом и картинками) на предмет фактического соответствия.
Если ответ фактически соответствует контексту, ему присваивается значение 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
Multimodal Relevancy
Метрика показывает, насколько ответ модели соответствует возвращенному контексту.
Реализация
Ответ модели сравнивается с возвращенным контекстом (текстом и картинками) на предмет соответствия.
Если ответ соответствует контексту, ему присваивается значение 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
Contextual Relevancy
Метрика показывает, насколько контекст релевантен изначальному запросу.
Реализация
Происходит разбиение контекста на утверждения.
Каждое утверждение оценивается на предмет релевантности вопросу. Если утверждение релевантно, ему присваивается значение '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. В следующих публикациях постараемся рассказать о других имеющихся на данный момент метриках и принципах их работы.