From 60e475b9cea94390e9c9dabd8d8109c3166131db Mon Sep 17 00:00:00 2001 From: arys Date: Mon, 19 Jan 2026 16:05:13 +0500 Subject: [PATCH] fix --- .../service/MarketingAnalysisService.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java index 62fcf0a..f8446b0 100644 --- a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java +++ b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java @@ -649,7 +649,7 @@ public class MarketingAnalysisService { // 3. Формирование промпта (Безопасный метод!) String systemPrompt = buildSystemPromptForKazakhstan(); - String instruction = buildDetailedInstruction(request, competitorCompanies, structureExampleJson); + String instruction = buildDetailedInstruction(request, structureExampleJson); String contextJson = objectMapper.writeValueAsString(Map.of( "request", request, @@ -703,11 +703,12 @@ public class MarketingAnalysisService { "- Запрещено возвращать null в полях (особенно income_by_age) — делай экстраполяцию если нет точных данных.\n"; } - private String buildDetailedInstruction(MarketingAnalysisRequest request, List competitorCompanies, String structureExampleJson) { - + private String buildDetailedInstruction(MarketingAnalysisRequest request, String structureExampleJson) { String regionsList = (request.getRegion() != null && !request.getRegion().isEmpty()) ? String.join(", ", request.getRegion()) - : "Алматы, Астана, Шымкент"; String ageRangesInstruction = ""; + : "Алматы, Астана, Шымкент"; + + String ageRangesInstruction = ""; if (request.getTargetAudience() != null && request.getTargetAudience().containsKey("ageRanges")) { @SuppressWarnings("unchecked") List ranges = (List) request.getTargetAudience().get("ageRanges"); @@ -716,6 +717,7 @@ public class MarketingAnalysisService { } } + // Шаблон с плейсхолдерами {{KEY}} вместо %s String template = """ Твоя задача: Провести глубокий маркетинговый анализ и вернуть его СТРОГО в формате JSON. @@ -732,19 +734,23 @@ public class MarketingAnalysisService { - Значения (0-100) должны быть разными и неровными (например, 87, 64, 43). 2. КОНКУРЕНТЫ (competitive_environment): - - Найди в `evidence` РЕАЛЬНЫХ лидеров (сети, крупные игроки из 2GIS/Kaspi). + - Найди в `evidence` РЕАЛЬНЫХ лидеров рынка (сети, крупные игроки из 2GIS/Kaspi). - Игнорируй мелкие ИП или выдуманные названия. - Заполни `digital_visibility_benchmarks` реальными именами. 3. КАНАЛЫ (acquisition_channels): - Приоритет в РК: Instagram (Reels), TikTok, Kaspi Marketing, 2GIS. - Яндекс.Директ и VK ставь ниже (Low/Medium), если это B2C. - - Указывай стоимость лида (CPL) неровными числами (напр. 2350 KZT). + - Указывай стоимость лида (CPL) строкой с валютой (напр. "2350 KZT"). - 4. ЦИФРЫ И ГРАФИКИ: - - ЗАПРЕЩЕНО использовать круглые числа (20%, 50%, 1000). Пиши: 18.7%, 42.3%, 1240. - - income_by_age: Заполни реальными доходами в KZT по возрастам (из evidence). - - monthly_online_index: График должен быть "живым" (не прямая линия). + 4. ЦИФРЫ И ТИПЫ ДАННЫХ (КРИТИЧНО!): + - `income_by_age` (TargetAudience): ЭТО ЧИСЛОВОЕ ПОЛЕ (Integer). + Пиши ТОЛЬКО ГОЛЫЕ ЦИФРЫ. Без кавычек, без запятых, без пробелов, без "KZT". + ПРАВИЛЬНО: 342500 + ОШИБКА: "342,500", "342 500", "342500 KZT". + - `monthly_online_index`: Дробные числа (0.0 - 1.0). + - `marketSize` (String): Пиши текстом с валютой ("500 млн KZT"). + - ЗАПРЕЩЕНО использовать круглые числа в статистике (20%, 50%, 1000). Пиши: 18.7%, 42.3%, 1240. 5. ИСТОЧНИКИ: - Собери ВСЕ ссылки из `evidence` в ОДИН СПИСОК в самом конце (поле `recommendations.conclusion`).