Оценка заявок RAG с помощью RAGAs

Оценка заявок с использованием системы RAGAs

Фреймворк с метриками и данными, сгенерированными LLM, для оценки производительности вашего трубопровода с усиленным извлечением и генерацией

Станащированная панель производительности для улучшенной генерации с использованием извлечения

К настоящему времени мы знаем, что создание концепции для приложения Улучшенная генерация с использованием извлечения (RAG) легко, но сделать его готовым к производству очень сложно. Особенно сложно достичь удовлетворительной производительности трубопровода RAG из-за разных компонентов в трубопроводе RAG:

  • Компонент извлекателя: извлекает дополнительный контекст из внешней базы данных для LLM для ответа на запрос.
  • Компонент генератора: генерирует ответ на основе подсказки с добавленной информацией.

При оценке трубопровода RAG необходимо оценивать каждый компонент по отдельности и вместе, чтобы понять, нуждается ли трубопровод RAG в улучшении и в каком направлении. Кроме того, чтобы понять, улучшается ли производительность вашего приложения RAG, необходимо оценивать ее количественно. Для этого вам понадобятся два компонента: метрика оценки и данных для оценки.

В настоящее время определение правильных метрик оценки и сбор хороших данных для проверки является активной областью исследований. Поскольку это быстро развивающаяся тема, мы сейчас наблюдаем появление различных подходов для оценки фреймворков RAG, таких как Триада метрик RAG, ROUGE, ARES, BLUE и RAGAs [1]. В этой статье будет рассмотрено, как оценить трубопровод RAG с использованием RAGAs [1].

Что такое RAGAs

RAGAs (Retrieval-Augmented Generation Assessment) – это фреймворк (GitHub, Документы), который предоставляет вам необходимые компоненты для оценки трубопровода RAG на уровне компонента.

Данные оценки

Интересно в RAGAs состоит в том, что он начался как фреймворк для “безреферентной” оценки [1]. Это означает, что вместо того, чтобы полагаться на аннотированные человеком основные метки правды в наборе данных для оценки, RAGAs использует LLM внутри себя для проведения оценок.

Для оценки трубопровода RAG RAGAs ожидает следующую информацию:

  • вопрос: Запрос пользователя, являющийся входом трубопровода RAG. Это входные данные.
  • ответ: Сгенерированный ответ от трубопровода RAG. Это выходные данные.
  • контексты: Контексты, полученные из внешнего источника знаний, используемые для ответа на вопрос.
  • ground_truths: Истинный ответ на вопрос. Это единственная аннотированная человеком информация. Эта информация необходима только для метрики context_recall (см. Метрики оценки).

Использование LLM для безреферентной оценки является активной темой исследований. Хотя использование как можно меньшего количества аннотированных человеком данных делает его более дешевым и быстрым методом оценки, все еще идет обсуждение его недостатков, таких как предвзятость [3]. Однако уже были продемонстрированы некоторые многообещающие результаты [4]. Для подробной информации смотрите раздел “Related Work” в статье RAGAs [1].

Обратите внимание, что фреймворк расширился, чтобы предоставить метрики и парадигмы, которые требуют меток истинности (например, context_recall и answer_correctness, см. Метрики оценки).

Кроме того, фреймворк предоставляет вам инструменты для автоматической генерации тестовых данных.

Метрики оценки

RAGAs предоставляет вам несколько метрик для оценки компонентов RAG пайплайна как по отдельности, так и в целом.

На уровне компонентов, RAGAs предоставляет вам метрики для оценки компонента ретриевала (context_relevancy и context_recall) и компонента генерации (faithfulness и answer_relevancy) отдельно [2]:

  • Точность контекста измеряет отношение сигнал-шум полученного контекста. Эта метрика вычисляется с использованием question и contexts.
  • Полнота контекста измеряет, была ли получена вся необходимая информация для ответа на вопрос. Эта метрика вычисляется на основе ground_truth (это единственная метрика в фреймворке, которая зависит от аннотированных человеком меток истинности) и contexts.
  • Фактическая точность измеряет достоверность сгенерированного ответа. Количество верных утверждений из заданных контекстов делится на общее количество утверждений в сгенерированном ответе. Эта метрика использует question, contexts и answer.
  • Релевантность ответа измеряет, насколько ответ соответствует вопросу. Эта метрика вычисляется с использованием question и answer. Например, ответ “Франция находится в западной Европе.” на вопрос “Где находится Франция и какая ее столица?” будет иметь низкую релевантность, потому что он отвечает только на половину вопроса.

Все метрики нормированы в диапазоне [0, 1], где более высокие значения указывают на более высокую производительность.

RAGAs также предоставляет вам метрики для оценки RAG пайплайна в целом, такие как семантическая схожесть ответов и правильность ответов. В данной статье акцент сделан на метриках на уровне компонентов.

Оценка приложения RAG с использованием RAGAs

В этом разделе используется RAGAs для оценки минимального ванильного RAG пайплайна, чтобы показать вам, как использовать RAGAs и дать вам представление о его метриках оценки.

Предварительные требования

Убедитесь, что у вас установлены необходимые пакеты Python:

  • langchain, openai и weaviate-client для RAG пайплайна
  • ragas для оценки RAG пайплайна
#!pip install langchain openai weaviate-client ragas

Кроме того, укажите соответствующие переменные среды в файле .env в вашем корневом каталоге. Чтобы получить ключ API OpenAI, вам понадобится учетная запись OpenAI, затем “Создать новый секретный ключ” в разделе API-ключи.

OPENAI_API_KEY="<ВАШ_КЛЮЧ_OPENAI_API>"

Настройка приложения RAG

Прежде чем вы сможете оценить ваше приложение RAG, вам необходимо его настроить. Мы будем использовать стандартный конвейер RAG. Мы оставим этот раздел коротким, так как мы будем использовать ту же настройку, описанную в подробностях в следующей статье.

Получение средства генерации данных с условиями Retrieval-Augmented (RAG): от теории до реализации с помощью LangChain на базе Python

От теории оригинальной учебной статьи до ее реализации на Python с помощью OpenAI, Weaviate и LangChain

towardsdatascience.com

Сначала вам необходимо подготовить данные, загрузив и разбив их на фрагменты.

import requestsfrom langchain.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterurl = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"res = requests.get(url)with open("state_of_the_union.txt", "w") as f:    f.write(res.text)# Загрузка данныхdataloader = TextLoader('./state_of_the_union.txt')documents = loader.load()# Разбиение данныхtext_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = text_splitter.split_documents(documents)

Затем сгенерируйте векторные вложения для каждого фрагмента с помощью модели вложений OpenAI и сохраните их в векторной базе данных.

from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsfrom dotenv import load_dotenv,find_dotenv# Загрузка ключа OpenAI API из файла .envload_dotenv(find_dotenv())# Настройка векторной базы данныхclient = weaviate.Client(  embedded_options = EmbeddedOptions())# Заполнение векторной базы данныхvectorstore = Weaviate.from_documents(    client = client,        documents = chunks,    embedding = OpenAIEmbeddings(),    by_text = False)# Определение векторной базы данных как 'retriever' для возможности семантического поискаretriever = vectorstore.as_retriever()

Наконец, настройте шаблон запроса и модель OpenAI LLM, а затем объедините их с элементом ‘retriever’ в конвейер RAG.

from langchain.chat_models import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParser# Определение LLMllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# Определение шаблона запросатemplate = """Вы являетесь помощником по вопросно-ответной задаче. Используйте следующие фрагменты контекста для ответа на вопрос. Если вы не знаете ответ, просто скажите, что не знаете. Используйте не более двух предложений и делайте ответ кратким.Вопрос: {question} Контекст: {context} Ответ:"""prompt = ChatPromptTemplate.from_template(template)# Настройка конвейера RAGrag_chain = (    {"context": retriever,  "question": RunnablePassthrough()}     | prompt     | llm    | StrOutputParser() )

Подготовка данных для оценки

Поскольку RAGAs стремится быть фреймворком оценки без ссылок на эталон, необходимая подготовка набора данных для оценки минимальна. Вам нужно подготовить пары вопрос и ground_truths, на основе которых вы сможете получить остальную информацию посредством вывода, как показано ниже:

from datasets import Datasetquestions = ["Что сказал президент о судье Брейере?",              "Что сказал президент о CEO Intel?",             "Что сказал президент о стрельбе из оружия?"]ground_truths = [["Президент сказал, что судья Брейер посвятил свою жизнь служению стране и поблагодарил его за его службу."],                ["Президент сказал, что Пэт Гельсингер готов увеличить инвестиции Intel до $100 миллиардов."],                ["Президент вызвал Конгресс принять проверенные меры по сокращению насилия со стороны оружия."]]answers = []contexts = []# Выводfor query in questions:  answers.append(rag_chain.invoke(query))  contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])# Преобразование в словарьdata = {    "question": questions,    "answer": answers,    "contexts": contexts,    "ground_truths": ground_truths}# Преобразование словаря в набор данныхdataset = Dataset.from_dict(data)

Если вас не интересует метрика context_recall, вам не нужно указывать информацию о ground_truths. В этом случае вам необходимо только подготовить question.

Оценка приложения RAG

Сначала импортируйте все метрики, которые вы хотите использовать из ragas.metrics. Затем вы можете использовать функцию evaluate() и просто передать соответствующие метрики и подготовленный набор данных.

from ragas import evaluatefrom ragas.metrics import (    faithfulness,    answer_relevancy,    context_recall,    context_precision,)result = evaluate(    dataset = dataset,     metrics=[        context_precision,        context_recall,        faithfulness,        answer_relevancy,    ],)df = result.to_pandas()

Ниже вы можете увидеть полученные оценки RAGAs для примеров:

Оценки RAGAs для точности контекста, воспоминаний контекста, достоверности и соответственности ответа.

Мы можем сделать следующие наблюдения:

  • context_relevancy (отношение сигнал/шум полученного контекста): В то время как LLM судит, что весь контекст последнего вопроса является актуальным, он также считает, что большая часть полученного контекста для второго вопроса не имеет отношения к нему. Исходя из этой метрики, вы можете экспериментировать с разным количеством полученных контекстов, чтобы уменьшить шум.
  • context_recall (была ли получена вся необходимая информация для ответа на вопрос): LLM оценивают, что полученные контексты содержат необходимую информацию для правильного ответа на вопросы.
  • faithfulness (фактическая точность сгенерированного ответа): Хотя LLM считает, что на первый и последний вопросы даны правильные ответы, ответ на второй вопрос, который неверно утверждает, что президент не упомянул генерального директора Intel, оценивается с достоверностью 0,5.
  • answer_relevancy (насколько актуальный сгенерированный ответ к вопросу): Все сгенерированные ответы считаются довольно актуальными для вопросов.

Как упоминается в Evaluation Data, использование LLM для оценки без ссылочного определения является активной областью исследований. Мне интересно увидеть, как эта тема будет развиваться.

Резюме

Построение концептуального приложения RAG просто, но сделать его готовым к использованию в производстве сложно. Как в проекте машинного обучения, вам следует оценивать производительность конвейера RAG с использованием набора данных для валидации и метрики оценки.

Однако, поскольку конвейер RAG состоит из нескольких компонентов, которые должны быть оценены отдельно и в комбинациях, вам понадобится набор метрик для оценки. Кроме того, создание высококачественного набора данных для валидации от человеческих аннотаторов является сложной, трудоемкой и дорогостоящей задачей.

В этой статье была представлена оценочная система RAGAs [1]. Система предлагает четыре метрики оценки — context_relevancy, context_recall, faithfulness и answer_relevancy — которые вместе образуют оценочный показатель RAGAs. Кроме того, RAGAs использует LLM под капотом для оценки без опорных данных, что позволяет сократить затраты.

Теперь, когда у вас есть инструменты для оценки производительности вашего приложения RAG, я рекомендую настроить конвейер экспериментации и начать настраивать производительность с помощью следующих стратегий настройки:

Руководство по 12 стратегиям настройки для готовых к использованию в производстве приложений RAG

Как улучшить производительность вашего конвейера Retrieval-Augmented Generation (RAG) с помощью этих «гиперпараметров» и…

towardsdatascience.com

Вы можете найти код для создания этого набора данных в этом репозитории GitHub.

Понравилась эта история?

Подпишитесь бесплатно, чтобы получать уведомления, когда я публикую новую историю.

Получайте уведомления по электронной почте о публикациях Леони Монигатти.

Получайте уведомления по электронной почте о публикациях Леони Монигатти. Если вы еще не имеете аккаунта VoAGI, при регистрации он будет создан…

VoAGI.com

Найдите меня на LinkedIn, Twitter и Kaggle!

Отказ от ответственности

На момент написания я являюсь разработчиком-пропагандистом в Weaviate, открытой векторной базе данных.

Ссылки

[1] Es, S., James, J., Espinosa-Anke, L., и Schockaert, S. (2023). RAGAs: Автоматизированная оценка Retrieval Augmented Generation. arXiv предварительная печать arXiv:2309.15217.

[2] Документация RAGAs (2023). Документация (обновлено 11 декабря 2023 года)

[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … и Sui, Z. (2023). Большие языковые модели не являются справедливыми оценщиками. arXiv предварительная печать arXiv:2305.17926.

[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., и Zhu, C. (2023). G-eval: Оценка NLG с использованием GPT-4 с лучшим человеческим соответствием, май 2023 года. arXiv предварительная печать arXiv:2303.16634, 6.

Изображения

Если не указано иное, все изображения созданы автором.