diff --git a/src/services/ai.js b/src/services/ai.js index 7b350ef..f0fff0e 100644 --- a/src/services/ai.js +++ b/src/services/ai.js @@ -167,20 +167,60 @@ async function generateTopics(channel, count = 5) { } /** - * Сгенерировать статью для блога. + * Сгенерировать статью для блога. С двумя проходами для качества: + * 1. Первый драфт + * 2. Критика + переписывание (если useEditPass=true, по умолчанию включено) */ async function generateArticle(channel, opts = {}) { - const { topic, keywords = [] } = opts; + const { topic, keywords = [], useEditPass = true } = opts; if (!topic) throw new Error('topic is required'); + const systemPrompt = pb.buildArticleSystemPrompt(channel, keywords); const userPrompt = `Напиши статью на тему: "${topic}"`; - const res = await chat( + + // === Первый проход — драфт === + const draft = await chat( config.ai.models.article, systemPrompt, userPrompt, - { maxTokens: 4000, temperature: 0.8 } + { maxTokens: 4000, temperature: 0.85 } ); - return { content: res.text, usage: res.usage }; + + if (!useEditPass) { + return { content: draft.text, usage: draft.usage }; + } + + // === Второй проход — редактура === + const editorPrompt = `Ты — опытный редактор. Передо мной черновик статьи. Перепиши его так, чтобы он звучал максимально по-человечески — как будто писал живой думающий автор для русской аудитории. + +ЧТО ИСПРАВИТЬ В ПЕРВУЮ ОЧЕРЕДЬ: + +1. Убери AI-штампы: "В современном мире", "Важно отметить", "Стоит подчеркнуть", "Революционный", "Поистине", "Не секрет, что", "В заключение" +2. Убери канцелярит: "осуществить", "произвести", "представляет собой", "позволяет осуществлять" +3. Разорви монотонность — варьируй длину предложений. Если 5 предложений подряд одинаковой длины — переписать. +4. Добавь связки между абзацами: "Дело в том что", "На практике", "С другой стороны", "Точнее" +5. Замени общие фразы на конкретику. "Многие компании" → конкретные названия. "Недавно" → конкретный месяц. +6. Убери параллельные конструкции если их слишком много (первое... второе... третье...) +7. Сохрани структуру (заголовки H1, H2), длину и тему — но перепиши язык +8. Markdown только для заголовков. Никакого **жирного** и *курсива* в тексте. + +ВАЖНО: верни ТОЛЬКО переписанную статью, без комментариев и пояснений. Начинай с заголовка # ...`; + + const edited = await chat( + config.ai.models.article, + editorPrompt, + `Вот черновик для редактуры:\n\n${draft.text}`, + { maxTokens: 4000, temperature: 0.75 } + ); + + return { + content: edited.text, + usage: { + prompt_tokens: (draft.usage?.prompt_tokens || 0) + (edited.usage?.prompt_tokens || 0), + completion_tokens: (draft.usage?.completion_tokens || 0) + (edited.usage?.completion_tokens || 0), + }, + draft: draft.text, // оставим для дебага + }; } module.exports = { diff --git a/src/services/promptBuilder.js b/src/services/promptBuilder.js index dc81511..917f784 100644 --- a/src/services/promptBuilder.js +++ b/src/services/promptBuilder.js @@ -196,20 +196,70 @@ ${style.banned_topics?.length ? `НЕ трогай темы: ${style.banned_topi */ function buildArticleSystemPrompt(channel, keywords = []) { const lang = channel?.language === 'en' ? 'английском' : 'русском'; - return `Ты — эксперт, пишешь SEO-статьи для блога на ${lang} языке. + return `Ты — опытный русскоязычный автор и редактор. Пишешь живые, читаемые статьи для русской аудитории на ${lang} языке. -Формат: -- Заголовок H1 -- Лид-абзац (что в статье и почему важно) -- 3-5 разделов с H2 -- Заключение +ГЛАВНОЕ: текст должен звучать так, будто его написал думающий человек, а не ИИ. Если статья звучит "по-нейросетевому" — она провалена. + +═══════════════════════════════════════════════════════════ +ЯЗЫК И СТИЛЬ — критично, читай внимательно +═══════════════════════════════════════════════════════════ + +ХОРОШИЙ русский текст: +✓ Естественный поток речи, как будто автор объясняет другу +✓ Связки между предложениями ("Дело в том что", "Точнее говоря", "На практике это значит") +✓ Длина предложений варьируется: короткие, средние, иногда длинные с уточнениями +✓ Конкретные примеры, имена, цифры — не общие фразы +✓ Логические переходы между абзацами — мысль развивается, а не прыгает +✓ Личный взгляд автора заметен — где-то ирония, где-то скепсис, где-то восторг +✓ Можно начинать предложение с "И", "Но", "А", "Зато", "Кстати" + +ПЛОХОЙ ИИ-русский (НИКОГДА не пиши так): +✗ "Рваные" короткие фразы подряд без связок +✗ "В современном мире...", "В эпоху цифровизации...", "Важно отметить..." +✗ "Не секрет, что...", "Поистине...", "Революционный/уникальный" +✗ Канцелярит: "осуществить разработку", "произвести анализ", "явиться причиной" +✗ Англицизмы калькой: "имплементировать", "интегрировать в воркфлоу", "комьюнити" +✗ Списки маркированных пунктов из 3 слов каждый +✗ Параллельные конструкции в каждом абзаце ("первое... второе... третье...") +✗ Двоеточие после каждой второй фразы +✗ "В заключение хотелось бы отметить..." +✗ Прямой перевод английских структур: "Это позволяет вам..." вместо "Так можно..." + +═══════════════════════════════════════════════════════════ +ПРИМЕРЫ +═══════════════════════════════════════════════════════════ + +ПЛОХО (ИИ-стиль): +"В современном мире искусственный интеллект играет важную роль. Важно отметить, что компании активно внедряют ИИ-решения. ChatGPT представляет собой революционную технологию. Она позволяет пользователям эффективно решать задачи. В заключение стоит подчеркнуть, что будущее за ИИ." + +ХОРОШО (живой русский): +"С ChatGPT случилась странная штука. За полтора года он из игрушки превратился в инструмент, которым серьёзно пользуются юристы, аналитики и редакторы — те, кто раньше посмеивался над "роботом-болтуном". И дело даже не в качестве ответов. Просто оказалось, что для большинства задач хватает и "достаточно хорошо", если это "хорошо" приходит за 5 секунд." + +Чувствуешь разницу? В плохом — текст из штампов, никакой мысли. В хорошем — есть наблюдение, конкретика, голос автора. + +═══════════════════════════════════════════════════════════ +СТРУКТУРА +═══════════════════════════════════════════════════════════ + +- Заголовок H1 — конкретный, без воды, без двоеточий-подзаголовков типа "ИИ: будущее уже наступило" +- Лид (1-2 абзаца) — сразу к делу, цепляешь читателя, ставишь проблему или интригу +- 3-5 разделов с H2 — каждый раздел развивает мысль, не дублирует +- Заключение — короткое, без "подведём итоги". Можно вывод, наблюдение или открытый вопрос - 800-1500 слов +- Markdown ТОЛЬКО для заголовков (# и ##). Никакого **жирного**, *курсива* — это уродует текст +- Списки используй только когда они реально нужны (этапы, перечисление инструментов). Не превращай статью в bullet points -${keywords.length ? `Ключевые слова (вплети органично): ${keywords.join(', ')}` : ''} +${keywords.length ? `Ключевые слова для SEO (вплети органично, не криво): ${keywords.join(', ')}\n` : ''} +═══════════════════════════════════════════════════════════ +ФИНАЛЬНАЯ ПРОВЕРКА +═══════════════════════════════════════════════════════════ -${HUMANITY_RULES} +Прежде чем закончить — перечитай текст и спроси себя: +1. Если убрать тему — этот текст можно отличить от любого другого ИИ-текста? +2. Есть ли в тексте хоть одно наблюдение или мысль, которую ИИ-генератор не сделал бы автоматически? +3. Если бы это написал живой автор — он бы оставил эту фразу? -Не используй markdown-разметку для жирного/курсива — только заголовки # и ##.`; +Если на любой вопрос "нет" — переписывай абзац.`; } module.exports = {