OllamaDocumentEmbedder

OllamaDocumentEmbedder

Ollama Library와 호환되는 임베딩 모델로 문서 목록의 임베딩을 계산하는 컴포넌트예요.

출처: 문서

본문

OllamaDocumentEmbedder는 문서 목록의 임베딩을 계산하고 그 결과 벡터를 각 문서의 embedding 필드에 저장해요. Ollama Library와 호환되는 임베딩 모델을 사용하죠.

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

Overview

OllamaDocumentEmbedder는 문서 목록을 임베딩할 때 써요. 문자열 하나만 임베딩할 때는 OllamaTextEmbedder를 쓰세요.

이 컴포넌트는 대부분 사용 가능한 환경(Mac, Linux, Docker)이 포트 11434를 기본으로 쓰기 때문에 기본 URL로 http://localhost:11434를 사용해요.

호환 모델

이 컴포넌트를 초기화할 때 따로 지정하지 않으면 기본 임베딩 모델은 "nomic-embed-text"예요. 다른 사전 빌드 모델은 Ollama의 library에서 볼 수 있어요. 자체 커스텀 모델을 쓰려면 Ollama의 지침을 따르세요.

설치

Haystack에서 이 통합을 쓰려면 패키지를 설치해요.

pip install ollama-haystack

실행 중인 Ollama 모델(docker 컨테이너 또는 로컬 호스팅)이 준비돼 있어야 해요. Ollama에는 임베딩 API가 내장되어 있어 추가 설정은 필요 없어요.

메타데이터 임베딩

임베딩된 메타데이터는 대부분 모델 이름과 유형에 대한 정보를 담아요. 선택 인자(temperature, top_p 등)를 Ollama 생성 엔드포인트에 넘길 수 있어요.

사용한 모델 이름은 문서 메타데이터의 일부로 자동으로 덧붙여져요. nomic-embed-text 모델을 쓰면 예시 페이로드는 이렇게 돼요.

{"meta": {"model": "nomic-embed-text"}}

더 알아보기 (Learn more)

단독으로 쓰기

from haystack import Document
from haystack_integrations.components.embedders.ollama import OllamaDocumentEmbedder


doc = Document(content="What do llamas say once you have thanked them? No probllama!")

document_embedder = OllamaDocumentEmbedder()

result = document_embedder.run([doc])
print(result["documents"][0].embedding)

# Calculating embeddings: 100%|██████████| 1/1 [00:02<00:00, 2.82s/it]

# [-0.16412407159805298, -3.8359334468841553, ... ]

파이프라인에서 쓰기

from haystack import Pipeline

from haystack_integrations.components.embedders.ollama import OllamaDocumentEmbedder

from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter

from haystack.components.converters import PyPDFToDocument
from haystack.components.writers import DocumentWriter
from haystack.document_stores.types import DuplicatePolicy
from haystack.document_stores.in_memory import InMemoryDocumentStore


document_store = InMemoryDocumentStore(embedding_similarity_function="cosine")

embedder = OllamaDocumentEmbedder(
    model="nomic-embed-text",
    url="http://localhost:11434",
)  # This is the default model and URL

cleaner = DocumentCleaner()
splitter = DocumentSplitter()
file_converter = PyPDFToDocument()
writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.OVERWRITE)

indexing_pipeline = Pipeline()

# Add components to pipeline
indexing_pipeline.add_component("embedder", embedder)
indexing_pipeline.add_component("converter", file_converter)
indexing_pipeline.add_component("cleaner", cleaner)
indexing_pipeline.add_component("splitter", splitter)
indexing_pipeline.add_component("writer", writer)

# Connect components in pipeline
indexing_pipeline.connect("converter", "cleaner")
indexing_pipeline.connect("cleaner", "splitter")
indexing_pipeline.connect("splitter", "embedder")
indexing_pipeline.connect("embedder", "writer")

# Run Pipeline
indexing_pipeline.run({"converter": {"sources": ["files/test_pdf_data.pdf"]}})

# Calculating embeddings: 100%|██████████| 115/115
# {'embedder': {'meta': {'model': 'nomic-embed-text'}},  'writer': {'documents_written': 115}}