illuin-tech/colpali

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

ColPali – 비전-언어 모델을 활용한 시각 문서 검색

무엇인가요 – ColPali는 연구용 라이브러리로, 문서 페이지 이미지(PDF를 PNG/JPEG로 렌더링한 것, 스크린샷 등)를 비전-언어 모델(VLM)을 사용해 다중 벡터 임베딩으로 변환할 수 있게 해줍니다. 이 임베딩은 라이트 인터랙션(ColBERT 스타일) 유사도를 통해 쿼리 임베딩과 비교되며, 표, 차트, 레이아웃 단서에 숨겨진 정보도 포함해 사용자가 요청한 정보를 빠르고 정확하게 검색할 수 있게 해줍니다.

왜 중요한가요 – 기존 문서 검색 파이프라인은 먼저 OCR을 수행하고 레이아웃을 추출한 후 평문을 인덱싱합니다. ColPali는 이 취약한 OCR 단계를 건너뜁니다. 단일 VLM(PaliGemma‑3B, Qwen‑VL, Qwen3‑VL 등)이 원시 이미지 패치를 처리하여 시각적 및 텍스트적 단서를 유지합니다. 그 결과, 각 이미지 패치당 벡터 세트가 생성되며, 이는 쿼리 벡터와 효율적으로 비교 가능합니다.

주요 구성 요소

  • 모델 패밀리vidore/colpali‑v1.3, vidore/colqwen2‑v1.0, vidore/colqwen2.5‑v0.2, 커뮤니티 기여 모델(예: Tomoro‑colqwen3‑embed‑4b) 등 사전 학습된 체크포인트. ColBERT 아키텍처와 VLM 백본(PaliGemma, Qwen2‑VL, Qwen3‑VL 등) 위에 구축됨.
  • colpali-engine 패키지 – 모델 클래스(ColPali, ColQwen2 등), 이미지 및 텍스트 프로세서, 스코어링, 토큰 풀링, 해석성 도구 제공. 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