解读RAG测评:关键指标与应用分析
©作者|CodeDan
来源|神州问学
一、RAG介绍
1.1 简介
RAG(Retrieval-Augmented Generation)是一种结合信息检索与文本生成的技术,旨在提高大型语言模型(LLM)在回答复杂查询时的表现。它通过检索相关的上下文信息来增强生成答案的质量和准确性。
想象一下,你在准备一场关于某个冷门历史事件的演讲,但你不太了解细节。你有一个很聪明的助手(相当于大型语言模型,LLM),但他也不是万能的,需要查阅外部信息来给出最好的答案。
这时候,RAG 就像是你的智能助手工作流程,它分成两个步骤:
1. 检索:助手先从图书馆或网上找出与这个历史事件相关的几篇文章或资料(这就是检索部分,它从外部数据源中找到相关的信息)。
2. 生成:助手读了这些资料后,再根据你给的提示(比如:“这个事件的关键人物是谁?”),结合刚刚找到的资料,生成一个完整、准确的回答告诉你。
通俗来说,RAG 就是让智能助手先去查资料,再根据资料来生成答案,而不是仅仅凭借它自己原有的知识作答。这样能让回答更准确,特别是对于冷门或专业领域的问题。
1.2 RAG的问题以及关注点
但是RAG也不是万能的,通常他们在检索质量和生成质量上需要我们着重关注。让我们在原来的例子中来体会一下这两个问题。
在检索质量上,助手从图书馆找到了几本书或文章,但其中一些信息可能并不完全相关,甚至有很多不必要的噪声。如果助手不能准确挑选出最有价值的内容,就可能导致生成的答案不准确或不连贯。因此,检索器必须确保找到的资料高度相关,避免噪声和无关信息的干扰,否则会直接影响到生成环节的表现。
在生成质量上,即使检索器找到了相关的资料,助手如何将这些资料转化为一个连贯、准确的回答仍然是个挑战。如果助手在生成答案时信息混乱或缺乏逻辑,就会降低最终的回答质量。因此,生成器需要有能力根据检索到的信息进行高质量的回答生成,并且还要能适应特定领域的问题。
通常来说,生成质量在很大程度上取决于模型的智能水平。像 GPT-4 或 GPT-1o 这样的高级模型,通常能提供较高的生成质量,确保答案的准确性和连贯性。
因此,我们的重点更多集中在检索质量上。那么,如何判断检索出的信息是否满足需求呢?
二、检索质量关键测评指标
这篇论文《生成式搜索引擎中验证性评估》的思路非常贴近我们讨论的主题,尤其是在评估生成内容的可验证性方面。其内容总结下来就是一论点,四指标,两算法。
2.1 一个论点
论文中的一个观点——成熟的可信赖的生成式搜索引擎(Generative Search Engine, GSE)的先决条件是可验证性(verifiability)。理想的 RAG 系统应该具备以下特征:
• 高引用召回率(high citation recall):所有生成内容都有充分的外部知识支持。
• 高引用精度(high citation precision):每个引用确实支持生成的内容。
然而,研究表明,这两个指标不可能达到 100%。根据实验结果,现有的 GSE 经常生成无据陈述和不准确的引文,分别达到 51.5% 和 74.5%。
2.2 四个指标
并且论文采用了四个指标来进行评估:
1. 流畅性(fluency):生成文本是否流畅连贯,使用五点李克特量表进行评分,从“强烈不同意”到“强烈同意”。
2. 实用性(perceived utility):生成内容的有用性,评测者对“这个回答对查询是有帮助且信息丰富的”这一说法的同意程度进行评分。
3. 引文召回率(citation recall):引文支持的生成内容与总生成内容的比例,类似于上下文支持率的概念。
4. 引文精度(citation precision):与特定主题相关的文献数量与检索到的内容的比例,接近于上下文有效率的概念。
2.3两个算法
为了综合考虑精确率和召回率,论文中引入了 F1 分数和 F2 分数:
F1 分数:精确率和召回率的调和平均数,适用于数据不平衡的情况,能够更全面地反映模型性能。
F2 分数:通过引入参数 β,允许调整精确率和召回率的相对重要性。比如β<1时,意味着精确率大于召回率,反之精确率大于召回率。
这些分数能够更准确地评估模型的性能,尤其是在面对不平衡数据时,提供比单纯准确率更有价值的见解。
三、RAG评测的具体方法RAGAs
3.1 RAGAs框架介绍
RAGAs (Retrieval-Augmented Generation Assessment) 是一个评估框架,专注于分析 RAG 系统在检索和生成环节的性能。它评估检索系统识别相关上下文段落的能力,以及大语言模型(LLM)在生成中如何有效利用这些段落。此外,RAGAs 还关注生成内容的质量。
为了评估 RAG 流程,RAGAs 需要以下几类数据:
RAGAs 提供多个指标来从组件和整体流程两个层面评估 RAG 系统的性能。所有指标的评分范围在 0 到 1 之间,分数越高代表性能越好。
组件层面的指标:
3.2 RAGAs实际代码演示
# 创建一个 GPT-4 小模型实例,用于生成对话。可以通过指定 API 密钥和 base URL 进行自定义调用。
model = ChatOpenAI(model="gpt-4o-mini", openai_api_key="",openai_api_base="",temperature=1)
# 加载博客文章或其他文本数据。
loader = TextLoader("your_name")
documents = loader.load()
# 使用字符分割器将文本按 1000 个字符大小进行切片,且切片之间不重叠。
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 将切片后的文本数据向量化,以便于后续的检索操作。
embeddings = OpenAIEmbeddings(model="text-embedding-3-large",openai_api_key="", openai_api_base="")
# 将向量化后的文档存入 FAISS 向量存储中,便于进行相似度检索。
vectorstore = FAISS.from_documents(texts, embeddings)
# 将向量存储转换为检索器,使其能够基于嵌入向量进行文档检索。
retriever = vectorstore.as_retriever()
# 设置系统提示,告诉模型其角色是基于检索的上下文回答问题,且答案需要简洁。
system_prompt = ( "You are an assistant for question-answering tasks. "
"Use the following pieces of retrieved context to answer "
"the question. If you don't know the answer, say that you "
"don't know. Use three sentences maximum and keep the "
"answer concise."
"\n\n"
"{context}"
)
# 定义一个对话提示模板,包含系统消息和用户输入部分。将检索到的上下文嵌入到回答逻辑中。
prompt = ChatPromptTemplate.from_messages(
[
("system", system_prompt),
("human", "{input}"),
]
)
# 创建用于文档处理的 QA 链(基于检索内容回答问题的链条)。
question_answer_chain = create_stuff_documents_chain(model, prompt)
# 将检索器整合进问答链,形成一个完整的 RAG(检索增强生成)链,用于实现基于检索的生成式问
答。
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy, context_recall, context_precision,
)
# 示例问题
questions = ["question1", "question2", "question3"]
# 真实答案
ground_truths = [["true_answer1"], ["true_answer2"], ["true_answer3"]]
# 存储推导的答案和上下文
answers = []
contexts = []
# 迭代每个问题,生成答案并获取相关上下文
for query in questions:
# 生成答案
answer = rag_chain.invoke(query)
answers.append(answer if isinstance(answer, str) else answer['text'])
# 获取与问题相关的文档内容
relevant_docs = retriever.get_relevant_documents(query)
contexts.append([doc.page_content for doc in relevant_docs])
# 将数据转换为字典形式
data = { "question": questions, "answer": answers, "contexts": contexts, "ground_truths": ground_truths
}
# 创建数据集
dataset = Dataset.from_dict(data)
# 评估结果
result = evaluate(
dataset=dataset, metrics=[
context_precision, context_recall, faithfulness, answer_relevancy,
],
)
# 将结果转换为 Pandas DataFrame 格式
df = result.to_pandas()
print(df)
3.2 RAGAs效果展示
这些指标为衡量 RAG 系统在检索和生成环节的表现提供了标准,能够帮助判断 RAG 流程的性能是否有所提升。
参考内容:
[1] Chen, J., Lin, H., Han, J., & Sun, Y. (2023). 在检索增强生成中对大型语言模型进行基准测试. arXiv preprint arXiv:2309.01431v2.
https://doi.org/10.48550/arXiv.2309.01431
[2] Riedel, S., Kiela, D., Lewis, P., & Piktus, A. (2020). Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models. Meta AI Blog.
[3] Liu, N. F., Zhang, T., & Liang, P. (2023).
评估生成搜索引擎的可验证性. arXiv预印本, arXiv:2304.09848v2.