AI 文摘

【AI大模型应用开发】【RAG评估】1通俗易懂:深度理解RAGAS评估方法的原理与应用





作者: 同学小张 来源: 同学小张

  • 大家好,我是同学小张,日常分享AI知识和实战案例

  • 欢迎点赞 + 关注 👏,持续学习持续干货输出

公众号内文章一览

有任何问题,欢迎+vx:jasper_8017 ,期待与志同道合的朋友一起讨论,共同进步!

上篇文章【AI大模型应用开发】【RAG评估】0. 综述:一文了解RAG评估方法、工具与指标, 我们盘点了当前RAG系统评估的一些主流方法、工具和评估指标。本文我们针对其中的RAGAS评估方法进行详细介绍。我们将深入其原理,理解其评估指标背后是怎么实现的。都是我根据自己的理解用大白话解释,保证大家能看懂。

  • RAGAS论文地址:https://arxiv.org/pdf/2309.15217.pdf

0. 简介及评估指标

RAGAS是一个对检索增强生成(RAG)pipeline进行无参考评估 的框架。

考虑标准的RAG设置,即给定一个问题q,系统首先检索一些上下文c(q),然后使用检索到的上下文生成答案as(q)。在构建RAG系统时,通常无法访问人工标注的数据集或参考答案,因此该工作将重点放在完全独立且无参考的度量指标上

该方法有四个评估指标:

  • 评估检索质量:

  • context_relevancy(上下文相关性,也叫 context_precision)

  • context_recall(召回性,越高表示检索出来的内容与正确答案越相关)

  • 评估生成质量:

  • faithfulness(忠实性,越高表示答案的生成使用了越多的参考文档(检索出来的内容))

  • answer_relevancy(答案的相关性)

1. 在LangChain中使用

1.1 首先构建你的RAG程序

retriever的构建步骤就不展开了,需要的同学可以去看下我之前的文章:【AI大模型应用开发】【LangChain系列】4. 从Chain到LCEL:探索和实战LangChain的巧妙设计

构建完的代码示例如下:

from langchain.chains import RetrievalQA  
......  
# !!!!!主要应用点:RetrievalQA构建的qa_chain的返回结果  
qa_chain = RetrievalQA.from_chain_type(  
    llm,  
    retriever=retriever,  
    return_source_documents=True,  
)  
question = "How did New York City get its name?"  
result = qa_chain({"query": question})  

关键点 :使用RetrievalQA 去获取结果,因为使用RetrievalQA 去获取的结果中包含key:query, result, source_documents,这是LangChain集成的Ragas直接需要的,不用自己再组装数据结构了:

  • 上述result中包含query, result, source_documents字段,这三个字段可以直接用来评估出 context_relevancy, faithfulness, answer_relevancy 三个指标,context_recall无法评估

  • 要想评估 context_recall 指标,==需要人工添加预期的答案 ==,并添加到 result 的key=“ground_truths” 的字段,例如下面的代码

    result_with_truth = result
    result_with_truth[“ground_truths”] = “XXXXXXXXXXXX”

1.2 评估

  • 引入Ragas封装:RagasEvaluatorChain

  • 引入Ragas评估指标

  • 构造评估的chain,需传入构造的chain的评估指标类型

  • 将上面RAG的结果传入这个评估chain,获得评估结果

    from ragas.langchain.evalchain import RagasEvaluatorChain
    from ragas.metrics import (
        faithfulness,
        answer_relevancy,
        context_precision,
        context_recall,
    )

    # create evaluation chains
    faithfulness_chain = RagasEvaluatorChain(metric=faithfulness)
    answer_rel_chain = RagasEvaluatorChain(metric=answer_relevancy)
    context_rel_chain = RagasEvaluatorChain(metric=context_precision)
    context_recall_chain = RagasEvaluatorChain(metric=context_recall)

    # 获取结果
    eval_result = faithfulness_chain(result)
    eval_result = answer_rel_chain(result)
    eval_result = context_rel_chain(result)
    eval_result = context_recall_chain(result_with_truth)

1.3 结果示例

2. 原理

2.1 faithfulness

This measures the factual consistency of the generated answer against the given context. It is calculated from answer and retrieved context. The answer is scaled to (0,1) range. Higher the better.

这衡量了生成的答案在给定上下文中的事实一致性。它是根据答案和检索到的上下文来计算的。答案按比例缩放到(0,1)范围。越高越好。

2.1.1 测量步骤

(1)首先使用LLM来根据问题和答案提取一组语句S。这一步骤的目的是将较长的句子分解为更短、更集中的断言。

该步骤的Prompt如下:

Given a question and answer, create one or more statements from each sentence in the given answer.  
question: [question]  
answer: [answer]  

(2)针对生成的每个语句s,再次使用大模型或验证函数来判断这个语句是否能用上下文中的信息来支撑。

该步骤的Prompt如下(最后输出Yes或No):

Consider the given context and following statements, then determine whether they are supported by the information present in the context. Provide a brief explanation for each statement before arriving at the verdict (Yes/No). Provide a final verdict for each statement in order at the end in the given format. Do not deviate from the specified format.  
statement: [statement 1]  
...  
statement: [statement n]  

(3)最后分数的计算,计算公式

其中V为可以被支撑的s的数量,S为生成的statement数量。

2.2 answer_relevancy

答案与问题的相关程度。不考虑答案的正确性,但是对答案不完整或包含冗余信息的情况进行惩罚。

2.2.1 测量步骤

(1)根据最终答案,利用大模型生成针对该问题的多个潜在的问题。

Prompt如下:

Generate a question for the given answer.  
answer: [answer]  

(2)针对生成的每个潜在问题,利用OpenAI的嵌入模型 text-embedding-ada-002 来计算与原始问题的向量相似度(余弦距离)。

不懂向量相似度或余弦距离是什么的,可以参考下我之前的文章:【AI大模型应用开发】【补充知识】文本向量化与向量相似度(含Python代码)

(3)最后分数的计算,计算公式

即最终对所有的向量相似度取个平均数。

2.3 context_relevancy

检索回的上下文与原始问题之间的相关性,对其中的冗余信息进行惩罚

2.3.1 测量步骤

(1)利用大模型,从给定的context上下文信息中,提取出所有对最终答案直接相关或重要的句子,不改变句子内容。

Prompt如下:

Please extract relevant sentences from the provided context that can potentially help answer the following question. If no relevant sentences are found, or if you believe the question cannot be answered from the given context, return the phrase "Insufficient Information". While extracting candidate sentences you’re not allowed to make any changes to sentences from given context.  

(2)最后分数计算,计算公式

即:对答案有用的句子数量 / 上下文中全部句子的数量

2.4 context_recall

论文中没提到这个指标,待查。这个需要认为给定参考答案,在RAGAS评估中比较少用。

3. 其它接口

langchain中的ragas还提供了其它的评估接口,简单看一个。

3.1 批量评估 evaluate()

给定一系列需要测试的输出结果,批量生成评估结果。

# run the queries as a batch for efficiency  
predictions = qa_chain.batch(examples)  
  
# evaluate  
print("evaluating...")  
r = faithfulness_chain.evaluate(examples, predictions)  
  
# output  
[{'faithfulness_score': 1.0},  
 {'faithfulness_score': 0.5},  
 {'faithfulness_score': 1.0},  
 {'faithfulness_score': 1.0},  
 {'faithfulness_score': 0.8}]  

4. 总结

本文详细介绍了RAGAS的原理及在LangChain中的使用方式。对于RAGAS的原理更是用通俗易懂的语言进行了深入讲解,相信大家都能看懂!

从上面的评测步骤可以看到,RAGAS各个指标的评测都依赖了大模型的能力。所以也会有一定的不稳定性。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~

  • 大家好,我是同学小张,日常分享AI知识和实战案例

  • 欢迎点赞 + 关注 👏,持续学习持续干货输出

大家好,我是【同学小张 】。持续学习,持续干货输出,关注我,跟我一起学AI大模型技术!

公众号内文章一览

有任何问题,欢迎+vx:jasper_8017 ,期待与志同道合的朋友一起讨论,共同进步!

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具