1.2 Классификация
В задачах классификации мы задаём модели понятный контекст и просим отнести данный текст к одной из заранее определённых категорий. Роли сообщений в таком диалоге просты и взаимодополняемы: системное сообщение описывает постановку задачи и перечисляет допустимые классы, а пользовательское сообщение содержит сам фрагмент текста для отнесения к одному из этих классов. Такой порядок — сначала система, затем пользователь — формирует однозначный контекст, в рамках которого модель отвечает предсказуемо и воспроизводимо.
Чтобы зафиксировать формат, начнём с самого компактного примера: классифицируем отзыв клиента по тональности — «Положительный», «Отрицательный» или «Нейтральный». Системное сообщение даёт прямую инструкцию, пользовательское — представляет текст отзыва, который требуется оценить.
system_message = """Классифицируй отзыв клиента в одну из категорий: Положительный, Отрицательный или Нейтральный."""
Для user_message
используем отзыв, который нужно классифицировать:
user_message = """Я недавно купил товар в вашем магазине. Покупка прошла отлично, а качество товара превзошло мои ожидания!"""
Такой диалог строится на общей схеме Chat Completions API: каждое сообщение — это структура с ключами role
и content
. role
указывает источник (система или пользователь), а content
содержит текст. Разделение ролей позволяет инициализировать поведение модели заранее, а затем передавать ей конкретный ввод. В простейшем случае последовательность выглядит так: системное сообщение задаёт правила и стиль, а пользовательское формулирует задачу. Например, если вам нужно получить игривый стих о счастливой морковке, вы вначале можете указать установку модели {'role': 'system', 'content': "Ты — помощник, отвечающий в стиле игривого поэта."}
, а затем отправить запрос {'role': 'user', 'content': "Напиши очень короткое стихотворение о счастливой морковке."}
. Один и тот же пользовательский запрос в другом системном контексте дал бы уже иной по тону и форме результат, поэтому последовательность system → user
— ключ к контролю поведения модели.
Полный рабочий пример для задачи классификации отзывов собирается из этих же элементов и отличается лишь тем, что мы вызываем модель программно и возвращаем ответ:
import os
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # читаем локальный .env
client = OpenAI()
def classify(messages, model="gpt-4o-mini", temperature=0, max_tokens=500):
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
max_tokens=max_tokens,
)
return response.choices[0].message["content"]
delimiter = "####"
system_message = """Классифицируй отзыв клиента в одну из категорий: Положительный, Отрицательный или Нейтральный."""
user_message = """Я недавно купил товар в вашем магазине. Покупка прошла отлично, а качество товара превзошло мои ожидания!"""
messages = [
{'role': 'system', 'content': system_message},
{'role': 'user', 'content': f"{delimiter}{user_message}{delimiter}"},
]
response = classify(messages)
print(response)
На тех же принципах строятся и другие сценарии классификации. В электронной почте удобно отличать рабочие письма от личных и спама (категории: Работа, Личное, Спам). Формулировка системного сообщения может быть: «Классифицируй следующее письмо как Работа, Личное или Спам.», а пример пользовательского: «Отличные скидки на нашу новую электронику! Жми сейчас и экономь.» В анализе тональности рецензий на фильмы полезно различать «Положительный», «Отрицательный» и «Нейтральный» оттенки: системное сообщение — «Определи тональность следующего отзыва о фильме: Положительный, Отрицательный или Нейтральный.», пользовательское — «Визуально фильм потрясающий, но сюжет предсказуем и неглубокий.» Если речь о новостях, удобно классифицировать тему материала как Политика, Технологии, Спорт или Развлечения: «Определи тему новости: Политика, Технологии, Спорт или Развлечения.» и «Новая модель смартфона использует прорывные технологии, меняющие отрасль.»
Для оценок продуктов по отзывам подойдут классы по звёздам — 1, 2, 3, 4 или 5: «По содержанию отзыва определи рейтинг от 1 до 5 звезд.» и «Дизайн интересный, но частые поломки и слабая поддержка мешают рекомендовать.» При маршрутизации клиентских обращений часто выделяют намерения: Биллинг, Техподдержка, Продажи или Общий вопрос — «Определи намерение запроса: Биллинг, Техподдержка, Продажи или Общий вопрос.» и «Расскажите про доступные тарифы и текущие акции.» Определяя жанр текста, можно использовать категории Художественный, Нон-фикшн, Поэзия, Новости — «Определи жанр текста: Художественный, Нон-фикшн, Поэзия или Новости.» и «В сердце города, среди шумных улиц, скрывался сад, не тронутый временем.»
В социальных сетях ценна автоматическая оценка тона публикации — Серьёзный, Ироничный, Вдохновляющий или Раздражённый. Здесь подойдёт системное сообщение «Определи тон следующего поста: Серьезный, Ироничный, Вдохновляющий или Раздраженный.», а пример пользовательского: «Нет ничего лучше, чем начать день с улыбки. Счастье заразительно!» В академических текстах полезно классифицировать область знания: Биология, Компьютерные науки, Психология или Математика — «Определи область следующей аннотации: Биология, Компьютерные науки, Психология или Математика.» и «Исследование изучает алгоритмическую сложность методов сортировки и их эффективность.» В гастрономических отзывах возможно выделение вкусового профиля: Сладкий, Солёный, Кислый, Горький, Умами — «Определи вкусовой профиль в отзыве: Сладкий, Соленый, Кислый, Горький или Умами.» и «Блюдо с идеальным балансом умами и легкой сладостью, усиливающей вкус.» Наконец, для экстренных вызовов важно быстро определить тип ситуации: Пожар, Медицинский, Преступление или Другое — «Определи тип экстренной ситуации по расшифровке звонка: Пожар, Медицинский, Преступление или Другое.» и «Соседнее здание в дыму, видим пламя. Просьба срочно помочь!» Во всех этих случаях ключ к качественным ответам — ясная формулировка системного сообщения, где чётко указаны границы и перечень категорий; пользовательское сообщение остаётся лаконичным носителем того текста, который требуется отнести к одному из классов.
Для каждого из таких сценариев можно свободно менять содержимое user_message
под конкретный кейс: важно, чтобы системное сообщение оставалось конкретным и однозначным относительно набора допустимых меток.
Теоретические вопросы
- Каковы ключевые компоненты сообщения при работе с моделями GPT (ключи
role
иcontent
), и почему важно их различать? - Чем роль сообщений
system
отличается от роли сообщенийuser
в диалоге с ИИ? - Приведите пример того, как
system
-сообщение может задавать поведение или стиль ответа модели. - Как последовательность сообщений
system
→user
влияет на ответ модели? - В рассмотренном примере классификации отзывов, какие категории используются?
- Опишите сценарий, где полезна классификация тональности рецензии на фильм. Какие категории подойдут?
- Как классификация темы новостной статьи помогает в управлении контентом или рекомендациях? Приведите варианты категорий.
- Обсудите важность классификации клиентских обращений в бизнесе. Какие категории помогут оптимизировать поддержку?
- Какова роль
user_message
в задачах классификации, и как его структурировать для получения точных результатов? - Чем полезна классификация тона постов в соцсетях для модерации или маркетинга? Приведите примеры категорий.