2.7 KiB
2.7 KiB
Долгий прогон: разбор и исправления (2026-10-07)
Первый прогон (62 вопроса, прод)
| Метрика | Значение |
|---|---|
| Ответов 200 | 56/62 |
Отказов 502 bad_llm_output |
6 |
| Шаблон соблюдён | 56/56 |
resource_type определён |
42/56 |
| Задержки | min 3.3 с, p50 8.0 с, p95 13.2 с, max 16.1 с |
Негативные и инъекции обработаны верно (9/10 без resource_type; «напиши эссе»/«забудь инструкции» → ответ по шаблону, без ухода в сторону).
Причина 502 (найдена)
Упавшие 6: openbao, «создать ВМ», rabbitmq, nodejs, gitea, pgadmin.
Локальное воспроизведение с захватом сырого ответа LLM показало: finish_reason: "length" — ответ обрезался лимитом max_tokens: 1024 до секции «Ограничения» (последний заголовок шаблона). Проверка обязательных заголовков не проходила → 502.
Исправления
stage2.js:maxTokensпо умолчанию 1024 → 2048; добавлен повтор (до 2 попыток) с удвоением бюджета (до 4096) при отсутствии заголовков.orchestrator.js: вызов этапа 2 →maxTokens: 2048.stage2.js: проверка заголовков сделана устойчивой (regex, markdown#/**, регистр).- ⚠️ Собственный баг: первая версия regex использовала
\b, который не работает с кириллицей в JS безu-флага → все заголовки «не находились». Исправлено (заголовок ищется в начале строки + требование:).
- ⚠️ Собственный баг: первая версия regex использовала
- Промпт этапа 2: добавлено «Пиши сжато, без повторов» (снижает риск обрезки).
Повторная проверка (локально, тот же индекс)
6 ранее упавших вопросов → 6/6 OK (длины 1.3–2.8 КБ, все секции на месте).
Тестовые артефакты
llm_project/tests/run_e2e_live.js— прогон 62 вопросов по живому эндпоинту (учёт 429).llm_project/tests/RESULTS_LIVE.{json,md}— результаты первого прогона.llm_project/tests/debug_bad_llm_output.js— захват сырого ответа LLM (диагностика).