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
例項而不是此函式,因為前者負責執行預處理和後處理步驟,而後者則默默地忽略它們。