LLM в роли классификатора текста
Используйте запросы для классификации тональности, намерений, тем и нескольких меток
«LLM в роли классификатора текста» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
LLM как классификаторы текста
Для традиционной классификации текста требуются размеченные данные для обучения, дообучение модели и инфраструктура для развёртывания. LLM может классифицировать текст с помощью одной инструкции — данные для обучения не требуются.
Классификаторы на основе LLM особенно эффективны, когда:
- Категории требуют смыслового понимания, а не только сопоставления ключевых слов
- Нужно добавлять новые категории без повторного обучения
- У Вас мало размеченных примеров
- Категории требуют тонкого различения (намерение сообщения, а не только его тема)
Классификация тональности
Тональность — одна из самых распространённых задач классификации. Хорошо составленная инструкция превосходит простое сопоставление ключевых слов в неоднозначных случаях:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
def classify_sentiment(text):
prompt = f'''
Classify the sentiment of the text below.
Return ONLY JSON: {{"sentiment": "positive|negative|neutral", "confidence": "high|medium|low"}}
Definitions:
- positive: Overall favorable opinion or emotion
- negative: Overall unfavorable opinion or dissatisfaction
- neutral: Factual, balanced, or no clear sentiment
Text: {text}
'''
r = client.messages.create(
model='claude-opus-4-5', max_tokens=50,
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(r.content[0].text)
print(classify_sentiment('The product works but setup was painful.'))
print(classify_sentiment('Delivery was incredibly fast and packaging was perfect!'))Классификация намерений
Классификация намерений определяет, что пытается сделать пользователь, — это необходимо для чат-ботов, систем поддержки и поисковых приложений:
INTENT_CATEGORIES = [
'purchase_intent: User wants to buy or is ready to purchase',
'complaint: User is dissatisfied and reporting a problem',
'question: User is asking for information or help',
'cancellation: User wants to cancel a service or subscription',
'compliment: User is expressing satisfaction or praise',
'other: Does not fit any category above'
]
def classify_intent(message):
categories_str = '\n'.join(f'- {c}' for c in INTENT_CATEGORIES)
prompt = f'''
Classify the intent of this customer message.
Return JSON: {{"intent": str, "confidence": "high|medium|low"}}
Categories:
{categories_str}
Message: {message}
'''
r = client.messages.create(model='claude-opus-4-5', max_tokens=80, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
print(classify_intent('I love the app but I need to cancel my plan.'))
print(classify_intent('How do I export my data to CSV?'))Классификация по темам
Классификация по темам присваивает тексту тематическую категорию. Это полезно для маршрутизации содержимого, фильтрации лент и категоризации обращений в службу поддержки:
def classify_topic(article_text, topics):
topic_list = ', '.join(topics)
prompt = f'''
Classify the topic of this article. Choose EXACTLY ONE from the list.
Return JSON: {{"topic": str, "secondary_topic": str or null}}
Available topics: {topic_list}
Article (first 300 chars): {article_text[:300]}
'''
r = client.messages.create(model='claude-opus-4-5', max_tokens=80, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
topics = ['technology', 'sports', 'politics', 'business', 'science', 'health', 'entertainment']
text = 'The FDA approved a new mRNA vaccine for seasonal influenza, marking a breakthrough in vaccine technology.'
result = classify_topic(text, topics)
print(result)Классификация срочности
Классификация срочности помогает расставлять приоритеты для обращений в службу поддержки, электронных писем и инцидентов. Точное определение уровней срочности имеет решающее значение:
URGENCY_PROMPT = '''
Classify the urgency of this support ticket.
Return JSON: {{"urgency": str, "reason": str}}
Urgency levels:
- critical: Service is completely down, data loss occurring, or security breach
- high: Major functionality broken, many users affected, no workaround
- medium: Non-critical feature broken, workaround exists, single user affected
- low: Cosmetic issue, enhancement request, general question
Be conservative: only use critical if the ticket explicitly describes a system-wide outage or data loss.
Ticket: {ticket}
'''
def classify_urgency(ticket_text):
prompt = URGENCY_PROMPT.replace('{ticket}', ticket_text)
r = client.messages.create(model='claude-opus-4-5', max_tokens=100, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
print(classify_urgency('The entire production database is down. All customers affected.'))
print(classify_urgency('Dark mode button is slightly off-center.'))Многометочная классификация
Иногда фрагмент текста одновременно относится к нескольким категориям. Многометочная классификация возвращает все применимые категории:
def multi_label_classify(text, labels):
label_list = ', '.join(labels)
prompt = f'''
Classify this text. It may belong to multiple categories.
Return JSON: {{"labels": [str], "primary_label": str}}
Available labels: {label_list}
Rules:
- Include all labels that clearly apply
- Do NOT include labels that only marginally apply
- primary_label is the single most relevant label
Text: {text}
'''
r = client.messages.create(model='claude-opus-4-5', max_tokens=100, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
labels = ['technical', 'billing', 'account', 'bug_report', 'feature_request', 'security']
text = 'I found a bug that exposes other users billing information on my account page.'
print(multi_label_classify(text, labels))Шаблоны промптов для классификации
Многоразовый шаблон промпта классификации, работающий с любым набором категорий:
def build_classifier(category_definitions, additional_rules=''):
cats = '\n'.join(f'- {k}: {v}' for k, v in category_definitions.items())
return f'''
Classify the input text into exactly one category below.
Return JSON: {{"category": str, "confidence": "high|medium|low"}}
Categories:
{cats}
{('\nAdditional rules:\n' + additional_rules) if additional_rules else ''}
Text: {{text}}
'''
language_classifier = build_classifier({
'formal': 'Business or academic writing, professional context',
'informal': 'Casual, conversational, slang or colloquial',
'technical': 'Domain-specific jargon, code, or specialized terminology',
'emotional': 'High emotional content, personal, expressive'
})
print(language_classifier[:200])Обработка неоднозначных результатов классификации
Некоторые входные данные действительно подходят под несколько категорий. Проектируйте промпты классификации так, чтобы они явно обрабатывали неоднозначность:
AMBIGUITY_PROMPT = '''
Classify this customer message. If the message is ambiguous or could fit multiple categories,
choose the category that would be most useful for routing it to the correct team.
Return JSON:
{{
"category": str,
"is_ambiguous": true | false,
"alternative": str or null,
"reasoning": str
}}
Categories: billing, technical_support, sales, account_management
Message: {message}
'''
message = 'I upgraded my plan but I am still seeing the free tier features.'
r = client.messages.create(
model='claude-opus-4-5', max_tokens=150,
messages=[{'role': 'user', 'content': AMBIGUITY_PROMPT.format(message=message)}]
)
print(json.loads(r.content[0].text))Пакетная классификация для повышения эффективности
Классификация элементов по одному обходится дорого. Пакетная классификация обрабатывает несколько входных данных за один вызов программного интерфейса:
def batch_classify(items, categories):
items_str = '\n'.join(f'{i+1}. {item}' for i, item in enumerate(items))
cat_str = ', '.join(categories)
prompt = f'''
Classify each item below. Categories: {cat_str}
Return JSON: {{"results": [{{"id": int, "category": str, "confidence": str}}]}}
Items:
{items_str}
'''
r = client.messages.create(model='claude-opus-4-5', max_tokens=300, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)['results']
texts = [
'Absolutely love this product!',
'It crashed twice today.',
'What is your refund policy?',
'The color options are limited.'
]
results = batch_classify(texts, ['positive_feedback', 'bug_report', 'inquiry', 'feature_request'])
for r in results:
print(f'{texts[r["id"]-1][:30]}... -> {r["category"]} ({r["confidence"]})')Оценка точности классификатора
Классификаторы на основе LLM требуют систематической оценки на размеченных примерах. Создайте небольшой набор для тестирования и измерьте точность:
labeled_test_set = [
{'text': 'Great product, no issues!', 'expected': 'positive'},
{'text': 'The app keeps crashing on startup.', 'expected': 'negative'},
{'text': 'The screen resolution is 1080p.', 'expected': 'neutral'},
{'text': 'Worst experience of my life.', 'expected': 'negative'},
{'text': 'Works as advertised, decent value.', 'expected': 'positive'},
]
def evaluate_classifier(test_set, classify_fn):
correct = 0
for example in test_set:
result = classify_fn(example['text'])
if result['sentiment'] == example['expected']:
correct += 1
else:
print(f'WRONG: "{example["text"][:40]}" -> got {result["sentiment"]}, expected {example["expected"]}')
accuracy = correct / len(test_set)
print(f'Accuracy: {correct}/{len(test_set)} = {accuracy:.0%}')
return accuracy
evaluate_classifier(labeled_test_set, classify_sentiment)Примеры на нескольких образцах в промптах классификации
Добавление примеров на нескольких образцах в промпт классификации повышает точность для пограничных случаев и категорий с тонкими различиями. Разместите 2–3 примера, демонстрирующих различие между похожими категориями:
few_shot_classifier = '''
Classify each customer message as: billing, technical, or general.
Examples:
Input: "I was charged twice for this month." -> billing
Input: "The app crashes when I open the dashboard." -> technical
Input: "Do you have a mobile app?" -> general
Input: "My invoice shows the wrong plan." -> billing
Input: "I cannot log in, I get error 403." -> technical
Now classify:
Input: {message}
Return JSON: {"category": str, "confidence": "high|medium|low"}
'''
message = "My subscription was renewed but I cancelled last week."
prompt = few_shot_classifier.replace("{message}", message)
print(prompt)Быстрая проверка
Каково главное преимущество использования LLM для классификации текста по сравнению с традиционным обученным классификатором?
LLM в роли классификатора — основные выводы
Классификация на основе LLM отличается мощностью, гибкостью и быстротой внедрения:
- Определяйте категории с помощью описаний, а не только названий, чтобы правильно обрабатывать неоднозначные случаи
- Возвращайте JSON с категорией и уровнем уверенности для каждого результата классификации
- Распространённые варианты применения: тональность (положительная, отрицательная, нейтральная), намерение, тема, срочность
- Многометочная классификация возвращает все применимые категории и основную метку
- Пакетная классификация обрабатывает несколько входных данных за один вызов программного интерфейса, что повышает эффективность
- Явно обрабатывайте неоднозначные входные данные: запрашивайте основную категорию, альтернативы и обоснование
- Оценивайте точность на размеченном наборе для тестирования до развёртывания в рабочей среде
Часто задаваемые вопросы
Урок «LLM в роли классификатора текста» бесплатный?
Да — полный текст урока «LLM в роли классификатора текста» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «LLM в роли классификатора текста»?
Используйте запросы для классификации тональности, намерений, тем и нескольких меток Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «LLM в роли классификатора текста»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Запросы для извлечения именованных сущностей
- Извлечение данных по схеме
- LLM в роли классификатора текста
- Уверенность и неопределённость при классификации