diff --git a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java index 3157832..12e026a 100644 --- a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java +++ b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java @@ -290,8 +290,8 @@ public class MarketingAnalysisService { "Твоя задача — на основе входных данных о бизнесе выполнить ГЛУБОКИЙ анализ целевой аудитории с психологическим профилированием сегментов.\n\n"); promptBuilder.append( "КРИТИЧЕСКИ ВАЖНО: Проведи глубокое психологическое профилирование. Распиши мотивацию и барьеры подробно. " - + "Не используй общие фразы типа 'хотят качество' или 'боятся потратить деньги'. " - + "Опиши КОНКРЕТНЫЕ психологические механизмы, жизненные ситуации, эмоциональные триггеры и реальные препятствия для каждого сегмента.\n\n"); + + "Не используй общие фразы типа 'хотят качество' или 'боятся потратить деньги'. " + + "Опиши КОНКРЕТНЫЕ психологические механизмы, жизненные ситуации, эмоциональные триггеры и реальные препятствия для каждого сегмента.\n\n"); promptBuilder.append( "Выдай результат ТОЛЬКО в виде корректного JSON-объекта строго по указанной структуре.\n\n"); promptBuilder.append("Не добавляй пояснений, комментариев, текста до или после JSON.\n"); @@ -358,13 +358,13 @@ public class MarketingAnalysisService { promptBuilder.append(" \"incomeLevel\": \"Средний\",\n"); promptBuilder.append( " \"motivation\": \"Детальное описание мотивации покупки (3-4 предложения). Опиши психологические и практические причины, почему этот сегмент покупает продукт/услугу. " - + "Используй конкретные примеры жизненных ситуаций, эмоциональных потребностей, ценностей. НЕ используй общие фразы.\",\n"); + + "Используй конкретные примеры жизненных ситуаций, эмоциональных потребностей, ценностей. НЕ используй общие фразы.\",\n"); promptBuilder.append( " \"triggers\": \"Список триггеров (что заставляет действовать). Опиши конкретные ситуации, события, эмоции, которые побуждают к покупке (2-3 предложения). " - + "Например: 'Сезонные события (Новый год, 8 марта), жизненные изменения (рождение ребенка, переезд), эмоциональные состояния (стресс, радость, желание перемен)'.\",\n"); + + "Например: 'Сезонные события (Новый год, 8 марта), жизненные изменения (рождение ребенка, переезд), эмоциональные состояния (стресс, радость, желание перемен)'.\",\n"); promptBuilder.append( " \"barriers\": \"Что мешает купить (страхи, сомнения, препятствия). Опиши конкретные барьеры: финансовые, психологические, информационные (2-3 предложения). " - + "Например: 'Опасение переплатить, недоверие к онлайн-покупкам, отсутствие времени на изучение предложений, страх выбрать неправильно'.\",\n"); + + "Например: 'Опасение переплатить, недоверие к онлайн-покупкам, отсутствие времени на изучение предложений, страх выбрать неправильно'.\",\n"); promptBuilder.append(" \"primaryChannels\": [\"Instagram\", \"TikTok\"],\n"); promptBuilder.append(" \"secondaryChannels\": [\"Telegram\"]\n"); promptBuilder.append(" }\n"); @@ -388,16 +388,16 @@ public class MarketingAnalysisService { "7. Для каждого сегмента заполни ВСЕ поля: name, sharePercent, ageRange, incomeLevel, motivation, triggers, barriers, primaryChannels, secondaryChannels.\n"); promptBuilder.append( "8. Поля motivation, triggers, barriers должны содержать ДЕТАЛЬНЫЕ описания (не общие фразы, а конкретные инсайты с примерами). " - + "Каждое поле должно быть минимум 2-3 предложения с конкретными деталями.\n"); + + "Каждое поле должно быть минимум 2-3 предложения с конкретными деталями.\n"); promptBuilder.append( "9. В segmentsChannelMatrix должна быть строка для КАЖДОГО сегмента из массива segments. " - + "Используй значения \"High\", \"Medium\", \"Low\" (с заглавной буквы) для каждого канала: Instagram, Facebook, YouTube, TikTok, Telegram.\n"); + + "Используй значения \"High\", \"Medium\", \"Low\" (с заглавной буквы) для каждого канала: Instagram, Facebook, YouTube, TikTok, Telegram.\n"); promptBuilder.append("10. Все строки — на русском языке.\n"); promptBuilder.append( "11. keyTakeaways должны содержать глубокие инсайты, а не общие фразы. Каждый вывод должен быть конкретным и практичным.\n"); promptBuilder.append( "12. segmentsChannelMatrix должна отражать реальное поведение каждого сегмента в социальных сетях. " - + "High = сегмент активно использует канал, Medium = умеренное использование, Low = редкое использование.\n"); + + "High = сегмент активно использует канал, Medium = умеренное использование, Low = редкое использование.\n"); String prompt = promptBuilder.toString(); logger.debug("Generating audience analysis with detailed prompt (length: {} chars)", prompt.length()); @@ -434,8 +434,8 @@ public class MarketingAnalysisService { "Твоя задача — на основе входных данных о бизнесе выполнить глубокий анализ конкурентов и выдать результат ТОЛЬКО в виде корректного JSON-объекта строго по указанной структуре.\n\n"); promptBuilder.append( "КРИТИЧЕСКИ ВАЖНО: Найди или смоделируй реалистичных конкурентов для этой ниши. " - + "Оцени их цифровые метрики и контент-стратегию. Если ты не знаешь реальных конкурентов, " - + "создай реалистичные модели на основе типичных игроков в этой нише в Казахстане.\n\n"); + + "Оцени их цифровые метрики и контент-стратегию. Если ты не знаешь реальных конкурентов, " + + "создай реалистичные модели на основе типичных игроков в этой нише в Казахстане.\n\n"); promptBuilder.append("Не добавляй пояснений, комментариев, текста до или после JSON.\n"); promptBuilder.append("Ответ должен быть валидным JSON.\n\n"); promptBuilder.append("---\n\n"); @@ -467,15 +467,17 @@ public class MarketingAnalysisService { promptBuilder.append(" \"competitorsDetails\": [ // Детали по 3-4 конкурентам\n"); promptBuilder.append(" {\n"); promptBuilder.append(" \"name\": \"Конкурент А\",\n"); - promptBuilder.append(" \"digitalMetrics\": { \"reach\": число, \"followers\": число, \"activityIndex\": число }, // activityIndex от 0 до 100\n"); + promptBuilder.append( + " \"digitalMetrics\": { \"reach\": число, \"followers\": число, \"activityIndex\": число }, // activityIndex от 0 до 100\n"); promptBuilder.append(" \"channelsHeatmap\": { // Оценка (0-100) качества ведения канала\n"); - promptBuilder.append(" \"Instagram\": число, \"TikTok\": число, \"Telegram\": число, \"YouTube\": число, \"Facebook\": число\n"); + promptBuilder.append( + " \"Instagram\": число, \"TikTok\": число, \"Telegram\": число, \"YouTube\": число, \"Facebook\": число\n"); promptBuilder.append(" },\n"); promptBuilder.append(" \"priceStrategy\": \"Премиум/Средняя/Эконом\",\n"); promptBuilder.append( " \"contentStrategy\": \"Детальное описание контент-стратегии конкурента (3-4 предложения). " - + "Опиши типы контента, стиль подачи, частоту публикаций, основные темы, тон коммуникации. " - + "Проанализируй, что работает у конкурента и почему.\",\n"); + + "Опиши типы контента, стиль подачи, частоту публикаций, основные темы, тон коммуникации. " + + "Проанализируй, что работает у конкурента и почему.\",\n"); promptBuilder.append(" \"swot\": {\n"); promptBuilder.append( " \"strengths\": [\"Конкретная сильная сторона 1\", \"Конкретная сильная сторона 2\", \"Конкретная сильная сторона 3\"],\n"); @@ -556,7 +558,7 @@ public class MarketingAnalysisService { "Твоя задача — на основе входных данных о бизнесе выполнить глубокий анализ сезонности и рынка и выдать результат ТОЛЬКО в виде корректного JSON-объекта строго по указанной структуре.\n\n"); promptBuilder.append( "КРИТИЧЕСКИ ВАЖНО: Предоставь детальный анализ сезонных колебаний спроса с конкретными объяснениями. " - + "Опиши рыночные тренды, возможности и угрозы с конкретными инсайтами, а не общими фразами.\n\n"); + + "Опиши рыночные тренды, возможности и угрозы с конкретными инсайтами, а не общими фразами.\n\n"); promptBuilder.append("Не добавляй пояснений, комментариев, текста до или после JSON.\n"); promptBuilder.append("Ответ должен быть валидным JSON.\n\n"); promptBuilder.append("---\n\n"); @@ -580,13 +582,13 @@ public class MarketingAnalysisService { promptBuilder.append(" \"demandIndex\": [12 чисел от 0 до 100], // Индекс спроса по месяцам\n"); promptBuilder.append( " \"description\": \"Детальное описание сезонности (3-4 предложения). Опиши конкретные причины сезонных колебаний: " - + "праздники, климатические условия, культурные особенности, жизненные циклы целевой аудитории. " - + "Укажи, какие месяцы являются пиковыми и почему, какие - низкими и что это означает для бизнеса.\"\n"); + + "праздники, климатические условия, культурные особенности, жизненные циклы целевой аудитории. " + + "Укажи, какие месяцы являются пиковыми и почему, какие - низкими и что это означает для бизнеса.\"\n"); promptBuilder.append(" },\n"); promptBuilder.append(" \"market\": {\n"); promptBuilder.append( " \"marketSize\": \"Оценка объема рынка (например, 'Оценка объема рынка составляет X млн тенге в год' или 'Средний рынок с потенциалом роста'). " - + "Дай конкретную оценку или описание масштаба рынка в Казахстане для данной ниши.\",\n"); + + "Дай конкретную оценку или описание масштаба рынка в Казахстане для данной ниши.\",\n"); promptBuilder.append( " \"growthRate\": \"Темп роста рынка (например, '+15% в год' или 'Стабильный рост 10-12% ежегодно')\",\n"); promptBuilder.append( @@ -600,7 +602,8 @@ public class MarketingAnalysisService { promptBuilder.append("КРИТИЧЕСКИ ВАЖНЫЕ ТРЕБОВАНИЯ:\n\n"); promptBuilder.append("1. Верни ТОЛЬКО JSON, без пояснений, комментариев, markdown-разметки.\n"); promptBuilder.append("2. JSON должен быть синтаксически корректным и валидным.\n"); - promptBuilder.append("3. Значения \"demandIndex\" должны быть от 0 до 100 (12 чисел для каждого месяца).\n"); + promptBuilder + .append("3. Значения \"demandIndex\" должны быть от 0 до 100 (12 чисел для каждого месяца).\n"); promptBuilder.append( "4. Поле \"description\" в seasonality должно содержать ДЕТАЛЬНОЕ описание (3-4 предложения) с конкретными причинами сезонных колебаний.\n"); promptBuilder.append( @@ -618,7 +621,8 @@ public class MarketingAnalysisService { "11. НЕ включай поле \"estimated\" ни в seasonality, ни в market.\n"); String prompt = promptBuilder.toString(); - logger.debug("Generating seasonality and market analysis with detailed prompt (length: {} chars)", prompt.length()); + logger.debug("Generating seasonality and market analysis with detailed prompt (length: {} chars)", + prompt.length()); String jsonResponse = openAIAnalyticsService.generateWithInstruction(context, prompt, "ru"); if (jsonResponse == null || jsonResponse.trim().isEmpty()) {