Checkpoint frontend UI/UX overhaul and ingestion embed benchmark work
This commit is contained in:
@@ -58,6 +58,59 @@ class RetrievalService:
|
||||
self._section_resolver = section_resolver
|
||||
self._reranker = reranker
|
||||
|
||||
def retrieve_framed(
|
||||
self,
|
||||
drug_id: str,
|
||||
section_key: str | None,
|
||||
query: str,
|
||||
is_overview: bool = False,
|
||||
) -> RetrievalResult:
|
||||
"""Retrieve driven by an already-understood frame, not by parsing text.
|
||||
|
||||
The LLM understanding layer has resolved the drug (against the real
|
||||
catalog) and, when the turn named one, the section. So this skips the
|
||||
fuzzy `CatalogDrugResolver` and the keyword `SectionResolver` entirely:
|
||||
a named `section_key` filters that section whole; without one, this
|
||||
mirrors `retrieve()`'s two remaining cases — `is_overview` (the frame's
|
||||
`turn_type == "drug_overview"`, a bare name) answers from the identity
|
||||
sections only, and a free-form question reranks the full monograph
|
||||
down to `rerank_top_k`.
|
||||
|
||||
Found live 2026-08-06: without the `is_overview` split, a bare drug
|
||||
name sent the ENTIRE ~29-section monograph as evidence for every
|
||||
generation call (retrieval had no notion of "just the intro"), which
|
||||
is both wrong retrieval and, downstream, an answer so long it
|
||||
intermittently failed generation/entailment outright. `query` is only
|
||||
the rerank signal here, never a resolution input.
|
||||
"""
|
||||
if not drug_id.strip():
|
||||
return RetrievalResult(EvidenceDecision.ABSTAIN, "missing_query_or_drug")
|
||||
|
||||
if section_key:
|
||||
find_by_section = getattr(self._retriever, "find_by_section", None)
|
||||
if find_by_section is not None:
|
||||
hits = find_by_section(drug_id, section_key)
|
||||
if hits:
|
||||
return self._decide(self._hydrate(hits, limit=None))
|
||||
|
||||
overview_hits = self._drug_overview(drug_id)
|
||||
if overview_hits is None:
|
||||
return RetrievalResult(EvidenceDecision.ABSTAIN, "insufficient_retrieval_score")
|
||||
|
||||
if is_overview:
|
||||
intro = [h for h in overview_hits if h.document.section_key in INTRO_SECTIONS]
|
||||
return self._decide(
|
||||
self._hydrate(intro or overview_hits, limit=None), is_drug_overview=True
|
||||
)
|
||||
|
||||
overview_hits = self._rerank(query, overview_hits)
|
||||
# Capped even when rerank is disabled/unavailable and fails open to
|
||||
# the unfiltered list — an ordering aid must never remove the size
|
||||
# bound too, or the same 29-section explosion returns through here.
|
||||
return self._decide(
|
||||
self._hydrate(overview_hits, limit=self._policy.evidence_limit)
|
||||
)
|
||||
|
||||
def retrieve(self, query: str, drug_id: str) -> RetrievalResult:
|
||||
if not query.strip() or not drug_id.strip():
|
||||
return RetrievalResult(EvidenceDecision.ABSTAIN, "missing_query_or_drug")
|
||||
|
||||
Reference in New Issue
Block a user