4 из 102 мин

По какой логике бот отвечает людям

Бот отвечает не по принципу “увидел сообщение → сразу сгенерировал текст”.

Сначала он решает, нужно ли вообще отвечать. Потом собирает контекст, подтягивает профиль и только после этого строит ответ.

Один из ключевых узлов выглядит так:

ctx = ann_build_context_from_db(chat_id, limit=ANN_CONTEXT_MSG_LIMIT, max_chars=ANN_CONTEXT_MAX_CHARS)
profile_block = _build_profile_prompt_block(last_user_text, base_max_tokens, mention_max_tokens)

messages = [
    {"role": "system", "content": system_prompt},
    {"role": "system", "content": profile_block},
    {"role": "user", "content": ctx},
]

Что здесь важно:

• ann_build_context_from_db(…)
Функция собирает контекст из базы данных.
То есть бот берет не только последнее сообщение, а историю разговора перед ответом.

• chat_id
Контекст собирается для конкретного чата.
Это защита от смешивания разных диалогов.

• limit=ANN_CONTEXT_MSG_LIMIT
Ограничивает, сколько сообщений брать в контекст.
Иначе prompt раздуется и станет шумным.

• max_chars=ANN_CONTEXT_MAX_CHARS
Дополнительно ограничивает размер контекста в символах.
Это нужно, чтобы не перегружать модель.

• _build_profile_prompt_block(…)
Отдельно строит блок профиля пользователя.
То есть бот подмешивает не только историю чата, но и накопленные наблюдения о человеке.

• last_user_text
В профильный блок передаётся последнее сообщение пользователя.
Это помогает выбрать более релевантный тон и факт из профиля.

• messages = […]
Это уже финальная сборка prompt-пакета перед генерацией.

• {“role”: “system”, “content”: system_prompt}
Главный системный слой.
Здесь лежит общий характер бота, его рамка и поведение.

• {“role”: “system”, “content”: profile_block}
Второй системный слой.
Здесь лежит персонализация: тон, факты, особенности конкретного человека.

• {“role”: “user”, “content”: ctx}
А здесь лежит уже сам собранный контекст разговора.

То есть логика такая:

  1. бот не отвечает “вслепую”
  2. сначала собирает историю диалога
  3. потом добавляет профиль человека
  4. потом соединяет это с общей философией и системными правилами
  5. и только после этого генерирует ответ

Именно поэтому его ответ держится не на одной последней реплике, а на нескольких слоях сразу:
контекст, профиль, память и системная логика. Бот отвечает не “на сообщение”, а на ситуацию разговора.

Оглавление серии
  1. Как из идеи книги родилось пространство для памяти, разговора и рециркуляции
  2. Из чего на самом деле состоит этот проект
  3. Память, профиль и контекст: на чем держится бот
  4. По какой логике бот отвечает людям
  5. Как я сделал систему, которая не даёт контенту исчезать
  6. Как философия проекта вшита в код
  7. Почему этот проект живёт не только в тексте
  8. Как бот собирает и обновляет профили людей
  9. Как я защищаю проект от хаоса, дублей и случайности
  10. Почему я писал этот код не ради автоматизации