在 Mini MT-Bench(单次评分)上对 LLM 评估器进行基准测试 LabelledEvaluatorDataset¶¶
在本 Notebook 中,我们将对三种不同的评估器进行评估,这些评估器将根据用户查询判断另一个 LLM 的响应。更具体地说,我们将使用 Mini 版 MT-Bench 单次评分数据集运行基准测试。在此版本中,我们仅考虑 llama2-70b 提供的 160 个问题(即 80 x 2,因为有 80 个两轮对话)的答案。此基准测试中使用的参考答案由 GPT-4 提供。因此,我们对这三种评估器进行的基准测试将评估它们与 GPT-4 的接近程度(实际上,对于 GPT-4 而言,是自洽性)。
- GPT-3.5 (OpenAI)
- GPT-4 (OpenAI)
- Gemini-Pro (Google)
输入 [ ]
已复制!
%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
输入 [ ]
已复制!
import nest_asyncio
nest_asyncio.apply()
import nest_asyncio nest_asyncio.apply()
输入 [ ]
已复制!
!pip install "google-generativeai" -q
!pip install "google-generativeai" -q
加载评估器数据集¶¶
让我们从 llama-hub 加载 llama-dataset。
输入 [ ]
已复制!
from llama_index.core.llama_dataset import download_llama_dataset
# download dataset
evaluator_dataset, _ = download_llama_dataset(
"MiniMtBenchSingleGradingDataset", "./mini_mt_bench_data"
)
from llama_index.core.llama_dataset import download_llama_dataset # download dataset evaluator_dataset, _ = download_llama_dataset( "MiniMtBenchSingleGradingDataset", "./mini_mt_bench_data" )
输入 [ ]
已复制!
evaluator_dataset.to_pandas()[:5]
evaluator_dataset.to_pandas()[:5]
输出 [ ]
查询 | 答案 | 上下文 | ground_truth_answer | query_by | answer_by | ground_truth_answer_by | 参考反馈 | 参考分数 | 参考评估者 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 撰写一篇关于 R 的引人入胜的旅游博客文章... | 标题:发现夏威夷精神:最近的... | 无 | 无 | 无 | AI (llama2-70b) | 无 | 生成的答案与... 高度相关 | 5.0 | AI (gpt-4) |
1 | 重写你之前的回复。每句话都以 S 开头... | 当然,这是修改后的回复:\n\n绝... | 无 | 无 | 无 | AI (llama2-70b) | 无 | 生成的答案高度相关且具... | 5.0 | AI (gpt-4) |
2 | 起草一封专业的电子邮件,寻求你主管的... | 主题:寻求关于季度财务的反馈... | 无 | 无 | 无 | AI (llama2-70b) | 无 | 生成的答案与... 高度相关 | 5.0 | AI (gpt-4) |
3 | 花点时间评估和批评你自己的... | 我的回复是:\n\n"主题:寻求反馈... | 无 | 无 | 无 | AI (llama2-70b) | 无 | 生成的答案与... 高度相关 | 5.0 | AI (gpt-4) |
4 | 想象你正在写一篇博客文章,比较... | 当然,这是一篇比较...的博客文章大纲 | 无 | 无 | 无 | AI (llama2-70b) | 无 | 生成的答案与... 高度相关 | 5.0 | AI (gpt-4) |
定义我们的评估器¶¶
输入 [ ]
已复制!
from llama_index.core.evaluation import CorrectnessEvaluator
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": CorrectnessEvaluator(llm=llm_gpt4),
"gpt-3.5": CorrectnessEvaluator(llm=llm_gpt35),
"gemini-pro": CorrectnessEvaluator(llm=llm_gemini),
}
from llama_index.core.evaluation import CorrectnessEvaluator 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": CorrectnessEvaluator(llm=llm_gpt4), "gpt-3.5": CorrectnessEvaluator(llm=llm_gpt35), "gemini-pro": CorrectnessEvaluator(llm=llm_gemini), }
使用 EvaluatorBenchmarkerPack
(llama-pack) 进行基准测试¶
当使用 EvaluatorBenchmarkerPack
和 LabelledEvaluatorDataset
时,返回的基准测试结果将包含以下量的值
number_examples
:数据集中包含的样本数量。invalid_predictions
:无法得出最终评估结果的评估次数(例如,由于无法解析评估输出,或LLM评估器抛出异常)。correlation
:提供的评估器得分与参考评估器(此处为 gpt-4)得分之间的相关性。mae
:提供的评估器得分与参考评估器得分之间的平均绝对误差。hamming
:提供的评估器得分与参考评估器得分之间的汉明距离。
注意:`correlation`、`mae` 和 `hamming` 都在排除无效预测的情况下计算。因此,这些指标本质上是条件指标,以预测有效为前提。
输入 [ ]
已复制!
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¶
输入 [ ]
已复制!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gpt-3.5"],
eval_dataset=evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gpt-3.5"], eval_dataset=evaluator_dataset, show_progress=True, )
输入 [ ]
已复制!
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 )
/Users/nerdai/Projects/llama_index/docs/examples/evaluation/pack/base.py:142: UserWarning: You've set a large batch_size (>10). If using OpenAI GPT-4 as `judge_llm` (which is the default judge_llm), you may experience a RateLimitError. Previous successful eval responses are cached per batch. So hitting a RateLimitError would mean you'd lose all of the current batches successful GPT-4 calls. warnings.warn( Batch processing of predictions: 100%|████████████████████| 100/100 [00:05<00:00, 18.88it/s] Batch processing of predictions: 100%|██████████████████████| 60/60 [00:04<00:00, 12.26it/s]
输入 [ ]
已复制!
gpt_3p5_benchmark_df.index = ["gpt-3.5"]
gpt_3p5_benchmark_df
gpt_3p5_benchmark_df.index = ["gpt-3.5"] gpt_3p5_benchmark_df
输出 [ ]
样本数量 | 无效预测 | 相关性 | 平均绝对误差 | 汉明距离 | |
---|---|---|---|---|---|
gpt-3.5 | 160 | 0 | 0.317047 | 1.11875 | 27 |
GPT-4¶
输入 [ ]
已复制!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gpt-4"],
eval_dataset=evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gpt-4"], eval_dataset=evaluator_dataset, show_progress=True, )
输入 [ ]
已复制!
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 )
/Users/nerdai/Projects/llama_index/docs/examples/evaluation/pack/base.py:142: UserWarning: You've set a large batch_size (>10). If using OpenAI GPT-4 as `judge_llm` (which is the default judge_llm), you may experience a RateLimitError. Previous successful eval responses are cached per batch. So hitting a RateLimitError would mean you'd lose all of the current batches successful GPT-4 calls. warnings.warn( Batch processing of predictions: 100%|████████████████████| 100/100 [00:13<00:00, 7.26it/s] Batch processing of predictions: 100%|██████████████████████| 60/60 [00:10<00:00, 5.92it/s]
输入 [ ]
已复制!
gpt_4_benchmark_df.index = ["gpt-4"]
gpt_4_benchmark_df
gpt_4_benchmark_df.index = ["gpt-4"] gpt_4_benchmark_df
输出 [ ]
样本数量 | 无效预测 | 相关性 | 平均绝对误差 | 汉明距离 | |
---|---|---|---|---|---|
gpt-4 | 160 | 0 | 0.966126 | 0.09375 | 143 |
Gemini Pro¶
输入 [ ]
已复制!
evaluator_benchmarker = EvaluatorBenchmarkerPack(
evaluator=evaluators["gemini-pro"],
eval_dataset=evaluator_dataset,
show_progress=True,
)
evaluator_benchmarker = EvaluatorBenchmarkerPack( evaluator=evaluators["gemini-pro"], eval_dataset=evaluator_dataset, show_progress=True, )
输入 [ ]
已复制!
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 )
输入 [ ]
已复制!
gemini_pro_benchmark_df.index = ["gemini-pro"]
gemini_pro_benchmark_df
gemini_pro_benchmark_df.index = ["gemini-pro"] gemini_pro_benchmark_df
输出 [ ]
样本数量 | 无效预测 | 相关性 | 平均绝对误差 | 汉明距离 | |
---|---|---|---|---|---|
gemini-pro | 160 | 1 | 0.295121 | 1.220126 | 12 |
输入 [ ]
已复制!
evaluator_benchmarker.prediction_dataset.save_json(
"mt_sg_gemini_predictions.json"
)
evaluator_benchmarker.prediction_dataset.save_json( "mt_sg_gemini_predictions.json" )
总结¶
将所有基准结果放在一起。
输入 [ ]
已复制!
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
输出 [ ]
样本数量 | 无效预测 | 相关性 | 平均绝对误差 | 汉明距离 | |
---|---|---|---|---|---|
gpt-3.5 | 160 | 0 | 0.317047 | 1.118750 | 27 |
gpt-4 | 160 | 0 | 0.966126 | 0.093750 | 143 |
gemini-pro | 160 | 1 | 0.295121 | 1.220126 | 12 |
从以上结果,我们得出以下观察:
- GPT-3.5 和 Gemini-Pro 的结果似乎相似,GPT-3.5 在与 GPT-4 的接近度方面可能略有优势。
- 不过,两者似乎都与 GPT-4 不太接近。
- 在本次基准测试中,GPT-4 本身表现得相当一致。