.
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
---
|
||||
name: DetailLevel prompts
|
||||
overview: Адаптировать генерацию промптов и выбор модели/лимитов по уровню DetailLevel для JSON-аналитики (get*Analysis) и текстовых секций (genSection*), сохранив текущий режим СТАНДАРТНО как baseline.
|
||||
todos:
|
||||
- id: inspect-json-methods
|
||||
content: Пройти по getAudienceAnalysis/getCompetitorAnalysis/getSeasonalityAndMarket/getStrategyAndFunnel и определить точки для вставки detailLevel-ветвления + вынесения общих частей промпта
|
||||
status: pending
|
||||
- id: update-text-directives
|
||||
content: Обновить appendDetailLevelDirectives/buildSystemPromptForSection под новые требования КРАТКО (150-250, bullet-only, soften placeholders) и ПОДРОБНО (1000-1500, академичность, 3 примера, смежные рынки, прогноз 3-5 лет, LaTeX формулы)
|
||||
status: pending
|
||||
- id: model-routing
|
||||
content: "В genSection* и get*Analysis внедрить выбор модели по DetailLevel: КРАТКО→mini, ПОДРОБНО→text, СТАНДАРТНО→как сейчас"
|
||||
status: pending
|
||||
dependencies:
|
||||
- update-text-directives
|
||||
- inspect-json-methods
|
||||
- id: max-tokens-detailed
|
||||
content: Скорректировать maxTokensOverride для ПОДРОБНО в generateWithRetryForSection и добавить override в JSON get*Analysis вызовы (8000-12000, например 12000)
|
||||
status: pending
|
||||
dependencies:
|
||||
- model-routing
|
||||
- id: smoketest-3-levels
|
||||
content: "Сделать короткий ручной smoketest: один запрос, три уровня, проверить объем/сегменты/плейсхолдеры/модель"
|
||||
status: pending
|
||||
dependencies:
|
||||
- max-tokens-detailed
|
||||
---
|
||||
|
||||
# План внедрения DetailLevel (КРАТКО/СТАНДАРТНО/ПОДРОБНО)
|
||||
|
||||
## Цели
|
||||
|
||||
- **КРАТКО**: экономим токены — краткие инструкции, меньше сегментов в JSON, текст 150–250 слов, только bullet points, модель всегда `miniModelName`.
|
||||
- **СТАНДАРТНО**: **без изменений** (текущие промпты/модели/объемы принимаем baseline).
|
||||
- **ПОДРОБНО**: максимальная глубина — больше сегментов в JSON + доп. поля (гипотезы/мини-кейсы), текст 1000–1500 слов, академические требования, больше формул LaTeX, модель всегда `textModelName`, увеличенный `maxTokens`.
|
||||
|
||||
## Где менять код
|
||||
|
||||
- Основная логика промптов и вызовов модели: [src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java](/Users/magzhanzhumabaev/Desktop/kt%20cloud/parser/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java)
|
||||
- API вызовы и параметры `max_tokens`: [src/main/java/kz/konturai/parser/service/OpenAIAnalyticsService.java](/Users/magzhanzhumabaev/Desktop/kt%20cloud/parser/src/main/java/kz/konturai/parser/service/OpenAIAnalyticsService.java)
|
||||
- Источник уровня: `MarketingAnalysisRequest.getDetailLevelEnum()` в [src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java](/Users/magzhanzhumabaev/Desktop/kt%20cloud/parser/src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java)
|
||||
|
||||
## Изменения для текстовых секций (genSection*)
|
||||
|
||||
- **Централизовать требования по уровню** в `MarketingAnalysisService.appendDetailLevelDirectives(...)`:
|
||||
- **КРАТКО**: добавить явное требование **150–250 слов**, **только bullet points**, запрет вводных/«консалтинговых оборотов», и правило по плейсхолдерам: **вставлять `[[CHART_...]]/[[TABLE_...]] только если в JSON реально есть данные/раздел этого требует**.
|
||||
- **ПОДРОБНО**: добавить жесткие требования:
|
||||
- объем **1000–1500 слов**;
|
||||
- «глубокий академический анализ»;
|
||||
- **для каждого вывода — 3 конкретных примера реализации**;
|
||||
- **смежные рынки** и **прогноз 3–5 лет**;
|
||||
- больше расчетов в LaTeX: **CAC, LTV, ROI, Payback Period**.
|
||||
- **Выбор модели по уровню** в каждом `genSection*` (там, где сейчас жестко задан `miniModelName` или mix):
|
||||
- **КРАТКО → всегда `miniModelName`**
|
||||
- **ПОДРОБНО → всегда `textModelName`**
|
||||
- **СТАНДАРТНО → оставить текущую модельную логику как есть** (например, `genSectionSummary/product` сейчас на `miniModelName`, `market/audience/competitors/strategy` — на `textModelName`).
|
||||
- Технически: добавить небольшой helper вроде `selectModelForTextSection(detailLevel, currentPrimaryModel, currentFallbackModel)` и использовать его при вызове `generateWithRetryForSection(...)`.
|
||||
|
||||
## Изменения для JSON-методов (get*Analysis)
|
||||
|
||||
Методы: `getAudienceAnalysis`, `getCompetitorAnalysis`, `getSeasonalityAndMarket`, `getStrategyAndFunnel`.
|
||||
|
||||
- Добавить `DetailLevel detailLevel = request.getDetailLevelEnum()` и ветвление (switch/if):
|
||||
- **КРАТКО**:
|
||||
- сократить инструкции;
|
||||
- заменить «минимум 4 сегмента» → **«2–3 ключевых сегмента»**;
|
||||
- заменить требования к полям (motivation/triggers/barriers/contentStrategy и т.п.) с 3–4 предложений → **1 емкое предложение**;
|
||||
- модель **всегда `miniModelName`**.
|
||||
- **СТАНДАРТНО**: оставить текущий prompt builder без изменений.
|
||||
- **ПОДРОБНО**:
|
||||
- требовать **5–6 сегментов** (где применимо) и более глубокую детализацию;
|
||||
- расширить JSON-схему (без ломания текущих полей) добавив:
|
||||
- top-level: `hypotheses[]`, `miniCases[]` внутри соответствующей секции (например `audienceAnalysis.hypotheses`, `competitorAnalysis.miniCases`);
|
||||
- per-item: например `segments[].hypothesis`, `segments[].miniCase`, `competitorsDetails[].miniCase`;
|
||||
- модель **всегда `textModelName`**.
|
||||
- **Вынести базовые части промптов** в общие методы/константы, чтобы не дублировать текст:
|
||||
- базовый «Ты — ...», правила «только JSON», блок входных данных;
|
||||
- отдельные функции для добавления level-specific требований (segment count / sentence counts / extra fields).
|
||||
|
||||
## Max tokens для ПОДРОБНО
|
||||
|
||||
- Сейчас в `generateWithRetryForSection(...)` уже есть `maxTokensOverride` для `DetailLevel.ПОДРОБНО`, но он равен `REPORT_BASE_MAX_TOKENS * 2`.
|
||||
- Привести к требованию: **установить override в диапазоне 8000–12000** (например, **12000**) для ПОДРОБНО, чтобы ответы не обрезались и не упираться в потенциальные лимиты модели.
|
||||
- Для JSON-методов, которые вызывают `openAIAnalyticsService.generateWithInstructionWithModel(...)` без override, добавить `maxTokensOverride` (минимум для ПОДРОБНО), чтобы подробный JSON не резался.
|
||||
|
||||
## Проверка совместимости
|
||||
|
||||
- Убедиться, что существующие поля, которые используются в `genSection*` (например `audienceAnalysis.ageGroups`, `competitorAnalysis.marketShareChart`) **не меняются**, а новые поля добавляются как опциональные.
|
||||
|
||||
## Быстрый smoketest (локально)
|
||||
|
||||
- Прогнать генерацию отчета для 3 режимов на одном и том же входе и сравнить:
|
||||
- модель (`gpt-4o-mini` vs `gpt-4o`),
|
||||
- длину ответа (word count приблизительно),
|
||||
Reference in New Issue
Block a user