0Pricing
AI Prompt Engineering · Lekcja

LLM jako klasyfikator tekstu

Używaj promptów do klasyfikacji sentymentu, intencji, tematów i wielu etykiet.

LLM jako klasyfikator tekstu to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

LLM-y jako klasyfikatory tekstu

Tradycyjna klasyfikacja tekstu wymaga oznaczonych danych treningowych, dostrajania modelu i infrastruktury wdrożeniowej. LLM-y mogą klasyfikować tekst wyłącznie za pomocą promptu — dane treningowe nie są wymagane.

Klasyfikatory oparte na LLM-ach sprawdzają się szczególnie dobrze, gdy:

  • Kategorie wymagają rozumienia semantyki, a nie tylko dopasowywania słów kluczowych
  • Trzeba dodawać nowe kategorie bez ponownego trenowania modelu
  • Dostępna jest niewielka liczba oznaczonych przykładów
  • Kategorie są niuansowe (dotyczą intencji wiadomości, a nie tylko jej tematu)

Klasyfikacja sentymentu

Sentyment jest jednym z najczęstszych zadań klasyfikacyjnych. Dobrze przygotowany prompt daje lepsze wyniki niż proste dopasowywanie słów kluczowych w niejednoznacznych przypadkach:

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!'))

Klasyfikacja intencji

Klasyfikacja intencji identyfikuje, co użytkownik próbuje zrobić — jest niezbędna w chatbotach, systemach wsparcia i aplikacjach wyszukiwawczych:

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?'))

Klasyfikacja tematyczna

Klasyfikacja tematyczna przypisuje tekstowi kategorię tematyczną. Jest przydatna do kierowania treści, filtrowania kanałów oraz kategoryzowania zgłoszeń do pomocy technicznej:

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)

Klasyfikacja pilności

Klasyfikacja pilności pomaga ustalać priorytety zgłoszeń do pomocy technicznej, wiadomości e-mail i incydentów. Precyzyjne zdefiniowanie poziomów pilności ma kluczowe znaczenie:

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.'))

Klasyfikacja wieloetykietowa

Czasami tekst należy jednocześnie do wielu kategorii. Klasyfikacja wieloetykietowa zwraca wszystkie pasujące kategorie:

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))

Szablony promptów do klasyfikacji

Uniwersalny, wielokrotnego użytku szablon promptu do klasyfikacji, działający z dowolnym zestawem kategorii:

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])

Obsługa niejednoznacznych klasyfikacji

Niektóre dane wejściowe rzeczywiście pasują do wielu kategorii. Należy projektować prompty do klasyfikacji tak, aby jawnie obsługiwały niejednoznaczność:

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))

Klasyfikacja wsadowa dla większej wydajności

Klasyfikowanie elementów jeden po drugim jest kosztowne. Klasyfikacja wsadowa przetwarza wiele danych wejściowych w jednym wywołaniu API:

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"]})')

Ocena dokładności klasyfikatora

Klasyfikatory LLM wymagają systematycznej oceny na podstawie oznaczonych przykładów. Należy utworzyć niewielki zbiór testowy i zmierzyć dokładność:

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)

Przykłady few-shot w promptach do klasyfikacji

Dodanie przykładów few-shot do promptu do klasyfikacji poprawia dokładność w przypadkach granicznych i przy niuansowych kategoriach. Należy umieścić 2–3 przykłady pokazujące różnicę między podobnymi kategoriami:

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)

Szybki test

Jaka jest główna zaleta używania LLM do klasyfikacji tekstu w porównaniu z tradycyjnie wytrenowanym klasyfikatorem?

LLM jako klasyfikator — najważniejsze wnioski

Klasyfikacja oparta na LLM jest wydajna, elastyczna i szybka we wdrożeniu:

  • Należy definiować kategorie za pomocą opisów, a nie samych nazw, aby poprawnie obsługiwać niuansowe przypadki
  • Dla każdej klasyfikacji należy zwracać JSON zawierający kategorię i poziom pewności
  • Typowe zastosowania to: sentyment (pozytywny/negatywny/neutralny), intencja, temat i pilność
  • Klasyfikacja wieloetykietowa zwraca wszystkie pasujące kategorie oraz główną etykietę
  • Klasyfikacja wsadowa przetwarza wiele danych wejściowych w jednym wywołaniu API, zwiększając wydajność
  • Niejednoznaczne dane wejściowe należy obsługiwać jawnie — prosić o główną kategorię, alternatywy i uzasadnienie
  • Przed wdrożeniem produkcyjnym należy ocenić dokładność na podstawie oznaczonego zbioru testowego

Często zadawane pytania

Czy lekcja „LLM jako klasyfikator tekstu” jest bezpłatna?

Tak — pełny tekst „LLM jako klasyfikator tekstu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Co nauczysz się w „LLM jako klasyfikator tekstu”?

Używaj promptów do klasyfikacji sentymentu, intencji, tematów i wielu etykiet. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?

Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „LLM jako klasyfikator tekstu”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?

Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Prompty do ekstrakcji nazwanych jednostek
  2. Ekstrakcja danych sterowana schematem
  3. LLM jako klasyfikator tekstu
  4. Pewność i niepewność w klasyfikacji
← Powrót do AI Prompt Engineering