Transformers 文件
ColQwen2
並獲得增強的文件體驗
開始使用
ColQwen2
ColQwen2 是 ColPali 模型的一個變體,旨在透過分析文件的視覺特徵來檢索文件。與傳統嚴重依賴文字提取和 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 )
用於儲存 ColQ2en2ForRetrieval
配置的配置類。它用於根據指定引數例項化 ColQwen2ForRetrieval
例項,並按照“ColPali: 使用視覺語言模型進行高效文件檢索”論文中的方法定義模型架構。
使用預設值例項化配置將生成與預訓練的 ColQwen2-v1.0 模型所使用的視覺編碼器類似的配置,例如 vidore/colqwen2-v1.0-hf。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關更多資訊,請參閱 PretrainedConfig 的文件。
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__()
。
此方法將其所有引數轉發到 GemmaTokenizerFast 的 batch_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 (
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
時返回。
為模型準備一個或多個影像。此方法是 ColQwen2Processor 的 ColQwen2Processor.__call__()
方法的包裝器。
此方法將 images
和 kwargs
引數轉發到影像處理器。
處理查詢
< 來源 >( 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 (
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
時)。
為模型準備一個或多個文字。此方法是 ColQwen2Processor 的 ColQwen2Processor.__call__()
方法的包裝器。
此方法將 text
和 kwargs
引數轉發到分詞器。
檢索分數
< 來源 >( 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)。對於 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.ColQwen2ForRetrievalOutput
或 tuple(torch.FloatTensor)
引數
- input_ids (形狀為
(batch_size, sequence_length)
的torch.LongTensor
, 可選) — 詞彙表中輸入序列 token 的索引。預設情況下將忽略填充。可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- 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]
。 - past_key_values (
list[torch.FloatTensor]
, optional) — 預先計算的隱藏狀態(自注意力塊和交叉注意力塊中的鍵和值),可用於加速順序解碼。這通常包括模型在解碼上一階段返回的past_key_values
,當use_cache=True
或config.use_cache=True
時。允許兩種格式:
- 一個 Cache 例項,請參閱我們的 kv cache 指南;
- 一個長度為
config.n_layers
的tuple(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.ColQwen2ForRetrievalOutput
或 tuple(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_layers
的tuple(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
例項而不是此函式,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。