SentenceTransformersDocumentImageEmbedder
SentenceTransformersDocumentImageEmbedder
SentenceTransformersDocumentImageEmbedder는 문서 목록의 이미지 임베딩을 계산해 각 문서의 embedding 필드에 얻은 벡터를 저장해요. 텍스트와 이미지를 같은 벡터 공간으로 임베딩할 수 있는 Sentence Transformers 임베딩 모델을 사용하죠.
출처: 문서
본문
| 항목 | 내용 |
|---|---|
| 파이프라인에서 가장 흔한 위치 | 인덱싱 파이프라인에서 DocumentWriter 앞 |
| 필수 init 변수 | 없음 |
| 필수 run 변수 | documents: 이미지 파일 경로를 담은 메타 필드가 있는 문서 목록 |
| 출력 변수 | documents: 임베딩으로 풍부해진 문서 목록 |
| API reference | Sentence Transformers |
| GitHub 링크 | sentence_transformers 통합 |
| 패키지 이름 | sentence-transformers-haystack |
개요
SentenceTransformersDocumentImageEmbedder는 메타 필드에 이미지 또는 PDF 파일 경로를 담은 문서 목록을 기대해요. 메타 필드는 이 컴포넌트의 file_path_meta_field init 파라미터로 지정할 수 있어요.
임베더는 이미지를 효율적으로 로드해 Sentence Transformers 모델로 임베딩을 계산하고, 각각을 문서의 embedding 필드에 저장해요.
SentenceTransformersDocumentImageEmbedder는 인덱싱 파이프라인에서 주로 사용해요. 검색 시점에는 임베딩 Retriever를 사용하기 전에 같은 모델을 SentenceTransformersTextEmbedder로 사용해 쿼리를 임베딩해야 해요.
device 파라미터를 설정해 HF 모델을 CPU나 GPU에서 실행할 수 있어요.
또한 backend 파라미터로 Sentence Transformers 모드에 사용할 백엔드를 선택할 수 있어요: torch(기본값), onnx, openvino. ONNX와 OpenVINO는 특정 속도 최적화를 허용해요. 자세한 내용은 Sentence Transformers 문서를 읽어보세요.
인증
Hugging Face API 토큰 인증은 비공개 또는 게이트 모델에만 필요해요.
컴포넌트는 HF_API_TOKEN 또는 HF_TOKEN 환경 변수를 사용하거나, 초기화 시 Hugging Face API 토큰을 전달할 수 있어요. 자세한 내용은 Secret Management 페이지를 참고하세요.
호환 모델
이 컴포넌트와 함께 사용하려면 모델이 Sentence Transformers와 호환되고 이미지와 텍스트를 같은 벡터 공간으로 임베딩할 수 있어야 해요. 호환 모델은 다음과 같아요:
sentence-transformers/clip-ViT-B-32(기본값)sentence-transformers/clip-ViT-L-14sentence-transformers/clip-ViT-B-16sentence-transformers/clip-ViT-B-32-multilingual-v1jinaai/jina-embeddings-v4jinaai/jina-clip-v1jinaai/jina-clip-v2
사용법
SentenceTransformersDocumentImageEmbedder를 사용하려면 sentence-transformers-haystack 패키지를 설치하세요:
pip install sentence-transformers-haystack
단독으로 사용하기
from haystack import Document
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersDocumentImageEmbedder,
)
embedder = SentenceTransformersDocumentImageEmbedder(
model="sentence-transformers/clip-ViT-B-32",
)
documents = [
Document(content="A photo of a cat", meta={"file_path": "cat.jpg"}),
Document(content="A photo of a dog", meta={"file_path": "dog.jpg"}),
]
result = embedder.run(documents=documents)
documents_with_embeddings = result["documents"]
print(documents_with_embeddings)
# [Document(id=...,
# content='A photo of a cat',
# meta={'file_path': 'cat.jpg',
# 'embedding_source': {'type': 'image', 'file_path_meta_field': 'file_path'}},
# embedding=vector of size 512),
# ...]
파이프라인에서 사용하기
이 예제에서 3개 컴포넌트로 구성된 인덱싱 파이프라인을 볼 수 있어요:
ImageFileToDocumentConverter:meta.file_path필드의 이미지 참조로 빈 문서를 만들어요.SentenceTransformersDocumentImageEmbedder: 이미지를 로드해 임베딩을 계산하고 문서에 저장해요.DocumentWriter: 문서를InMemoryDocumentStore에 써요.
또한 SentenceTransformersTextEmbedder(이전과 같은 모델)와 InMemoryEmbeddingRetriever로 구성된 멀티모달 검색 파이프라인도 있어요.
from haystack import Pipeline
from haystack.components.converters.image import ImageFileToDocument
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersTextEmbedder,
SentenceTransformersDocumentImageEmbedder,
)
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
document_store = InMemoryDocumentStore()
# Indexing pipeline
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("image_converter", ImageFileToDocument())
indexing_pipeline.add_component(
"embedder",
SentenceTransformersDocumentImageEmbedder(
model="sentence-transformers/clip-ViT-B-32",
),
)
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("image_converter", "embedder")
indexing_pipeline.connect("embedder", "writer")
indexing_pipeline.run(data={"image_converter": {"sources": ["dog.jpg", "hyena.jpeg"]}})
# Multimodal retrieval pipeline
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component(
"embedder",
SentenceTransformersTextEmbedder(model="sentence-transformers/clip-ViT-B-32"),
)
retrieval_pipeline.add_component(
"retriever",
InMemoryEmbeddingRetriever(document_store=document_store, top_k=2),
)
retrieval_pipeline.connect("embedder", "retriever")
result = retrieval_pipeline.run(data={"text": "man's best friend"})
print(result)
# {
# 'retriever': {
# 'documents': [
# Document(
# id=0c96...,
# meta={
# 'file_path': 'dog.jpg',
# 'embedding_source': {
# 'type': 'image',
# 'file_path_meta_field': 'file_path'
# }
# },
# score=32.025817780129856
# ),
# Document(
# id=5e76...,
# meta={
# 'file_path': 'hyena.jpeg',
# 'embedding_source': {
# 'type': 'image',
# 'file_path_meta_field': 'file_path'
# }
# },
# score=20.648225327085242
# )
# ]
# }
# }
추가 참고 자료
- 🧑🍳 Cookbook: Introduction to Multimodality