lct-07 (без LLM): слот-автомат, персона, звонящий на заготовках, make repl
Звонящий не выдаёт данные сам: автомат держит раскрытые факты явно и отдаёт звонящему только их. Тест прогоняет длинную серию реплик и проверяет, что ни один нераскрытый факт не прозвучал. Главная находка — матчинг по порогу близости не работает. На multilingual-e5-small настоящие вопросы дают 0.79–0.95, а «Оставайтесь на линии» — до 0.89: диапазоны перекрываются, и любой порог либо выдаёт адрес на «успокойтесь», либо не слышит «где вы находитесь?». Решение — сравнение с ближайшим соседом: у пункта чек-листа несколько формулировок (examples), рядом общий список не-вопросов (checklists/common.yaml), и реплика засчитывается пункту, только если она ближе к нему, чем к любому не-вопросу. На отложенных фразах: 19 из 20 вопросов, 0 из 8 ложных срабатываний. Реплика режется только по границам предложений, со знаком: «?» для e5 — сильный признак вопроса, без него «Куда ехать» уходит к не-вопросам. Подсказка берёт неотработанный пункт из автомата. В живой сессии автомат начнёт слышать оператора, когда голосовой контур передаст ему stt.final. Ждёт ключа LLM: условие approach у скрытых фактов, звонящий своими словами, dialog/llm.py с кэшем.
This commit is contained in:
parent
4f5a8d1400
commit
7c97310938
22 changed files with 1073 additions and 26 deletions
|
|
@ -60,9 +60,17 @@ class Fact(Strict):
|
|||
|
||||
|
||||
class ChecklistItem(Strict):
|
||||
"""Пункт эталонного опроса.
|
||||
|
||||
`examples` — другие формулировки того же вопроса. Без них матчинг
|
||||
по эмбеддингам не отличает вопрос от не-вопроса: на e5 «Оставайтесь
|
||||
на линии» ближе к пункту чек-листа, чем половина настоящих вопросов.
|
||||
"""
|
||||
|
||||
id: str
|
||||
question: str | None = None
|
||||
fact: str | None = None
|
||||
examples: list[str] = []
|
||||
|
||||
|
||||
class EraGlonass(Strict):
|
||||
|
|
@ -109,6 +117,10 @@ class Scenario(Strict):
|
|||
facts: list[Fact] = []
|
||||
checklist: list[ChecklistItem] = []
|
||||
required_fields: list[str] = Field(default_factory=list)
|
||||
# Реплики оператора, которые вопросом не являются: «успокойтесь»,
|
||||
# «оставайтесь на линии». Общий список — checklists/common.yaml,
|
||||
# сценарий может дополнить своими.
|
||||
not_questions: list[str] = Field(default_factory=list)
|
||||
ground_truth: GroundTruth = GroundTruth()
|
||||
era_glonass: EraGlonass | None = None
|
||||
tree: Tree = Tree()
|
||||
|
|
|
|||
Loading…
Reference in a new issue