- Регистрация
- 26.02.2024
- Сообщения
- 69
- Реакции
- 78
- Баллы
- 18
Текст в десятой степени: ИИ Агент размечает, движок множит
Первую статью для конкурса я писал для команды ZennoLab: показать движок и предложить его к нативной поддержке, чтобы расширенный спинтакс работал в ZennoPoster без плагинов.
Эта статья — для форумчан, и в ней нет ничего про устройство движка. Только руководство: как уже сейчас, с плагином из архива, получить из одного написанного текста десятки разных — для описания сервиса под постинг или для холодного письма. Вы пишете один хороший текст, «ИИ Агент» его размечает, а дальше из одного шаблона выходит по файлу на каждую площадку или на каждого адресата. Показано на описании вымышленного сервиса, по-русски и по-английски. Про сами площадки и доставляемость писем здесь ничего не сказано: статья о том, как получить набор чистых файлов; что с ними делать дальше, решаете вы. Проекты, код и движок открыты, лицензия MIT.
Что вы получите
Что нужно: ZennoPoster 7.9 и новее с кубиком «ИИ Агент» (проверено на 7.9.1.0), ключ ИИ-сервиса в настройках программы (
Шаг 1. Установка, один раз
Если у вас стоят проекты из первой статьи — dll те же, шаг 2 уже сделан. Если ProjectMaker при открытии проекта спросит про ссылку на
Шаг 2. Напишите текст
Текст — это файл рядом с проектом. В поставке два образца:
Пять правил, и текст готов к разметке:
Больше о том, как писать такой текст, — 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 правой кнопкой по проекту
Для английского образца: файл
Кнопкой «Экспорт» в этом же окне набор значений сохраняется в файл, «Импорт» возвращает его — так удобно держать русский и английский наборы рядом.
Запускайте. Проект идёт по абзацам: каждый абзац отдельно уходит модели, возвращается размеченным и проверяется. Если ответ не годится — слипшиеся абзацы, выдуманная переменная, цифра вместо слова, лишний предлог, сломанные скобки — проект сам переспрашивает модель, объяснив ей, что было не так, до трёх раз на абзац. В логе это выглядит как «абзац 0 — попытка разметки 2 из 3 (причина в брифе: …)». Вам делать ничего не нужно. В конце — строка «шаблон собран — 5 абзацев (3 в перестановке), путей выбора …, самый длинный рендер … знаков».
Так это прошло на ZennoPoster Pro 7.9.1.0 с
Если абзац не удался за три попытки, проект останавливается и пишет в лог номер абзаца и причину. Обычно это значит, что в тексте есть переменная, которой нет в форме, или в самом абзаце что-то надо упростить. Самая частая ошибка первого запуска ловится ещё до обращения к модели: «в источнике есть переменная, которой нет в разрешённых» — впишите её в форму.
Шаг 4. Посмотрите результат
В папке
Одна вещь, которую не надо делать с готовым шаблоном: открывать его в редакторе и «исправлять» перестановку абзацев — там между кавычками стоят настоящие переводы строки, и так и должно быть.
⟦Рисунок: t3-loop.png — Схема проекта разметки в ProjectMaker: цикл по абзацам и обе петли возврата; красный крест у последнего кубика цикла — его штатный выход после последнего абзаца⟧
Доводка в Spintax Studio
Проект отдаёт готовый шаблон, а вам захочется чуть подправить: в
Studio годится и для обратного пути: написать шаблон руками с нуля, без «ИИ Агента», и отдать его проекту шага 5. Файл один и тот же для всей семьи: узел n8n, плагин для WordPress, пакет для JavaScript читают его без изменений.
Шаг 5. Файл на площадку
Второй проект,
Повторный запуск с той же таблицей, тем же шаблоном, той же dll и тем же именем кампании даёт те же байты — можно перегенерировать одну площадку через месяц и получить ровно тот текст, что уже размещён. Другая кампания — другое имя в поле «Кампания», и весь набор разыгрывается заново. На боевом дне: шестнадцать файлов за один проход, все разные, повторный запуск не изменил ни байта; английский шаблон с кампанией
⟦Рисунок: t3-output.png — Результат: шестнадцать файлов, по одному на площадку, и открытый p12.txt — 25 компаний, без города, перечисления мест и ролей в своём порядке⟧
Под свой сервис
Как это устроено, коротко
Модель не пишет текст, а только размечает готовый, по одному абзацу за раз, под каноническим промптом семьи spintax и с инструкцией «менять слова, не менять смысл». Каждый ответ проходит проверку формы, проверку синтаксиса и проверку восьми пробных вариантов; что не прошло — модель переделывает. Собирает шаблон, считает варианты и пишет файлы сам движок, без обращений к сети. Кому интересно, как это сделано внутри и на каких граблях стояло, — первая статья и
Первую статью для конкурса я писал для команды ZennoLab: показать движок и предложить его к нативной поддержке, чтобы расширенный спинтакс работал в ZennoPoster без плагинов.
Эта статья — для форумчан, и в ней нет ничего про устройство движка. Только руководство: как уже сейчас, с плагином из архива, получить из одного написанного текста десятки разных — для описания сервиса под постинг или для холодного письма. Вы пишете один хороший текст, «ИИ Агент» его размечает, а дальше из одного шаблона выходит по файлу на каждую площадку или на каждого адресата. Показано на описании вымышленного сервиса, по-русски и по-английски. Про сами площадки и доставляемость писем здесь ничего не сказано: статья о том, как получить набор чистых файлов; что с ними делать дальше, решаете вы. Проекты, код и движок открыты, лицензия MIT.
Что вы получите
- Из одного файла с вашим текстом — шаблон, в котором слова и обороты размечены вариантами, первый и последний абзацы стоят на месте, а средние меняются местами.
- Двадцать готовых вариантов текста для чтения глазами и отчёт проверки по пятидесяти документам.
- Затем — по текстовому файлу на каждую строку вашей таблицы: площадка это или адресат письма, проекту всё равно. Те же строки и то же имя кампании дают те же файлы на любой машине.
Что нужно: ZennoPoster 7.9 и новее с кубиком «ИИ Агент» (проверено на 7.9.1.0), ключ ИИ-сервиса в настройках программы (
Редактирование → Настройки → ИИ; в проекте ключей нет), архив у этого поста. Код открывать не придётся: всё, что вы трогаете, — форма проекта и один текстовый файл.Шаг 1. Установка, один раз
- Закройте ProjectMaker и ZennoPoster: при открытых программах новая dll не подхватится.
- Из архива скопируйте обе dll из
template-3-markup\lib\вProgs\ExternalAssembliesпапки ZennoPoster. - Папку
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, en | ru |
| Разрешённые переменные | по одной на строку: %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 — Схема проекта разметки в ProjectMaker: цикл по абзацам и обе петли возврата; красный крест у последнего кубика цикла — его штатный выход после последнего абзаца⟧
Доводка в Spintax Studio
Проект отдаёт готовый шаблон, а вам захочется чуть подправить: в
variants.txt попался неудачный синоним, или одну фразу вы бы написали иначе. Открывать .spintax в Блокноте не стоит — там не видно, что вы сломали. Для этого есть Spintax Studio, бесплатный редактор шаблонов для Windows: https://spintax.studio/. Ставится из Microsoft Store (https://apps.microsoft.com/detail/9mw3ch7b530p), работает без сети и без аккаунта; движок внутри — той же семьи, что и dll в ZennoPoster, так что вердикт «валидно» у них один.- Откройте
out\submit-ru.spintax. Слева шаблон, справа один из текстов, которые он даёт; кнопка Другой показывает следующий. Панель Диагностика внизу должна быть пустой. - В панели Переменные впишите значения для
%service%,%url%,%clients%,%CityLoc%— они действуют на время сеанса и в файл не попадают, зато справа виден живой текст, а не%…%. - Правьте текстом: лишний синоним удалите вместе с чертой, к слову добавьте вариант через Вставка → Обернуть в {…}, одинаковую правку по всему файлу — Ctrl+H. Справа сразу видно результат, диагностика скажет, если скобка не сошлась. Большую скобку с абзацами не трогайте: переводы строк внутри неё — часть конструкции.
- Панель Варианты: задайте число, сгенерируйте, прочитайте. Там же написано, сколько текстов шаблон может дать вообще. Экспорт по файлу на вариант или строкой на вариант — если файлы нужны без ZennoPoster.
- Сохраните под тем же именем — проект шага 5 прочитает файл как есть.
Studio годится и для обратного пути: написать шаблон руками с нуля, без «ИИ Агента», и отдать его проекту шага 5. Файл один и тот же для всей семьи: узел n8n, плагин для WordPress, пакет для JavaScript читают его без изменений.
Шаг 5. Файл на площадку
Второй проект,
template-3-production.zp, — тот же, что «прод» в первой статье: таблица → на каждую строку один текст → файл.- Таблица
platforms.csvв поставке — шестнадцать строк:key;platform;service;url;CityLoc;City;clients. Замените строки своими: ключ строки уникален (он станет именем файла), город — в нужном падеже, число клиентов — числом. Колонки называйте так же, как переменные в тексте. - Правой кнопкой по проекту → «Настройки»: «Шаблон» =
out\submit-ru.spintax, «Язык» =ru, «Кампания» = имя вашей кампании, «Колонка ключа» =key, «Папка вывода» пустая. Пробел в начале «Кампании» уходит и в имя папки, и в розыгрыш — следите за ним. - Запуск. В
out\<кампания>\— по файлу на строку:p01.txt,p02.txt, …
Повторный запуск с той же таблицей, тем же шаблоном, той же dll и тем же именем кампании даёт те же байты — можно перегенерировать одну площадку через месяц и получить ровно тот текст, что уже размещён. Другая кампания — другое имя в поле «Кампания», и весь набор разыгрывается заново. На боевом дне: шестнадцать файлов за один проход, все разные, повторный запуск не изменил ни байта; английский шаблон с кампанией
catalog-2026-en дал ещё шестнадцать. Обе папки лежат в архиве, template-3-markup\out\.⟦Рисунок: 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/.Вложения
Последнее редактирование:


