评估召回环节效果需要的测试数据形式为“问题-包含答案的文本块”这样的二元组。常用的评估指标有命中率和平均倒数排名(Mean Reciprocal Rank, MRR)。
命中率指的是包含答案的文本块在召回文本集合中出现的概率。对于单次召回,只有“命中”和“未命中”两种情况,不考虑包含答案的文本块在召回列表中的排序。
平均倒数排名是一种简单的搜索算法评价指标,计算方式为进行多次召回,得到每次召回中包含答案的文本块在召回列表中的排名倒数,然后取平均。具体计算方式如下公式所示,其中 , rank_i表示包含第i个问题 Q_i的答案的文本片段在召回文本列表中的位置。
Context information is below. ---------------------
{context_str}
---------------------
Given the context information and not prior knowledge.
generate only questions based on the below query.
You are a Teacher/ Professor. Your task is to setup \
{num_questions_per_chunk} questions for an upcoming \
quiz/examination. The questions should be diverse in nature \
across the document. Restrict the questions to the \
context information provided.
ingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif;background-color: rgb(255, 255, 255);">除此之外,LlamaIndex也提供了RetrieverEvaluator接口,为其提供测试数据集,向量数据库,向量化模型,就能自动的进行评估,并输出命中率和平均倒数排名。利用LlamaIndex构建向量数据库、生成召回环节测试数据集并评估的完整示例代码如下所示。from llama_index.evaluation import generate_question_context_pairs
from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext,OpenAIEmbedding
from llama_index.node_parser import SentenceSplitter
from llama_index.llms import OpenAI
import os
from llama_index.evaluation import RetrieverEvaluator
import pandas as pd
os.environ["OPENAI_API_BASE"] = "xxx"
os.environ["OPENAI_API_KEY"] = "xxx"
llm = OpenAI(model="gpt-35-turbo")
# 文本加载与切块,data文件夹中存放txt文件
documents = SimpleDirectoryReader("./data/").load_data()
node_parser = SentenceSplitter(chunk_size=512)
nodes = node_parser.get_nodes_from_documents(documents)
# 设置文本块id
for idx, node in enumerate(nodes):
node.id_ = f"node_{idx}"
# 构建向量数据库
embed_model = OpenAIEmbedding()
service_context = ServiceContext.from_defaults(embed_model=embed_model)
vector_index = VectorStoreIndex(nodes, service_context=service_context)
retriever = vector_index.as_retriever(similarity_top_k=2)
# 根据原始文本块生成问题qa_dataset = generate_question_context_pairs(
nodes, llm=llm, num_questions_per_chunk=2
)
# 定义评估器
retriever_evaluator = RetrieverEvaluator.from_metric_names(
["mrr", "hit_rate"], retriever=retriever
)
# 在所有生成的问题上评估召回效果
eval_results = await retriever_evaluator.aevaluate_dataset(qa_dataset)
result = []
for eval_result in eval_results:
metric_dict = eval_result.metric_vals_dict
result.append(metric_dict)
result_df = pd.DataFrame(result)
hit_rate = result_df["hit_rate"].mean()
mrr = result_df["mrr"].mean()
print("hit_rate:", hit_rate)
print("mrr:", mrr)
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |