Source code for fastrag.retrieval.vector

"""``VectorRetriever``: dense similarity search over a ``VectorStore``."""

from __future__ import annotations

from fastrag.ingestion.steps.embedding import Embedder
from fastrag.models import Document
from fastrag.retrieval.base import Retriever
from fastrag.vector_store import VectorStore


[docs] class VectorRetriever(Retriever): """Dense similarity search: the base retriever every other one over-fetches from. Holds its collaborators without owning their lifecycles: the caller opens ``vector_store`` (``async with MilvusVectorStore(...) as vector_store:``) and this retriever never opens or closes it. ``embedder`` is used only for its :meth:`~fastrag.ingestion.steps.embedding.base.Embedder.embed` method — never run as a pipeline step, never cached, never batched — so a single query embeds as one call. .. code-block:: python async with MilvusVectorStore(url=MILVUS_URI) as vector_store: retriever = VectorRetriever( vector_store=vector_store, embedder=Model2VecEmbedder(model=EMBEDDING_MODEL), ) documents = await retriever.retrieve("What is AgrospAI?", k=5) Args: vector_store: The collection to search. Opened by the caller. embedder: Embeds the query text with the same model the collection was indexed with. """ def __init__(self, *, vector_store: VectorStore, embedder: Embedder) -> None: """Store the collaborators; no I/O happens until :meth:`retrieve`.""" self.vector_store = vector_store self.embedder = embedder
[docs] async def retrieve(self, query: str, *, k: int = 5) -> list[Document]: """Embed ``query`` and return the ``k`` nearest documents, best first.""" embedding = (await self.embedder.embed([query]))[0] return await self.vector_store.search(embedding, k=k)