Fix live multi-turn: pass the resolved drug, stop did-you-mean garbage

This commit is contained in:
2026-08-05 16:54:35 +07:00
parent ef08b4929e
commit 1e8cbdb586
29 changed files with 2013 additions and 83 deletions
@@ -31,8 +31,8 @@ class FakeAnswers:
self._e = evidence_text
self.calls = []
def answer(self, query, subject_scope, intent):
self.calls.append(query)
def answer(self, query, subject_scope, intent, drug_id=None):
self.calls.append((query, drug_id))
return _grounded(self._a, self._e)
@@ -66,7 +66,7 @@ def test_medical_turn_returns_grounded_answer():
assert out.grounded is not None
def test_followup_inherits_drug_and_names_it_and_rewrites_query():
def test_followup_inherits_drug_and_passes_it_resolved():
answers = FakeAnswers(
"Ở trẻ em điều chỉnh theo cân nặng.",
"Ở trẻ em, liều metformin điều chỉnh theo cân nặng.",
@@ -76,12 +76,40 @@ def test_followup_inherits_drug_and_names_it_and_rewrites_query():
out = svc.answer("c3", "còn trẻ em thì sao?", SubjectScope.HUMAN, QueryIntent.FACT_LOOKUP)
assert out.inherited_drug == "metformin"
assert out.answer.startswith("Về metformin:")
# The follow-up was rewritten self-contained before hitting the engine.
assert "metformin" in answers.calls[-1]
# The inherited drug is passed already-resolved (not re-resolved from the
# rewritten turn text), and the raw follow-up drives section routing.
last_query, last_drug_id = answers.calls[-1]
assert last_drug_id == "metformin"
assert last_query == "còn trẻ em thì sao?"
# State carried the drug forward.
assert svc._store.load("c3").focus.drug_id == "metformin"
def test_confirmation_is_not_fuzzy_matched_to_a_drug():
"""'đúng' must not be fuzzy-matched to terbinafin/tretinoin (the did-you-mean
loop the reviewer hit); it asks which drug instead."""
answers = FakeAnswers("x", "x")
svc = _service(answers)
out = svc.answer("cc", "đúng", SubjectScope.HUMAN, QueryIntent.FACT_LOOKUP)
assert out.clarification is not None
assert out.clarification.reason == "confirm_without_context"
assert answers.calls == []
def test_a_long_sentence_that_names_no_drug_is_not_offered_did_you_mean():
"""A full question ('EPO điều trị thiếu máu...') that resolves no drug is
answered honestly, not with garbage suggestions from fuzzing the sentence."""
answers = FakeAnswers("x", "x")
svc = _service(answers) # catalog holds only metformin
out = svc.answer(
"cl", "EPO điều trị thiếu máu do hóa trị ung thư liều khởi đầu bao nhiêu",
SubjectScope.HUMAN, QueryIntent.FACT_LOOKUP,
)
assert out.clarification is not None
assert out.clarification.reason == "drug_not_supported"
assert answers.calls == []
def test_no_close_drug_reports_not_supported():
answers = FakeAnswers("x", "x")
svc = _service(answers) # catalog holds only metformin