FastembedDocumentEmbedder

FastembedDocumentEmbedder

FastEmbed가 지원하는 모델을 사용해 문서 리스트의 임베딩을 계산하는 컴포넌트예요.

출처: 문서

본문

  • 파이프라인에서의 일반적인 위치: 인덱싱 파이프라인에서 DocumentWriter 앞에 사용해요.
  • 필수 실행 변수: documents(문서 리스트)
  • 출력 변수: documents(임베딩이 보강된 문서 리스트)

이 컴포넌트는 문서 리스트를 임베딩할 때 사용해요. 문자열을 임베딩할 때는 FastembedTextEmbedder를 사용하세요.

개요 (Overview)

FastembedDocumentEmbedder는 문서 리스트의 임베딩을 계산하고 얻은 벡터를 각 문서의 embedding 필드에 저장해요. FastEmbed가 지원하는 임베딩 모델을 사용하죠.

이 컴포넌트로 계산한 벡터는 문서 모음에 대해 임베딩 검색을 수행하는 데 필요해요. 검색 시점에 쿼리를 나타내는 벡터를 문서들의 벡터와 비교해 가장 유사하거나 관련 있는 문서를 찾아요.

호환 모델 (Compatible models)

원본 모델은 FastEmbed 문서에서 찾을 수 있어요.

현재 MTEB(Massive Text Embedding Benchmark) 리더보드의 대부분 모델이 FastEmbed와 호환돼요. 지원되는 모델 목록에서 호환성을 확인할 수 있어요.

설치 (Installation)

이 통합을 Haystack에서 사용하려면 패키지를 설치하세요.

pip install fastembed-haystack

파라미터 (Parameters)

모델이 저장될 경로를 캐시 디렉터리로 설정할 수 있어요. 또한 단일 onnxruntime 세션이 사용할 스레드 수를 설정할 수 있어요.

cache_dir = "/your_cacheDirectory"
embedder = FastembedDocumentEmbedder(
    model="BAAI/bge-large-en-v1.5",
    cache_dir=cache_dir,
    threads=2,
)

데이터 병렬 인코딩을 사용하려면 parallel과 batch_size 파라미터를 설정할 수 있어요.

  • parallel > 1이면 데이터 병렬 인코딩을 사용해요. 대규모 데이터셋의 오프라인 인코딩에 권장돼요.
  • parallel이 0이면 사용 가능한 모든 코어를 사용해요.
  • None이면 데이터 병렬 처리를 사용하지 않고 기본 onnxruntime 스레딩을 사용해요.

tip

같은 모델 기반의 Text Embedder와 Document Embedder를 만들면, Haystack은 뒤에서 같은 리소스를 사용해 리소스를 아껴요.

메타데이터 임베딩 (Embedding Metadata)

텍스트 문서에는 종종 여러 메타데이터가 따라와요. 이 메타데이터가 구별되고 의미적으로 의미 있다면, 문서 텍스트와 함께 임베딩해 검색을 개선할 수 있어요.

Document Embedder로 쉽게 할 수 있어요.

from haystack import Document
from haystack_integrations.components.embedders.fastembed import (
    FastembedDocumentEmbedder,
)

doc = Document(
    content="some text",
    meta={"title": "relevant title", "page number": 18},
)

embedder = FastembedDocumentEmbedder(
    model="BAAI/bge-small-en-v1.5",
    batch_size=256,
    meta_fields_to_embed=["title"],
)

docs_w_embeddings = embedder.run(documents=[doc])["documents"]

사용법 (Usage)

단독 사용 (On its own)

from haystack.dataclasses import Document
from haystack_integrations.components.embedders.fastembed import (
    FastembedDocumentEmbedder,
)

document_list = [
    Document(content="I love pizza!"),
    Document(content="I like spaghetti"),
]

doc_embedder = FastembedDocumentEmbedder()

result = doc_embedder.run(document_list)
print(result["documents"][0].embedding)

# [-0.04235665127635002, 0.021791068837046623, ...]

파이프라인에서 사용 (In a pipeline)

from haystack import Document, Pipeline
from haystack.components.writers import DocumentWriter
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.document_stores.types import DuplicatePolicy
from haystack_integrations.components.embedders.fastembed import (
    FastembedDocumentEmbedder,
    FastembedTextEmbedder,
)

document_store = InMemoryDocumentStore(embedding_similarity_function="cosine")

documents = [
    Document(content="My name is Wolfgang and I live in Berlin"),
    Document(content="I saw a black horse running"),
    Document(content="Germany has many big cities"),
    Document(content="fastembed is supported by and maintained by Qdrant."),
]

document_embedder = FastembedDocumentEmbedder()
writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.OVERWRITE)

indexing_pipeline = Pipeline()
indexing_pipeline.add_component("document_embedder", document_embedder)
indexing_pipeline.add_component("writer", writer)
indexing_pipeline.connect("document_embedder", "writer")

indexing_pipeline.run({"document_embedder": {"documents": documents}})

query_pipeline = Pipeline()
query_pipeline.add_component("text_embedder", FastembedTextEmbedder())
query_pipeline.add_component(
    "retriever",
    InMemoryEmbeddingRetriever(document_store=document_store),
)
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")

query = "Who supports fastembed?"

result = query_pipeline.run({"text_embedder": {"text": query}})

print(result["retriever"]["documents"][0])  # noqa: T201

# Document(id=...,
# content: 'fastembed is supported by and maintained by Qdrant.',
# score: 0.758..)

추가 자료 (Additional References)

🧑‍🍳 Cookbook: RAG Pipeline Using FastEmbed for Embeddings Generation

더 알아보기 (Learn more)