用 Ragas 评测比较 LLM
Retrieval Augmented Generation(RAG)系统中使用的 LLM 对生成输出的质量有重大影响。评测不同 LLM 生成的结果,可以帮助你判断特定用例应使用哪一个 LLM。
本教程 notebook 逐步说明如何用 Ragas 库比较并为你自己的数据选择最合适的 LLM。
比较 LLM
创建合成测试数据
提示
Ragas 也可以使用你的数据集。参见 数据准备,了解如何将你的数据集与 ragas 一起使用。
Ragas 提供独特的测试生成范式,能够创建专门针对你的检索与生成任务的评测数据集。与传统 QA 生成器不同,Ragas 可以从你的文档语料中生成各种各样有挑战性的测试用例。
提示
参见 testset generation 了解其工作原理。
在本教程 notebook 中,我使用 Arxiv 上与 large language models 相关的论文来构建 RAG。
注意
用 Testset generator 生成 50+ 条样本以获得更好结果
import os
from llama_index import download_loader, SimpleDirectoryReader
from ragas.testset import TestsetGenerator
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
os.environ['OPENAI_API_KEY'] = 'Your OPEN AI key'
# load documents
reader = SimpleDirectoryReader("./arxiv-papers/",num_files_limit=30)
documents = reader.load_data()
# generator with openai models
generator_llm = ChatOpenAI(model="gpt-4o-mini")
critic_llm = ChatOpenAI(model="gpt-4o")
embeddings = OpenAIEmbeddings()
generator = TestsetGenerator.from_langchain(
generator_llm,
critic_llm,
embeddings
)
distributions = {
simple: 0.5,
multi_context: 0.4,
reasoning: 0.1
}
# generate testset
testset = generator.generate_with_llama_index_docs(documents, 100,distributions)
testset.to_pandas()
test_questions = test_df['question'].values.tolist()
test_answers = [[item] for item in test_df['answer'].values.tolist()]
构建你的 RAG
这里我用 llama-index 和我的文档构建一个基础 RAG 流水线。目标是为流水线中的每个测试问题收集检索到的上下文和生成的答案。Ragas 与多种 RAG 框架有集成,用 ragas 评测它们会更容易。
注意
参见 langchain-tutorial 了解如何用 langchain 进行评测
import nest_asyncio
from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms import HuggingFaceInferenceAPI
from llama_index.embeddings import HuggingFaceInferenceAPIEmbedding
import pandas as pd
nest_asyncio.apply()
def build_query_engine(llm):
vector_index = VectorStoreIndex.from_documents(
documents, service_context=ServiceContext.from_defaults(chunk_size=512, llm=llm),
embed_model=HuggingFaceInferenceAPIEmbedding,
)
query_engine = vector_index.as_query_engine(similarity_top_k=2)
return query_engine
# Function to evaluate as Llama index does not support async evaluation for HFInference API
def generate_responses(query_engine, test_questions, test_answers):
responses = [query_engine.query(q) for q in test_questions]
answers = []
contexts = []
for r in responses:
answers.append(r.response)
contexts.append([c.node.get_content() for c in r.source_nodes])
dataset_dict = {
"question": test_questions,
"answer": answers,
"contexts": contexts,
}
if test_answers is not None:
dataset_dict["ground_truth"] = test_answers
ds = Dataset.from_dict(dataset_dict)
return ds
从 ragas 导入指标
这里我们导入评测检索器组件所需的指标。
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
answer_correctness,
)
metrics = [
faithfulness,
answer_relevancy,
answer_correctness,
]
评测 Zephyr 7B Alpha LLM
第一个 LLM,我将使用 HuggingFace zephyr-7b-alpha。我用 HuggingFaceInferenceAPI 通过该模型生成答案。HuggingFaceInferenceAPI 可免费使用,token 可通过 HuggingFaceToken 设置。
# Use zephyr model using HFInference API
zephyr_llm = HuggingFaceInferenceAPI(
model_name="HuggingFaceH4/zephyr-7b-alpha",
token="Your Hugging Face token"
)
query_engine1 = build_query_engine(zephyr_llm)
result_ds = generate_responses(query_engine1, test_questions, test_answers)
result_zephyr = evaluate(
result_ds,
metrics=metrics,
)
result_zephyr
{'faithfulness': 0.8365, 'answer_relevancy': 0.8831, 'answer_correctness': 0.6605}
评测 Falcon-7B-Instruct LLM
第二个要评测的模型,我使用 Falcon-7B-Instruct。它也可以与 HuggingFaceInferenceAPI 一起使用。
falcon_llm = HuggingFaceInferenceAPI(
model_name="tiiuae/falcon-7b-instruct",
token="Your Huggingface token"
)
query_engine2 = build_query_engine(falcon_llm)
result_ds_falcon = generate_responses(query_engine2, test_questions, test_answers)
result = evaluate(
result_ds_falcon,
metrics=metrics,
)
result
{'faithfulness': 0.6909, 'answer_relevancy': 0.8651, 'answer_correctness': 0.5850}
比较分数
根据评测结果,在我自己的数据集上,HuggingFace zephyr-7b-alpha 模型的 faithfulness、answer_correctness 和 answer_relevancy 指标在我的 RAG 流水线中略优于 falcon-7b-instruct 模型。
完整 Colab notebook 参见 这里。
import numpy as np
import matplotlib.pyplot as plt
def analysis(zephyr_df, falcon_df):
sns.set_style("whitegrid")
fig, axs = plt.subplots(1,3, figsize=(12, 5))
for i,col in enumerate(zephyr_df.columns):
sns.kdeplot(data=[zephyr_df[col].values,falcon_df[col].values],legend=False,ax=axs[i],fill=True)
axs[i].set_title(f'{col} scores distribution')
axs[i].legend(labels=["zephyr", "falcon"])
plt.tight_layout()
plt.show()
result_zephyr_df = result_zephyr.to_pandas()
result_falcon_df = result.to_pandas()
analysis(
result_zephyr_df[['faithfulness', 'answer_relevancy', 'answer_correctness']],
result_falcon_df[['faithfulness', 'answer_relevancy', 'answer_correctness']]
)
分数分布分析
比较 LLM