许可证: MIT
库名称: colpali
基础模型: vidore/colpaligemma-3b-mix-448-base
语言:
- 英文
标签:
- colpali
- vidore
新版本: vidore/colpali-v1.2
管道标签: 视觉文档检索
ColPali: 基于PaliGemma-3B与ColBERT策略的视觉检索模型
ColPali是一种基于新型模型架构和训练策略的视觉语言模型(VLM),用于高效地从视觉特征中索引文档。
它是PaliGemma-3B的扩展,能够生成文本和图像的ColBERT风格多向量表示。
该模型在论文ColPali: 基于视觉语言模型的高效文档检索中首次提出,并在此代码库中发布。

版本特性
此版本使用colpali-engine==0.2.0
训练。
与colpali
相比,此版本采用右填充处理查询,以修复查询编码中的异常标记问题。
同时,它基于修复后的vidore/colpaligemma-3b-mix-448-base
模型,确保投影层初始化的确定性。
数据与论文中描述的ColPali数据相同。
模型描述
该模型从现成的SigLIP模型迭代构建而来。
我们通过微调创建了BiSigLIP,并将SigLIP输出的图像块嵌入输入到大型语言模型PaliGemma-3B中,最终形成BiPali。
通过语言模型处理图像块嵌入的优势在于,它们能自然地映射到与文本输入(查询)相似的潜在空间。
这使得可以利用ColBERT策略计算文本标记与图像块之间的交互,相比BiPali实现了性能的显著提升。
模型训练
数据集
我们的训练数据集包含127,460个查询-页面对,由公开学术数据集的训练集(63%)和合成数据集(37%)组成。合成数据集基于网络爬取的PDF文档页面,并通过VLM(Claude-3 Sonnet)生成的伪问题增强。
训练集完全为英文设计,使我们能够研究对非英语语言的零样本泛化能力。我们明确验证了ViDoRe与训练集之间没有重复的多页PDF文档,以避免评估污染。
验证集占样本的2%,用于调整超参数。
注:多语言数据可能存在于语言模型(Gemma-2B)的预训练语料库中,或在PaliGemma-3B的多模态训练过程中出现。
参数
所有模型在训练集上训练1个周期。除非另有说明,我们以bfloat16
格式训练模型,使用低秩适配器(LoRA),在语言模型的Transformer层和随机初始化的最终投影层上设置alpha=32
和r=32
,并采用paged_adamw_8bit
优化器。
我们在8 GPU设置上进行数据并行训练,学习率为5e-5,线性衰减并包含2.5%的预热步数,批次大小为32。
使用示例
import torch
import typer
from torch.utils.data import DataLoader
from tqdm import tqdm
from transformers import AutoProcessor
from PIL import Image
from colpali_engine.models.paligemma_colbert_architecture import ColPali
from colpali_engine.trainer.retrieval_evaluator import CustomEvaluator
from colpali_engine.utils.colpali_processing_utils import process_images, process_queries
from colpali_engine.utils.image_from_page_utils import load_from_dataset
def main() -> None:
"""ColPali推理示例脚本"""
model_name = "vidore/colpali-v1.1"
model = ColPali.from_pretrained("vidore/colpaligemma-3b-mix-448-base", torch_dtype=torch.bfloat16, device_map="cuda").eval()
model.load_adapter(model_name)
model = model.eval()
processor = AutoProcessor.from_pretrained(model_name)
images = load_from_dataset("vidore/docvqa_test_subsampled")
queries = ["詹姆斯·V·菲奥卡来自哪所大学?", "日本首相是谁?"]
dataloader = DataLoader(
images,
batch_size=4,
shuffle=False,
collate_fn=lambda x: process_images(processor, x),
)
ds = []
for batch_doc in tqdm(dataloader):
with torch.no_grad():
batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
embeddings_doc = model(**batch_doc)
ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
dataloader = DataLoader(
queries,
batch_size=4,
shuffle=False,
collate_fn=lambda x: process_queries(processor, x, Image.new("RGB", (448, 448), (255, 255, 255))),
)
qs = []
for batch_query in dataloader:
with torch.no_grad():
batch_query = {k: v.to(model.device) for k, v in batch_query.items()}
embeddings_query = model(**batch_query)
qs.extend(list(torch.unbind(embeddings_query.to("cpu"))))
retriever_evaluator = CustomEvaluator(is_multi_vector=True)
scores = retriever_evaluator.evaluate(qs, ds)
print(scores.argmax(axis=1))
if __name__ == "__main__":
typer.run(main)
注意: 如果需要从此适配器进一步训练ColPali,应运行:
lora_config = LoraConfig.from_pretrained("vidore/colpali-v1.1")
lora_config.inference_mode = False
model = get_peft_model(model, lora_config)
print("调整后")
model.print_trainable_parameters()
局限性
- 专注领域:该模型主要针对PDF类文档和高资源语言,可能对其他文档类型或低资源语言的泛化能力有限。
- 支持:模型依赖ColBERT后期交互机制的多向量检索,可能需要工程适配以兼容广泛使用的缺乏原生多向量支持的向量检索框架。
许可证
ColPali的视觉语言骨干模型(PaliGemma)遵循其模型卡片中指定的gemma
许可证。附加到模型的适配器采用MIT许可证。
联系方式
- Manuel Faysse: manuel.faysse@illuin.tech
- Hugues Sibille: hugues.sibille@illuin.tech
- Tony Wu: tony.wu@illuin.tech
引用
如果您在研究中使用了本组织的任何数据集或模型,请按以下方式引用原始论文:
@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models},
author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449},
}