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