数据驱动的 RAG 评估:使用 Relari AI 测试 Qdrant 应用
Thierry Damiba, David Myriel 和 Yi Zhang
·2024 年 9 月 16 日

使用性能指标评估 RAG 系统
对于开发者来说,评估检索增强生成 (RAG) 应用的性能可能是一项复杂的任务。
为了简化这一过程,Qdrant 与 Relari 合作提供了一个深入的 RAG 评估流程。
作为向量数据库,Qdrant 负责数据存储和检索,而 Relari 使您能够运行实验来评估您的 RAG 应用在真实世界场景中的表现。它们协同工作,实现了快速、迭代的测试和评估,使您更容易跟上应用的开发速度。

Qdrant 和 Relari 合作进行了一个联合项目,使用合成数据测试 RAG 性能。
您将学到什么
在最近的网络研讨会上,我们讨论了构建和评估 RAG 系统的最佳方法。Relari 提供了使用内在和外在方法评估大型语言模型 (LLM) 应用的工具。结合 Qdrant 强大的数据存储能力,这创建了一个坚实的评估框架。
在本文中,我们将介绍您可以使用 Qdrant 和 Relari 的**两种评估方法**,以及实际用例。具体来说,我们将带您了解一个分析 GitLab 法律政策数据集的示例。您可以在此 Google Colab Notebook 中跟着代码操作。
RAG 评估的关键指标:Top-K 和自动提示优化
为了确保您的 RAG 系统在真实世界条件下良好运行,关注性能优化至关重要。虽然精度、召回率和基于排名的传统指标很有帮助,但它们并不总是足够。评估 RAG 系统的两种高级策略是 **Top-K 参数优化**和**自动提示优化**。这些技术有助于提高模型为实际用户提供最佳体验的可能性。
Top-K 参数优化
**Top-K** 参数控制向用户显示多少个靠前的结果。想象一下使用一个搜索引擎,每次查询只显示一个结果——这可能是一个好的结果,但大多数用户喜欢有更多选择。另一方面,显示太多结果可能会让用户不知所措。
例如,在产品推荐系统中,Top-K 设置决定了用户是看到销量最好的 3 个产品还是 10 个不同的选项。调整此参数可确保用户有足够的、相关的选择,而不会感到困惑。
借助 Relari 和 Qdrant,测试不同的 Top-K 值非常简单。首先,我们将使用 Qdrant 构建一个简单的 RAG 应用,然后使用 Relari 评估其性能。
如何开始
前往 Qdrant 云和 Relari 创建账户并获取您的 API 密钥。获得密钥后,将其添加到 Google Colab 中的 secrets 中,即可开始!
安装依赖项
在此示例中,我们将使用 Qdrant、FastEmbed、Relari 和 LangChain**
!pip install relari langchain_community langchain_qdrant
!pip install unstructured rank_bm25
!pip install --upgrade nltk
设置环境
from google.colab import userdata
import os
os.environ['RELARI_API_KEY'] = userdata.get('RELARI_API_KEY')
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
设置 Relari
from relari import RelariClient
client = RelariClient()
创建新的 Relari 项目
proj = client.projects.create(name="Gitlab Employee Assistant")
定义黄金数据集
在本案例研究中,我们将使用 GitLab 法律政策数据集,但您可以轻松替换为自己的数据集。数据集在 Relari 评估和改进LLM 应用的方法中至关重要。数据集作为测试 LLM 管道准确性和性能的“基本事实”或参考点。
Relari 的数据驱动方法确保评估可靠且全面。您可以在这里了解更多关于 Relari 如何处理数据集的信息。
!wget https://ceevaldata.blob.core.windows.net/examples/gitlab/gitlab_legal_policies.zip
!unzip gitlab_legal_policies.zip -d gitlab_legal_policies
创建数据集
数据下载完成后,您可以通过运行以下命令创建黄金数据集。此数据集将作为您的测试或评估的基本事实,为衡量 RAG 应用的准确性提供基准。
from pathlib import Path
dir = Path("gitlab_legal_policies")
task_id = client.synth.new(
project_id=proj["id"],
name="Gitlab Legal Policies",
samples=30,
files=list(dir.glob("*.txt")),
)
这将准备好数据集以供 Relari 使用,让您可以根据已知参考评估您的应用。
构建一个简单的 RAG 应用
现在项目已设置好,我们开始构建用于评估的检索增强生成 (RAG) 应用。我们将使用 Qdrant 进行向量搜索,使用 FastEmbed 进行嵌入,并使用 LangChain 管理文档工作流程。
导入所有库
from langchain_community.document_loaders.directory import DirectoryLoader
from langchain_qdrant import Qdrant
from langchain_community.embeddings.fastembed import FastEmbedEmbeddings
from relari.core.types import DatasetDatum
加载和分块数据
我们将使用 LangChain 来准备数据。
# load the document and split it into chunks
loader = DirectoryLoader("gitlab_legal_policies/")
documents = loader.load_and_split()
现在我们将使用 FastEmbed(Qdrant 内置的嵌入提供程序)来嵌入我们的块。
# Initialize FastEmbedEmbeddings
embeddings = FastEmbedEmbeddings(
model_name="BAAI/bge-small-en-v1.5", # specify the model
)
将数据存储到 Qdrant
最后,我们将块上传到 Qdrant 集合中。
# Load chunks into a Qdrant Cloud vectorstore using FastEmbedEmbeddings
db = Qdrant.from_documents(
documents,
embedding=embeddings,
url=os.environ['QDRANT_URL'], # Qdrant Cloud URL
api_key=os.environ['QDRANT_API_KEY'], # Qdrant Cloud API Key
collection_name="gitlab_legal_policies",
)
print(f"{len(documents)} chunks loaded into Qdrant Cloud vector database.")
开始记录结果
数据上传到 Qdrant 后,我们可以构建一个函数,在数据集上运行不同的 RAG 管道,并记录结果以进行评估。这将使我们能够跟踪各种配置(例如不同的 Top-K 值)的性能,并将结果反馈到 Relari 进行进一步分析。
这是一个函数,用于记录来自不同检索器配置的结果
# Prepare a function to run different RAG pipelines over the dataset and log the results
def log_retriever_results(retriever, dataset):
log = list()
for datum in dataset.data:
# First compute the result
retrieved_docs = retriever.invoke(datum["question"])
# Now log the result in Relari format
result = DatasetDatum(
label=datum["uid"],
data={"retrieved_context": [doc.page_content for doc in retrieved_docs]},
)
log.append(result)
return log
这就是结合 Qdrant 和 Relari 的强大之处。您无需构建多个应用、缓慢地插入和检索数据,而是可以同时使用它们快速测试不同的参数并立即获得结果。这个评估系统专为快速、有用的迭代而构建。
评估结果
RAG 应用构建完成后,是时候通过尝试不同的 Top-K 值来评估其性能了。Top-K 参数控制检索期间返回给用户的靠前结果数量,优化此参数可以改善用户体验和结果的相关性。
首次尝试:实验 Top-K
在此实验中,我们将测试不同的 Top-K 值(3、5、7 和 9),以查看它们如何影响检索性能。
k_values = [3, 5, 7, 9] # Define the different values of top k to experiment
semantic_retrievers = {}
semantic_logs = {}
# Run the retrievers on the dataset and log retrieved chunks
for k in k_values:
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": k})
log = log_retriever_results(retriever, dataset)
semantic_retrievers[f"k_{k}"] = retriever
semantic_logs[f"k_{k}"] = log
print(f"Results on {dataset.name} by Semantic Retriever with k={k} saved!")
将结果发送到 Relari
记录了不同 Top-K 实验的结果后,您可以将它们提交到 Relari 进行评估。Relari 将使用 Precision/Recall 和 Rank-Aware 等指标分析您的结果,使您可以比较每种配置的性能。以下是将结果发送到 Relari 的方法
对于每种 Top-K 配置,我们将结果提交到 Relari 并使用适当的指标运行评估。这将帮助您根据不同的 K 值对 RAG 系统的性能进行基准测试。
from relari import Metric
for k in k_values:
eval_name = f"Semantic Retriever Evaluation k={k}"
eval_data = semantic_logs[f"k_{k}"]
eval_info = client.evaluations.submit(
project_id=proj["id"],
dataset=dataset_info["id"],
name=eval_name,
pipeline=[Metric.PrecisionRecallF1, Metric.RankedRetrievalMetrics],
data=eval_data,
)
print(f"{eval_name} submitted!")
使用我们的数据集,如果希望召回率大于 85%,我们应该选择至少为 7 的 K 值。
我们甚至可以在 UI 中查看单个案例以获得更多洞察。
Relari 和 Qdrant 还可以集成以评估混合搜索系统,该系统结合了稀疏(传统关键字搜索)和密集(基于向量)搜索方法。这种组合使您可以利用这两种方法的优势,从而可能提高搜索结果的相关性和准确性。
通过结合使用 Relari 的评估框架和 Qdrant 的向量搜索能力,您可以尝试不同的混合搜索配置。例如,您可以测试稀疏到密集搜索结果的不同比例,或者调整每个组件对整体检索得分的贡献方式。
自动提示优化
在像聊天机器人这样的对话应用中,**自动提示优化(APO)**通过持续改进其与用户互动的方式来增强聊天机器人的沟通效率。APO 从之前的互动中学习,调整和改进回复措辞,从而产生更准确、更具吸引力且更用户友好的对话。
例如,在客户服务聊天机器人中,提问的方式可以极大地影响用户满意度。虽然传达的信息可能相同,但表达方式很重要。想象一下在巴黎咖啡馆点餐:用法语点餐可能比用英语点餐带来更愉快的互动,即使请求相同。类似地,APO 帮助聊天机器人找到构建问题或回复的最佳方式,以确保用户感到被理解和参与,从而增强整体体验。
随着时间的推移,APO 微调聊天机器人使用的提示,以优化互动,使系统更能响应用户需求和语境,提高生成答案的质量,并最终提高用户满意度。
自动提示优化持续改进聊天机器人的回复,以改善用户互动。以下是如何使用 Relari 实现 APO:
设置基础提示
通过自动提示优化,您可以定义一个系统提示,并在每次互动迭代中检查结果。
from relari.core.types import Prompt, UserPrompt
base_prompt = Prompt(
system="You are a GitLab legal policy Q&A bot. Answer the following question given the context.",
user=UserPrompt(
prompt="Question: $question\n\nContext:\n$ground_truth_context",
description="Question and context to answer the question.",
),
)
提示使用了变量 question
和 ground_truth_context
。这些变量有助于衡量生成的答案对基本事实语境的忠实程度(即,它没有产生幻觉)。
有关其他指标的更多详细信息,请访问Relari 文档网站
设置任务 ID
task_id = client.prompts.optimize(
name="GitLab Legal Policy RAG Prompt",
project_id=proj["id"],
dataset_id=dataset_info["id"],
prompt=base_prompt,
llm="gpt-4o-mini",
task_description="Answer the question using the provided context.",
metric=client.prompts.Metrics.CORRECTNESS,
)
print(f"Optimization task submitted with ID: {task_id}")
CORRECTNESS 指标衡量生成的答案与基本事实参考答案的接近程度。
分析提示
自动提示优化设置完成后,您可以开始在 Relari UI 中分析提示在每次迭代中如何演变。这使您能够看到系统如何根据之前的互动和用户反馈进行调整和改进其回复。
在 Relari UI 中,您可以:
跟踪变化:审查提示随时间的变化,并查看带来性能改进的迭代。例如,您可以分析不同的措辞如何影响聊天机器人回复的准确性和相关性。
评估有效性:检查每个提示在准确性、流畅性和用户满意度等关键指标方面的表现。您可以查看哪些迭代带来了更好的结果,哪些需要进一步调整。
比较迭代:可视化不同提示迭代的并排比较,帮助您了解哪些具体变化产生了更准确或更具吸引力的回复。
识别模式:寻找用户互动中的模式以及聊天机器人如何适应不同的场景,从而让您了解最适合目标受众的方法。
这种提示迭代分析有助于确保您的聊天机器人的对话流程持续改进,从而与用户进行更自然、更有效的互动。
通过自动提示优化 (APO) 生成的最佳**系统提示**和**少量示例**可以显著提高您的检索增强生成 (RAG) 系统的性能。
系统提示:这是指导您的聊天机器人或应用如何响应用户查询的基础指令。APO 帮助改进此提示,以确保回复符合用户期望和应用目标,从而产生更清晰、更准确的输出。
少量示例:这些是提供给模型的示例,用于演示如何回答问题或解决问题。通过优化这些示例,您的 RAG 系统可以更好地理解上下文并提供更相关、更连贯的回复。例如,使用精心制作的少量示例可以显著减少语言模型输出中的幻觉,并产生更符合语境的结果。
通过 APO 确定最佳系统提示和少量示例后,您可以将其集成到 RAG 系统中。这将确保模型在不同场景下始终提供高质量的结果,从而改善整体用户体验和系统性能。
结论
结合 **Relari** 和 **Qdrant** 可以创建一个迭代的、数据驱动的评估框架,从而优化您的 RAG 系统以获得最佳的真实世界性能。这些方法有助于确保您的应用既响应迅速又有效,尤其是在处理用户查询或推荐时。