fix(jivo-bot): «не знаю» без кнопки экскурсии + статья про объединение дублей

Живой урок владельца 12.07.2026 («а что такое объединить дубли?»):
- LLM признался «в инструкции этого нет» (слабое ИЛИ-совпадение по общим словам),
  а мы лепили кнопку «Показать на портале» → теперь такой ответ = честная
  эскалация без кнопок (регэксп-детектор признания)
- статья konkurentnoe-pole: «Найти и объединить дубли» 🧹 — пары-двойники,
  подтверждение клиента, бесплатно, счётчик на кнопке
- TDD: тест «не знаю без кнопки», 38/38 зелёные

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-12 10:24:01 +03:00
parent 185df2d810
commit dd16edde8e
3 changed files with 32 additions and 1 deletions
@@ -82,6 +82,24 @@ it('вопрос-продолжение: история разговора сп
});
});
it('LLM ответил «в инструкции этого нет» → честная эскалация БЕЗ кнопки экскурсии', function () {
// Живой урок 12.07.2026: «а что такое объединить дубли?» → слабое совпадение поиска
// («что», «такое») → LLM честно сказал «В инструкции этого нет», а мы приляпали
// кнопку «Показать на портале». Незнание = эскалация, без кнопок.
config()->set('services.jivo_bot.tours_enabled', true);
Http::fake([
'llm.api.cloud.yandex.net/*' => Http::response([
'result' => ['alternatives' => [['message' => ['role' => 'assistant', 'text' => 'В инструкции этого нет.']]]],
]),
]);
$answer = app(BotAnswerService::class)->answer('что такое объединить дубли?');
expect($answer->escalate)->toBeTrue()
->and($answer->text)->not->toContain('Показать на портале')
->and($answer->text)->toContain('живому специалисту');
});
it('просьба позвать человека → эскалация', function () {
Http::fake();