Transformers 文档
ColPali
并获得增强的文档体验
开始使用
ColPali
ColPali 是一种旨在通过分析文档的视觉特征来检索文档的模型。与传统上严重依赖文本提取和 OCR 的系统不同,ColPali 将每个页面视为图像。它使用 Paligemma-3B 不仅捕获文本,还捕获布局、表格、图表和其他视觉元素,以创建详细的多向量嵌入,通过计算成对的后期交互相似性分数来进行检索。这提供了对文档更全面的理解,并能够实现更高效和准确的检索。
该模型由 @tonywu71 (ILLUIN Technology) 和 @yonigozlan (HuggingFace) 贡献。
您可以在 Vidore 的 Hf-native ColVision Models 集合中找到所有原始的 ColPali 检查点。
点击右侧边栏中的 ColPali 模型,查看更多关于如何使用 ColPali 进行图像检索的示例。
import requests
import torch
from PIL import Image
from transformers import ColPaliForRetrieval, ColPaliProcessor
# Load the model and the processor
model_name = "vidore/colpali-v1.3-hf"
model = ColPaliForRetrieval.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto", # "cpu", "cuda", or "mps" for Apple Silicon
)
processor = ColPaliProcessor.from_pretrained(model_name)
# The document page screenshots from your corpus
url1 = "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg"
url2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg"
images = [
Image.open(requests.get(url1, stream=True).raw),
Image.open(requests.get(url2, stream=True).raw),
]
# The queries you want to retrieve documents for
queries = [
"When was the United States Declaration of Independence proclaimed?",
"Who printed the edition of Romeo and Juliet?",
]
# Process the inputs
inputs_images = processor(images=images).to(model.device)
inputs_text = processor(text=queries).to(model.device)
# Forward pass
with torch.no_grad():
image_embeddings = model(**inputs_images).embeddings
query_embeddings = model(**inputs_text).embeddings
# Score the queries against the images
scores = processor.score_retrieval(query_embeddings, image_embeddings)
print("Retrieval scores (query x image):")
print(scores)
如果在使用 PIL 加载图像时遇到问题,可以使用以下代码创建虚拟图像:
images = [
Image.new("RGB", (128, 128), color="white"),
Image.new("RGB", (64, 32), color="black"),
]
量化通过以较低精度表示权重来减少大型模型的内存负担。有关更多可用量化后端,请参阅量化概述。
以下示例使用 bitsandbytes 将权重量化为 int4。
import requests
import torch
from PIL import Image
from transformers import BitsAndBytesConfig, ColPaliForRetrieval, ColPaliProcessor
model_name = "vidore/colpali-v1.3-hf"
# 4-bit quantization configuration
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
model = ColPaliForRetrieval.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="cuda",
)
processor = ColPaliProcessor.from_pretrained(model_name)
url1 = "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg"
url2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg"
images = [
Image.open(requests.get(url1, stream=True).raw),
Image.open(requests.get(url2, stream=True).raw),
]
queries = [
"When was the United States Declaration of Independence proclaimed?",
"Who printed the edition of Romeo and Juliet?",
]
# Process the inputs
inputs_images = processor(images=images, return_tensors="pt").to(model.device)
inputs_text = processor(text=queries, return_tensors="pt").to(model.device)
# Forward pass
with torch.no_grad():
image_embeddings = model(**inputs_images).embeddings
query_embeddings = model(**inputs_text).embeddings
# Score the queries against the images
scores = processor.score_retrieval(query_embeddings, image_embeddings)
print("Retrieval scores (query x image):")
print(scores)
注意事项
- score_retrieval() 返回一个 2D 张量,其中第一个维度是查询的数量,第二个维度是图像的数量。分数越高表示查询与图像之间的相似性越高。
ColPaliConfig
class transformers.ColPaliConfig
< source >( vlm_config = None text_config = None embedding_dim: int = 128 **kwargs )
配置类,用于存储 ColPaliForRetrieval 的配置。它用于根据指定的参数实例化 ColPaliForRetrieval
实例,按照“ColPali:使用视觉语言模型高效检索文档”论文中的方法定义模型架构。
使用默认设置创建配置将导致 VLM 主干设置为默认 PaliGemma 配置,即来自 vidore/colpali-v1.2 的配置。
请注意,与类名所暗示的(实际上该名称是指 ColPali 方法论)相反,您可以通过将相应的 VLM 配置传递给类构造函数来使用 PaliGemma 之外的不同 VLM 主干模型。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。
ColPaliProcessor
class transformers.ColPaliProcessor
< source >( image_processor = None tokenizer = None chat_template = None visual_prompt_prefix: str = 'Describe the image.' query_prefix: str = 'Question: ' )
参数
- image_processor (SiglipImageProcessor, 可选) — 图像处理器是必需输入。
- tokenizer (LlamaTokenizerFast, 可选) — 分词器是必需输入。
- chat_template (
str
, 可选) — 一个 Jinja 模板,用于将聊天中的消息列表转换为可分词的字符串。 - visual_prompt_prefix (
str
, 可选, 默认为"Describe the image."
) — 一个字符串,它将被分词并添加到图像 token 的前面。 - query_prefix (
str
, 可选, 默认为"Question -- "
): 查询前缀。
构建一个 ColPali 处理器,它封装了一个 PaliGemmaProcessor 和处理图像和查询的特殊方法,以及计算后期交互检索分数的方法。
ColPaliProcessor 提供了 PaliGemmaProcessor 的所有功能。有关更多信息,请参阅 __call__()
。
此方法将其所有参数转发给 GemmaTokenizerFast 的 batch_decode()。有关更多信息,请参阅此方法的文档字符串。
此方法将其所有参数转发给 GemmaTokenizerFast 的 decode()。有关更多信息,请参阅此方法的文档字符串。
process_images
< source >( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] = None **kwargs: typing_extensions.Unpack[transformers.models.colpali.processing_colpali.ColPaliProcessorKwargs] ) → BatchFeature
参数
- images (
PIL.Image.Image
,np.ndarray
,torch.Tensor
,list[PIL.Image.Image]
,list[np.ndarray]
,list[torch.Tensor]
) — 要准备的图像或图像批次。每个图像可以是 PIL 图像、NumPy 数组或 PyTorch 张量。如果是 NumPy 数组/PyTorch 张量,每个图像的形状应为 (C, H, W),其中 C 是通道数,H 和 W 是图像高和宽。 - return_tensors (
str
或 TensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.Tensor
对象。'np'
: 返回 NumPynp.ndarray
对象。'jax'
: 返回 JAXjnp.ndarray
对象。
返回
一个具有以下字段的 BatchFeature
- input_ids — 要输入到模型中的标记 ID 列表。
- attention_mask — 指定模型应关注哪些 token 的索引列表(当
return_attention_mask=True
或"attention_mask"
在self.model_input_names
中且text
不为None
时)。 - pixel_values — 要输入到模型的像素值。当
images
不为None
时返回。
为模型准备一个或多个图像。此方法是 ColPaliProcessor 的 ColPaliProcessor.__call__()
方法的包装器。
此方法将 images
和 kwargs
参数转发给图像处理器。
process_queries
< source >( text: typing.Union[str, list[str]] **kwargs: typing_extensions.Unpack[transformers.models.colpali.processing_colpali.ColPaliProcessorKwargs] ) → BatchFeature
参数
- text (
str
,list[str]
,list[list[str]]
) — 要编码的序列或序列批次。每个序列可以是字符串或字符串列表(预分词字符串)。如果序列以字符串列表(预分词)形式提供,则必须设置is_split_into_words=True
(以消除与批次序列的歧义)。 - return_tensors (
str
或 TensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.Tensor
对象。'np'
: 返回 NumPynp.ndarray
对象。'jax'
: 返回 JAXjnp.ndarray
对象。
返回
一个具有以下字段的 BatchFeature
- input_ids — 要输入到模型中的标记 ID 列表。
- attention_mask — 指定模型应关注哪些 token 的索引列表(当
return_attention_mask=True
或"attention_mask"
在self.model_input_names
中且text
不为None
时)。
为模型准备一个或多个文本。此方法是 ColPaliProcessor 的 ColPaliProcessor.__call__()
方法的包装器。
此方法将 text
和 kwargs
参数转发给分词器。
score_retrieval
< source >( query_embeddings: typing.Union[ForwardRef('torch.Tensor'), list['torch.Tensor']] passage_embeddings: typing.Union[ForwardRef('torch.Tensor'), list['torch.Tensor']] batch_size: int = 128 output_dtype: typing.Optional[ForwardRef('torch.dtype')] = None output_device: typing.Union[ForwardRef('torch.device'), str] = 'cpu' ) → torch.Tensor
参数
- query_embeddings (
Union[torch.Tensor, list[torch.Tensor]
) — 查询嵌入。 - passage_embeddings (
Union[torch.Tensor, list[torch.Tensor]
) — 段落嵌入。 - batch_size (
int
, 可选, 默认为 128) — 计算分数的批次大小。 - output_dtype (
torch.dtype
, 可选, 默认为torch.float32
) — 输出张量的数据类型。如果为None
,则使用输入嵌入的数据类型。 - output_device (
torch.device
或str
, 可选, 默认为“cpu”) — 输出张量的设备。
返回
torch.Tensor
一个形状为 (n_queries, n_passages)
的张量,包含分数。分数张量保存在“cpu”设备上。
计算给定多向量查询嵌入 (qs
) 和段落嵌入 (ps
) 的后期交互/MaxSim 分数(ColBERT-like)。对于 ColPali,段落是文档页面的图像。
由于嵌入张量是多向量的,因此可以具有不同的形状,它们应以以下形式提供:(1)张量列表,其中第 i 个张量的形状为(sequence_length_i,embedding_dim)(2)形状为(n_passages,max_sequence_length,embedding_dim)的单个张量 -> 通常通过填充张量列表获得。
ColPaliForRetrieval
class transformers.ColPaliForRetrieval
< source >( config: ColPaliConfig )
参数
- config (ColPaliConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。请查看 from_pretrained() 方法加载模型权重。
ColPali 架构利用 VLM 直接从文档图像(“截图”)构建高效的多向量嵌入,用于文档检索。该模型经过训练,旨在最大化这些文档嵌入与相应查询嵌入之间的相似性,使用 ColBERT 中引入的后期交互方法。
使用 ColPali 消除了对可能复杂且脆弱的布局识别和 OCR 管道的需求,而是通过一个单一模型来考虑文档的文本和视觉内容(布局、图表等)。
ColPali 是 ColVision 模型系列的一部分,该系列首次在以下论文中介绍:ColPali:使用视觉语言模型高效检索文档。
该模型继承自 PreTrainedModel。请查看超类文档,了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch Module,并参阅 PyTorch 文档以了解所有与一般用法和行为相关的事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None pixel_values: typing.Optional[torch.FloatTensor] = None attention_mask: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None **kwargs ) → transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutput
or tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 词汇表中输入序列 token 的索引。默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参见 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- pixel_values (形状为
(batch_size, num_channels, image_size, image_size)
的torch.FloatTensor
, 可选) — 对应于输入图像的张量。像素值可以使用{image_processor_class}
获取。有关详细信息,请参见{image_processor_class}.__call__
({processor_class}
使用{image_processor_class}
处理图像)。 - attention_mask (形状为
(batch_size, sequence_length)
的torch.Tensor
, 可选) — 避免对填充 token 索引执行注意力操作的掩码。掩码值选择在[0, 1]
中:- 1 表示 未被掩盖 的 token,
- 0 表示 被掩盖 的 token。
- output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 对象而不是纯元组。
返回
transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutput
或一个 torch.FloatTensor
元组(如果传入 return_dict=False
或 config.return_dict=False
),包含根据配置(ColPaliConfig)和输入而定的各种元素。
-
loss (
torch.FloatTensor
形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失(用于下一个 token 预测)。 -
embeddings (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 模型的嵌入。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, 可选, 在传入use_cache=True
或config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量)包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple[torch.FloatTensor]
, 可选, 在传入output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(一个用于嵌入层输出,如果模型有嵌入层,+ 每个层的输出一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple[torch.FloatTensor]
, 可选, 在传入output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
-
image_hidden_states (
torch.FloatTensor
, 可选) — 一个大小为(batch_size, num_images, sequence_length, hidden_size)
的torch.FloatTensor
。由视觉编码器在投影最后隐藏状态后生成的模型 image_hidden_states。
ColPaliForRetrieval 的 forward 方法,它覆盖了 __call__
特殊方法。
尽管前向传递的实现需要在该函数中定义,但在此之后应调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。