MockDocumentEmbedder
MockDocumentEmbedder
API 호출 없이 결정적(deterministic) 임베딩을 돌려주는 Document Embedder예요. 테스트와 빠른 프로토타입에서 실제 Embedder 대신 쓰죠.
출처: 문서
본문
MockDocumentEmbedder는 OpenAIDocumentEmbedder 같은 실제 Document Embedder의 결정적이고 비용이 들지 않는 대체품이에요. 다른 임베더처럼 run, run_async, 직렬화를 모두 구현하되 외부 서비스에는 절대 접촉하지 않아서, 유닛 테스트·스모크 테스트·빠른 프로토타입에 아주 좋아요.
임베딩이 어떻게 만들어지는지는 컴포넌트 설정에 따라 갈려요.
- 결정적(기본값): 설정 없이 쓰면 각 문서의 임베딩이 준비된 텍스트의 안정적인 해시(hash)에서 유도돼요. 같은 텍스트는 항상 같은 단위 길이(unit-length) 임베딩을 만들고, 다른 텍스트는 다른 임베딩을 만들어서 검색(리트리벌) 파이프라인에서도 동작하고 실행·프로세스에 걸쳐 재현 가능해요.
- 고정 임베딩(Fixed embedding):
embedding벡터를 넘기면 모든 문서에 같은 벡터가 할당돼요. - 동적 임베딩(Dynamic embedding):
embedding_fn콜러블을 넘기면 문서의 준비된 텍스트를 받아 임베딩을 돌려줘요. 직렬화를 지원하려면 이름이 있는 함수를 넘겨야 해요.
embedding과 embedding_fn은 함께 쓸 수 없어요.
추가로 넣을 수 있는 선택 파라미터는 다음과 같아요.
dimension: 결정적 임베딩의 차원 수예요. 기본값768.embedding이나embedding_fn을 주면 길이가 값이나 콜러블에 의해 정해지므로 이 값은 무시돼요.model: 메타데이터에 기록되는 모델 이름이에요. 기본값"mock-model".meta: 출력meta에 병합되는 추가 메타데이터예요.prefix/suffix: 임베딩 전에 각 텍스트의 시작과 끝에 붙는 문자열이에요. 실제 임베더와 동일하게 동작해요.meta_fields_to_embed/embedding_separator: 실제 Document Embedder와 마찬가지로,meta_fields_to_embed에 나열된 메타데이터 필드를 문서 내용과 이어붙인 뒤 임베딩해서, 결정적 임베딩이 메타데이터까지 반영하게 해요.progress_bar: 실제 Document Embedder와 인터페이스를 맞추기 위해 받지만 무시돼요.
info: 결정적 임베딩은 해시에서 유도돼서, 같은 텍스트는 같은 벡터를 얻고 서로 다른 텍스트 사이의 유사도는 안정적이되 임의적이에요. 테스트에서 정확히 일치하는 문서를 찾는 검색에는 딱 원하는 동작이에요. 의미적으로 비슷한 텍스트가 벡터 공간에서 가까워질 거라고 기대하진 마세요.
검색어에는 MockTextEmbedder를, 문서에는 이 MockDocumentEmbedder를 쓰세요. 기본 결정적 모드에서는 검색어 텍스트가 문서 내용과 일치하면 같은 벡터가 만들어져서 그 문서가 최상위 결과로 검색돼요.
더 알아보기 (Learn more)
단독으로 쓰기
from haystack import Document
from haystack.components.embedders import MockDocumentEmbedder
embedder = MockDocumentEmbedder(dimension=8)
result = embedder.run([Document(content="I love pizza!")])
print(result["documents"][0].embedding) # a deterministic list of 8 floats
파이프라인에서 쓰기
인덱싱 파이프라인에서 실제 Document Embedder와 똑같이 쓰면 되고, API 키도 필요 없어요.
from haystack import Document, Pipeline
from haystack.components.embedders import MockDocumentEmbedder
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
document_store = InMemoryDocumentStore()
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("embedder", MockDocumentEmbedder(dimension=8))
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder.documents", "writer.documents")
indexing_pipeline.run(
{
"embedder": {
"documents": [
Document(content="My name is Wolfgang and I live in Berlin"),
Document(content="I saw a black horse running"),
],
},
}
)
print(document_store.count_documents()) # 2