Weaviate 임베딩: 멀티모달 임베딩

Weaviate 임베딩: 멀티모달 임베딩

Weaviate 벡터 인덱스를 Weaviate Embeddings 모델로 구성하면 이미지 객체 임베딩을 자동으로 생성하고, 검색할 때는 텍스트 쿼리를 임베딩으로 변환해 이미지에서 필요한 정보를 찾을 수 있어요. 이 기능은 이미지 기반 문서 검색에 최적화되어 있고, PDF·슬라이드·인보이스처럼 문서를 그대로 이미지로 만들어 임베딩합니다. v1.35.0에서 추가됐고 Weaviate Cloud 전용입니다.

출처: 공식문서

주요 사용 사례: 이미지 기반 문서 검색

이 통합은 이미지 기반 문서 검색을 위해 최적화되어 있어요. Weaviate Embeddings의 멀티모달 모델로 문서 페이지 이미지를 임베딩한 뒤, 텍스트 쿼리로 관련 페이지를 검색합니다.

OCR이나 전처리가 필요 없어요. 이 모델은 문서 이미지를 직접 임베딩하므로 OCR 파이프라인, 텍스트 추출 같은 전처리 단계가 필요하지 않습니다. 문서(PDF, 슬라이드, 인보이스)를 그냥 이미지로 변환해 그대로 임베딩하면 돼요.

사전 준비

Weaviate Embeddings를 쓰려면 Weaviate Embeddings를 지원하는 클라이언트 라이브러리가 있는 Weaviate Cloud 인스턴스가 필요합니다. 셀프호스트 사용자는 사용할 수 없고, 인증은 Weaviate Cloud 자격 증명으로 자동 처리됩니다.

import weaviate
from weaviate.classes.init import Auth
import os

# Best practice: store your credentials in environment variables
weaviate_url = os.getenv("WEAVIATE_URL")
weaviate_key = os.getenv("WEAVIATE_API_KEY")

client = weaviate.connect_to_weaviate_cloud(
    cluster_url=weaviate_url,  # Weaviate URL: "REST Endpoint" in Weaviate Cloud console
    auth_credentials=Auth.api_key(weaviate_key),  # Weaviate API key: "ADMIN" API key in Weaviate Cloud console
)
print(client.is_ready())  # Should print: `True`

인덱스 구성

이미지 데이터를 담을 BLOB 타입 속성 하나를 구성하고, 그 속성 이름을 벡터라이저 구성에 전달합니다.

이 모델은 다중 벡터 임베딩(multi-vector embeddings) 을 생성해 각 문서를 여러 개의 벡터로 표현하므로 세밀한 의미 매칭이 가능해요. 다만 메모리를 많이 쓰므로, 다중 벡터를 하나의 고정 차원 벡터로 압축하는 MUVERA 인코딩을 켜는 것을 권장합니다.

MUVERA 인코딩 활성화 (권장)

ColModernVBERT 모델이 만드는 다중 벡터 임베딩은 메모리를 상당히 소비합니다. MUVERA 인코딩은 검색 품질을 유지하면서 이를 효율적인 단일 벡터로 압축해요.

from weaviate.classes.config import Configure, Property, DataType

client.collections.create(
    "DemoCollection",
    properties=[
        Property(
            name="doc_page",
            data_type=DataType.BLOB,
        ),
    ],
    vector_config=[
        Configure.MultiVectors.multi2vec_weaviate(
            # name="document",  # Optional: You can choose to name the vector
            image_field="doc_page",
            model="ModernVBERT/colmodernvbert",
            encoding=Configure.VectorIndex.MultiVector.Encoding.muvera(
                # Optional parameters for tuning MUVERA
                ksim=4,
                dprojections=16,
                repetitions=20,
            ),
        )
    ],
)

MUVERA 없이 기본 구성

MUVERA 압축 없이 원본 다중 벡터 임베딩을 저장하고 싶다면 이 구성으로 하세요. 메모리를 더 소비한다는 점만 주의하세요.

from weaviate.classes.config import Configure, Property, DataType

client.collections.create(
    "DemoCollection",
    properties=[
        Property(
            name="doc_page",
            data_type=DataType.BLOB,  # Define an image property
        )
        # Any other properties can be defined here
    ],
    vector_config=[
        Configure.MultiVectors.multi2vec_weaviate(
            name="document",
            image_field="doc_page"  # Must provide the image property name here
        )
    ],
    # Additional parameters not shown
)

멀티모달 벡터라이저 파라미터

  • base_url (선택): Weaviate Embeddings 서비스의 기본 URL (대부분의 경우 불필요)
  • model (선택): 임베딩 생성에 사용할 모델 이름. 현재 사용 가능한 모델은 하나뿐이에요.

데이터 가져오기

벡터라이저를 구성한 뒤 데이터를 가져오면 Weaviate가 지정한 모델로 이미지 객체의 임베딩을 생성합니다.

collection = client.collections.use("DemoCollection")
with collection.batch.fixed_size(batch_size=200) as batch:
    for src_obj in source_objects:
        pages_b64 = url_to_base64(src_obj["page_img_path"])
        weaviate_obj = {
            "title": src_obj["title"],
            "doc_page": pages_b64,  # Add the image in base64 encoding
        }
        # The model provider integration will automatically vectorize the object
        batch.add_object(
            properties=weaviate_obj,
            # vector=vector  # Optionally provide a pre-obtained vector
        )

검색하기

벡터/하이브리드 검색을 수행하면 Weaviate가 텍스트 쿼리를 지정한 모델로 임베딩으로 변환하고, 가장 유사한 객체를 반환합니다.

collection = client.collections.use("DemoCollection")
response = collection.query.near_text(
    query="A holiday film",  # The model provider integration will automatically vectorize the query
    limit=2,
)
for obj in response.objects:
    print(obj.properties["title"])

사용 가능한 모델: ModernVBERT/colmodernvbert

  • 2억 5000만 파라미터의 late-interaction 비전-언어 인코더로, 시각 문서 검색용으로 파인튜닝됨
  • 문서 이미지와 텍스트 쿼리에서 다중 벡터 임베딩(ColBERT 스타일 late-interaction)을 생성
  • 무거운 전처리 없이 문서를 바로 Weaviate에 넣기에 이상적 (OCR·텍스트 추출 불필요)
  • 사이즈 대비 최고 수준 성능으로, 최대 10배 더 큰 모델과 견줄 수 있음
  • 쿼리 토큰 한도: 8,192 토큰

MUVERA 인코딩 권장

메모리 사용량을 줄이면서 검색 품질을 유지하려면 MUVERA 인코딩을 활성화하세요.

더 알아보기 (Learn more)