windlass.interfaces.retriever¶
retriever
¶
The retriever interface.
A retriever answers "which chunks are relevant to this query?". That is a different job from the vector store, which only answers "which vectors are closest to this one" — the distinction is what lets BM25, hybrid fusion, contextual retrieval and reranking all be retrievers while only some of them touch a vector database.
Implementers override one coroutine, :meth:Retriever.aretrieve_chunks.
Example
from windlass.providers.retrievers.bm25 import BM25Retriever from windlass.core.types import Chunk r = BM25Retriever() r.index([Chunk(content="the cat sat"), Chunk(content="dogs bark")]) 2 r.retrieve("cat").hits[0].chunk.content 'the cat sat'
Retriever
¶
Retriever(
*,
top_k: int = 5,
score_threshold: float | None = None,
rerank: Any = None,
fetch_k: int | None = None,
name: str | None = None,
**config: Any
)
Bases: Component
Abstract retrieval strategy.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
top_k
|
int
|
Default number of chunks to return. |
5
|
score_threshold
|
float | None
|
Drop hits scoring below this. |
None
|
rerank
|
Any
|
Optional reranker applied to the candidate set before
truncation. Any object with an |
None
|
fetch_k
|
int | None
|
How many candidates to pull before reranking/filtering.
Defaults to |
None
|
name
|
str | None
|
Component name for traces. |
None
|
**config
|
Any
|
Strategy-specific options. |
{}
|
Attributes:
| Name | Type | Description |
|---|---|---|
top_k |
The configured result count. |
|
requires_index |
bool
|
Whether :meth: |
Example
Implementing a retriever takes one method::
class RandomRetriever(Retriever):
provider_name = "random"
async def aretrieve_chunks(self, query, k, *, filters=None, **kw):
picks = random.sample(self.corpus, k)
return [ScoredChunk(chunk=c, score=1.0) for c in picks]
Source code in src\windlass\interfaces\retriever.py
aretrieve_chunks
abstractmethod
async
¶
aretrieve_chunks(
query: str, k: int, *, filters: MetadataFilter | None = None, **kwargs: Any
) -> list[ScoredChunk]
Return candidate chunks for query.
The only method a strategy must implement. Thresholding, reranking,
truncation and timing are applied by :meth:aretrieve.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
query
|
str
|
The search query. |
required |
k
|
int
|
How many candidates to produce. This is |
required |
filters
|
MetadataFilter | None
|
Metadata constraints. |
None
|
**kwargs
|
Any
|
Strategy-specific options. |
{}
|
Returns:
| Type | Description |
|---|---|
list[ScoredChunk]
|
Scored chunks, ideally already sorted by descending score. |
Source code in src\windlass\interfaces\retriever.py
aindex
async
¶
Add chunks to whatever index this retriever maintains.
The default is a no-op, which is right for retrievers that read from a shared vector store. Lexical retrievers override it.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
chunks
|
Sequence[Chunk]
|
Chunks to index. |
required |
Returns:
| Type | Description |
|---|---|
int
|
How many chunks were indexed. |
Source code in src\windlass\interfaces\retriever.py
index
¶
aretrieve
async
¶
aretrieve(
query: str,
k: int | None = None,
*,
filters: MetadataFilter | None = None,
**kwargs: Any
) -> SearchResult
Retrieve chunks for a query.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
query
|
str
|
The search query. |
required |
k
|
int | None
|
Override for :attr: |
None
|
filters
|
MetadataFilter | None
|
Metadata constraints. |
None
|
**kwargs
|
Any
|
Strategy-specific options. |
{}
|
Returns:
| Name | Type | Description |
|---|---|---|
A |
SearchResult
|
class: |
SearchResult
|
candidate count and latency. |
Raises:
| Type | Description |
|---|---|
RetrievalError
|
When the underlying strategy fails. |
Performance
With a reranker configured, fetch_k candidates are retrieved and
then narrowed to k. Raising fetch_k improves recall at the
cost of one larger rerank call.
Example
import asyncio from windlass.providers.retrievers.bm25 import BM25Retriever from windlass.core.types import Chunk r = BM25Retriever() _ = r.index([Chunk(content="vector search rocks")]) asyncio.run(r.aretrieve("vector")).hits[0].score > 0 True
Source code in src\windlass\interfaces\retriever.py
retrieve
¶
retrieve(
query: str,
k: int | None = None,
*,
filters: MetadataFilter | None = None,
**kwargs: Any
) -> SearchResult
Blocking :meth:aretrieve.
Source code in src\windlass\interfaces\retriever.py
abatch_retrieve
async
¶
abatch_retrieve(
queries: Sequence[str],
k: int | None = None,
*,
filters: MetadataFilter | None = None,
concurrency: int | None = None
) -> list[SearchResult]
Retrieve for many queries concurrently.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
queries
|
Sequence[str]
|
The queries to run. |
required |
k
|
int | None
|
Override for :attr: |
None
|
filters
|
MetadataFilter | None
|
Metadata constraints applied to every query. |
None
|
concurrency
|
int | None
|
Maximum simultaneous retrievals. |
None
|
Returns:
| Type | Description |
|---|---|
list[SearchResult]
|
One result per query, in input order. |