Optionally perform reranking when searching
This commit is contained in:
parent
1437942edc
commit
2347612fb6
2 changed files with 20 additions and 3 deletions
|
|
@ -10,6 +10,7 @@ import httpx
|
||||||
|
|
||||||
from haiku.rag.config import Config
|
from haiku.rag.config import Config
|
||||||
from haiku.rag.reader import FileReader
|
from haiku.rag.reader import FileReader
|
||||||
|
from haiku.rag.reranking import get_reranker
|
||||||
from haiku.rag.store.engine import Store
|
from haiku.rag.store.engine import Store
|
||||||
from haiku.rag.store.models.chunk import Chunk
|
from haiku.rag.store.models.chunk import Chunk
|
||||||
from haiku.rag.store.models.document import Document
|
from haiku.rag.store.models.document import Document
|
||||||
|
|
@ -277,9 +278,9 @@ class HaikuRAG:
|
||||||
return await self.document_repository.list_all(limit=limit, offset=offset)
|
return await self.document_repository.list_all(limit=limit, offset=offset)
|
||||||
|
|
||||||
async def search(
|
async def search(
|
||||||
self, query: str, limit: int = 5, k: int = 60
|
self, query: str, limit: int = 3, k: int = 60, rerank=Config.RERANK
|
||||||
) -> list[tuple[Chunk, float]]:
|
) -> list[tuple[Chunk, float]]:
|
||||||
"""Search for relevant chunks using hybrid search (vector similarity + full-text search).
|
"""Search for relevant chunks using hybrid search (vector similarity + full-text search) with reranking.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
query: The search query string.
|
query: The search query string.
|
||||||
|
|
@ -289,8 +290,23 @@ class HaikuRAG:
|
||||||
Returns:
|
Returns:
|
||||||
List of (chunk, score) tuples ordered by relevance.
|
List of (chunk, score) tuples ordered by relevance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not rerank:
|
||||||
return await self.chunk_repository.search_chunks_hybrid(query, limit, k)
|
return await self.chunk_repository.search_chunks_hybrid(query, limit, k)
|
||||||
|
|
||||||
|
# Get more initial results (3X) for reranking
|
||||||
|
search_results = await self.chunk_repository.search_chunks_hybrid(
|
||||||
|
query, limit * 3, k
|
||||||
|
)
|
||||||
|
|
||||||
|
# Apply reranking
|
||||||
|
reranker = get_reranker()
|
||||||
|
chunks = [chunk for chunk, _ in search_results]
|
||||||
|
reranked_results = await reranker.rerank(query, chunks, top_n=limit)
|
||||||
|
|
||||||
|
# Return reranked results with scores from reranker
|
||||||
|
return reranked_results
|
||||||
|
|
||||||
async def ask(self, question: str) -> str:
|
async def ask(self, question: str) -> str:
|
||||||
"""Ask a question using the configured QA agent.
|
"""Ask a question using the configured QA agent.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ class AppConfig(BaseModel):
|
||||||
EMBEDDINGS_MODEL: str = "mxbai-embed-large"
|
EMBEDDINGS_MODEL: str = "mxbai-embed-large"
|
||||||
EMBEDDINGS_VECTOR_DIM: int = 1024
|
EMBEDDINGS_VECTOR_DIM: int = 1024
|
||||||
|
|
||||||
|
RERANK: bool = False
|
||||||
RERANK_PROVIDER: str = "mxbai"
|
RERANK_PROVIDER: str = "mxbai"
|
||||||
RERANK_MODEL: str = "mixedbread-ai/mxbai-rerank-base-v2"
|
RERANK_MODEL: str = "mixedbread-ai/mxbai-rerank-base-v2"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue