使用 HuggingFace 开源模型评估 RAG 管道

社区文章 发布于 2024 年 6 月 26 日

在当今的人工智能时代,允许我们与数据交互的应用程序变得至关重要。现在,通过检索增强生成(RAG),只需上传文件并查询即可理解大型书籍或报告。这种方法利用大型语言模型(LLM)的功能,根据提示和提供的数据生成内容,将上下文整合到查询中,通过在响应前查阅源数据来减少幻觉。

BeyondLLM 是一个开源框架,它简化了 RAG 应用程序的开发、LLM 评估和可观察性,所有这些都只需几行代码即可完成。

什么是 RAG?

检索增强生成(RAG)是一种先进的自然语言处理(NLP)技术,它融合了两个核心 NLP 任务:信息检索和文本生成。RAG 的目的是通过整合外部来源的信息来增强文本生成,从而产生更准确和上下文相关的响应。

传统的文本生成模型,如 GPT-3,根据从大量数据集中学习到的模式生成文本,但它们可能缺乏对特定、最新或上下文相关信息的访问。RAG 通过引入信息检索组件克服了这一限制。

RAG 工作流程

image/png

检索:模型首先从外部源检索相关信息,这些源可以包括数据库、知识库、文档集合甚至搜索引擎结果。此步骤旨在查找与输入或提示相关的文本片段或段落。

增强:检索到的信息与原始输入或提示结合,丰富了模型可用的上下文。这些额外知识有助于模型生成更明智和准确的响应。

生成:最后,模型生成一个同时考虑检索到的信息和原始输入的响应。这种添加的上下文使模型能够生成更具上下文适当性和相关性的输出。

RAG 在问答、对话生成、摘要等 NLP 任务中特别有用。通过结合外部知识,RAG 模型可以提供比仅依赖其训练数据的传统模型更准确和信息丰富的响应。

使用 BeyondLLM 构建 RAG 管道

让我们使用 BeyondLLM 构建 RAG 管道并探索其核心概念。

步骤 1:数据摄取和预处理

首先,我们需要加载和预处理源文件。BeyondLLM 为不同的数据类型(包括 PDF 和 YouTube 视频)提供了各种加载器。我们可以在预处理期间指定文本分割参数,如 chunk_size 和 chunk_overlap。

from beyondllm import source, embeddings, retrieve, llms, generator
import os
from getpass import getpass

os.environ['HUGGINGFACE_ACCESS_TOKEN'] = getpass("Enter your HF API token:")

data = source.fit(path="https://www.youtube.com/watch?v=oJJyTztI_6g", dtype="youtube", chunk_size=1024, chunk_overlap=0)

在此步骤中,我们从 YouTube 加载视频,通过将文本分割成每个 1024 个字符的可管理块进行预处理,块之间没有重叠。这种预处理至关重要,因为 LLM 的上下文长度有限。

步骤 2:嵌入

接下来,我们需要一个嵌入模型将分块的文本转换为数值嵌入。这些嵌入有助于检索器将查询与嵌入而不是纯文本进行比较。

from beyondllm.embeddings import HuggingFaceEmbeddings

model_name = 'BAAI/bge-small-en-v1.5'
embed_model = HuggingFaceEmbeddings(model_name=model_name)

BeyondLLM 中的 HuggingFaceEmbeddings 类允许我们使用 HuggingFace Hub 上提供的各种嵌入模型。在这里,我们使用“BAAI/bge-small-en-v1.5”模型生成嵌入。

步骤 3:检索 - 索引您的数据

现在,我们定义检索器,它使用先进的交叉重排技术来检索特定的文本块。这种方法直接比较查询和文档嵌入,以进行准确的相关性评估。

from beyondllm.retrieve import auto_retriever

retriever = auto_retriever(data=data, embed_model=embed_model, type="cross-rerank", top_k=2)

auto_retriever 方法通过结合多种检索技术实现高效检索。在此示例中,它使用交叉重排方法来查找与查询相关的最相关的 2 个文本块。

步骤 4:LLM 生成

LLM 使用检索到的文档和用户的查询生成一个连贯的响应。在这里,我们使用 Huggingface Hub 的 mistralai/Mistral-7B-Instruct-v0.2 模型。

from beyondllm.llms import HuggingFaceHubModel

llm = HuggingFaceHubModel(model="mistralai/Mistral-7B-Instruct-v0.2")

HuggingFaceHubModel 类允许我们访问和使用 HuggingFace Hub 上提供的各种 LLM。在此示例中,我们使用“mistralai/Mistral-7B-Instruct-v0.2”模型生成响应。

步骤 5:集成组件

接下来,我们使用 BeyondLLM 中的 generator.Generate 方法集成所有组件。

from beyondllm.generator import Generate

system_prompt = f"""
<s>[INST]
You are an AI Assistant.
Please provide direct answers to questions.
[/INST]
</s>
"""

pipeline = Generate(
    question=" What is the name of the organization mentioned in the video?",
    retriever=retriever,
    system_prompt=system_prompt,
    llm=llm
)

print(pipeline.call())

在这里,我们定义一个系统提示来指导 LLM 的响应生成。Generate 类将检索器和 LLM 组合起来,形成一个完整的 RAG 管道。call 方法执行管道,检索相关块并生成对给定问题的响应。

步骤 6:评估您的 RAG 应用程序

构建完整个 RAG 管道后,我们使用 BeyondLLM 中提供的指标评估其性能:上下文相关性、基础性、答案相关性、RAG 三元组和真实值。

  • 上下文相关性:衡量检索到的块与用户查询的相关性。
  • 答案相关性:评估 LLM 生成有用答案的能力。
  • 基础性:确定 LLM 响应与检索到的信息的关系。
  • 真实值:衡量 LLM 响应与预定义正确答案的一致性。
  • RAG 三元组:直接计算所有三个关键评估指标。
print(pipeline.get_rag_triad_evals())

结论

因此,我们构建并评估了一个 RAG 管道,该管道可以摄取数据、创建嵌入、检索信息,并在 LLM 的帮助下回答问题。BeyondLLM 使构建、评估和观察 RAG 应用程序变得简单,从而使 AI 开发更易于访问和高效。

合著者:希瓦亚·潘迪 (Shivaya Pandey)

试用 BeyondLLM

探索 食谱 了解更多!

Colab 上使用 BeyondLLM 框架尝试此用例。

阅读 BeyondLLM 文档并创建新的用例:BeyondLLM 文档

通过给 GitHub 仓库 一个 ⭐️ 来支持该项目。

社区

注册登录 评论