모델별 실행 레시피

최종 업데이트

OCR 없이 PDF 페이지를 찾는 ColPali·ColQwen 가이드

페이지 이미지의 시각 정보를 검색하고, 텍스트 추출은 별도 도구에 맡겨요.

ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고 질문과 가까운 페이지를 찾아줘요. 표의 배치 같은 시각 정보도 검색 단서로 쓸 수 있어요.

실행 조건과 핵심 내용
  • PDF 페이지를 이미지 표현으로 검색해요.
  • 페이지 검색과 텍스트 추출은 다른 작업이에요.

페이지 자체를 검색 대상으로 삼아요

ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고, 질문과 가까운 페이지를 찾아줘요. 표의 배치처럼 페이지에 보이는 구조도 검색 단서로 쓸 수 있어 OCR1로 뽑은 텍스트만 검색할 때보다 레이아웃을 활용할 수 있어요.

업무 문서 묶음에서 ‘세 번째 표에 적힌 보증 기간’처럼 질문을 정하고, PDF 원본의 페이지 번호와 답이 있는 위치를 먼저 표시하세요. 검색은 답변 생성이 아니라 관련 페이지 후보를 좁히는 단계예요.

스캔 PDF 페이지에서 문자가 추출되는 모습
문서 페이지의 레이아웃과 표가 검색 단서가 됩니다.

검색과 추출을 분리해 평가해요

페이지 검색 지표는 정답 페이지가 상위 k개에 들어온 비율로 계산하고, OCR 품질은 별도의 문자 오류율이나 필드 정확도로 봅니다. 페이지를 잘 찾았다고 해서 셀 경계, 읽기 순서, 작은 글자가 정확히 추출됐다고 볼 수는 없습니다.

같은 PDF에서 ColPali와 ColQwen을 비교하고 페이지 번호·순위·검색 시간을 저장하세요. 답변에 필요한 표나 문장은 원본에서 확인하고, 인용할 텍스트가 필요하면 OCR이나 문서 파서로 따로 추출합니다.

긴 문서가 문맥이 겹치는 조각으로 나뉜 모습
찾은 페이지는 원문과 나란히 확인하세요.

색인 용량과 페이지 렌더링 비용을 확인해요

이 코드는 페이지 배치와 표를 단서로 후보 페이지를 찾습니다. ColPali와 ColQwen을 비교하려면 같은 PDF·질의·정답 페이지·렌더링 조건을 두 모델에 각각 적용해 결과를 수집하세요.

검색 예제는 페이지 번호와 점수를 JSON으로 반환해요. OCR 글자 정확도나 필드 추출 품질은 별도 파서 실험에서 확인하세요.

표에서 숫자 하나만 뽑아 쓰는 일이 대부분이라면 페이지 검색 모델을 먼저 붙일 필요는 없어요. 문서가 몇 장뿐이거나 OCR 텍스트가 이미 잘 정리되어 있다면 키워드 검색과 문서 파서로 먼저 해 보세요.

PDF 렌더링과 ColPali 다중 벡터 API 설치
python -m venv .venv
source .venv/bin/activate
python -m pip install -U 'sentence-transformers[image]>=6.0.0' pymupdf pillow
make_report.py — 예제 PDF 작성
import fitz

doc = fitz.open()
page = doc.new_page(width=595, height=842)
page.insert_text((72, 90), "Product comparison", fontsize=20)
page.insert_text((72, 150), "Model | Warranty", fontsize=13)
page.insert_text((72, 185), "Atlas | 2 years", fontsize=12)
page.insert_text((72, 220), "Nova | 1 year", fontsize=12)
page2 = doc.new_page(width=595, height=842)
page2.insert_text((72, 90), "Support contacts", fontsize=20)
page2.insert_text((72, 150), "Email: help@example.test", fontsize=12)
doc.save("report.pdf")
print("saved report.pdf")
코드를 `make_report.py`로 저장해 실행해요. 합성 PDF는 파이프라인 동작을 확인하는 입력입니다.
colpali_search.py — 최대 20페이지를 검색해 JSON 출력
import fitz, json, time
from PIL import Image
from sentence_transformers import MultiVectorEncoder

pdf_path = "report.pdf"
query = "Which page shows the warranty period in the comparison table?"
model = MultiVectorEncoder("vidore/colqwen2.5-v0.2")
page_images = []
start = time.perf_counter()
with fitz.open(pdf_path) as pdf:
    for page_number in range(1, min(len(pdf), 20) + 1):
        page = pdf[page_number - 1]
        pix = page.get_pixmap(matrix=fitz.Matrix(1.5, 1.5), alpha=False)
        image = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
        page_images.append((page_number, image))
query_vectors = model.encode_query([query])
page_vectors = model.encode_document([image for _, image in page_images])
scores = model.similarity(query_vectors, page_vectors)[0]
ranked = scores.argsort(descending=True).tolist()[:5]
print(json.dumps({"query": query, "pages_rendered": len(page_images), "elapsed_s": round(time.perf_counter() - start, 3), "top_pages": [{"page": page_images[i][0], "score": float(scores[i])} for i in ranked]}, indent=2))
이 코드를 `colpali_search.py`로 저장해 실행합니다. 앞쪽에서 최대 20페이지를 렌더링해요.
PDF 작성 후 검색 실행
python make_report.py
python colpali_search.py
가중치는 첫 실행 때 내려받고, 상위 페이지를 JSON으로 출력합니다.
검색 오류를 원문 추출과 문단 순서에서 확인하는 장면
검색 결과를 추출·색인 단계와 구분해 기록해요.

용어 각주

  1. OCR — 이미지나 스캔 문서에서 글자를 인식해 텍스트로 바꾸는 처리입니다. 표 배치나 읽기 순서는 원본 이미지를 함께 봐야 판단할 수 있습니다.

    본문으로 돌아가기

자주 묻는 질문

이 글에서 가장 먼저 확인할 것은 무엇인가요?
ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고 질문과 가까운 페이지를 찾아줘요. 표의 배치 같은 시각 정보도 검색 단서로 쓸 수 있어요.