Фреймворк с метриками и данными, сгенерированными LLM, для оценки производительности конвейера с дополненной генерацией данных.
К настоящему моменту мы знаем, что создать доказательство концепции приложения с дополненной генерацией данных (RAG) легко, но подготовить его к эксплуатации очень сложно. Довести производительность конвейера RAG до удовлетворительного состояния особенно сложно из-за различных компонентов в конвейере RAG:
-
Компонент «Извлекатель»: извлекает дополнительный контекст из внешней базы данных для LLM, чтобы ответить на запрос.
-
Компонент «Генератор»: генерирует ответ на основе подсказки, дополненной извлеченной информацией.
При оценке конвейера RAG необходимо оценивать оба компонента по отдельности и вместе, чтобы понять, нуждается ли конвейер RAG в улучшении. Кроме того, чтобы понять, улучшается ли производительность вашего приложения RAG, необходимо оценить ее количественно. Для этого вам понадобятся два ингредиента: оценочная метрика и набор данных для оценки.
В настоящее время определение правильных оценочных метрик и сбор правильных данных для проверки являются активной областью исследований. В настоящее время мы наблюдаем появление различных подходов к системам оценки RAG, таких как триада метрик RAG, ROUGE, ARES, BLEU и RAGA. В этой статье основное внимание будет уделено тому, как можно оценить конвейер RAG с помощью RAGA.
Что такое RAGA
RAGA (оценка дополненной генерации данных) — это фреймворк (GitHub, Docs), который предоставляет вам необходимые ингредиенты для оценки конвейера RAG на уровне компонентов.
Оценочные данные
Что интересно в RAGA, так это то, что изначально она представляла собой основу для оценки «без ссылок». Это означает, что вместо того, чтобы полагаться на аннотированные человеком метки достоверной информации в наборе оценочных данных, RAGA использует LLM для проведения оценок.
Для оценки конвейера RAG RAGA ожидает следующую информацию:
-
question
: пользовательский запрос, который является входом конвейера RAG. Вход. -
answer
: сгенерированный ответ из конвейера RAG. Выход. -
contexts
: контексты, извлеченные из внешнего источника знаний, используемые для ответа наquestion
. -
ground_truths
: истинный ответ наquestion
. Это единственная информация, аннотированная человеком. Эта информация требуется только для метрикиcontext_recall
(см. Метрики оценки).
Использование LLM для оценки без ссылок является активной темой исследований. Хотя использование как можно меньшего количества данных, аннотированных человеком, делает его более дешевым и быстрым методом оценки, по-прежнему ведутся дискуссии о его недостатках, таких как смещение. Однако некоторые работы уже показали многообещающие результаты.
Обратите внимание, что фреймворк был расширен, чтобы предоставить метрики и парадигмы, которые требуют меток истинности (например, context_recall
и answer_correctness
; см. Метрики оценки).
Кроме того, фреймворк предоставляет инструменты для автоматической генерации тестовых данных.
Метрики оценки
RAGA предоставляет несколько метрик для оценки конвейера RAG как по компонентам, так и от начала до конца.
На уровне компонентов RAGA предоставляет метрики для оценки компонента извлечения (context_relevancy
и context_recall
) и генеративного компонента (faithfulness
и answer_relevancy
) по отдельности:
-
Точность контекста измеряет соотношение сигнала к шуму извлеченного контекста. Эта метрика вычисляется с использованием
question
иcontexts
. -
Полнота контекста измеряет, была ли извлечена вся необходимая для ответа на вопрос информация. Эта метрика вычисляется на основе
ground_truth
(это единственная метрика в фреймворке, которая опирается на аннотированные человеком метки истинности) иcontexts
. -
Верность измеряет фактическую точность сгенерированного ответа. Количество правильных утверждений из заданных контекстов делится на общее количество утверждений в сгенерированном ответе. Эта метрика использует
question
,contexts
иanswer
. -
Релевантность ответа измеряет, насколько релевантен сгенерированный ответ вопросу. Эта метрика вычисляется с использованием
question
иanswer
. Например, ответ «Франция находится в Западной Европе» на вопрос «Где находится Франция и какова ее столица?» достигнет низкой релевантности ответа, поскольку он отвечает только на половину вопроса.
Все метрики масштабируются до диапазона [0, 1], при этом более высокие значения указывают на лучшую производительность.
RAGA также предоставляет метрики для оценки конвейера RAG от начала до конца, такие как семантическое сходство ответов и правильность ответов. В этой статье основное внимание уделяется метрикам на уровне компонентов.
Оценка приложения RAG с помощью RAGA
В этом разделе RAGA используется для оценки минимального стандартного конвейера RAG, чтобы показать вам, как использовать RAGA, и дать вам наглядное представление о его метриках оценки.
Предварительные условия
Убедитесь, что вы установили необходимые пакеты Python:
-
langchain
,openai
иweaviate-client
для конвейера RAG -
ragas
для оценки конвейера RAG
#!pip install langchain openai weaviate-client ragas
Кроме того, определите соответствующие переменные среды в файле .env в корневом каталоге. Чтобы получить ключ API OpenAI, вам нужно создать учетную запись OpenAI, а затем создать новый секретный ключ в разделе ключей API.
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
Настройка приложения RAG
Прежде чем вы сможете оценить свое приложение RAG, вам нужно его настроить. Мы будем использовать стандартный конвейер RAG. Мы будем краткими в этом разделе, поскольку будем использовать ту же настройку, которая подробно описана в следующей статье: "Генерация дополненного извлечения (RAG): от теории к реализации LangChain".
Сначала вы должны подготовить данные, загрузив и разбив документы на фрагменты.
import requests
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
url = "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)
# Load the data
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
# Chunk the data
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
Затем сгенерируйте векторные вложения для каждого фрагмента с помощью модели вложения OpenAI и сохраните их в векторной базе данных.
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions
from dotenv import load_dotenv,find_dotenv
# Load OpenAI API key from .env file
load_dotenv(find_dotenv())
# Setup vector database
client = weaviate.Client(
embedded_options = EmbeddedOptions()
)
# Populate vector database
vectorstore = Weaviate.from_documents(
client = client,
documents = chunks,
embedding = OpenAIEmbeddings(),
by_text = False
)
# Define vectorstore as retriever to enable semantic search
retriever = vectorstore.as_retriever()
После этого настройте шаблон подсказки и OpenAI LLM и объедините их с компонентом извлечения в конвейер RAG.
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
# Define LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# Define prompt template
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use two sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)
# Setup RAG pipeline
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
Подготовка оценочных данных
Поскольку RAGA стремится быть фреймворком оценки без ссылок, требуемая подготовка набора оценочных данных будет минимальной. Вам нужно будет подготовить пары question
и ground_truths
, из которых вы можете подготовить оставшуюся информацию посредством вывода следующим образом:
from datasets import Dataset
questions = ["What did the president say about Justice Breyer?",
"What did the president say about Intel's CEO?",
"What did the president say about gun violence?",
]
ground_truths = [["The president said that Justice Breyer has dedicated his life to serve the country and thanked him for his service."],
["The president said that Pat Gelsinger is ready to increase Intel's investment to $100 billion."],
["The president asked Congress to pass proven measures to reduce gun violence."]]
answers = []
contexts = []
# Inference
for query in questions:
answers.append(rag_chain.invoke(query))
contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])
# To dict
data = {
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truths": ground_truths
}
# Convert dict to dataset
dataset = Dataset.from_dict(data)
Если вас не интересует метрика context_recall
, вам не нужно предоставлять информацию ground_truths
. В этом случае все, что вам нужно подготовить, — это question
.
Оценка приложения RAG
Сначала импортируйте из ragas.metrics
все метрики, которые вы хотите использовать. Затем вы можете использовать функцию evaluate()
и передать соответствующие метрики и подготовленный набор данных.
from ragas import evaluate
from 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()
Ниже в качестве примеров вы можете увидеть полученные оценки RAGA:
Мы можем сделать следующие наблюдения:
-
context_relevancy
(соотношение сигнала к шуму извлеченного контекста): в то время как LLM оценивает весь контекст как релевантный для последнего вопроса, он также оценивает, что большая часть извлеченного контекста для второго вопроса нерелевантна. В зависимости от этой метрики вы можете экспериментировать с различным количеством извлеченных контекстов, чтобы уменьшить шум. -
context_recall
(если была извлечена вся соответствующая информация, необходимая для ответа на вопрос): LLM оценивает, что извлеченные контексты содержат соответствующую информацию, необходимую для правильного ответа на вопросы. -
faithness
(фактическая точность сгенерированного ответа): в то время как LLM оценивает, что на первый и последний вопросы даны правильные ответы, ответ на второй вопрос, в котором ошибочно утверждается, что президент не упомянул генерального директора Intel, оценивается с точностью 0,5. -
answer_relevancy
(насколько релевантен сгенерированный ответ на вопрос): все сгенерированные ответы оцениваются как достаточно релевантные для вопросов.
Как упоминалось в разделе «Оценочные данные», использование LLM для оценки без ссылок является активной областью исследований. Любопытно, как будет дальше развиваться эта тема.
Резюме
Создать приложение RAG для проверки концепции легко, но сделать его производительность готовой к эксплуатации сложно. Как и в проекте машинного обучения, вы должны оценить производительность конвейера RAG с помощью набора проверочных данных и метрик оценки.
Однако, поскольку конвейер RAG состоит из нескольких компонентов, которые должны оцениваться по отдельности и в комбинациях, вам потребуется набор метрик оценки. Кроме того, создание высококачественного набора проверочных данных людьми-аннотаторами является сложным, трудоемким и дорогостоящим процессом.
В этой статье представлена оценочная структура RAGA. Структура предлагает четыре оценочные метрики — context_relevancy
, context_recall
, faithness
и answer_relevancy
— которые вместе составляют оценку RAGA. Кроме того, RAGA использует LLM для оценки без ссылок и экономии затрат.
Теперь, когда у вас есть все инструменты для оценки производительности вашего приложения RAG, я рекомендую настроить экспериментальный конвейер.
Вы можете найти код для создания этого набора данных в этом репозитории GitHub.
Автор: kucev