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