모델별 실행 레시피
최종 업데이트
OCR 없이 PDF 페이지를 찾는 ColPali·ColQwen 가이드
페이지 이미지의 시각 정보를 검색하고, 텍스트 추출은 별도 도구에 맡겨요.
ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고 질문과 가까운 페이지를 찾아줘요. 표의 배치 같은 시각 정보도 검색 단서로 쓸 수 있어요.
페이지 자체를 검색 대상으로 삼아요
ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고, 질문과 가까운 페이지를 찾아줘요. 표의 배치처럼 페이지에 보이는 구조도 검색 단서로 쓸 수 있어 OCR1로 뽑은 텍스트만 검색할 때보다 레이아웃을 활용할 수 있어요.
업무 문서 묶음에서 ‘세 번째 표에 적힌 보증 기간’처럼 질문을 정하고, PDF 원본의 페이지 번호와 답이 있는 위치를 먼저 표시하세요. 검색은 답변 생성이 아니라 관련 페이지 후보를 좁히는 단계예요.

검색과 추출을 분리해 평가해요
페이지 검색 지표는 정답 페이지가 상위 k개에 들어온 비율로 계산하고, OCR 품질은 별도의 문자 오류율이나 필드 정확도로 봅니다. 페이지를 잘 찾았다고 해서 셀 경계, 읽기 순서, 작은 글자가 정확히 추출됐다고 볼 수는 없습니다.
같은 PDF에서 ColPali와 ColQwen을 비교하고 페이지 번호·순위·검색 시간을 저장하세요. 답변에 필요한 표나 문장은 원본에서 확인하고, 인용할 텍스트가 필요하면 OCR이나 문서 파서로 따로 추출합니다.

색인 용량과 페이지 렌더링 비용을 확인해요
이 코드는 페이지 배치와 표를 단서로 후보 페이지를 찾습니다. ColPali와 ColQwen을 비교하려면 같은 PDF·질의·정답 페이지·렌더링 조건을 두 모델에 각각 적용해 결과를 수집하세요.
검색 예제는 페이지 번호와 점수를 JSON으로 반환해요. OCR 글자 정확도나 필드 추출 품질은 별도 파서 실험에서 확인하세요.
표에서 숫자 하나만 뽑아 쓰는 일이 대부분이라면 페이지 검색 모델을 먼저 붙일 필요는 없어요. 문서가 몇 장뿐이거나 OCR 텍스트가 이미 잘 정리되어 있다면 키워드 검색과 문서 파서로 먼저 해 보세요.
python -m venv .venv
source .venv/bin/activate
python -m pip install -U 'sentence-transformers[image]>=6.0.0' pymupdf pillowimport 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")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))python make_report.py
python colpali_search.py
용어 각주
OCR — 이미지나 스캔 문서에서 글자를 인식해 텍스트로 바꾸는 처리입니다. 표 배치나 읽기 순서는 원본 이미지를 함께 봐야 판단할 수 있습니다.
본문으로 돌아가기
자주 묻는 질문
- 이 글에서 가장 먼저 확인할 것은 무엇인가요?
- ColPali는 PDF 페이지 이미지를 입력받아 페이지별 다중 벡터 표현을 만들고 질문과 가까운 페이지를 찾아줘요. 표의 배치 같은 시각 정보도 검색 단서로 쓸 수 있어요.
