在 MT-Bench 人工判断数据集上对 LLM 评估器进行基准测试 LabelledPairwiseEvaluatorDataset
¶
在本 Notebook 指南中,我们将使用略微改编的 MT-Bench 人工判断数据集对 Gemini 和 GPT 模型作为 LLM 评估器进行基准测试。对于此数据集,人工评估员比较两个 LLM 模型对给定查询的响应,并根据自己的偏好对其进行排名。在原始版本中,对于给定示例(查询,两个模型响应),可能有多个进行人工评估。然而,在我们考虑的改编版本中,我们将这些“重复”条目进行聚合,并将原始 schema 的“winner”列转换为表示“model_a”在所有人工评估员中获胜的比例。为了将其改编为 llama-dataset,并更好地考虑平局(尽管样本量较小),我们为此比例设置了一个不确定性阈值,即如果该比例在 [0.4, 0.6] 之间,我们认为这两个模型之间没有赢家。我们从 llama-hub 下载此数据集。最后,我们进行基准测试的 LLM 如下所列:
- GPT-3.5 (OpenAI)
- GPT-4 (OpenAI)
- Gemini-Pro (Google)
In [ ]
Copied!
%pip install llama-index-llms-openai
%pip install llama-index-llms-cohere
%pip install llama-index-llms-gemini
%pip install llama-index-llms-openai %pip install llama-index-llms-cohere %pip install llama-index-llms-gemini
In [ ]
Copied!
!pip install "google-generativeai" -q
!pip install "google-generativeai" -q
In [ ]
Copied!
import nest_asyncio
nest_asyncio.apply()
import nest_asyncio nest_asyncio.apply()
载入数据集¶
让我们从 llama-hub 载入 llama-dataset。
In [ ]
Copied!
from llama_index.core.llama_dataset import download_llama_dataset
# download dataset
pairwise_evaluator_dataset, _ = download_llama_dataset(
"MtBenchHumanJudgementDataset", "./mt_bench_data"
)
from llama_index.core.llama_dataset import download_llama_dataset # 下载数据集 pairwise_evaluator_dataset, _ = download_llama_dataset( "MtBenchHumanJudgementDataset", "./mt_bench_data" )
In [ ]
Copied!
pairwise_evaluator_dataset.to_pandas()[:5]
pairwise_evaluator_dataset.to_pandas()[:5]
Out[ ]
查询 | 回答 | 第二个回答 | 上下文 | 标准答案 | 查询来源 | 回答来源 | 第二个回答来源 | 标准答案来源 | 参考反馈 | 参考得分 | 参考评估来源 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 撰写一篇关于最近...的引人入胜的旅游博客文章 | 我最近有幸访问了夏威夷... | Aloha!我最近有幸踏上了一段... | 无 | 无 | 人工 | ai (alpaca-13b) | ai (gpt-3.5-turbo) | 无 | 无 | 0.0 | 人工 |
1 | 撰写一篇关于最近...的引人入胜的旅游博客文章 | 我最近有幸访问了夏威夷... | Aloha,欢迎阅读我关于最近...的旅游博客文章 | 无 | 无 | 人工 | ai (alpaca-13b) | ai (vicuna-13b-v1.2) | 无 | 无 | 0.0 | 人工 |
2 | 撰写一篇关于最近...的引人入胜的旅游博客文章 | 这是一篇关于最近一次旅行的旅游博客文章草稿... | 我最近有幸访问了夏威夷... | 无 | 无 | 人工 | ai (claude-v1) | ai (alpaca-13b) | 无 | 无 | 1.0 | 人工 |
3 | 撰写一篇关于最近...的引人入胜的旅游博客文章 | 这是一篇关于最近一次旅行的旅游博客文章草稿... | 这是一篇关于最近一次旅行的旅游博客文章... | 无 | 无 | 人工 | ai (claude-v1) | ai (llama-13b) | 无 | 无 | 1.0 | 人工 |
4 | 撰写一篇关于最近...的引人入胜的旅游博客文章 | Aloha!我最近有幸踏上了一段... | 我最近有幸访问了夏威夷... | 无 | 无 | 人工 | ai (gpt-3.5-turbo) | ai (alpaca-13b) | 无 | 无 | 1.0 | 人工 |
定义我们的评估器¶
In [ ]
Copied!
from llama_index.core.evaluation import PairwiseComparisonEvaluator
from llama_index.llms.openai import OpenAI
from llama_index.llms.gemini import Gemini
from llama_index.llms.cohere import Cohere
llm_gpt4 = OpenAI(temperature=0, model="gpt-4")
llm_gpt35 = OpenAI(temperature=0, model="gpt-3.5-turbo")
llm_gemini = Gemini(model="models/gemini-pro", temperature=0)
evaluators = {
"gpt-4": PairwiseComparisonEvaluator(llm=llm_gpt4),
"gpt-3.5": PairwiseComparisonEvaluator(llm=llm_gpt35),
"gemini-pro": PairwiseComparisonEvaluator(llm=llm_gemini),
}
from llama_index.core.evaluation import PairwiseComparisonEvaluator from llama_index.llms.openai import OpenAI from llama_index.llms.gemini import Gemini from llama_index.llms.cohere import Cohere llm_gpt4 = OpenAI(temperature=0, model="gpt-4") llm_gpt35 = OpenAI(temperature=0, model="gpt-3.5-turbo") llm_gemini = Gemini(model="models/gemini-pro", temperature=0) evaluators = { "gpt-4": PairwiseComparisonEvaluator(llm=llm_gpt4), "gpt-3.5": PairwiseComparisonEvaluator(llm=llm_gpt35), "gemini-pro": PairwiseComparisonEvaluator(llm=llm_gemini), }
使用 EvaluatorBenchmarkerPack
(llama-pack) 进行基准测试¶
为了比较我们的四个评估器,我们将使用 MTBenchHumanJudgementDataset
对它们进行基准测试,其中的参考结果由人工评估员提供。基准测试将返回以下量化结果:
number_examples
:数据集中的示例数量。invalid_predictions
:无法得出最终评估的评估数量(例如,由于无法解析评估输出,或 LLM 评估器抛出异常)。inconclusives
:由于这是配对比较,为了减轻“位置偏差”的风险,我们进行两次评估 — 一次按原始顺序呈现两个模型答案,另一次将呈现给评估 LLM 的答案顺序翻转。如果 LLM 评估器在第二次排序中相对于第一次投票翻转了投票结果,则结果为不确定。ties
:PairwiseComparisonEvaluator
也可以返回“平局”结果。这是给出平局结果的示例数量。agreement_rate_with_ties
:当包含平局时,LLM 评估器与参考(此处指人工)评估员一致的比例。计算此指标使用的分母为:示例数量 - 无效预测 - 不确定结果
。agreement_rate_without_ties
:当排除平局时,LLM 评估器与参考(此处指人工)评估员一致的比例。计算此指标使用的分母为:示例数量 - 无效预测 - 不确定结果 - 平局
。
为了计算这些指标,我们将使用 EvaluatorBenchmarkerPack
。
In [ ]
Copied!
from llama_index.core.llama_pack import download_llama_pack
EvaluatorBenchmarkerPack = download_llama_pack(
"EvaluatorBenchmarkerPack", "./pack"
)
from llama_index.core.llama_pack import download_llama_pack EvaluatorBenchmarkerPack = download_llama_pack( "EvaluatorBenchmarkerPack", "./pack" )
GPT-3.5¶
In [ ]
Copied!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gpt-3.5"],
eval_dataset=pairwise_evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gpt-3.5"], eval_dataset=pairwise_evaluator_dataset, show_progress=True, )
In [ ]
Copied!
gpt_3p5_benchmark_df = await evaluator_benchmarker.arun(
batch_size=100, sleep_time_in_seconds=0
)
gpt_3p5_benchmark_df = await evaluator_benchmarker.arun( batch_size=100, sleep_time_in_seconds=0 )
In [ ]
Copied!
gpt_3p5_benchmark_df.index = ["gpt-3.5"]
gpt_3p5_benchmark_df
gpt_3p5_benchmark_df.index = ["gpt-3.5"] gpt_3p5_benchmark_df
Out[ ]
示例数量 | 无效预测 | 不确定结果 | 平局 | 包含平局的一致率 | 不包含平局的一致率 | |
---|---|---|---|---|---|---|
gpt-3.5 | 1204 | 82 | 393 | 56 | 0.736626 | 0.793462 |
GPT-4¶
In [ ]
Copied!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gpt-4"],
eval_dataset=pairwise_evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gpt-4"], eval_dataset=pairwise_evaluator_dataset, show_progress=True, )
In [ ]
Copied!
gpt_4_benchmark_df = await evaluator_benchmarker.arun(
batch_size=100, sleep_time_in_seconds=0
)
gpt_4_benchmark_df = await evaluator_benchmarker.arun( batch_size=100, sleep_time_in_seconds=0 )
In [ ]
Copied!
gpt_4_benchmark_df.index = ["gpt-4"]
gpt_4_benchmark_df
gpt_4_benchmark_df.index = ["gpt-4"] gpt_4_benchmark_df
Out[ ]
示例数量 | 无效预测 | 不确定结果 | 平局 | 包含平局的一致率 | 不包含平局的一致率 | |
---|---|---|---|---|---|---|
gpt-4 | 1204 | 0 | 100 | 103 | 0.701087 | 0.77023 |
Gemini Pro¶
注意:Gemini 模型的速率限制仍然非常严格,考虑到它们在编写本 Notebook 时刚刚发布,这是可以理解的。因此,我们使用非常小的 batch_size
和适度高的 sleep_time_in_seconds
来降低达到速率限制的风险。
In [ ]
Copied!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gemini-pro"],
eval_dataset=pairwise_evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gemini-pro"], eval_dataset=pairwise_evaluator_dataset, show_progress=True, )
In [ ]
Copied!
gemini_pro_benchmark_df = await evaluator_benchmarker.arun(
batch_size=5, sleep_time_in_seconds=0.5
)
gemini_pro_benchmark_df = await evaluator_benchmarker.arun( batch_size=5, sleep_time_in_seconds=0.5 )
In [ ]
Copied!
gemini_pro_benchmark_df.index = ["gemini-pro"]
gemini_pro_benchmark_df
gemini_pro_benchmark_df.index = ["gemini-pro"] gemini_pro_benchmark_df
Out[ ]
示例数量 | 无效预测 | 不确定结果 | 平局 | 包含平局的一致率 | 不包含平局的一致率 | |
---|---|---|---|---|---|---|
gemini-pro | 1204 | 2 | 295 | 60 | 0.742007 | 0.793388 |
In [ ]
Copied!
evaluator_benchmarker.prediction_dataset.save_json("gemini_predictions.json")
evaluator_benchmarker.prediction_dataset.save_json("gemini_predictions.json")
总结¶
为了方便,我们将所有结果放入一个 DataFrame 中。
In [ ]
Copied!
import pandas as pd
final_benchmark = pd.concat(
[
gpt_3p5_benchmark_df,
gpt_4_benchmark_df,
gemini_pro_benchmark_df,
],
axis=0,
)
final_benchmark
import pandas as pd final_benchmark = pd.concat( [ gpt_3p5_benchmark_df, gpt_4_benchmark_df, gemini_pro_benchmark_df, ], axis=0, ) final_benchmark
Out[ ]
示例数量 | 无效预测 | 不确定结果 | 平局 | 包含平局的一致率 | 不包含平局的一致率 | |
---|---|---|---|---|---|---|
gpt-3.5 | 1204 | 82 | 393 | 56 | 0.736626 | 0.793462 |
gpt-4 | 1204 | 0 | 100 | 103 | 0.701087 | 0.770230 |
gemini-pro | 1204 | 2 | 295 | 60 | 0.742007 | 0.793388 |
从以上结果,我们可以得出以下观察:
- 在一致率方面,这三个模型似乎相当接近,其中 Gemini 模型可能略有优势。
- Gemini Pro 和 GPT-3.5 似乎比 GPT-4 更坚定,平局次数分别为 50-60 次,而 GPT-4 为 100 次。
- 然而,可能与前一点有关,GPT-4 的不确定结果最少,这意味着它受位置偏差的影响最小。
- 总体而言,Gemini Pro 似乎与 GPT 模型旗鼓相当,并且可以说它优于 GPT-3.5——看起来 Gemini 在评估任务中可以成为 GPT 模型的合法替代品。