链载Ai

标题: 如何利用框架,使用大模型评估RAG效果(附文档代码) [打印本页]

作者: 链载Ai    时间: 2025-12-2 09:52
标题: 如何利用框架,使用大模型评估RAG效果(附文档代码)

导读

目前RAG是很多AI落地场景的解决方案, 但所谓没有评估就没有优化。本文介绍几种常用的RAG评估框架。阅读本文你将学到:

  1. 如何使用大模型评估大模型

  2. 如何使用这些框架

  3. 框架文档和代码


LlamaIndex 是用于大型语言模型(LLM)应用的开发框架。

它被开发人员广泛使用,用于创建检索增强生成(RAG)应用程序。

在 RAG 应用程序的开发过程中,评估相关数据对于更好地调整和优化应用程序至关重要。

随着 RAG 技术的进步,出现了更有效的评估工具,以促进对 RAG 应用程序的准确和高效评估。

在本文中,我们将介绍一些可以与 LlamaIndex 集成的 RAG 评估工具,并对它们进行比较。


RAG 评估工具是什么?

RAG 评估工具是用于测试和评估基于检索的文本生成系统的方法或框架。

它们评估准确性、内容质量和相关性等指标。

有助于开发人员了解并优化 RAG 应用程序以实现真实世界的使用。与手动评估相比,RAG 评估工具更客观、准确和高效,通过自动化实现大规模评估。

一些应用甚至将这些工具集成到 CI/CD 过程中,以实现自动化评估和优化。

实体术语

RAG 应用通常使用特定术语进行评估。这些术语在不同的评估工具之间可能会有所不同。以下是常见的实体定义:


我们将在接下来的工具描述中一贯使用这些术语,以保持清晰并便于比较。

准备工作

测试文档

我们使用漫威电影“复仇者联盟”作为测试文档。这些数据主要来自维基百科关于复仇者联盟的条目,包含了四部复仇者联盟电影的情节信息。

数据集

基于测试文档,我们创建了一个包含“问题”和“真相”的数据集。以下是定义的数据集:

questions = ["洛基在征服地球的尝试中使用了什么神秘的物体?","复仇者联盟的哪两名成员创造了奥创?","灭霸如何实现了他在宇宙中消灭一半生命的计划?","复仇者联盟用什么方法扭转了灭霸的行动?","复仇者联盟的哪位成员牺牲了自己来打败灭霸?",]


ground_truth = ["六角宝","托尼·斯塔克(钢铁侠)和布鲁斯·班纳(绿巨人浩克)。","通过使用六颗无限宝石","通过时间旅行收集宝石。","托尼·斯塔克(钢铁侠)",]

检索引擎

接下来,我们将使用LlamaIndex创建一个标准的RAG检索引擎。评估工具将使用此引擎生成Answer和Context:

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader


documents = SimpleDirectoryReader("./data").load_data()vector_index = VectorStoreIndex.from_documents(documents)query_engine = vector_index.as_query_engine(similarity_top_k=2)


TruLens

TruLens 是一个旨在评估和改进LLM应用程序的软件工具。

评估指标

TruLens 主要使用以下指标来评估 RAG 应用程序:

  1. 答案相关性:评估答案对问题的回应情况,确保其有帮助和相关性。

  2. 上下文相关性:评估上下文对问题的相关性,为LLM答案提供基础。

  3. 基于事实:检查答案是否与上下文中呈现的事实相一致。

  4. 基准真相:将答案与手动标记的基准真相进行比较,以确保准确性。

使用示例

以下是一个代码片段,演示如何使用 TruLens 进行 RAG 评估:

import numpy as npfrom trulens_eval import Tru, Feedback, TruLlamafrom trulens_eval.feedback.provider.openai import OpenAIfrom trulens_eval.feedback import Groundedness, GroundTruthAgreement


openai = OpenAI()golden_set = [{"query": q, "response": r} for q, r inzip(questions, ground_truth)]ground_truth = Feedback(GroundTruthAgreement(golden_set).agreement_measure, name="Ground Truth").on_input_output()grounded = Groundedness(groundedness_provider=openai)groundedness = (Feedback(grounded.groundedness_measure_with_cot_reasons, name="Groundedness").on(TruLlama.select_source_nodes().node.text).on_output().aggregate(grounded.grounded_statements_aggregator))qa_relevance = Feedback(openai.relevance_with_cot_reasons, name="Answer Relevance").on_input_output()qs_relevance = (Feedback(openai.qs_relevance_with_cot_reasons, name="Context Relevance").on_input().on(TruLlama.select_source_nodes().node.text).aggregate(np.mean))tru_query_engine_recorder = TruLlama(query_engine,app_id="Avengers_App",feedbacks=[ground_truth,groundedness,qa_relevance,qs_relevance,],)with tru_query_engine_recorder as recording:for question in questions:query_engine.query(question)tru = Tru()tru.run_dashboard()

这段代码片段使用 TruLens 来评估 RAG 应用程序。它定义了诸如 Ground Truth、Groundedness、Answer Relevance 和 Context Relevance 等反馈指标。然后使用 TruLlama 记录查询引擎的结果,并使用 Tru 运行评估以显示结果。

评估结果

TruLens的评估结果可以通过浏览器访问本地服务来查看。评估结果包括总体得分和详细指标。得分背后的原因也是可见的。以下是TruLens评估结果的示例:


Ragas

Ragas 是另一个用于评估RAG应用程序的框架。与TruLens相比,Ragas提供了更详细的指标。

评估指标

Ragas 使用以下指标来评估 RAG 应用程序:


使用示例

官方 Ragas 文档提供了与 LlamaIndex 集成的示例,但代码已过时。以下是更新后的示例:

from ragas.metrics import (faithfulness,answer_relevancy,context_relevancy,answer_correctness,)from ragas import evaluatefrom datasets import Dataset


metrics = [faithfulness,answer_relevancy,context_relevancy,answer_correctness,]answers = []contexts = []for q in questions:response = query_engine.query(q)answers.append(response.response)contexts.append([sn.get_content() for sn in response.source_nodes])data = {"question": questions,"contexts": contexts,"answer": answers,"ground_truth": ground_truth,}dataset = Dataset.from_dict(data)result = evaluate(dataset, metrics)result.to_pandas().to_csv("output/ragas-evaluate.csv", sep=",")

在这个示例中


评估结果

Ragas的评估结果可以在本地文件中查看。结果包含每个评估指标的分数。以下是Ragas评估结果的示例:

Ragas和TruLens的评估结果显示出相当大的差异,特别是在上下文相关性指标上,得分明显较低。

事实上,在评估上下文时,Ragas建议将上下文精度和上下文召回作为主要指标。然而,为了与TruLens进行比较,我们使用了上下文相关性。

在Ragas的评估结果中,我们只看到分数,没有任何解释分数背后的原因。


DeepEval

DeepEval 是一个开源的LLM评估框架,允许像单元测试一样运行评估任务。

评估指标

DeepEval 使用以下评估指标,其中一些设计用于 RAG 应用程序,另一些用于其他 LLM 使用:


用法示例

DeepEval 可以运行像单元测试这样的评估任务。这里有一个简单的例子:

import pytestfrom deepeval.metrics import (AnswerRelevancyMetric,FaithfulnessMetric,ContextualRelevancyMetric,)from deepeval.test_case import LLMTestCasefrom deepeval import assert_testfrom deepeval.dataset import EvaluationDataset


def generate_dataset():test_cases = []for i inrange(len(questions)):response = query_engine.query(questions[i])test_case = LLMTestCase(input=questions[i],actual_output=response.response,retrieval_context=[node.get_content() for node in response.source_nodes],expected_output=ground_truth[i],)test_cases.append(test_case)return EvaluationDataset(test_cases=test_cases)


dataset = generate_dataset()


@pytest.mark.parametrize("test_case",dataset,)def test_rag(test_case: LLMTestCase):answer_relevancy_metric = AnswerRelevancyMetric(model="gpt-3.5-turbo")faithfulness_metric = FaithfulnessMetric(model="gpt-3.5-turbo")context_relevancy_metric = ContextualRelevancyMetric(model="gpt-3.5-turbo")assert_test(test_case,[answer_relevancy_metric, faithfulness_metric, context_relevancy_metric],)

在这个例子中:

构建一个包含问题、生成的答案、上下文和真相的测试数据集。

使用像 Faithfulness、Answer Relevance 和 Context Relevance 这样的度量标准。

DeepEval 默认使用 gpt-4,但为了成本效益,您可以指定其他模型,比如 gpt-3.5-turbo。

评估度量标准的阈值默认设置为 0.5,表示低于此值的分数表示测试失败。

运行测试文件 deepeval test run test_deepeval.py 来执行评估任务。DeepEval 会在终端输出评估结果。如果测试通过,您将看到 PASSED;如果没有,将看到 FAILED。

评估结果

虽然终端结果可能不方便查看,但DeepEval提供了访问评估结果的替代方式。您可以通过设置环境变量 export DEEPEVAL_RESULTS_FOLDER="./output" 将它们保存到本地JSON文件中。

这将结果保存在指定的文件夹中。

查看结果的另一种方式是通过Confident平台。使用您的API密钥登录,使用 deepeval login --confident-api-key your_api_key,然后运行测试。

结果会自动上传到Confident平台,使其更容易查看。以下是Confident上的评估结果的屏幕截图:

Confident还允许您将结果导出为CSV文件以供本地查看:


UpTrain

UpTrain 是一个用于评估和改进LLM应用程序的开源平台。它在这里讨论的工具中拥有最广泛的评估指标集。


评估指标

UpTrain的评估指标适用于RAG应用程序和其他LLM应用程序。以下是一些指标:

使用示例

UpTrain 与 LlamaIndex 集成,允许您使用 EvalLlamaIndex 创建评估对象。以下是一个示例:

import osimport jsonfrom uptrain import EvalLlamaIndex, Evals, ResponseMatching, Settings


settings = Settings(openai_api_key=os.getenv("OPENAI_API_KEY"),)data = []for i inrange(len(questions)):data.append({"question": questions[i],"ground_truth": ground_truth[i],})llamaindex_object = EvalLlamaIndex(settings=settings, query_engine=query_engine)results = llamaindex_object.evaluate(data=data,checks=[ResponseMatching(),Evals.CONTEXT_RELEVANCE,Evals.FACTUAL_ACCURACY,Evals.RESPONSE_RELEVANCE,],)withopen("output/uptrain-evaluate.json", "w") as json_file:json.dump(results, json_file, indent=2)

在这个例子中,我们:


评估结果

评估结果存储在 JSON 文件中。为了更容易比较,将结果转换为 CSV 格式。以下是 UpTrain 的评估结果:

在 UpTrain 的评估结果中,Response Matching 分数有时可能看起来不准确。运行 Response Matching 后,您可能会得到三个分数:score_response_match、score_response_match_recall 和 score_response_match_precision。

即使 Answer 和 Ground Truth 看起来相似,这些分数可能为 0。目前尚不清楚为什么会发生这种情况;如果您知道,请在下方评论。


比较分析

TruLens 和 Ragas 是最早的 RAG 评估工具之一,而 DeepEval 和 UpTrain 则是后来出现的。这些更新的工具可能受到早期工具的启发,从而拥有更全面的指标和改进的功能。然而,TruLens 和 Ragas 仍然具有独特的优势,例如 TruLens 直观的结果和 Ragas 为 RAG 应用量身定制的指标。

结论

本文讨论了与 LlamaIndex 集成的各种 RAG 评估工具,并比较了它们的特性。这些工具帮助开发人员更好地理解和优化 RAG 应用程序。还有其他未在此提及的工具,比如 LlamaIndex 的内置评估工具和 Tonic Validate。如果您不确定选择哪种评估工具,请从一个项目开始使用它。如果不符合您的需求,请尝试另一个。







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5