RAG 评测

原文:AIGC面试宝典


1. 合成RAG测试集

成功构建一个RAG系统后想要评估它的为性能需要一个评估数据集,该数据集包含以下列:

  • question(问题):想要评估的RAG的问题
  • ground_truths(真实答案):问题的真实答案
  • answer(答案):RAG预测的答案
  • contexts:RAG用于生成答案的相关信息列表

要创建这样的数据集,我们首先需要生成问题答案的元组。
接下来,在RAG上运行这些问题以获得预测结果

1.1 生成问题和基准答案(实践中可能会出现偏差)

要生成(问题、答案)元组,我们首先需要准备 RAG数据,将其拆分为,并将其嵌入向量数据库中。完成这些步骤后,指示LLM 从指定主题中生成num_questions个问题,从而得到问题答案元组。

为了从给定的上下文中生成问题和答案,我们需要按照以下步骤聚操作:

  1. 选择一个随机块并将其作为根上下文
  2. 从向量数据库中检索K个相似的上下文
  3. 随机上下文和其K个相邻上下文的文本连接起来以构建一个个更大的上下文
  4. 使用这个大的上下文num_questions在以下的提示模板中生成问题答案
"""
Your task is to formulate exactly {num_questions} questions from given context and provide the answer
to each one.

End each question with a '?' character and then in a newline write the answer to that question using only the context provided.
Separate each question/answer pair by "XXX"
Each question must start with "question:".
Each answer must start with "answer:".

The question must satisfy the rules given below:
1. The question should make sense to humans even when read without the given context.
2. The question should be fully answered from the given context.
3. The question should be framed from a part of context that contains important information. It can also be from tables, code, etc.
4. The answer to the question should not contain any links.
5. The question should be of moderate difficulty.
6. The question must be reasonable and must be understood and responded by humans.
7. Do no use phrases like 'provided context', etc in the question
8. Avoid framing question using word "and" that can be decomposed into more than one question.
9. The question should not contain more than 10 words, make of use of abbreviation wherever possible.
context:{context)
"""
"""
您的任务是根据给定的上下文提出{num_questions}个问题,并给出每个问题的答案。
在每个问题的末尾加上'?'
提供的上下文写出该问题的答案。
每个问题/答案之间用"XXX"隔开。
每个问题必须以"question:"开头。
每个答案必须以"answer:"开头。

问题必须符合以下规则:
1.即使在没有给定上下文的情况下,问题也应该对人类有意义。
2.问题应能根据给定的上下文给出完整的答案。
3.问题应从包含重要信息的上下文中提取。也可以是表格、代码等。
4.问题答案不应包含任何链接。
5.问题难度应适中。
6.问题必须合理,必须为人类所理解和回答。
7.不要在问题中使用"提供上下文"等短语。
8.避免在问题中使用"和"字,因为它可以分解成多个问题。
9.问题不应超过10个单词,尽可能使用缩写。

语境:{上下文}
"""
  1. 重复以上步骤 num_count 次,每次改变上下文并生成不同的问题。

基于上面的工作流程,下面是生成问题和答案的结果示例。

在这里插入图片描述

1.2 代码案例

首先构建一个向量存储,其中包含RAG使用的数据

1.2.1 从维基百科加载
from langchain.document_loaders import WikipediaLoader

topic = 'python programming'
wikipedia_loader = WikipediaLoader(
						query = topic,
						load_max_docs = 1,
						doc_content_chars_max = 100000,
						)
docs = wikipedia_loader.load()
doc = docs[0]
1.2.2 加载数据后将其分块
from langchain.text_splitter import RecursiveCharacterTextSplitter

CHUNK_SIZE = 512
CHUNK_OVERLAP = 128
splitter = RecursiveCharacterTextSplitter(
				chunk_size = CHUNK_SIZE,
				chunk_overlap = CHUNK_OVERLAP,
				separators = ["."],
				)
splits = splitter.split_documents([doc])
1.2.3 在Pinecine中创建一个索引
import os
import pinecone

pinecone.init(
	api_key = os.environ.get("PINECONE_API_KEY"),
	environment = os.envieon.get("PINECONE_ENV"),
	)
index_name = topic.replace(" ","-")
if index_name in pinecone.list_indexs():
	pinecone.delete_index(index_name)
pinecone.create_index(index_name, dimension=768)

1.2.4 使用langchain 包装器来索引其中的分片嵌入
from langchain.vectorstores import Pinecone

docsearch = Pinecone.from_documents(
						splits,
						embedding_model,
						index_name=index_name,
						)
1.2.5 生成合成数据集

使用LLM、文档拆分、嵌入模型和Pinecone索引名称从TestsetGenerator类初始化一个对象。

from langchain.embeddings import VertexAIEmbeddings
from langchain.llms import VertexAI
from testset_generator import TestsetGenerator

generator_llm = VertexAI(
					location = 'europr-west3',
					max_output_tokens = 256,
					max_retries = 20,
					)
embedding_model = VertexAIEmbeddings()
testset_generator = TestsetGenerator(
						generator_llm = generator_llm ,
						documents = splits,
						embedding_model  = embedding_model ,
						index_name = index_name,
						key = 'text',
						)
1.2.6 通过传递两个参数来调用generate方法
synthetic_dataset = testset_generator.generate(
						num_contexts = 10,
						num_questions_per_context = 2,
						)
1.2.7 生成问题与答案如下

在这里插入图片描述
接下来使用RAG来预测每个问题的答案,并提供用于支撑响应的上下文列表

1.2.8 初始化RAG
from rag import RAG

rag = RAG(
		index_name,
		"text-bison",
		embedding_model,
		"text",
		)
1.2.9 用过对每个问题调用predict方法来迭代合成数据集并收集预测
rag_answers, contexts =[],[]

for i, row in synthetic_dataset.itterows():
	question = row["question"]
	prediction = rag.predict(question)
	rag_answer = prediction["answer"]
	rag_answers.append(rag_answer)
	source_documents = prediction["source_documents"]
	contexts.append([s.page_content for s in source_documents])
synthetic_dataset_rag = synthetic_dataset.copy()
synthetic_dataset_rag["answer"] = rag_answers
1.2.10 最终结果如下

在这里插入图片描述
基于以上步骤,我们已经为评估RAG做好了数据准备,接下来进行RAG 评估

2. RAG 评估方法

  • 独立评估
  • 端到端评估

2.1 独立评估

独立评估涉及对检索模块生成模块(即阅读和合成信息)的评估。

2.1.1 生成模块
介绍

生成模块指的是将检索到的文档与查询相结合,形成增强或合合成的输入。这与最终答案或响应的生成不同,后者通常采用端到端的评估方方式。

2.1.2 评估指标

2.1.2.1、答案相关性(Answer Relevancy)
指标的目标:评估生成的答案与提供的问题提示之间的相关性
答案如果缺乏完整性或者包含冗余信息,那么其得分将相对较低。这一指标通过问题和答案的结合来进行计算,评分的范围通常在0到1之间,其中高分代表更好的相关性。

示例:

问题:健康饮食的主要特点是什么?

低相关性答案:健康饮食对整体健康非常重要。
高相关性答案:健康饮食应包括各种水果、蔬菜、全麦食品、瘦肉和乳制品,为优化健康提供必要的营养素。

2.1.2.2、忠实度(Faithfulness)
评价标准:在检查生成的答案在给定上下文中的事实准确性
评估的过程涉及到答案内容与其检索到的上下文之间的比对。这一指标也使用一个介于0到1之间的数值来表示,其中更高的数值意味着答案与上下文的一致性更高。

示例:

问题:居里夫人的主要成就是什么?
背景:玛丽·居里(1867-1934)是一位开创性的物理学家和化学家,她是第一位获得诺贝尔奖的女性,也是唯位在两个不同领域获得诺贝尔奖的女性。

高忠实度答案:玛丽·居里在物理和化学两个领域都获得了诺贝尔奖,使她成为第一位实现这一成就的女性。
低忠实度答案:玛丽·居里只在物理学领域获得了诺贝尔奖。

2.1.2.3、上下文精确度(Context Precision)
指标:评估所有在给定上下文中与基准信息相关的条目是否被正确地排序
理想情况下,所有相关的内容应该出现在排序的前部。这一评价标准同样使用0到1之间的得分值来表示,其中较高的得分反映了更高的精确度

指标:

  • 命中率(Hit Rate)
  • 平均排名倒数(MRR)
  • 归一化折扣累积增益(NDCG)
  • 精确度(Precision)等

2.1.2.4、答案正确性(Answer Correctness)
指标:主要用于测量生成的答案与实际基准答案之间的匹配程度
这一评估考虑了基准答案和生成答案的对比,其得分也通常在0到1之间,较高的得分表明生成答案与实际答案的一致性更高。

示例:

基本事实:埃菲尔铁塔于1889年在法国巴黎竣工。

答案正确率高:埃菲尔铁塔于1889年在法国巴黎竣工。
答案正确率低:埃菲尔铁塔于1889年竣工,矗立在英国伦敦。

2.2 端到端评估

2.2.1介绍

对RAG模型对特定输入生成的最终响应进行评估,涉及模型生成的答案与输入查询的相关性和一致性。

2.2.2 端到端评估模块

1.无标签的内容评估:

  • 评价指标:
    • 答案的准确性
    • 相关性
    • 无害性

2.有标签的内容评估:

  • 评价指标:
    • 准确率(Accuracy)
    • 精确匹配(EM)

3. RAG关键指标和能力

评估RAG在不同下游任务不同检索器中的应用可能会得到不同的结果。然而,一些学术和工程实践已经开始关注RAG的通用评估指标和有效运用所需的能力。

  • 关键指标:
    • 答案的准确性、
    • 答案的相关性
    • 上下文的相关性。
  • 关键基本能力:
    • 抗噪声能力
    • 拒绝无效回答能力
    • 信息综合能力
    • 反事实稳健性

4. 评估框架

  • RAGAS
  • ARES

4.1 RAGAS

RAGAS是一个基于简单手写提示的评估框架,通过这些提示全自动地衡量答案的的准确性相关性上下文相关性

  • 算法原理:
    1.答案忠实度评估:利用大语言模型(LLM)分解答案为多个陈述,检验每个陈述与上下文的一致性。最终,根据支持的陈述数量与总陈述数量的的比例,计算出一个"忠实度得分"。
    2.答案相关性评估:使用大语言模型(LLM)创造可能的问题,并分析这些问题与原始问题的相似度。答案相关性得分是通过计算所有生成问题与原始问题相似度的平均值来得出的。
    3.上下文相关性评估:运用大语言模型(LLM)筛选出直接与问题相关的句子,以这些句子上下文句子数量比例来确定上下文相关性得分。

4.2 ARES

ARES的目标是自动化评价RAG系统在上下文相关性答案忠实度答案相关性三个方面的性能。ARES减少了评估成本,通过使用少量的手动标注数据和合成数据,并应用预测驱动推理(PDR)提供统计置信区间,提高了评估的准确角性。

  • 算法原理:
    1.生成合成数据集:ARES首先使用语言模型从目标语料库中的文档生成合成问题和答案,创建正负两种样本
    2.训练大语言模型(LLM)裁判:然后ARES对轻量级语言模型进行微调,利用合成数据集训练它们以评估上下文相关性答案忠实度答案相关性
    3.基于置信区间对RAG系统排名:最后,ARES使用这些裁判模型为RAG系统打分,并结合手动标注的验证集,采用PPI方法生成置信区间,从而可靠地评估RAG系统的性能。
  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值