77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
"""A section must be served in the order it was written.
|
|
|
|
Found 2026-08-05 by reading a real answer in the UI rather than a test:
|
|
`liều dùng paracetamol` opened mid-sentence on `5 - 12 tuổi:` and buried
|
|
`Liều lượng: Người lớn:` seven hundred words down. Qdrant scrolls in point-id
|
|
order and point ids are `uuid5(chunk_id)`, so PARACETAMOL's five dosing parts
|
|
came back **3, 4, 1, 2, 0**.
|
|
|
|
This is a clinical defect, not a cosmetic one: a reader who stops partway
|
|
through stops in the middle of a different population's dose.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from adapters.qdrant import QdrantRetriever
|
|
|
|
|
|
class _ScrambledClient:
|
|
"""Returns parts out of order, the way a real scroll did."""
|
|
|
|
def __init__(self, part_indices: list[int], include_index: bool = True) -> None:
|
|
self._payloads = [
|
|
{
|
|
"chunk_id": f"paracetamol__lieu__{index}",
|
|
"drug_id": "paracetamol",
|
|
"section_key": "lieu_luong_va_cach_dung",
|
|
"chunk_kind": "prose",
|
|
"text": f"part {index}",
|
|
"source_refs": [{"physical_page": 1120, "precision": "page"}],
|
|
**({"part_index": index} if include_index else {}),
|
|
}
|
|
for index in part_indices
|
|
]
|
|
|
|
def scroll(self, **kwargs):
|
|
points = [type("P", (), {"payload": payload})() for payload in self._payloads]
|
|
return points, None
|
|
|
|
|
|
class _Embedder:
|
|
dimensions = 4
|
|
|
|
def embed_query(self, text: str) -> list[float]: # never used by this route
|
|
raise AssertionError("find_by_section must not embed anything")
|
|
|
|
|
|
def _hits(part_indices: list[int], include_index: bool = True) -> list[str]:
|
|
retriever = QdrantRetriever(
|
|
_ScrambledClient(part_indices, include_index), "duocthu_v1", _Embedder()
|
|
)
|
|
return [
|
|
hit.document.text
|
|
for hit in retriever.find_by_section("paracetamol", "lieu_luong_va_cach_dung")
|
|
]
|
|
|
|
|
|
def test_the_exact_scramble_observed_against_the_real_collection():
|
|
assert _hits([3, 4, 1, 2, 0]) == [
|
|
"part 0",
|
|
"part 1",
|
|
"part 2",
|
|
"part 3",
|
|
"part 4",
|
|
]
|
|
|
|
|
|
def test_an_already_ordered_section_is_left_alone():
|
|
assert _hits([0, 1, 2, 3]) == ["part 0", "part 1", "part 2", "part 3"]
|
|
|
|
|
|
def test_a_part_missing_its_index_is_kept_and_sorted_last():
|
|
"""Dropping it would silently shorten a dose list, which is the one
|
|
outcome worse than showing it out of order."""
|
|
texts = _hits([1, 0], include_index=False)
|
|
|
|
assert len(texts) == 2
|
|
assert set(texts) == {"part 0", "part 1"}
|