feat(search): enhance phrase matching and reranking logic with improved async handling

This commit is contained in:
2026-07-24 11:38:51 -04:00
parent e510c94b95
commit 94f18722e4
3 changed files with 47 additions and 37 deletions
+31 -29
View File
@@ -129,18 +129,24 @@ async def search_ebooks(
rank_constant=config.rrf_rank_constant,
)
timings.append(timing)
if phrase_matching:
fused, timing = await async_timed_result(
"Phrase mention boost",
apply_phrase_mention_boosts(engine, fused, phrase_matches, config.phrase_hit_boost),
)
else:
fused, timing = timed_result("Phrase mention boost skipped", skip_phrase_mention_boosts, fused)
phrase_boost_timing_name = "Phrase mention boost" if phrase_matching else "Phrase mention boost skipped"
fused, timing = await async_timed_result(
phrase_boost_timing_name,
apply_phrase_mention_boosts(
engine,
fused,
phrase_matches,
config.phrase_hit_boost,
phrase_matching=phrase_matching,
),
)
timings.append(timing)
if config.rerank.enabled and rerank:
response, timing = await async_timed_result("Rerank", apply_rerank(client, query, fused, config))
else:
response, timing = timed_result("Rerank skipped", skip_rerank, query, fused, config)
rerank_enabled = config.rerank.enabled and rerank
rerank_timing_name = "Rerank" if rerank_enabled else "Rerank skipped"
response, timing = await async_timed_result(
rerank_timing_name,
apply_rerank(client, query, fused, config, rerank=rerank_enabled),
)
timings.append(timing)
response = replace(response, timings=tuple(timings), phrase_matches=tuple(phrase_matches))
logger.info(
@@ -171,19 +177,19 @@ async def query_phrase_matches(
return []
def skip_phrase_mention_boosts(candidates: list[SearchResult]) -> list[SearchResult]:
"""Return candidates unchanged when phrase matching is disabled."""
logger.info(f"ebook_phrase_boost_skipped candidates={len(candidates)}")
return candidates
async def apply_phrase_mention_boosts(
engine: AsyncEngine,
candidates: list[SearchResult],
phrase_matches: Sequence[PhraseMatch],
phrase_hit_boost: float,
*,
phrase_matching: bool,
) -> list[SearchResult]:
"""Boost retrieved chunks that have indexed mentions for detected protected phrases."""
"""Boost retrieved chunks that have indexed mentions for detected protected phrases when enabled."""
if not phrase_matching:
logger.info(f"ebook_phrase_boost_skipped candidates={len(candidates)}")
return candidates
phrase_ids = sorted({match.phrase_id for match in phrase_matches})
if not candidates or not phrase_ids or phrase_hit_boost <= 0:
return candidates
@@ -274,23 +280,19 @@ async def parallel_retrieval(
)
def skip_rerank(
query: str,
candidates: list[SearchResult],
config: EbookSearchConfig,
) -> SearchResponse:
"""Return fused hybrid results without reranking."""
logger.info(f"ebook_rerank_skipped candidates={len(candidates)}")
return SearchResponse(query=query, results=candidates[: config.top_k], rank_label="Hybrid")
async def apply_rerank(
client: httpx.AsyncClient,
query: str,
candidates: list[SearchResult],
config: EbookSearchConfig,
*,
rerank: bool,
) -> SearchResponse:
"""Rerank already-fused hybrid candidates."""
"""Rerank already-fused hybrid candidates when enabled for this request."""
if not rerank:
logger.info(f"ebook_rerank_skipped candidates={len(candidates)}")
return SearchResponse(query=query, results=candidates[: config.top_k], rank_label="Hybrid")
reranked = await rerank_chunks(client, query, candidates[: config.rerank.candidates], config.rerank)
logger.info(
f"ebook_rerank_complete input_candidates={min(len(candidates), config.rerank.candidates)} "