Today

Гайд на 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}} = персонаж, которым управляет AI.
  • {{user}} = персонаж/персона пользователя.
  • AI ≠ {{char}}.

Это важно.

Например, инструкция:

{{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...

Такой prompt:

  • расходует контекст;
  • может противоречить сам себе;
  • иногда конфликтует с другими инструкциями;
  • часто пытается исправить проблемы, которые лучше исправлять структурой самого персонажа.

Автор рекомендует вообще не использовать 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.

AI уже решил:

  • куда пользователь пошёл;
  • что увидел;
  • что почувствовал;
  • что сказал.

Модель видит такой паттерн и может продолжать его.

Автор советует строить сцену из 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. Проверь согласованность

Если First Message написано:

third person

то Example Dialogue тоже лучше делать:

third person.

Если narration оформлено одним способом — придерживайся его везде.

Если персонаж говорит коротко — не давай ему примеры монологов на три страницы.

Автор отдельно подчёркивает ценность consistent formatting. Rentry


Шаг 16. Сделай Title + Description

Название должно быстро объяснять, что это за опыт.

Не просто:

Alex

а, например:

The Detective Who Investigates Impossible Cases

Description:

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?"

И регенерируй ответ 5–10 раз.

Смотри:

  • управляет ли бот пользователем;
  • сохраняется ли характер;
  • сохраняется ли 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.