Гайд на Janitor AI
Саммари в двух минутах
LLM сильнее учится на примерах того, как бот должен вести себя, чем на огромном списке инструкций о том, чего делать нельзя.
Особенно сильно на дальнейшее поведение влияют:
Personality → Scenario → First Message → Example Dialogue.
Причём Personality и Scenario постоянно остаются в контексте, поэтому туда стоит класть только действительно важные и относительно постоянные вещи. Автор советует не раздувать их: ориентир из статьи — примерно 500–1000 permanent tokens, желательно меньше 1500, хотя это именно практическая рекомендация автора, а не технический закон. Rentry
А First Message — пожалуй, самая важная часть. Если старт написан длинными абзацами, бот склонен писать длинно. Если он постоянно прыгает во времени — бот будет делать то же самое. Если в первом сообщении автор управляет действиями пользователя — модель с большей вероятностью продолжит делать это дальше. Rentry
Пошаговый гайд: создаём бота с нуля
Шаг 1. Сформулируй бота одной фразой
До заполнения каких-либо полей ответь:
Кто этот бот + что пользователь с ним делает + чем это интересно?
Эксцентричный частный детектив помогает пользователю расследовать странные происшествия в небольшом городе.
Очень интересный, сложный персонаж с богатой историей.
Из второго вообще непонятно, какой будет чат.
Это станет твоим Core Concept.
Шаг 2. Реши, кто чем управляет
{{char}} writes vivid narration.«Персонаж пишет художественное повествование».
Хотя на самом деле ты хотел сказать модели:
Use vivid but concise narration.Автор отдельно подчёркивает эту разницу. Rentry
Шаг 3. Напиши Personality
Не пытайся написать биографию на пять страниц.
Тебе нужны черты, которые реально изменят разговор.
Name: Age: Role: Core personality: - trait - trait - trait Key behaviors: - ... - ... - ... Speaking style: - ... Goals: - ... Likes: - ... Dislikes: - ... Important background: - ... Skills: - ... Quirks: - ...
Автор прямо советует удалять секции шаблона, которые персонажу не нужны. Plaintext тоже нормально работает — никакого магического формата нет. Rentry
Не просто называй черту — показывай её
Personality: shy, curious, impatient
Shy: Avoids being the center of attention and becomes noticeably quieter around strangers. Curious: Frequently investigates things that other people would ignore. Impatient: Gets visibly restless when conversations go in circles.
Это даёт модели наблюдаемое поведение, а не просто абстрактный ярлык.
Именно такой подход автор рекомендует для важных особенностей персонажа. Rentry
Шаг 4. Удали лишнее
Изменит ли эта информация реальные ответы бота?
Owns seven pairs of gray socks.
Если носки никак не связаны с персонажем или сюжетом — информация бесполезна.
Obsessively keeps everything organized and gets irritated when objects are out of place.
может постоянно проявляться в RP.
Автор советует позволять модели самостоятельно достраивать несущественные детали вместо попытки определить абсолютно всё. Rentry
Шаг 5. Не переопределяй пользователя
{{user}} is brave.
{{user}} loves adventure.
{{user}} is sarcastic.
{{user}} always helps people.
{{user}} is afraid of spiders.Чем больше ты описываешь {{user}}, тем проще модели начать воспринимать его как ещё одного NPC, которым она сама управляет. Автор отдельно предупреждает об этом. Rentry
Лучше оставить пользователю свободу.
Если что-то необходимо для концепции:
{{user}} has recently joined the investigation team.Шаг 6. Сделай Scenario
Scenario — не описание того, что происходит прямо сейчас.
{{char}} and {{user}} are sitting in a cafe.Потому что Scenario будет снова подаваться модели после того, как персонажи уже давно покинут кафе.
Автор рекомендует использовать Scenario для вещей, которые остаются верными долгое время: мир, эпоха, важный lore, отношения, правила повествования и другие фундаментальные условия. Rentry
The story takes place in a modern coastal town where supernatural
events are real but unknown to most residents.
{{char}} works as a private investigator specializing in unusual cases.
{{char}} and {{user}} investigate cases together.It is raining. They are currently inside a cafe. A waiter puts coffee on the table.
лучше перенести в First Message.
Шаг 7. Не делай огромный System Prompt
Одна из главных претензий автора — гигантские «универсальные» промпты на сотни строк.
Never do X. Never do Y. Never do Z. Always remember everything. Always stay in character. Never make mistakes. Always... Always... Never... Never...
- расходует контекст;
- может противоречить сам себе;
- иногда конфликтует с другими инструкциями;
- часто пытается исправить проблемы, которые лучше исправлять структурой самого персонажа.
Автор рекомендует вообще не использовать generic system prompt без причины; если инструкция нужна, делать её короткой и специфичной для конкретного бота. Rentry
Шаг 8. Формулируй желаемое поведение
Это один из самых полезных принципов статьи.
Don't make responses too long.
Keep narration focused on the current interaction.
Don't rush the story.
Develop events one interaction at a time and allow {{user}} to react
before major developments occur.Don't constantly change locations.
Maintain the current location until characters deliberately leave it.
Автор особенно выступает против бесконечных don't / never / do not и предлагает описывать что модель должна делать вместо нежелательного поведения. Это разумная практическая эвристика, хотя не стоит воспринимать её как буквальный закон работы всех LLM. Rentry
Шаг 9. Напиши First Message
Вот здесь начинается самое важное.
Автор прямо называет First Message «heart and soul» бота: оно задаёт длину, стиль, POV, манеру диалога и темп последующих ответов. Rentry
Хорошее первое сообщение должно сделать четыре вещи:
показать персонажа → показать ситуацию → продемонстрировать стиль → дать пользователю возможность действовать.
Rain hammered against the windows of the tiny detective office.
Alex leaned over a cluttered desk, comparing two photographs for what
must have been the tenth time.
"That's impossible."
He slid one of the photos across the desk toward {{user}}.
Both pictures showed the same empty street, taken twenty years apart.
And in both of them, the same man was standing beneath the same
streetlight.
Alex tapped the figure with his finger.
"I think we finally found an interesting case."- задано место;
- показан характер;
- появился mystery hook;
- есть предмет взаимодействия;
- AI не решил за пользователя, что тот сделал;
- пользователь сам выбирает реакцию.
Шаг 10. Не управляй {{user}} в First Message
Это, пожалуй, центральный совет всей статьи.
You enter the detective's office. You notice a strange photograph on the table. You become curious and ask Alex what happened.
Модель видит такой паттерн и может продолжать его.
Автор советует строить сцену из POV персонажа или мира, оставляя действие пользователя незаполненным. Rentry
Alex hears footsteps outside his office.
He puts the photograph down and looks toward the doorway.
"{{user}}? You might want to see this."Теперь ход принадлежит пользователю.
Шаг 11. Осторожнее со вторым лицом
You see... You feel... You think... You walk...
особенно легко заставляют модель начать управлять пользователем.
Автор поэтому предпочитает POV {{char}}:
Alex watches {{user}}.
Alex hears...
Alex walks...
Alex thinks...Второе лицо само по себе не является «запрещённым» — автор прямо это оговаривает, — но оно увеличивает вероятность такого поведения. Rentry
Шаг 12. Дай пользователю «открытый, но понятный» ход
"Do you agree?"
Yes / No.
You are in a giant fantasy world. What do you do?
¯_(ツ)_/¯
понятная ситуация + несколько естественных направлений действия.
Например, детектив положил фотографию на стол.
Автор называет это чем-то вроде open yet constrained choice. Rentry
Шаг 13. Не запихивай биографию в первое сообщение
Alex was born in 1998. When he was six... Ten years later... After university... Three years ago... Yesterday... Now...
First Message должен показывать сцену сейчас.
Предыстория может постепенно проявляться позже или находиться в Personality.
Автор отдельно предупреждает, что time skips в первом сообщении учат модель постоянно перескакивать вперёд по сюжету. Rentry
Шаг 14. Добавь Example Dialogue только если оно действительно нужно
Оно особенно полезно, если у персонажа есть:
- необычная манера речи;
- акцент;
- профессиональный жаргон;
- сарказм;
- специфический формат ответов;
- необычный narrator voice.
Если персонаж говорит совершенно обычно, хороших Personality + First Message может хватить. Rentry
<START>
{{char}}: "Interesting. Completely impossible, obviously—but interesting."
<START>
{{char}}: "Before we invent a supernatural explanation, let's eliminate the boring ones."
<START>Главная идея здесь даже не в конкретном синтаксисе <START>.
показать модели голос персонажа.
Причём автор советует делать примеры независимыми от текущей стартовой сцены, а не писать заранее следующий ответ бота. Rentry
Шаг 15. Проверь согласованность
то Example Dialogue тоже лучше делать:
Если narration оформлено одним способом — придерживайся его везде.
Если персонаж говорит коротко — не давай ему примеры монологов на три страницы.
Автор отдельно подчёркивает ценность consistent formatting. Rentry
Шаг 16. Сделай Title + Description
Название должно быстро объяснять, что это за опыт.
Alex
The Detective Who Investigates Impossible Cases
A private investigator specializing in cases that shouldn't be possible. You've joined him on a new investigation involving two photographs taken twenty years apart—and one person who hasn't aged a day.
То есть пользователь ещё до запуска понимает:
«Ага, вот что здесь будет происходить».
Статья рекомендует именно такой подход к title/description. Rentry
Шаг 17. Тестируй несколько генераций
Не запускай один чат и не решай:
Всё работает!
Сделай одинаковый первый ответ пользователя несколько раз.
"Hi."
"What happened?"
- управляет ли бот пользователем;
- сохраняется ли характер;
- сохраняется ли POV;
- не прыгает ли сцена;
- не повторяются ли одни и те же фразы;
- адекватна ли длина;
- не забывает ли бот основную premise.
Автор специально рекомендует короткий ответ вроде Hi как своеобразный stress-test: слабая реплика пользователя часто сильнее проявляет проблемы бота. Rentry
Шаг 18. Исправляй причину, а не добавляй запрет
Допустим, бот пишет слишком длинно.
DO NOT WRITE LONG RESPONSES.
А First Message у меня случайно не на 1500 слов?
Бот постоянно говорит за пользователя?
А в самом First Message я не написал «you walk / you think / you feel»?
Персонаж постоянно повторяет одну фразу?
А я случайно не повторил её пять раз в Personality и Example Dialogue?
Это, пожалуй, самый полезный способ думать о ботмейкинге из всей статьи:
Поведение модели часто является отражением твоих примеров.
Не пытайся чинить всё дополнительными инструкциями.
Готовая схема бота
В итоге я бы сократил всю статью до такого шаблона:
CONCEPT
[Кто бот + что происходит + почему это интересно]
PERSONALITY
Name:
Role:
Core traits:
- ...
- ...
- ...
Behavior:
- ...
- ...
- ...
Speaking style:
- ...
Goals:
- ...
Important background:
- ...
Important quirks:
- ...
SCENARIO
[Только постоянные правила мира / отношений / premise]
- ...
- ...
- ...
STYLE / SPECIAL INSTRUCTIONS
[Только действительно нужные инструкции]
- ...
- ...
FIRST MESSAGE
[Одна конкретная сцена]
1. Establish location.
2. Show {{char}} doing something.
3. Demonstrate personality.
4. Introduce hook/conflict.
5. Give {{user}} something to react to.
6. Stop before deciding what {{user}} does.
EXAMPLE DIALOGUE
<START>
{{char}}: "..."
<START>
{{char}}: "..."
<START>И весь гайд в одной формуле
1. Придумай сильную premise.
→ 2. Опиши только важные черты персонажа.
→ 3. В Scenario оставь только постоянные факты.
→ 4. Не раздувай system prompt.
→ 5. Показывай желаемое поведение вместо списка запретов.
→ 6. Сделай отличное First Message.
→ 7. Не решай за {{user}}.
→ 8. Через Example Dialogue задай голос персонажа.
→ 9. Протестируй несколько генераций.
→ 10. Исправляй исходный prompt, а не накладывай сверху ещё 50 правил.
Именно это я бы назвал 80/20 всей статьи. Rentry
Если ты хочешь реально сделать бота сейчас, самый продуктивный следующий шаг — можно взять твою идею персонажа и по этой схеме собрать готовые поля Personality, Scenario, First Message и Example Dialogue, которые останется вставить в JanitorAI.