使用Ragas评估VertexAI模型在RAG问答任务中的表现对比
概述
本文介绍如何利用Ragas评估框架对VertexAI平台上的不同大语言模型(LLM)在基于检索增强生成(RAG)的问答任务中的表现进行量化评估和可视化对比。通过本教程,您将掌握完整的模型评估流程,包括数据准备、评估指标选择、结果分析和可视化展示。
技术背景
Ragas评估框架简介
Ragas是一个专门用于评估RAG系统的开源框架,它提供了一系列评估指标,包括:
- 上下文精确度(Context Precision):衡量检索到的上下文与问题的相关性
- 忠实度(Faithfulness):评估生成答案与提供上下文的一致性
- ROUGE分数:衡量生成答案与参考答案的相似度
- 自定义评分标准(Rubrics Score):可根据业务需求定义的评价维度
VertexAI模型服务
VertexAI是Google Cloud提供的机器学习平台,集成了多种大语言模型,包括Gemini系列模型。本教程将对比Gemini 1.0 Pro和Gemini 1.5 Pro两个版本在问答任务中的表现差异。
环境准备
安装依赖包
首先需要安装必要的Python包:
%pip install --upgrade --user --quiet langchain-core langchain-google-vertexai langchain ragas rouge_score
安装完成后需要重启运行时环境以加载新安装的包。
初始化VertexAI SDK
设置Google Cloud项目信息并初始化VertexAI:
import vertexai
PROJECT_ID = "your-project-id" # 替换为实际项目ID
LOCATION = "us-central1" # 选择区域
vertexai.init(project=PROJECT_ID, location=LOCATION)
评估流程设计
1. 定义评估指标
选择适合问答任务的评估指标:
from ragas.metrics import ContextPrecision, Faithfulness, RubricsScore, RougeScore
# 定义ROUGE评分
rouge_score = RougeScore()
# 自定义有用性评分标准
helpfulness_rubrics = {
"score1_description": "回答无用/不相关,包含错误/误导信息",
"score2_description": "回答与问题勉强相关,但缺乏清晰度和细节",
"score3_description": "回答相关且有用,但不够全面详细",
"score4_description": "回答非常相关,清晰满足问题核心需求",
"score5_description": "回答极其全面,超出问题明确要求的范围"
}
rubrics_score = RubricsScore(name="helpfulness", rubrics=helpfulness_rubrics)
context_precision = ContextPrecision(llm=evaluator_llm)
faithfulness = Faithfulness(llm=evaluator_llm)
2. 准备测试数据集
构建评估数据集需要以下四个要素:
- 用户问题(user_input)
- 检索到的上下文(retrieved_contexts)
- 模型生成的回答(response)
- 参考答案(reference)
user_inputs = [
"短期记忆依赖于大脑的哪个部分?",
"什么使罗马元老院感到振奋?",
"Hasan-jalalians家族控制了什么地区?"
]
retrieved_contexts = [
["短期记忆由前额叶(特别是背外侧前额叶皮层)和顶叶区域的神经元活动模式支持..."],
["公元前62年,庞培从亚洲胜利归来。元老院因成功对抗喀提林而欢欣鼓舞..."],
["12世纪早期,Zakarid家族的亚美尼亚王子驱逐了塞尔柱突厥人..."]
]
references = [
"前额叶和顶叶",
"成功对抗喀提林",
"Artsakh和Utik地区"
]
3. 配置对比模型
设置两个Gemini模型进行对比:
from vertexai.generative_models import GenerativeModel
generation_config = {
"max_output_tokens": 128,
"temperature": 0.1,
}
gemini_15 = GenerativeModel("gemini-1.5-pro", generation_config=generation_config)
gemini_10 = GenerativeModel("gemini-1.0-pro", generation_config=generation_config)
4. 生成模型回答
使用统一模板生成两个模型的回答:
template = """根据以下上下文回答问题:
{context}
问题: {query}
"""
responses_15 = []
responses_10 = []
for i in range(len(user_inputs)):
context_str = "\n".join(retrieved_contexts[i])
prompt = template.format(context=context_str, query=user_inputs[i])
responses_15.append(gemini_15.generate_content(prompt).text)
responses_10.append(gemini_10.generate_content(prompt).text)
5. 构建评估数据集
将数据转换为Ragas评估格式:
from ragas.dataset_schema import SingleTurnSample, EvaluationDataset
samples_15 = [
SingleTurnSample(
user_input=user_inputs[i],
retrieved_contexts=retrieved_contexts[i],
response=responses_15[i],
reference=references[i]
) for i in range(len(user_inputs))
]
samples_10 = [...] # 同上,使用responses_10
dataset_15 = EvaluationDataset(samples=samples_15)
dataset_10 = EvaluationDataset(samples=samples_10)
执行评估
运行评估计算
from ragas import evaluate
metrics = [context_precision, faithfulness, rouge_score, rubrics_score]
result_15 = evaluate(dataset=dataset_15, metrics=metrics)
result_10 = evaluate(dataset=dataset_10, metrics=metrics)
结果可视化
使用雷达图和柱状图直观对比模型表现:
def plot_radar_compare(results, model_names):
fig = go.Figure()
for res, name in zip(results, model_names):
metrics = res._repr_dict
fig.add_trace(go.Scatterpolar(
r=list(metrics.values()),
theta=list(metrics.keys()),
fill='toself',
name=name
))
fig.update_layout(polar=dict(radialaxis=dict(visible=True, range=[0,5])))
fig.show()
plot_radar_compare([result_15, result_10], ["Gemini 1.5", "Gemini 1.0"])
结果分析与解读
通过评估结果可以发现:
- 上下文精确度:两个模型表现接近,但1.5版本在处理复杂上下文时表现更稳定
- 忠实度:两个模型都能很好地基于上下文生成答案
- ROUGE分数:1.5版本在答案与参考文本匹配度上略优
- 有用性评分:1.5版本生成的答案通常更全面和详细
最佳实践建议
- 指标选择:根据实际业务需求选择评估指标,问答系统应优先考虑忠实度和上下文精确度
- 测试数据:确保测试数据覆盖各种场景,包括边界情况
- 模型选择:新版本模型通常表现更好,但也需要考虑成本和延迟因素
- 持续评估:建立自动化评估流程,监控模型性能变化
通过本教程,您已经掌握了使用Ragas评估框架对VertexAI模型进行系统评估的方法,这套方法可以扩展到其他模型和任务的评估场景中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考