Перейти к содержанию

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 под конкретный кейс: важно, чтобы системное сообщение оставалось конкретным и однозначным относительно набора допустимых меток.

Теоретические вопросы

  1. Каковы ключевые компоненты сообщения при работе с моделями GPT (ключи role и content), и почему важно их различать?
  2. Чем роль сообщений system отличается от роли сообщений user в диалоге с ИИ?
  3. Приведите пример того, как system-сообщение может задавать поведение или стиль ответа модели.
  4. Как последовательность сообщений systemuser влияет на ответ модели?
  5. В рассмотренном примере классификации отзывов, какие категории используются?
  6. Опишите сценарий, где полезна классификация тональности рецензии на фильм. Какие категории подойдут?
  7. Как классификация темы новостной статьи помогает в управлении контентом или рекомендациях? Приведите варианты категорий.
  8. Обсудите важность классификации клиентских обращений в бизнесе. Какие категории помогут оптимизировать поддержку?
  9. Какова роль user_message в задачах классификации, и как его структурировать для получения точных результатов?
  10. Чем полезна классификация тона постов в соцсетях для модерации или маркетинга? Приведите примеры категорий.