feat: уточнение адреса — место происшествия не равно адресу заявителя (lct-35)
Главный предмет проверки в билетах заказчика — адрес: названный заявителем часто неверен, а настоящий добывается переспросом («ул. Станционная, 28» оказывается Королёвом). Памятка АРМ-112 называет это обычным делом. До этой правки оценка работала наоборот: ground_truth.address сравнивался с единственным значением факта, поэтому курсант, правильно переспросивший и записавший настоящий адрес, получал расхождение с эталоном, а записавший ориентир — зачёт. - Схема: у факта появились refined и refine_on, задаются только вместе. - Слот-автомат различает уточнение и повтор: повтор раздражает звонящего, уточнение — нет, оператор спросил о другом и получил другое. - Звонящий поправляется отдельной репликой, а не повторяет прежнее значение; офлайн-таблица получила секцию refine. - Оценка: метрика address_refined (E1, опрос). Сделана отдельной, а не правкой метрики address: «записал не тот адрес» и «не спросил» — разные навыки и разные компетенции в радаре. - Общие пункты чек-листа подключаются по требованию сценария: формулировки в checklists/common.yaml, сценарий объявляет пункт с тем же id без текста. Добавлять «уточните адрес» во все сценарии нельзя — неотработанный пункт штрафует за вопрос, которого сценарий не требовал. - scenarios/fire-private-house-l3.yaml — первый сценарий из библиотеки заказчика (билет 3, вызов 1). Риск механики проверен на живой модели: «Назовите адрес» и «Это точно Москва?» эмбеддинги не путают, тест это фиксирует. 125 тестов зелёных (12 новых), make typecheck чистый.
This commit is contained in:
parent
7212251112
commit
842a333d16
11 changed files with 381 additions and 8 deletions
|
|
@ -44,10 +44,26 @@ class RevealOn(Strict):
|
|||
|
||||
|
||||
class Fact(Strict):
|
||||
"""Факт, который оператор должен добыть.
|
||||
|
||||
`refined` — второе, настоящее значение. Нужно там, где заявитель называет
|
||||
ориентир или адрес, по которому стоит сам: «ул. Станционная, 28» оказывается
|
||||
Королёвом, «дом с библиотекой №193» — домом 11 по улице Грина. Памятка
|
||||
заказчика называет это обычным делом, а не краем сценария, и в билетах такой
|
||||
вызов не один (docs/spec/TICKETS.md).
|
||||
|
||||
Пока оператор не переспросил, звонящий говорит `value`; после уточняющего
|
||||
вопроса — `refined`, и эталон сверяется уже с ним.
|
||||
"""
|
||||
|
||||
id: str
|
||||
value: str
|
||||
hidden: bool = False
|
||||
reveal_on: RevealOn | None = None
|
||||
refined: str | None = None
|
||||
refine_on: str | None = Field(
|
||||
default=None, description="Пункт чек-листа, уточняющий этот факт"
|
||||
)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def hidden_needs_condition(self):
|
||||
|
|
@ -58,6 +74,15 @@ class Fact(Strict):
|
|||
)
|
||||
return self
|
||||
|
||||
@model_validator(mode="after")
|
||||
def refinement_needs_both_halves(self):
|
||||
if bool(self.refined) != bool(self.refine_on):
|
||||
raise ValueError(
|
||||
f"факт {self.id}: refined и refine_on задаются вместе — "
|
||||
"иначе уточнение либо нечем вызвать, либо нечего сказать"
|
||||
)
|
||||
return self
|
||||
|
||||
|
||||
class ChecklistItem(Strict):
|
||||
"""Пункт эталонного опроса.
|
||||
|
|
|
|||
Loading…
Reference in a new issue