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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.