Transformers 文档

ColQwen2

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

PyTorch

ColQwen2

ColQwen2ColPali 模型的一个变体,旨在通过分析文档的视觉特征来检索文档。与传统严重依赖文本提取和 OCR 的系统不同,ColQwen2 将每页视为图像。它使用 Qwen2-VL 主干来捕获文本以及布局、表格、图表和其他视觉元素,以创建详细的多向量嵌入,这些嵌入可以通过计算成对的后期交互相似度分数进行检索。这提供了对文档更全面的理解,并实现更高效和准确的检索。

该模型由 @tonywu71 (ILLUIN Technology) 和 @yonigozlan (HuggingFace) 贡献。

您可以在 Vidore 的 Hf-native ColVision Models 集合中找到所有原始的 ColPali 检查点。

点击右侧边栏中的 ColQwen2 模型,查看更多关于如何使用 ColQwen2 进行图像检索的示例。

图像检索
import requests
import torch
from PIL import Image

from transformers import ColQwen2ForRetrieval, ColQwen2Processor
from transformers.utils.import_utils import is_flash_attn_2_available


# Load the model and the processor
model_name = "vidore/colqwen2-v1.0-hf"

model = ColQwen2ForRetrieval.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto",  # "cpu", "cuda", or "mps" for Apple Silicon
    attn_implementation="flash_attention_2" if is_flash_attn_2_available() else "sdpa",
)
processor = ColQwen2Processor.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, ColQwen2ForRetrieval, ColQwen2Processor


model_name = "vidore/colqwen2-v1.0-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 = ColQwen2ForRetrieval.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="cuda",
).eval()

processor = ColQwen2Processor.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() 返回一个二维张量,其中第一个维度是查询的数量,第二个维度是图像的数量。分数越高表示查询与图像之间的相似度越高。
  • 与 ColPali 不同,ColQwen2 支持任意图像分辨率和纵横比,这意味着图像不会被重新调整为固定大小的正方形。这保留了更多的原始输入信号。
  • 较大的输入图像会生成更长的多向量嵌入,用户可以调整图像分辨率以平衡性能和内存使用。

ColQwen2Config

class transformers.ColQwen2Config

< >

( vlm_config = None embedding_dim: int = 128 initializer_range: float = 0.02 **kwargs )

参数

  • vlm_config (PretrainedConfig, 可选) — VLM 主干模型的配置。
  • embedding_dim (int, 可选, 默认为 128) — 模型生成的多元向量嵌入的维度。
  • initializer_range (float, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。

用于存储 ColQ2en2ForRetrieval 配置的配置类。它用于根据指定参数实例化 ColQwen2ForRetrieval 实例,并按照“ColPali: 使用视觉语言模型进行高效文档检索”论文中的方法定义模型架构。

使用默认值实例化配置将生成与预训练的 ColQwen2-v1.0 模型所使用的视觉编码器类似的配置,例如 vidore/colqwen2-v1.0-hf

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PretrainedConfig 的文档。

示例

from transformers.models.colqwen2 import ColQwen2Config, ColQwen2ForRetrieval

config = ColQwen2Config()
model = ColQwen2ForRetrieval(config)

ColQwen2Processor

class transformers.ColQwen2Processor

< >

( image_processor = None tokenizer = None chat_template = None visual_prompt_prefix: typing.Optional[str] = None query_prefix: typing.Optional[str] = None **kwargs )

参数

  • image_processor (Qwen2VLImageProcessor, 可选) — 图像处理器是必需输入。
  • tokenizer (Qwen2TokenizerFast, 可选) — 分词器是必需输入。
  • chat_template (str, 可选) — 一个 Jinja 模板,用于将聊天中的消息列表转换为可分词的字符串。
  • visual_prompt_prefix (str, 可选) — 一个将被分词并添加到图像 token 前面的字符串。
  • query_prefix (str, 可选) — 用于查询的前缀。

构建一个 ColQwen2 处理器,它封装了一个 Qwen2VLProcessor 和特殊的图像和查询处理方法,以及计算后期交互检索分数的方法。

ColQwen2Processor 提供了 Qwen2VLProcessor 的所有功能。有关更多信息,请参阅 __call__()

批量解码

< >

( *args **kwargs )

此方法将其所有参数转发到 GemmaTokenizerFast 的 batch_decode()。有关更多信息,请参阅此方法的文档字符串。

解码

< >

( *args **kwargs )

此方法将其所有参数转发给 GemmaTokenizerFast 的 decode()。有关更多信息,请参阅此方法的文档字符串。

处理图像

< >

( 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.colqwen2.processing_colqwen2.ColQwen2ProcessorKwargs] ) 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 (strTensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:

    • 'tf': 返回 TensorFlow tf.constant 对象。
    • 'pt': 返回 PyTorch torch.Tensor 对象。
    • 'np': 返回 NumPy np.ndarray 对象。
    • 'jax': 返回 JAX jnp.ndarray 对象。

返回

批次特征

一个具有以下字段的 BatchFeature

  • input_ids — 要输入到模型中的标记 ID 列表。
  • attention_mask — 指定模型应关注哪些 token 的索引列表(当 return_attention_mask=True"attention_mask"self.model_input_names 中且 text 不为 None 时)。
  • pixel_values — 要输入到模型的像素值。当 images 不为 None 时返回。

为模型准备一个或多个图像。此方法是 ColQwen2Processor 的 ColQwen2Processor.__call__() 方法的包装器。

此方法将 imageskwargs 参数转发到图像处理器。

处理查询

< >

( text: typing.Union[str, list[str]] **kwargs: typing_extensions.Unpack[transformers.models.colqwen2.processing_colqwen2.ColQwen2ProcessorKwargs] ) BatchFeature

参数

  • text (str, list[str], list[list[str]]) — 要编码的序列或序列批次。每个序列可以是字符串或字符串列表(预分词字符串)。如果序列以字符串列表(预分词)形式提供,则必须设置 is_split_into_words=True(以消除与序列批次之间的歧义)。
  • return_tensors (strTensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:

    • 'tf': 返回 TensorFlow tf.constant 对象。
    • 'pt': 返回 PyTorch torch.Tensor 对象。
    • 'np': 返回 NumPy np.ndarray 对象。
    • 'jax': 返回 JAX jnp.ndarray 对象。

返回

批次特征

一个具有以下字段的 BatchFeature

  • input_ids — 要输入到模型中的标记 ID 列表。
  • attention_mask — 指定模型应关注哪些 token 的索引列表(当 return_attention_mask=True"attention_mask"self.model_input_names 中且 text 不为 None 时)。

为模型准备一个或多个文本。此方法是 ColQwen2Processor 的 ColQwen2Processor.__call__() 方法的包装器。

此方法将 textkwargs 参数转发到分词器。

检索分数

< >

( 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.devicestr, 可选, 默认为“cpu”) — 输出张量的设备。

返回

torch.Tensor

一个形状为 (n_queries, n_passages) 的张量,包含分数。分数张量保存到“cpu”设备上。

计算给定多向量查询嵌入 (qs) 和段落嵌入 (ps) 的后期交互/MaxSim 分数(ColBERT-like)。对于 ColQwen2,段落是文档页面的图像。

由于嵌入张量是多向量的,因此可以具有不同的形状,它们应以以下形式提供:(1) 张量列表,其中第 i 个张量的形状为 (sequence_length_i, embedding_dim) (2) 形状为 (n_passages, max_sequence_length, embedding_dim) 的单个张量 -> 通常通过填充张量列表获得。

ColQwen2ForRetrieval

class transformers.ColQwen2ForRetrieval

< >

( config: ColQwen2Config )

参数

  • config (ColQwen2Config) — 包含模型所有参数的模型配置类。使用配置文件初始化不加载与模型关联的权重,只加载配置。请查阅 from_pretrained() 方法以加载模型权重。

遵循 ColPali 的方法,ColQwen2 利用 VLM 直接从文档图像(“截图”)构建高效的多向量嵌入,用于文档检索。模型经过训练,通过 ColBERT 中引入的后期交互方法,最大化这些文档嵌入与相应查询嵌入之间的相似性。

使用 ColQwen2 消除了对可能复杂而脆弱的布局识别和 OCR 流水线的需求,而是使用单个模型来考虑文档的文本和视觉内容(布局、图表等)。

ColQwen2 是 ColVision 模型系列的一部分,该系列在以下论文中与 ColPali 一起推出:ColPali: Efficient Document Retrieval with Vision Language Models

此模型继承自 PreTrainedModel。查阅超类文档以获取库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。

此模型也是 PyTorch torch.nn.Module 子类。将其作为常规 PyTorch 模块使用,并查阅 PyTorch 文档以获取所有与通用使用和行为相关的事项。

正向传播

< >

( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[list[torch.FloatTensor]] = None labels: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None pixel_values: typing.Optional[torch.Tensor] = None image_grid_thw: typing.Optional[torch.LongTensor] = None cache_position: typing.Optional[torch.LongTensor] = None ) transformers.models.colqwen2.modeling_colqwen2.ColQwen2ForRetrievalOutputtuple(torch.FloatTensor)

参数

  • input_ids (形状为 (batch_size, sequence_length)torch.LongTensor, 可选) — 词汇表中输入序列 token 的索引。默认情况下将忽略填充。

    可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入 ID?

  • attention_mask (torch.Tensor of shape (batch_size, sequence_length), optional) — 用于避免对填充标记索引执行注意力操作的掩码。掩码值选择范围为 [0, 1]

    • 1 表示**未被掩码**的标记,
    • 0 表示**被掩码**的标记。

    什么是注意力掩码?

  • position_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — 每个输入序列标记在位置嵌入中的位置索引。选择范围为 [0, config.n_positions - 1]

    什么是位置 ID?

  • past_key_values (list[torch.FloatTensor], optional) — 预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码上一阶段返回的 past_key_values,当 use_cache=Trueconfig.use_cache=True 时。

    允许两种格式:

    • 一个 Cache 实例,请参阅我们的 kv cache 指南
    • 一个长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含两个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量。这也被称为传统缓存格式。

    模型将输出与输入相同的缓存格式。如果未传递 past_key_values,将返回传统缓存格式。

    如果使用了 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后一个 input_ids(那些没有将其过去键值状态提供给此模型的),而不是形状为 (batch_size, sequence_length) 的所有 input_ids

  • labels (torch.LongTensor of shape (batch_size, sequence_length), optional) — 用于计算掩码语言建模损失的标签。索引应在 [0, ..., config.vocab_size] 或 -100 之间(参见 input_ids 文档字符串)。索引设置为 -100 的标记将被忽略(掩码),损失仅针对标签在 [0, ..., config.vocab_size] 范围内的标记计算。
  • inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 可选参数,您可以选择直接传递嵌入表示,而不是传递 input_ids。如果您希望对 input_ids 索引如何转换为相关向量有比模型内部嵌入查找矩阵更多的控制,这将非常有用。
  • use_cache (bool, optional) — 如果设置为 True,则返回 past_key_values 键值状态,可用于加速解码(参见 past_key_values)。
  • output_attentions (bool, optional) — 是否返回所有注意力层的注意力张量。更多详细信息请参见返回张量中的 attentions
  • output_hidden_states (bool, optional) — 是否返回所有层的隐藏状态。更多详细信息请参见返回张量中的 hidden_states
  • return_dict (bool, optional) — 是否返回 ModelOutput 而不是纯元组。
  • pixel_values (torch.Tensor of shape (batch_size, num_channels, image_size, image_size), optional) — 对应于输入图像的张量。像素值可以使用 {image_processor_class} 获取。有关详细信息,请参见 {image_processor_class}.__call__{processor_class} 使用 {image_processor_class} 处理图像)。
  • image_grid_thw (torch.LongTensor of shape (num_images, 3), optional) — LLM 中每张图像的特征形状的时间、高度和宽度。
  • cache_position (torch.LongTensor of shape (sequence_length), optional) — 表示输入序列标记在序列中位置的索引。与 position_ids 不同,此张量不受填充影响。它用于在正确位置更新缓存并推断完整的序列长度。

返回

transformers.models.colqwen2.modeling_colqwen2.ColQwen2ForRetrievalOutputtuple(torch.FloatTensor)

一个 transformers.models.colqwen2.modeling_colqwen2.ColQwen2ForRetrievalOutput 或一个 torch.FloatTensor 元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),其中包含根据配置 (ColQwen2Config) 和输入而定的各种元素。

  • loss (torch.FloatTensor 形状为 (1,)可选,当提供 labels 时返回) — 语言建模损失(用于下一个 token 预测)。

  • embeddings (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size)) — 模型的嵌入。

  • past_key_values (tuple(tuple(torch.FloatTensor)), optional, 当传递 use_cache=True 或当 config.use_cache=True 时返回) — 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含两个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量

    包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

  • hidden_states (tuple[torch.FloatTensor], optional, 当传递 output_hidden_states=True 或当 config.output_hidden_states=True 时返回) — torch.FloatTensor 元组(一个用于嵌入层输出,如果模型有嵌入层,+ 每个层输出一个),形状为 (batch_size, sequence_length, hidden_size)

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple[torch.FloatTensor], optional, 当传递 output_attentions=True 或当 config.output_attentions=True 时返回) — torch.FloatTensor 元组(每个层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

ColQwen2ForRetrieval 的 forward 方法,重写了 __call__ 特殊方法。

尽管前向传播的实现需要在该函数中定义,但之后应该调用 Module 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默忽略它们。

示例

< > 在 GitHub 上更新