Один текст — миллиарды вариантов: обратный авторинг на ZennoPoster

  • Автор темы Автор темы Divisor
  • Дата начала Дата начала

Divisor

Client
Регистрация
26.02.2024
Сообщения
69
Реакции
77
Баллы
18
Текст в десятой степени: ИИ Агент размечает, движок множит

Первую статью для конкурса я писал для команды ZennoLab: показать движок и предложить его к нативной поддержке, чтобы расширенный спинтакс работал в ZennoPoster без плагинов.

Эта статья — для форумчан, и в ней нет ничего про устройство движка. Только руководство: как уже сейчас, с плагином из архива, получить из одного написанного текста десятки разных — для описания сервиса под постинг или для холодного письма. Вы пишете один хороший текст, «ИИ Агент» его размечает, а дальше из одного шаблона выходит по файлу на каждую площадку или на каждого адресата. Показано на описании вымышленного сервиса, по-русски и по-английски. Про сами площадки и доставляемость писем здесь ничего не сказано: статья о том, как получить набор чистых файлов; что с ними делать дальше, решаете вы. Проекты, код и движок открыты, лицензия MIT.

Что вы получите

  • Из одного файла с вашим текстом — шаблон, в котором слова и обороты размечены вариантами, первый и последний абзацы стоят на месте, а средние меняются местами.
  • Двадцать готовых вариантов текста для чтения глазами и отчёт проверки по пятидесяти документам.
  • Затем — по текстовому файлу на каждую строку вашей таблицы: площадка это или адресат письма, проекту всё равно. Те же строки и то же имя кампании дают те же файлы на любой машине.

Что нужно: ZennoPoster 7.9 и новее с кубиком «ИИ Агент» (проверено на 7.9.1.0), ключ ИИ-сервиса в настройках программы (Редактирование → Настройки → ИИ; в проекте ключей нет), архив у этого поста. Код открывать не придётся: всё, что вы трогаете, — форма проекта и один текстовый файл.

Шаг 1. Установка, один раз

  1. Закройте ProjectMaker и ZennoPoster: при открытых программах новая dll не подхватится.
  2. Из архива скопируйте обе dll из template-3-markup\lib\ в Progs\ExternalAssemblies папки ZennoPoster.
  3. Папку template-3-markup из архива положите куда угодно и добавьте в ZennoPoster два проекта из неё: template-3-markup.zp (разметка) и template-3-production.zp (файлы по таблице).

Если у вас стоят проекты из первой статьи — dll те же, шаг 2 уже сделан. Если ProjectMaker при открытии проекта спросит про ссылку на Spintax.Zenno.dll — Свой код → Ссылки из GAC, добавить из файла template-3-markup\lib\Spintax.Zenno.dll.

Шаг 2. Напишите текст

Текст — это файл рядом с проектом. В поставке два образца: source.ru.txt и source.en.txt. Русский я писал так, чтобы он сам был инструкцией по форме — откройте его:

#def %e% = {сервис|инструмент}

%service% — %e% для планирования смен в небольших командах: [<sep=", ">кафе|клиниках|мастерских|службах доставки]. …

Смена ставится в расписание за несколько секунд: … Роли — [<sep=", ">кассир|повар|курьер] — задаются один раз …

Начать можно без обучения. …

Такой %e% подходит командам от пяти до пятидесяти человек. Сейчас им {plural %clients%: пользуется|пользуются|пользуются} %clients% {plural %clients%: компания|компании|компаний}{?CityLoc?, в том числе в %CityLoc%|}. …

Попробовать %service% можно бесплатно в течение четырнадцати дней, без карты. …

Пять правил, и текст готов к разметке:

  • Пишите как для одного читателя. Обычные предложения, без вариантов и синонимов — их расставит модель. Скобок {a|b} в файле быть не должно, проект такой файл не примет.
  • Пустая строка между абзацами, не меньше трёх. Первый и последний останутся на месте, средние будут меняться местами — поэтому ни один средний абзац не должен ссылаться на соседний: без «как сказано выше», «далее», «кроме того».
  • Главное слово текста — первой строкой. Если сервис называется по-разному («сервис», «инструмент»), напишите #def %e% = {сервис|инструмент} и дальше везде %e%. Одно слово на весь текст выберется один раз, и текст не будет прыгать между ними. Обе формы должны склоняться одинаково.
  • Всё, что меняется от строки к строке, — переменными: %service%, %url%, %clients%, %CityLoc%. Если рядом с числом стоит слово, которое от него зависит, оберните его в {plural …}: «пользуется 1 компания», «пользуются 3 компании», «пользуются 11 компаний» — движок подставит форму сам. Город приходит из таблицы уже в нужном падеже, и суффикс в имени говорит, в каком: %City% — «Казань», %CityLoc% — «Казани».
  • Перечисления — перестановкой. Список однородных слов оформите [<sep=", ">кассир|повар|курьер], и порядок будет разыгрываться в каждом файле. Модель перестановки не трогает и своих не добавляет: где список, а где последовательность шагов, знаете вы.

Больше о том, как писать такой текст, — https://ru.spintax.net/docs/authoring-mindset/, о русской грамматике в шаблонах — https://ru.spintax.net/docs/grammar-safe-spintax/. Образец после подстановки данных даёт от 1 614 до 1 646 знаков по-русски и от 1 549 до 1 584 по-английски — размер обычного описания для каталога. Своё описание сохраняйте рядом с проектом в UTF-8.

Шаг 3. Заполните форму и запустите

В ZennoPoster правой кнопкой по проекту template-3-markup → «Настройки». Семь полей:

ПолеЧто вписатьДля образца
Файл источникаимя файла рядом с проектом; пусто = source.<язык>.txtпусто
Языкru, uk, be, sr, hr, bs, enru
Разрешённые переменныепо одной на строку: %service% — бренд, не склоняетсякак в поставке
Имя шаблонаимя файлов результатаsubmit-ru
Пробные значения#set %service% = Lumio и так далее, для проверки и вариантовкак в поставке
Папка промптовпусто = папка prompts рядом с проектомпусто
Папка выводапусто = папка out рядом с проектомпусто

Для английского образца: файл source.en.txt, язык en, имя submit-en; в разрешённых переменных и в пробных значениях — %City% вместо %CityLoc%, город в именительном падеже (#set %City% = Kazan).

Кнопкой «Экспорт» в этом же окне набор значений сохраняется в файл, «Импорт» возвращает его — так удобно держать русский и английский наборы рядом.

Запускайте. Проект идёт по абзацам: каждый абзац отдельно уходит модели, возвращается размеченным и проверяется. Если ответ не годится — слипшиеся абзацы, выдуманная переменная, цифра вместо слова, лишний предлог, сломанные скобки — проект сам переспрашивает модель, объяснив ей, что было не так, до трёх раз на абзац. В логе это выглядит как «абзац 0 — попытка разметки 2 из 3 (причина в брифе: …)». Вам делать ничего не нужно. В конце — строка «шаблон собран — 5 абзацев (3 в перестановке), путей выбора …, самый длинный рендер … знаков».

Так это прошло на ZennoPoster Pro 7.9.1.0 с claude-opus-4-5-20251101: русский образец — пять абзацев за семь обращений к модели, два из них переспросы, оба со второй попытки; английский — те же семь и два. Последний абзац русского образца в том виде, в каком его вернула модель:

Попробовать %service% можно {бесплатно|без оплаты} в течение четырнадцати дней, без карты. Вопросы по внедрению {разбирает|решает} поддержка в рабочие дни. Подробности, тарифы и форма регистрации: %url%.

Если абзац не удался за три попытки, проект останавливается и пишет в лог номер абзаца и причину. Обычно это значит, что в тексте есть переменная, которой нет в форме, или в самом абзаце что-то надо упростить. Самая частая ошибка первого запуска ловится ещё до обращения к модели: «в источнике есть переменная, которой нет в разрешённых» — впишите её в форму.

Шаг 4. Посмотрите результат

В папке out три файла с именем шаблона:

  • submit-ru.spintax — сам шаблон;
  • submit-ru.variants.txt — двадцать вариантов; прочитайте несколько, не первый. Автоматика ловит повторы, пунктуацию и согласование «который», но не смысл: два варианта, верных по отдельности, могут не сойтись в одной фразе;
  • submit-ru.meta.txt — доля чистых документов из пятидесяти, число путей выбора и длина самого длинного варианта, чтобы знать, влезет ли он в поле площадки.

Для образца: 28 991 029 248 путей выбора и 1 686 знаков в самом длинном варианте по-русски, 3 343 537 668 096 и 1 637 по-английски; проверка на пятидесяти документах у обоих — без единой находки. И ответ на вопрос из первой статьи «сколько из моих текстов совпадут»: пять тысяч вариантов для одной строки данных — пять тысяч разных текстов, ни одного двойника, что по-русски, что по-английски. У карточки на две-три фразы двойников на тех же пяти тысячах было 236.

Одна вещь, которую не надо делать с готовым шаблоном: открывать его в редакторе и «исправлять» перестановку абзацев — там между кавычками стоят настоящие переводы строки, и так и должно быть.

t3-loop.png

⟦Рисунок: t3-loop.png — Схема проекта разметки в ProjectMaker: цикл по абзацам и обе петли возврата; красный крест у последнего кубика цикла — его штатный выход после последнего абзаца⟧

Доводка в Spintax Studio

Проект отдаёт готовый шаблон, а вам захочется чуть подправить: в variants.txt попался неудачный синоним, или одну фразу вы бы написали иначе. Открывать .spintax в Блокноте не стоит — там не видно, что вы сломали. Для этого есть Spintax Studio, бесплатный редактор шаблонов для Windows: https://spintax.studio/. Ставится из Microsoft Store (https://apps.microsoft.com/detail/9mw3ch7b530p), работает без сети и без аккаунта; движок внутри — той же семьи, что и dll в ZennoPoster, так что вердикт «валидно» у них один.

  1. Откройте out\submit-ru.spintax. Слева шаблон, справа один из текстов, которые он даёт; кнопка Другой показывает следующий. Панель Диагностика внизу должна быть пустой.
  2. В панели Переменные впишите значения для %service%, %url%, %clients%, %CityLoc% — они действуют на время сеанса и в файл не попадают, зато справа виден живой текст, а не %…%.
  3. Правьте текстом: лишний синоним удалите вместе с чертой, к слову добавьте вариант через Вставка → Обернуть в {…}, одинаковую правку по всему файлу — Ctrl+H. Справа сразу видно результат, диагностика скажет, если скобка не сошлась. Большую скобку с абзацами не трогайте: переводы строк внутри неё — часть конструкции.
  4. Панель Варианты: задайте число, сгенерируйте, прочитайте. Там же написано, сколько текстов шаблон может дать вообще. Экспорт по файлу на вариант или строкой на вариант — если файлы нужны без ZennoPoster.
  5. Сохраните под тем же именем — проект шага 5 прочитает файл как есть.

Studio годится и для обратного пути: написать шаблон руками с нуля, без «ИИ Агента», и отдать его проекту шага 5. Файл один и тот же для всей семьи: узел n8n, плагин для WordPress, пакет для JavaScript читают его без изменений.

Шаг 5. Файл на площадку

Второй проект, template-3-production.zp, — тот же, что «прод» в первой статье: таблица → на каждую строку один текст → файл.

  1. Таблица platforms.csv в поставке — шестнадцать строк: key;platform;service;url;CityLoc;City;clients. Замените строки своими: ключ строки уникален (он станет именем файла), город — в нужном падеже, число клиентов — числом. Колонки называйте так же, как переменные в тексте.
  2. Правой кнопкой по проекту → «Настройки»: «Шаблон» = out\submit-ru.spintax, «Язык» = ru, «Кампания» = имя вашей кампании, «Колонка ключа» = key, «Папка вывода» пустая. Пробел в начале «Кампании» уходит и в имя папки, и в розыгрыш — следите за ним.
  3. Запуск. В out\<кампания>\ — по файлу на строку: p01.txt, p02.txt, …

Повторный запуск с той же таблицей, тем же шаблоном, той же dll и тем же именем кампании даёт те же байты — можно перегенерировать одну площадку через месяц и получить ровно тот текст, что уже размещён. Другая кампания — другое имя в поле «Кампания», и весь набор разыгрывается заново. На боевом дне: шестнадцать файлов за один проход, все разные, повторный запуск не изменил ни байта; английский шаблон с кампанией catalog-2026-en дал ещё шестнадцать. Обе папки лежат в архиве, template-3-markup\out\.

t3-output.png

⟦Рисунок: t3-output.png — Результат: шестнадцать файлов, по одному на площадку, и открытый p12.txt — 25 компаний, без города, перечисления мест и ролей в своём порядке⟧

Под свой сервис

  • Другой текст — новый файл рядом с проектом, его имя в поле «Файл источника», новое имя шаблона. Форма и правила те же.
  • Другие переменные — впишите их в «Разрешённые переменные» (по одной на строку, с пометкой после тире) и в «Пробные значения»; колонки таблицы называйте так же.
  • Другой язык — язык в форме; промпты поставляются для ru uk be sr hr bs en.
  • Холодное письмо — тот же проект: файл с текстом письма, от трёх абзацев, таблица адресатов вместо таблицы площадок, имя рассылки в «Кампании».
  • Длиннее текст — больше абзацев, больше обращений к модели, не меньше одного на абзац. Обязательное чтение variants.txt никуда не девается: стык двух переставленных абзацев и смысл проверяет только человек.

Как это устроено, коротко

Модель не пишет текст, а только размечает готовый, по одному абзацу за раз, под каноническим промптом семьи spintax и с инструкцией «менять слова, не менять смысл». Каждый ответ проходит проверку формы, проверку синтаксиса и проверку восьми пробных вариантов; что не прошло — модель переделывает. Собирает шаблон, считает варианты и пишет файлы сам движок, без обращений к сети. Кому интересно, как это сделано внутри и на каких граблях стояло, — первая статья и README.md в папке проекта, где расписан каждый кубик; сам движок открыт: https://github.com/investblog/spintax-dotnet. Разбор того, почему грязный вариант переделывают, а не правят по месту, — https://ru.spintax.net/docs/repairing-spintax/; о перестановках и где им место — https://ru.spintax.net/docs/permutations/.
 

Вложения

Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)