在本教程中,我们将通过 LangChain 使用 Ragas 框架在 Python 中进行检索增强生成 (RAG) 评估。
RAG 是自然语言处理 (NLP) 的一种技术,可将信息检索和生成式模型相结合,生成更准确、相关和情境感知的响应。在传统的语言生成任务中,大语言模型 (LLM),比如 OpenAI 的 GPT-4(生成式预训练转换器)或 IBM 的 Granite 模型等常用于基于输入提示构建响应。这些大语言模型的常见现实用例是聊天机器人。然而,这些模型有时可能很难生成与上下文密切相关、事实准确或最新的响应。
RAG 应用程序通过在生成响应之前加入检索步骤,来解决这一局限性。在检索过程中,会从知识库中提取与提示相关的其他文本片段,例如从大型文本语料库中提取相关文档,这些语料库通常存储在矢量数据库中。最终,基于检索到的上下文所增强的原始提示,利用 LLM 生成回复。
有许多不同的 RAG 评估框架和评估指标。除了 Ragas 评估框架之外,其他评估框架还包括 IBM 的 Unitxt 以及 OpenAI 的 Evals 评估工具包。与其他框架不同,Ragas 使用另一个 LLM 作为评判者来评估 RAG 管道的性能。
针对评估 RAG 管道性能的需求,目前存在多种可用的评估指标。在开源 Ragas 框架中,我们将使用的评估指标可分为两部分:
这些指标旨在主观地衡量 RAG 管道从其知识库中检索相关信息以形成响应的能力。值得注意的是,没有理想完美的数据、提示或 LLM。即使上下文相关性得分较低,也不一定是糟糕的上下文。较低的分数可能是由于存在一定程度的“噪声”或不太相关的信息,或者仅仅是因为任务本身存在多种解释空间。噪音也不一定是坏事。我们人类在回答问题时,即使能够表达清晰,也会在回答中产生一定程度的噪声。
在评估 RAG 管道时,还会受到一些偏差的影响,例如对较短或较长回答的偏好,这通常被称为长度偏差。这种类型的偏差可能导致一种响应因其长度而不是实质内容而被评估得高于另一种响应。
因此,进行多次评估是最佳实践。这一操作可以通过调整 LLM 的提示模板、评估指标、评估顺序等方式来完成。如果您正在为 RAG 管道创建自己的数据集,建议对生成响应的 LLM 和对响应进行评判的 LLM 使用不同的模型。如果两者使用的是同一个模型,则更有可能出现自我评估偏差。由于这些评估指标具有主观性,这些框架产生的结果也应由人工评审进行核查。
在本教程中,我们将不会创建 RAG 系统。相反,我们使用 Ragas 来评估先前创建的 RAG 系统的输出。有关如何使用 LangChain 构建 RAG 系统的更多信息,请参阅我们详细的 RAG 教程。
您需要一个 IBM® Cloud 帐户才能创建 watsonx.ai项目。在此处注册免费帐户。
虽然您可以选择多种工具,本教程将引导您如何设置 IBM 帐户以使用 Jupyter Notebook。
使用您的 IBM Cloud 帐户登录 watsonx.ai使用您的 IBM Cloud 帐户。
创建一个 watsonx.ai 项目。
您可以从项目内部获取项目 ID。点击管理选项卡。然后在详细信息部分的常规页面中复制项目 ID。您在本教程中需要使用这个 ID。
创建一个 Jupyter Notebook。
此步骤将打开一个笔记本环境,您可以在其中复制本教程中的代码来实现自己的 RAG 评估。或者,您可以将此笔记本下载到本地系统并将其作为资产上传到您的 watsonx.ai 项目。要查看更多 Granite 教程,请访问 IBM Granite 社区。此 Jupyter Notebook 也可在 GitHub 上获得。
创建一个 watsonx.ai 运行时服务实例(选择适当的区域并选择 Lite 计划,这是一个免费实例)。
生成 API 密钥。
将 watsonx.ai 运行时服务实例与您在 watsonx.ai 中创建的项目关联。
本教程需要一些库和模块。确保导入列出的那些,如果它们没有安装,快速安装 pip 可以解决问题。本教程使用 Python 3.11.9 编写。
设置您的凭据。以字符串形式输入您的 API 密钥和项目 ID。根据您配置的服务实例,使用列出的区域之一作为 watsonx URL:
RAGas 的评估需要一个包含多个不同提示下 RAG 管道执行结果的数据集。除了问题本身之外,数据集还需要包含被称为“真实答案”的预期答案、LLM 生成的答案以及 RAG 管道在回答每个问题时检索到的上下文片段列表。您可以创建自己的端到端数据集,但在本教程中,我们使用的数据集可在 Hugging Face 上获取。让我们加载数据集。
输出:
数据以 DatasetDict 的形式加载,我们关注的特征位于 “eval” 划分中。
输出:
现在,将数据加载到 Pandas DataFrame 中。要查看此数据集中的条目示例,请参阅 HuggingFace 文档。
可以通过多种方式创建用于 RAG 评估的数据集。创建该数据集的一个关键要素是提供给 LLM 的外部知识库。可以从搜索到的网页、基本文本文件、导入文档等中获取这些知识。在本例中,使用了来自国际特赦组织收集的报告。数据集的内容可能是端到端创建的,也可能是使用诸如 RAGas 的 TestsetGenerator 之类的合成数据生成方法生成的。使用 TestsetGenerator 需要已加载的文档、一个生成器 LLM、一个评审 LLM 以及一个嵌入模型。
反过来,端到端方法涉及多个步骤。假设创建此数据集时采用了这种方法。这意味着 LLM 或人类用户生成了存储在 question 列中的问题。为了生成每个问题的真实答案,用户可能是手动创建的,也可能是使用带有适当提示模板的 LLM 生成的。这些回答被视为理想答案,并存储在 ground_truth 列中。最后,使用 RAG 管道生成了 answer 列中显示的答案。在构建 RAG 管道时,外部知识库被矢量化处理。然后,在查询 RAG 系统时,LLM 用于生成每个答案的相关文本块是通过使用相似度算法(如 top-k 检索算法)从矢量存储中获取的。这些数据集存储在 contexts 列中。
在本教程中,我们将使用 IBM Granite 模型作为评判标准。
Ragas 默认使用 Open AI 模型。WatsonxLLM 是 IBM watsonx.ai 基础模型的封装接口。兼容 Ragas 的 WatsonxLLM 封装接口仍在开发中,目前尚不可用。目前,要将 Ragas 与 Granite 模型一起使用,我们需要更改封装接口的属性。
在本教程中,我们建议使用 IBM Granite-3.0-8B-Instruct模型作为 LLM,以获得类似的效果。您可以自由使用自己选择的任何 AI 模型,与此基准进行比较,并选择最适合您应用的模型。可在此处查看通过 watsonx 提供的基础模型。在 LLM 应用程序中,这些模型的作用是充当推理引擎,决定要采取的行动和产生的响应。要将 WatsonxLLM 封装接口与 Ragas 一起使用,我们需要使用 LangchainLLMWrapper。
采用 Granite 模型作为评价模型。我们不会使用模型来生成任何响应,因为响应已经存储在数据集的 answer 列中。
我们使用的嵌入模型是通过 watsonx.ai LangChain 封装接口的 IBM Slate 模型。如果未定义嵌入模型,Ragas 将默认使用 OpenAI 嵌入。嵌入模型对于评估至关重要,因为它用于嵌入来自不同列的数据,以测量它们之间的距离。
最后,我们现在可以对数据集运行 Ragas 评估。在这里,我们传入数据集、评估指标、LLM 和嵌入模型作为参数。
如果出现警告消息,请忽略它们,让评估完成并输出结果,如图所示。
输出:
这样就行了。对 RAG 管道的一项评估已经完成。如前所述,您可以运行多次评估,尝试不同的模型并更改参数。执行评估越多,我们就越能全面评估使用 RAG 的 LLM 系统的准确性和有效性。
在本教程中,您使用 Ragas 来评估 RAG 管道。您的输出包括 context_precision、faithfulness、answer_relevancy 和 context_recall 指标。用于评估的 LLM 是 IBM Granite 模型,嵌入模型为 IBM Slate 模型,可通过 watsonx.ai 嵌入 API 访问。
此处执行的评估非常重要,因为它可以应用于未来的生成式 AI 工作流,以评估您的 RAG 系统的性能并对其进行改进。
我们建议您查看 Ragas 文档页面,以了解有关其指标和评估流程的更多信息。
使用面向 AI 构建器的新一代企业级开发平台 IBM watsonx.ai,可以训练、验证、调整和部署生成式 AI、基础模型和机器学习功能。使用一小部分数据,即可在很短的时间内构建 AI 应用程序。
借助 IBM 业界领先的人工智能专业知识和解决方案组合,让人工智能在您的业务中发挥作用。
通过增加 AI 重塑关键工作流程和运营,最大限度提升体验、实时决策和商业价值。