LlamaIndex 是大型语言模型 (LLM) 应用程序的开发框架。它被开发人员广泛用于创建检索增强生成 (RAG) 应用程序。在 RAG 应用程序的开发过程中,评估相关数据以更好地调整和优化应用程序至关重要。随着RAG技术的进步,出现了更有效的评估工具,以促进对RAG应用的准确和高效评估。在本文中,我们将介绍一些可以与 LlamaIndex 集成的 RAG 评估工具并进行比较。
什么是 RAG 评估工具?
RAG 评估工具是用于测试和评估基于检索的文本生成系统的方法或框架。他们评估准确性、内容质量和相关性等指标。它们在帮助开发人员了解和优化 RAG 应用程序以供实际使用方面很有价值。与人工评估相比,RAG评估工具更加客观、准确、高效,可以通过自动化进行大规模评估。一些应用程序甚至将这些工具集成到 CI/CD 流程中,以实现自动化评估和优化。
实体定义
RAG 应用程序通常使用特定的术语进行评估。这些术语可能因不同的评估工具而异。以下是常见的实体定义:
- 问题:指用户的查询。在某些工具中,它也称为“输入”或“查询”。
- 上下文:指检索到的文档上下文。一些工具将其称为检索上下文。
- 答:指生成的答案。可以使用不同的术语,例如“实际输出”或“响应”。
- 基本事实:指手动标记的正确答案。它用于评估生成的答案的准确性。
我们将在以下工具描述中一致地使用这些术语,以保持清晰度并便于比较。
准备
测试文档
我们使用漫威电影《复仇者联盟》中的内容作为测试文档。这些数据主要来自维基百科上关于复仇者联盟的条目,其中包含四部复仇者联盟电影的情节信息。
数据
根据测试文档,我们创建了一个包含问题和基本事实的数据集。下面是定义的数据集:
questions = [ "What mysterious object did Loki use in his attempt to conquer Earth?", "Which two members of the Avengers created Ultron?", "How did Thanos achieve his plan of exterminating half of all life in the universe?", "What method did the Avengers use to reverse Thanos' actions?", "Which member of the Avengers sacrificed themselves to defeat Thanos?",]ground_truth = [ "The Tesseract", "Tony Stark (Iron Man) and Bruce Banner (The Hulk).", "By using the six Infinity Stones", "By collecting the stones through time travel.", "Tony Stark (Iron Man)",]
检索引擎
接下来,我们将使用 LlamaIndex 创建一个标准的 RAG 检索引擎。评估工具将使用此引擎生成答案和上下文:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderdocuments = SimpleDirectoryReader("./data").load_data()vector_index = VectorStoreIndex.from_documents(documents)query_engine = vector_index.as_query_engine(similarity_top_k=2)
- 我们从数据目录加载文档。
- 使用 VectorStoreIndex 创建文档矢量索引。
- 将文档向量索引转换为查询引擎,并将相似性阈值设置为 2。
TruLens的
TruLens 是一种软件工具,旨在评估和改进 LLM 应用程序。
Image source: https://www.trulens.org/trulens_eval/core_concepts_rag_triad/
评估指标
TruLens 主要使用以下指标来评估 RAG 应用程序:
- 答案相关性:评估答案对问题的响应程度,确保有用性和相关性。
- 上下文相关性:评估上下文与问题的相关性,为LLM答案提供基础。
- 扎实性:检查答案是否与上下文中呈现的事实一致。
- Ground Truth:将答案与手动标记的 Ground Truth 进行比较,以确保准确性。
使用示例
下面是一个代码片段,演示了如何使用 TruLens 进行 RAG 评估:
import numpy as npfrom trulens_eval import Tru, Feedback, TruLlamafrom trulens_eval.feedback.PRovider.oPEnai import OpenAIfrom trulens_eval.feedback import Groundedness, GroundTruthAgreementopenai = OpenAI()golden_set = [{"query": q, "response": r} for q, r in zip(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 应用程序。它定义了反馈指标,如基本事实、扎根性、答案相关性和上下文相关性。然后,它使用 TruLlama 记录查询引擎的结果,并使用 Tru 运行评估以显示结果。
评估结果
TruLens的评估结果可以通过浏览器访问的本地服务进行查看。评估结果包括总分和详细指标。分数背后的原因也是显而易见的。以下是 TruLens 的评估结果示例:
之前,我写过一篇关于 TruLens 的文章,其中提供了更详细的描述和使用示例。
Ragas
Ragas 是另一个用于评估 RAG 应用程序的框架。与 TruLens 相比,Ragas 提供了更详细的指标。
Image source: https://www.trulens.org/trulens_eval/core_concepts_rag_triad/
评估指标
Ragas 使用以下指标来评估 RAG 应用程序:
- 忠实度:评估问题和上下文之间的一致性。
- 答案相关性:评估答案和问题之间的一致性。
- 上下文精度:检查 Ground Truth 是否在上下文中排名靠前。
- 上下文召回:评估 Ground Truth 和 Context 之间的一致性。
- 上下文实体召回:评估 Ground Truth 和 Context 中实体之间的一致性。
- 上下文相关性:评估问题和上下文之间的一致性。
- 答案语义相似性:评估答案和基本事实之间的语义相似性。
- 答案正确性:评估答案相对于基本事实的正确性。
- 方面批评:包括对其他方面的评估,如危害性、正确性等。
使用示例
Ragas 的官方文档提供了一个与 LlamaIndex 集成的示例,但代码已经过时。下面是一个更新的示例:
from ragas.metrics import ( faithfulness, answer_relevancy, context_relevancy, answer_correctness,)from ragas import evaluatefrom datasets import Datasetmetrics = [ 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=",")
在此示例中,我们:
- 对输入数据使用问题和ground_truth。
- 使用类似于 TruLens 中使用的指标。
- 手动构建数据集,添加问题、答案和上下文。
- 将评估结果保存到本地文件。
评估结果
Ragas的评估结果可以在本地文件中查看。结果包含每个评估指标的分数。以下是 Ragas 的评估结果示例:
Ragas 和 TruLens 的评估结果显示出相当大的差异,尤其是在上下文相关性指标方面,得分明显较低。事实上,在评估上下文时,Ragas 建议使用上下文精确度和上下文召回作为主要指标。但是,为了与 TruLens 进行比较,我们使用了上下文相关性。
在拉加斯的评估结果中,我们只看到分数,而没有解释分数背后的原因。
DeepEval
DeepEval 是一个用于 LLM 的开源评估框架,它允许像单元测试一样运行评估任务。
Image source: https://www.trulens.org/trulens_eval/core_concepts_rag_triad/
评估指标
DeepEval 使用以下评估指标,其中一些是为 RAG 应用程序设计的,另一些是为其他 LLM 用途而设计的:
- 忠实度:评估问题和上下文之间的一致性。
- 答案相关性:评估答案和问题之间的一致性。
- 上下文精度:检查 Ground Truth 是否在上下文中排名靠前。
- 上下文召回:评估基本事实和上下文之间的一致性。
- 上下文相关性:评估问题和上下文之间的一致性。
- 幻觉:衡量幻觉的程度。
- 偏差:评估偏差水平。
- 毒性:衡量毒性的存在,包括人身攻击、讽刺或威胁。
- Ragas:允许使用 Ragas 进行评估和生成解释。
- 知识保留:评估信息的持久性。
- 总结:评估总结的有效性。
- G-Eval:G-Eval 是一个使用具有思维链 (CoT) 的大型语言模型 (LLM) 执行评估任务的框架。它可以根据任何自定义标准评估 LLM 输出。有关更多信息,请查看此白皮书。
使用示例
DeepEval 可以运行单元测试等评估任务。下面是一个简单的示例:
import pytestfrom deepeval.metrics import ( AnswerRelevancyMetric, FaithfulnessMetric, ContextualRelevancyMetric,)from deepeval.test_case import LLMTestCasefrom deepeval import assert_testfrom deepeval.dataset import EvaluationDatasetdef generate_dataset(): test_cases = [] for i in range(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], )
在此示例中,我们:
- 构建包含问题、生成的答案、上下文和基本事实的测试数据集。
- 使用忠实度、答案相关性和上下文相关性等指标。
- 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 文件。这会将结果保存在指定的文件夹中。
查看结果的另一种方法是通过 Confidence 平台。使用 API 密钥登录 deepeval login --confident-api-key YOUr_api_key登录,然后运行测试。结果会自动上传到 Confidence 平台,使其更易于查看。以下是 Confidence 上评估结果的屏幕截图:
Confidence 还允许您将结果导出为 CSV 文件以供本地查看:
UpTrain
UpTrain 是一个用于评估和改进 LLM 应用程序的开源平台。在这里讨论的工具中,它具有最广泛的评估指标集。
Image source: https://github.com/uptrain-ai/uptrain
评估指标
UpTrain 的评估指标适用于 RAG 应用程序和其他 LLM 应用程序。以下是一些指标:
- 响应匹配:评估“答案”和“基本事实”之间的一致性。
- 回答完整性:衡量答案是否解决了问题的所有方面。
- 响应简洁性:检查答案是否包含不相关的内容。
- 响应相关性:评估答案和问题之间的相关性。
- 响应有效性:评估答案是否有效,避免“我不知道”之类的回答。
- 响应一致性:评估答案、问题和上下文之间的一致性。
- 上下文相关性:衡量上下文和问题之间的相关性。
- 上下文利用:评估 Answer 是否利用上下文来解决所有问题。
- 事实准确性:检查答案是否与事实准确并源自上下文。
- 上下文简洁性:衡量上下文是否简洁并避免不相关的信息。
- 上下文重新排名:评估重新排名上下文的有效性。
- 越狱检测:评估问题是否包含越狱提示。
- 提示注入:如果问题可能导致系统提示泄漏,则采取措施。
- 语言特征:评估答案是否简洁、连贯且没有语法错误。
- 音调:检查“答案”是否与特定音调一致。
- 子查询完整性:评估子问题是否涵盖问题的所有方面。
- 多查询准确性:评估“问题”的变体是否与原始问题一致。
- 代码幻觉:测量 Answer 中的代码是否与上下文相关。
- 用户满意度:评估用户在对话中的满意度。
使用示例
UpTrain 与 LlamaIndex 集成,允许您使用 EvalLlamaIndex 创建评估对象。下面是一个示例:
import osimport jsonfrom uptrain import EvalLlamaIndex, Evals, ResponseMatching, Settingssettings = Settings( openai_api_key=os.getenv("OPENAI_API_KEY"),)data = []for i in range(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, ],)with open("output/uptrain-evaluate.json", "w") as json_file: json.dump(results, json_file, indent=2)
在此示例中,我们:
- 将 OpenAI 的 API 密钥用于 UpTrain。
- 初始数据集只需要 Question 和 Ground Truth。答案和上下文由 EvalLlamaIndex 生成。
- 包括常见的评估指标。
- 将结果保存在 JSON 文件中。
评估结果
评估结果存储在 JSON 文件中。为了便于比较,请将结果转换为 CSV 格式。以下是UpTrain的评估结果:
在 UpTrain 的评估结果中,响应匹配分数有时似乎不准确。运行响应匹配后,可能会获得三个分数:score_response_match、score_response_match_recall 和 score_response_match_precision。即使“答案”和“基本事实”看起来相似,这些分数也可能为 0。目前尚不清楚为什么会发生这种情况;如果您知道,请在下面发表评论。
比较分析
- 评估指标:TruLens 的指标较少,而 DeepEval 和 UpTrain 的指标范围很广。Ragas 具有适度数量的指标,涵盖了 RAG 应用程序的所有关键方面。
- 自定义评估:DeepEval 和 UpTrain 支持自定义指标,而 TruLens 和 Ragas 则不支持。
- 自定义 LLM:大多数工具都支持自定义 LLM,Ragas 通过 LangChain 实现这一点。
- 框架集成:大多数工具都支持与 LlamaIndex 和 LangChain 集成,但 DeepEval 和 UpTrain 仅支持 LlamaIndex。
- WebUI:基于 Web 的界面允许更轻松地查看结果。TruLens、DeepEval 和 UpTrain 支持这一点;Ragas 没有,但您可以使用第三方工具查看结果。
- 分数解释:除 Ragas 外,所有工具都提供了分数的原因。DeepEval 可以帮助 Ragas 生成这些解释。
- 单元测试:DeepEval提供了类似单元测试的评估任务,在这些工具中是独一无二的。
TruLens 和 Ragas 是最早的 RAG 评估工具之一,DeepEval 和 UpTrain 稍后出现。这些较新的工具可能会从早期的工具中汲取灵感,从而产生更全面的指标和改进的功能。然而,TruLens 和 Ragas 仍然具有独特的优势,例如 TruLens 的直观结果和 Ragas 为 RAG 应用程序量身定制的指标。
结论
本文讨论了与 LlamaIndex 集成的各种 RAG 评估工具,并比较了它们的功能。这些工具可帮助开发人员更好地了解和优化 RAG 应用程序。这里没有提到其他工具,比如 LlamaIndex 的内置评估工具和 Tonic Validate。如果您不确定要选择哪种评估工具,请从其中一个开始,然后在项目中使用它。如果它不能满足您的需求,请尝试另一个。
发表评论