lct-07 и lct-19: звонящий на LLM, офлайн-таблица, предгенерация
Что можно сказать, решает слот-автомат, а не модель: в промпт попадают только раскрытые факты. Иначе LLM услужливо назовёт адрес, которого не спрашивали. Промпты лежат файлами — их правит тот, кто ведёт занятия. Отказ провайдера не роняет занятие: звонящий откатывается на заготовки. Молчащий звонящий хуже шаблонной фразы. Офлайн — таблица, а не локальная модель. Ветвление уже делает слот-автомат, поэтому таблица индексируется парой «событие × настроение» и выходит небольшой: для пожарного сценария 62 реплики, около 36 секунд генерации. Формулировки в ней от облачной модели, а задержка на занятии нулевая — локальная 3–4B дала бы формулировки хуже и за 2.5 секунды. Найдено на бесплатной модели OpenRouter: рассуждающие модели тратят сотни токенов на размышление и при малом бюджете возвращают пустой content с finish_reason=length. Пустой ответ теперь честный отказ, бюджет токенов поднят, рассуждение из ответа исключается. Живые запросы к LLM вынесены из общего прогона: они требуют сети, а рассуждающая модель отвечает десятками секунд.
This commit is contained in:
parent
34eb88270e
commit
2ceb26f2cd
19 changed files with 888 additions and 26 deletions
|
|
@ -153,18 +153,18 @@ class VoiceSession:
|
|||
await self.journal.utterance(self.session_id, entry)
|
||||
|
||||
started = time.monotonic()
|
||||
line = self._caller_line(text)
|
||||
line = await self._caller_line(text)
|
||||
timing.caller_ms = (time.monotonic() - started) * 1000
|
||||
await self.say(line.text, line.mood, ended_at=ended_at, timing=timing)
|
||||
|
||||
def _caller_line(self, text: str):
|
||||
async def _caller_line(self, text: str):
|
||||
state = self.state
|
||||
if state.slots is None or state.caller is None or state.persona is None:
|
||||
from app.dialog.caller import CallerLine
|
||||
|
||||
return CallerLine(text=FILLERS[Mood.PANIC], mood=Mood.PANIC)
|
||||
turn = state.slots.hear(text)
|
||||
return state.caller.reply(turn, state.persona, state.slots)
|
||||
return await state.caller.reply(turn, state.persona, state.slots)
|
||||
|
||||
async def say(
|
||||
self, text: str, mood: Mood, *, ended_at: float | None = None, timing: TurnTiming | None = None
|
||||
|
|
|
|||
Loading…
Reference in a new issue