illuin-tech/colpali

The code used to train and run inference with the ColVision models, e.g. ColPali, ColQwen2, and ColSmol.

ColPali – ビジョン・ランゲージモデルを用いた視覚ドキュメント検索

何であるか – ColPali は研究用のライブラリであり、ドキュメントページの画像(PNG/JPEG にレンダリングされた PDF ページ、スクリーンショットなど)をビジョン・ランゲージモデル(VLM)を用いて マルチベクトル エンベッディングに変換できます。これらのエンベッディングは、ラテ・インタラクション(ColBERTスタイル)の類似度でクエリエンベッディングと比較され、テーブル、チャート、レイアウトの手がかりに隠された情報も含めて、ユーザーが求める情報を迅速かつ正確に検索可能になります。

なぜ重要か – 伝統的なドキュメント検索パイプラインは、まず OCR を実行し、レイアウトを抽出してから、平文をインデックス化します。ColPali はこの脆弱な OCR ステップをスキップします:単一の VLM(例:PaliGemma‑3B、Qwen‑VL、Qwen3‑VL)が生の画像パッチを処理し、視覚的およびテキスト的ヒントを保持します。その結果、各画像パッチごとにベクトルのセットが得られ、クエリベクトルと効率的に比較可能になります。

主なコンポーネント

  • モデルファミリーvidore/colpali‑v1.3vidore/colqwen2‑v1.0vidore/colqwen2.5‑v0.2、コミュニティ寄与のバリアント(例:Tomoro‑colqwen3‑embed‑4b)など、事前学習済みチェックポイント。ColBERT アーキテクチャと VLM ベース(PaliGemma、Qwen2‑VL、Qwen3‑VL など)の上に構築されています。
  • colpali-engine パッケージ – モデルクラス(ColPaliColQwen2 など)、画像およびテキストのプロセッサ、スコアリング、トークンプール、解釈性ツールを提供します。PyPI からインストール可能(pip install colpali-engine)またはソースから直接インストール可能です。
  • ラテ・インタラクションカーネル – オプションの Triton ベース late-interaction-kernels 拡張(colpali-engine[lik])は、[B, B, Lq, Ld] シミラリティテンソルの計算時にメモリ使用量を大幅に削減し、現代の GPU でより大きなバッチサイズを可能にします。
  • Fast-Plaid インデックスplaid オプションを使用すると、processor.create_plaid_index でコンパクトなインデックスを構築でき、大規模コーパスでの高速 top-k 検索が可能になります。
  • 解釈性interpretability オプションにより、各クエリトークンに最も寄与した画像パッチを可視化する類似度マップを表示できます。デバッグや研究に有用です。
  • トークンプールHierarchicalTokenPooler は、重複するパッチ(例:白い背景)を統合することでマルチベクトル表現を圧縮し、ベクトル数を約 2/3 に削減しながら、検索性能の 97% 以上を維持します。

一般的なワークフロー

from colpali_engine.models import ColQwen2
from colpali_engine import ColQwen2Processor
import torch, PIL.Image as Image

model = ColQwen2.from_pretrained(
    "vidore/colqwen2-v1.0",
    torch_dtype=torch.bfloat16,
    device_map="cuda:0",
    attn_implementation="flash_attention_2",
).eval()

processor = ColQwen2Processor.from_pretrained("vidore/colqwen2-v1.0")

# ドキュメント(画像)とクエリ(テキスト)
images = [Image.open(p) for p in ["page1.png", "page2.png"]]
queries = ["What is the y‑axis variable?", "Which year had the highest outlay?"]

# 前処理
batch_imgs = processor.process_images(images).to(model.device)
batch_qs   = processor.process_queries(queries).to(model.device)

# エンコード
with torch.no_grad():
    doc_emb = model(**batch_imgs)
    qry_emb = model(**batch_qs)

# スコア(ラテ・インタラクション)
scores = processor.score_multi_vector(qry_emb, doc_emb)
print(scores)

同じパターンは、新しい Sentence‑Transformers v6 API(MultiVectorEncoder)でも動作します。ColPali チームは現在、本番環境でこれを推奨しています。

現在の状態 – 元の colpali-engine パッケージは 非推奨 であり、Sentence‑Transformers(v6+)に統合されたサポートが推奨されています。リポジトリは再現性、研究、移行ガイドのため保持されています。すべてのモデルチェックポイントは Hugging Face にホストされ、公開のリーダーボード(ViDoRe)がその検索性能を追跡しています。

次に進むべき場所

  • 本番環境sentence-transformers[image]MultiVectorEncoder クラスを使用してください。同じ API を提供しつつ、より良いエコシステムサポートがあります。
  • ベンチマークvidore-benchmark リポジトリで ViDoRe データセット上で評価できます。
  • コミュニティリソース – コックブック(github.com/tonywu71/colpali-cookbooks)には、トレーニング、インデックス作成、類似度マップの可視化用のノートブックが含まれます。
  • さらなる研究 – 論文(arXiv:2407.01449)とトークンプールに関する研究(arXiv:2409.14683)は、モデル設計に関するより深い洞察を提供します。

TL;DR – ColPali はビジョン・ランゲージモデルを用いてドキュメント画像をマルチベクトルエンベッディングに変換し、ColBERTスタイルのラテ・インタラクションにより、OCRを必要としない高速な検索を可能にします。元のエンジンは非推奨ですが、モデルと概念は Sentence‑Transformers のマルチベクトルサポートを通じて引き続き活用されています。

関連

  • プロジェクト
  • プロジェクト
  • Dispatch
  • プロジェクト
  • Dispatch