OracleEmbeddingRetriever

OracleEmbeddingRetriever

Oracle Document Store와 호환되는 임베딩 기반 Retriever예요.

출처: 문서

본문

OracleEmbeddingRetriever는 OracleDocumentStore와 호환되는 임베딩 기반 Retriever예요. Oracle AI Vector Search로 검색어와 문서 임베딩을 비교해서 벡터 유사도에 기반한 가장 관련 있는 문서를 가져와요.

파이프라인에서 OracleEmbeddingRetriever를 쓸 때는 문서(인덱스 시점)와 검색어(검색 시점) 모두에 임베딩이 준비돼 있어야 해요. 인덱싱 파이프라인에는 Document Embedder를, 검색 파이프라인에는 Text Embedder를 쓰세요.

거리 메트릭(COSINE, EUCLIDEAN, DOT)은 OracleDocumentStore에 설정돼요. query_embedding 외에도 Retriever는 top_k(반환할 최대 문서 수)와 검색 공간을 좁히는 filters를 받아요.

설치

Oracle Database 23ai를 Docker로 로컬에서 실행하려면:

docker run -d --name oracle23ai \
  -p 1521:1521 \
  -e ORACLE_PASSWORD=oracle \
  -e ORACLE_INIT_PARAMS=vector_memory_size=512M \
  gvenzl/oracle-free:23-slim

Haystack용 Oracle 통합을 설치해요.

pip install oracle-haystack

이 페이지의 예제는 sentence-transformers-haystack 패키지의 Sentence Transformers 임베더를 사용해요. 예제를 실행하려면 설치하세요.

pip install sentence-transformers-haystack

더 알아보기 (Learn more)

단독으로 쓰기

이 Retriever는 OracleDocumentStore와 임베딩이 있는 인덱싱된 문서가 필요해요.

from haystack.utils import Secret
from haystack_integrations.document_stores.oracle import (
    OracleDocumentStore,
    OracleConnectionConfig,
)
from haystack_integrations.components.retrievers.oracle import OracleEmbeddingRetriever


document_store = OracleDocumentStore(
    connection_config=OracleConnectionConfig(
        user=Secret.from_env_var("ORACLE_USER"),
        password=Secret.from_env_var("ORACLE_PASSWORD"),
        dsn=Secret.from_env_var("ORACLE_DSN"),
    ),
    embedding_dim=768,
)

retriever = OracleEmbeddingRetriever(document_store=document_store)

# using a fake vector to keep the example simple
retriever.run(query_embedding=[0.1] * 768)

파이프라인에서 쓰기

from haystack import Document, Pipeline
from haystack.document_stores.types import DuplicatePolicy
from haystack_integrations.components.embedders.sentence_transformers import (
    SentenceTransformersDocumentEmbedder,
    SentenceTransformersTextEmbedder,
)
from haystack.utils import Secret

from haystack_integrations.document_stores.oracle import (
    OracleDocumentStore,
    OracleConnectionConfig,
)
from haystack_integrations.components.retrievers.oracle import OracleEmbeddingRetriever


document_store = OracleDocumentStore(
    connection_config=OracleConnectionConfig(
        user=Secret.from_env_var("ORACLE_USER"),
        password=Secret.from_env_var("ORACLE_PASSWORD"),
        dsn=Secret.from_env_var("ORACLE_DSN"),
    ),
    embedding_dim=768,
)

documents = [
    Document(content="There are over 7,000 languages spoken around the world today."),
    Document(
        content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.",
    ),
    Document(
        content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.",
    ),
]

document_embedder = SentenceTransformersDocumentEmbedder(
    model="sentence-transformers/all-MiniLM-L6-v2",
)
documents_with_embeddings = document_embedder.run(documents)

document_store.write_documents(
    documents_with_embeddings["documents"],
    policy=DuplicatePolicy.OVERWRITE,
)

query_pipeline = Pipeline()
query_pipeline.add_component(
    "text_embedder",
    SentenceTransformersTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2"),
)
query_pipeline.add_component(
    "retriever",
    OracleEmbeddingRetriever(document_store=document_store),
)
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")

query = "How many languages are there?"
result = query_pipeline.run({"text_embedder": {"text": query}})

print(result["retriever"]["documents"][0])