Устройство интерфейса чата
Как работают чат-интерфейсы LLM: роли, ходы и контекст сеанса
«Устройство интерфейса чата» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
Три роли
Каждый диалог с LLM строится на трёх ролях: системной, пользовательской и ассистентской.
Роль system задаёт правила и образ до начала диалога. Роль user — это отправка Вами сообщений. Роль assistant — это ответы модели.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
message = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system='You are a helpful cooking assistant.',
messages=[
{'role': 'user', 'content': 'What is mise en place?'}
]
)
print(message.content[0].text)Системное сообщение
Системное сообщение — это руководство по эксплуатации модели. Оно выполняется до первого сообщения пользователя и остаётся активным на протяжении всего сеанса.
Используйте его, чтобы задать образ, тон, ограничения предметной области или формат вывода. Модель воспринимает его как направляющий контекст на протяжении всего диалога.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{
'role': 'system',
'content': 'You are a senior Python engineer. '
'Always include type hints and docstrings in your examples.'
},
{
'role': 'user',
'content': 'Show me a function that parses JSON safely.'
}
]
)
print(response.choices[0].message.content)Ходы и развитие диалога
Диалог представляет собой последовательность ходов. Каждый ход чередуется: пользователь говорит, ассистент отвечает, затем пользователь снова говорит.
При каждом запросе модель видит всю историю ходов. Благодаря этому диалог воспринимается как непрерывный, однако технически каждый вызов программного интерфейса не сохраняет состояние и каждый раз получает полный контекст.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Each call sends the FULL conversation history
history = [
{'role': 'system', 'content': 'You are a geography tutor.'},
{'role': 'user', 'content': 'What is the capital of France?'},
{'role': 'assistant', 'content': 'The capital of France is Paris.'},
{'role': 'user', 'content': 'And its population?'} # follow-up turn
]
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
print(response.choices[0].message.content)Контекст сеанса
Контекст сеанса — это сохраняемая память Вашего диалога. Каждое сообщение пользователя и ассистента накапливается в массиве истории.
У модели нет отдельного хранилища памяти — она рассуждает исключительно на основе того, что видит в текущем контекстном окне. Если Вы начнёте новый сеанс, модель не будет помнить предыдущие сеансы, если только Вы повторно не передадите ей эту информацию.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Simulating 3-turn session context
conversation = [
{'role': 'user', 'content': 'My name is Alex.'},
{'role': 'assistant', 'content': 'Nice to meet you, Alex!'},
{'role': 'user', 'content': 'What is 5 times 7?'},
{'role': 'assistant', 'content': '5 times 7 is 35.'},
{'role': 'user', 'content': 'Can you repeat my name?'} # uses session context
]
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=conversation
)
print(response.content[0].text) # expects: Your name is Alex.Структура истории сообщений
История сообщений — это просто список словарей, каждый из которых содержит ключи role и content.
Вы самостоятельно управляете этим списком в коде. После каждого ответа ассистента примените append к этому ответу, затем примените append к следующему сообщению пользователя — и при следующем вызове снова отправьте весь список.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def chat(history, user_message):
history.append({'role': 'user', 'content': user_message})
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
return reply, history
history = [{'role': 'system', 'content': 'You are a math tutor.'}]
reply, history = chat(history, 'What is a prime number?')
print(reply)
print('History length:', len(history))Ограничения на количество токенов
У каждой модели есть контекстное окно, измеряемое в токенах. Один токен — это примерно 4 символа или 0,75 слова в английском языке.
И Ваши входные данные (системное сообщение и вся история), и выходные данные модели учитываются в этом ограничении. GPT-4o поддерживает 128 тыс. токенов; Claude Opus 4.5 — 200 тыс. Когда предел достигнут, старые сообщения необходимо удалить или суммировать.
import tiktoken
# Count tokens before sending to avoid exceeding the limit
encoding = tiktoken.encoding_for_model('gpt-4o')
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Explain quantum entanglement in simple terms.'}
]
total_tokens = 0
for msg in messages:
total_tokens += len(encoding.encode(msg['content']))
total_tokens += 4 # overhead per message
print(f'Estimated input tokens: {total_tokens}')
print(f'GPT-4o limit: 128,000 tokens')
print(f'Budget remaining: {128000 - total_tokens:,} tokens')Что происходит при достижении ограничения на количество токенов
Когда история диалога выходит за пределы контекстного окна, есть три варианта:
- Обрезка — удалить самые старые сообщения
- Суммирование — вызвать ask, чтобы попросить модель сжать предыдущие реплики до краткого резюме
- Скользящее окно — сохранять только последние N сообщений
Неверный выбор стратегии может привести к тому, что модель потеряет важный контекст и начнёт отвечать бессвязно.
def trim_history(history, max_messages=10, keep_system=True):
'''Keep the system message and the last N non-system messages.'''
system_msgs = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
if len(non_system) > max_messages:
non_system = non_system[-max_messages:]
print(f'Trimmed to last {max_messages} messages.')
return system_msgs + non_system if keep_system else non_system
history = [{'role': 'system', 'content': 'You are a tutor.'}]
for i in range(15):
history.append({'role': 'user', 'content': f'Question {i}'})
history.append({'role': 'assistant', 'content': f'Answer {i}'})
trimmed = trim_history(history, max_messages=6)
print('Trimmed history length:', len(trimmed))Контекст в многоходовом диалоге на практике
Рассмотрим контекст в действии. В многоходовом диалоге модель использует каждое предыдущее сообщение, чтобы правильно отвечать на уточняющие вопросы.
Вот почему можно сказать «объясните это проще», не повторяя, что именно означает «это»: модель видит всю историю и понимает, на что Вы ссылаетесь.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a science teacher.'}]
# Turn 1
history.append({'role': 'user', 'content': 'What is photosynthesis?'})
r1 = client.chat.completions.create(model='gpt-4o', messages=history)
reply1 = r1.choices[0].message.content
history.append({'role': 'assistant', 'content': reply1})
# Turn 2 — refers to prior answer without repeating it
history.append({'role': 'user', 'content': 'Can you explain that using only 3 bullet points?'})
r2 = client.chat.completions.create(model='gpt-4o', messages=history)
print(r2.choices[0].message.content)API без состояния, интерфейс с состоянием
Вот важный вывод: API полностью не сохраняет состояние. Сервер ничего не запоминает между вызовами.
Продукты для чатов, такие как ChatGPT, используют create для создания иллюзии памяти: они сохраняют историю диалога в собственной базе данных и добавляют её обратно в каждый вызов API. Вы можете самостоятельно создать такой же механизм.
# Illustration: two isolated API calls vs one with history
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# ❌ WITHOUT history — model has no memory
r1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'My dog is named Biscuit.'}]
)
r2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': "What's my dog's name?"}]
)
print('Without history:', r2.choices[0].message.content) # will not know
# ✅ WITH history injected
r3 = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'My dog is named Biscuit.'},
{'role': 'assistant', 'content': 'Got it, your dog is named Biscuit!'},
{'role': 'user', 'content': "What's my dog's name?"}
]
)
print('With history:', r3.choices[0].message.content)Практические советы по использованию интерфейса чата
Чтобы получить максимум от интерфейса чата:
- Размещайте постоянные инструкции в системном сообщении, а не повторяйте их в каждой реплике пользователя
- Делайте предыдущие реплики краткими — подробная история быстро расходует токены
- Начинайте новый сеанс при смене темы, чтобы избежать загрязнения контекста
- При возобновлении долгого проекта добавляйте только нужную часть предыдущего контекста
# Good practice: compact system message + focused history
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
system = (
'You are a concise Python code reviewer. '
'Reply with: 1) one-line verdict, 2) top 3 issues, 3) fixed snippet.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
system=system,
messages=[
{'role': 'user', 'content': 'def add(a,b): return a+b\nprint(add(1,2))'}
]
)
print(response.content[0].text)Повторение: интерфейс чата
Рассмотрим основные идеи о работе интерфейса чата:
- Три роли: система задаёт правила, пользователь отправляет запросы, ассистент отвечает
- Вся история отправляется при каждом вызове API — сервер не сохраняет состояние
- Ограничения на количество токенов ограничивают общий контекст; при приближении к ним обрезайте историю или суммируйте её
- Контекст сеанса — это всего лишь список, которым Вы управляете в собственном коде
- Начинайте новые сеансы при смене темы, чтобы контекст оставался чистым
# Summary: minimal chat loop skeleton
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
def ask(question):
history.append({'role': 'user', 'content': question})
res = client.chat.completions.create(model='gpt-4o', messages=history)
answer = res.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
return answer
print(ask('Hello! What can you help me with?'))Проверка знаний
Проверьте, как устроен интерфейс чата.
Пользователь начинает совершенно новый сеанс и спрашивает ИИ: «Что мы обсуждали вчера?» У ИИ нет памяти о вчерашнем сеансе. Почему?
Что Вы узнали
Теперь Вы понимаете основу каждого взаимодействия с ИИ в чате:
- Структуру ролей система/пользователь/ассистент, формирующую каждый диалог
- Как полная история сообщений отправляется при каждом вызове, имитируя память
- Почему API не сохраняет состояние и как продукты для чатов создают поверх него память
- Как ограничения на количество токенов ограничивают контекст и как ими управлять
Эта модель мышления поможет Вам составлять более качественные запросы и создавать более интеллектуальные приложения на основе ИИ.
Изучай AI Prompt Engineering с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 53
- Уроки
- 199
Часто задаваемые вопросы
Урок «Устройство интерфейса чата» бесплатный?
Да — полный текст урока «Устройство интерфейса чата» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «Устройство интерфейса чата»?
Как работают чат-интерфейсы LLM: роли, ходы и контекст сеанса Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Устройство интерфейса чата»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Устройство интерфейса чата
- Типы запросов, с которыми может работать искусственный интеллект
- Как искусственный интеллект создает ответы
- Чего искусственный интеллект не умеет