AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【大模型RAG优化】RAG召回环节评估实践
发布日期:2024-04-10 20:56:45 浏览次数: 2251


对于大模型RAG来讲,召回的文本中是否包含用户问题对应的答案严重影响着最终LLM回答效果。文本切块策略、向量化模型、召回策略等因素都会影响最终的召回效果。因此,构建一套对召回环节的评估流程,并不断优化召回的各个环节,是构建RAG系统的必要步骤。

评估召回环节效果需要的测试数据形式为“问题-包含答案的文本块”这样的二元组。常用的评估指标有命中率和平均倒数排名(Mean Reciprocal Rank, MRR)

命中率指的是包含答案的文本块在召回文本集合中出现的概率。对于单次召回,只有“命中”和“未命中”两种情况,不考虑包含答案的文本块在召回列表中的排序。

平均倒数排名是一种简单的搜索算法评价指标,计算方式为进行多次召回,得到每次召回中包含答案的文本块在召回列表中的排名倒数,然后取平均。具体计算方式如下公式所示,其中 ,   rank_i表示包含第i个问题 Q_i的答案的文本片段在召回文本列表中的位置。

在实际场景中,通常没有现成的“问题-包含答案的文本片段”这样的测试数据二元组,可以根据原始文本进行构建。我们可以使用大模型应用开发框架LlamaIndex提供的generate_question_context_pairs接口来方便地生成召回环节的测试数据二元组。该接口调用LLM,根据切段后的原始文本生成对应问题,LLM的默认提示词如下:

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.

除此之外,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)



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询