Prompty oceniania oparte na rubrykach
Ustrukturyzowane kryteria oceny: dokładność, płynność, trafność i bezpieczeństwo (skale 1–5).
Prompty oceniania oparte na rubrykach to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 2 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.
Czym jest ocenianie na podstawie rubryki?
Ocenianie na podstawie rubryki polega na przekazaniu sędziemu LLM uporządkowanego zestawu kryteriów z wyraźnymi definicjami każdego poziomu oceny. Zamiast pytać „jak dobre to jest?”, należy zapytać „jaką ocenę uzyskuje to w każdym z tych konkretnych wymiarów?”
Rubryki ograniczają stronniczość, zwiększają spójność oraz sprawiają, że wyniki ewaluacji są zrozumiałe i można na ich podstawie podjąć konkretne działania.
Budowa rubryki oceniania
Dobrze zaprojektowana rubryka składa się z trzech elementów:
- Nazwy kryteriów: jakie wymiary należy oceniać (trafność faktograficzna, kompletność, jasność)
- Zakotwiczenia ocen: wyraźne definicje tego, co oznacza każda ocena dla danego kryterium
- Waga lub priorytet: które kryteria są najważniejsze w danym zastosowaniu
Każdy z tych elementów sprawia, że praca sędziego jest bardziej ograniczona regułami i możliwa do powtórzenia.
Prompt rubryki z trzema kryteriami
Oto konkretny szablon promptu z rubryką do oceniania odpowiedzi AI pod kątem trafności faktograficznej, kompletności i jasności. Sędzia zwraca uporządkowany JSON z ocenami dla poszczególnych kryteriów.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
RUBRIC_PROMPT = (
'Score this response on a scale of 1-5 for each criterion:\n\n'
'ACCURACY: Is the response factually correct?\n'
' 1=Contains significant factual errors\n'
' 3=Mostly correct with minor inaccuracies\n'
' 5=Completely accurate with no errors\n\n'
'COMPLETENESS: Did it answer everything asked?\n'
' 1=Missed most of the question\n'
' 3=Answered the main question but missed sub-parts\n'
' 5=Addressed every part of the question\n\n'
'CLARITY: Is it easy to understand?\n'
' 1=Confusing, hard to follow\n'
' 3=Understandable but could be clearer\n'
' 5=Exceptionally clear and well-organized\n\n'
'Question: {question}\n'
'Response: {response}\n\n'
'Return JSON: {{"accuracy": N, "completeness": N, "clarity": N, '
'"overall": N, "notes": "one sentence"}}'
)
def rubric_judge(question, response):
prompt = RUBRIC_PROMPT.format(question=question, response=response)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(r.content[0].text)
result = rubric_judge(
question='What is a REST API?',
response='A REST API is a way for applications to communicate over HTTP.'
)
print(result)Ocenianie ważone
Nie wszystkie kryteria są równie ważne. W przypadku bota do obsługi klienta pomocność ma większe znaczenie niż styl literacki. Ocenianie ważone pozwala uwzględnić te priorytety w obliczaniu oceny końcowej.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def weighted_rubric_judge(question, response, weights):
"""
weights: dict of criterion -> weight (should sum to 1.0)
Example: {'accuracy': 0.5, 'completeness': 0.3, 'clarity': 0.2}
"""
RUBRIC = (
'Score this response 1-5 on:\n'
'Accuracy: Is it factually correct?\n'
'Completeness: Does it cover the full question?\n'
'Clarity: Is it easy to understand?\n\n'
'Q: {q}\nA: {a}\n\n'
'Return JSON: {{"accuracy":N,"completeness":N,"clarity":N}}'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': RUBRIC.format(q=question, a=response)}]
)
scores = json.loads(r.content[0].text)
# Calculate weighted average
weighted_score = sum(
scores[criterion] * weight
for criterion, weight in weights.items()
if criterion in scores
)
print(f'Individual scores: {scores}')
print(f'Weighted score: {weighted_score:.2f}/5')
return weighted_score
weighted_rubric_judge(
'How do I reverse a string in Python?',
'Use slicing: s[::-1]',
weights={'accuracy': 0.5, 'completeness': 0.3, 'clarity': 0.2}
)Kryterium: trafność faktograficzna
Trafność faktograficzna jest najważniejszym kryterium w zadaniach wymagających dużej wiedzy. Specjalna rubryka trafności instruuje sędziego, aby zwracał szczególną uwagę na błędne fakty, nieaktualne informacje i twierdzenia bez uzasadnienia.
ACCURACY_RUBRIC = (
'Evaluate FACTUAL ACCURACY of the following response.\n\n'
'Score 1-5:\n'
'1 = Multiple factual errors that fundamentally mislead the reader\n'
'2 = At least one significant factual error (wrong date, number, or core fact)\n'
'3 = Factually correct but includes minor imprecisions or over-generalizations\n'
'4 = Factually correct with appropriate hedging of uncertain claims\n'
'5 = Factually precise, no errors, and correctly acknowledges uncertainty where present\n\n'
'Check specifically for:\n'
'- Wrong dates, statistics, or numerical values\n'
'- Misattributed quotes or inventions\n'
'- Outdated information presented as current\n'
'- Claims stated with false confidence (should be hedged)\n\n'
'Q: {question}\nA: {response}\n\n'
'Score and list any errors found:'
)
print(ACCURACY_RUBRIC[:400])Kryterium: kompletność
Kompletność sprawdza, czy odpowiedź uwzględnia każdą część pytania wieloczęściowego. To kryterium wykrywa odpowiedzi, które odpowiadają na pierwsze pytanie, ale pomijają pytanie uzupełniające, albo udzielają ogólnych odpowiedzi, gdy wymagane były szczegóły.
COMPLETENESS_RUBRIC = (
'Evaluate COMPLETENESS of this response.\n\n'
'First, list every distinct question or requirement in the original query.\n'
'Then, check whether the response addressed each one.\n\n'
'Score 1-5:\n'
'1 = Only addressed 0-20% of what was asked\n'
'2 = Addressed 20-50% — missed major components\n'
'3 = Addressed 50-80% — answered main question but missed sub-parts\n'
'4 = Addressed 80-95% — minor omissions only\n'
'5 = Addressed 100% — every requirement was met\n\n'
'Q: {question}\nA: {response}\n\n'
'Requirements checklist and completeness score:'
)
# This rubric forces the judge to decompose the question first,
# which is much more reliable than asking 'was it complete?'
print(COMPLETENESS_RUBRIC[:400])Kryterium: jasność
Ocena jasności sprawdza czytelność, strukturę oraz to, czy odpowiedź rzeczywiście przekazuje swoje znaczenie docelowym odbiorcom. To kryterium wykrywa odpowiedzi poprawne technicznie, ale źle wyjaśnione.
CLARITY_RUBRIC = (
'Evaluate CLARITY of this response for a {audience} audience.\n\n'
'Score 1-5:\n'
'1 = Incomprehensible — cannot extract meaning\n'
'2 = Very hard to follow — excessive jargon, poor structure\n'
'3 = Understandable with effort — some confusing parts\n'
'4 = Clear and well-organized — easy to read\n'
'5 = Exceptionally clear — ideal structure, appropriate vocabulary, '
'no unnecessary complexity\n\n'
'Consider:\n'
'- Is the vocabulary appropriate for the audience?\n'
'- Is the response logically organized?\n'
'- Are sentences a readable length?\n'
'- Is the main point stated early and clearly?\n\n'
'Q: {question}\nA: {response}\n\n'
'Clarity score and key issues:'
)
# Parameterize the audience for context-aware clarity assessment
print(CLARITY_RUBRIC.format(
audience='non-technical business stakeholder',
question='What is an API?',
response='REST APIs use HTTP to transfer data between client and server.'
)[:300])Rubryki właściwe dla zadania
Ogólne rubryki dotyczące trafności, kompletności i jasności sprawdzają się w wielu sytuacjach, ale rubryki właściwe dla konkretnego zadania zapewniają lepszą ewaluację w wyspecjalizowanych zastosowaniach. Kryteria należy dostosować do tego, co rzeczywiście ma znaczenie w danej aplikacji.
# Customer support response rubric
SUPPORT_RUBRIC = (
'Evaluate this customer support response:\n\n'
'EMPATHY (1-5): Does it acknowledge the customer emotion?\n'
'RESOLUTION (1-5): Does it provide a clear solution or next step?\n'
'TONE (1-5): Is it professional, warm, and not condescending?\n'
'EFFICIENCY (1-5): Does it avoid unnecessary words or boilerplate?\n\n'
'Customer message: {customer_message}\n'
'Support response: {support_response}\n\n'
'Scores and notes (JSON):'
)
# Code review rubric
CODE_REVIEW_RUBRIC = (
'Evaluate this code explanation:\n\n'
'CORRECTNESS (1-5): Is the code technically correct?\n'
'EDGE_CASES (1-5): Does it handle edge cases (empty input, errors)?\n'
'EFFICIENCY (1-5): Is it reasonably efficient (no obvious O(n^2) where O(n) is easy)?\n'
'READABILITY (1-5): Is the code easy to read and understand?\n\n'
'Task: {task}\n'
'Code: {code}\n\n'
'Scores and notes (JSON):'
)
print('Specialized rubrics produce better signal for your domain')Testowanie spójności rubryki
Aby sprawdzić spójność rubryki, należy pięć razy przesłać tę samą odpowiedź, za każdym razem nieznacznie zmieniając treść promptu, a następnie sprawdzić, czy oceny pozostają stabilne. Duża zmienność oznacza, że rubryka jest niedostatecznie precyzyjna.
import anthropic
import json
import statistics
client = anthropic.Anthropic(api_key='sk-ant-...')
def test_rubric_consistency(rubric_prompt, question, response, n_trials=5):
scores = []
for i in range(n_trials):
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': rubric_prompt.format(
question=question, response=response
)}]
)
try:
data = json.loads(r.content[0].text)
overall = data.get('overall', sum(data.values()) / len(data))
scores.append(overall)
except Exception:
scores.append(None)
valid = [s for s in scores if s is not None]
if valid:
print(f'Scores: {valid}')
print(f'Mean: {statistics.mean(valid):.2f}')
print(f'Std dev: {statistics.stdev(valid):.2f}')
if statistics.stdev(valid) > 0.5:
print('WARNING: High variance — rubric may be underspecified')
return validZwracanie JSON przez sędziego
Sędziom korzystającym z rubryk należy zawsze polecać zwracanie uporządkowanego JSON-u. Dzięki temu oceny są możliwe do odczytu maszynowego, można je automatycznie agregować, a sędzia nie może ukryć ważnych niuansów w tekście swobodnym, który jest pomijany przez potok przetwarzania.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def structured_rubric_judge(question, response):
prompt = (
'Score this response 1-5 on three criteria and return JSON.\n\n'
'Q: {q}\nA: {a}\n\n'
'Return ONLY this JSON structure (no other text):\n'
'{{\n'
' "accuracy": <1-5>,\n'
' "completeness": <1-5>,\n'
' "clarity": <1-5>,\n'
' "overall": <1-5>,\n'
' "primary_issue": "<what most needs improvement>",\n'
' "primary_strength": "<what the response does best>"\n'
'}}'
).format(q=question, a=response)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': prompt}]
)
text = r.content[0].text.strip()
# Strip markdown code fences if present
if text.startswith('###'):
text = text.split('###')[1]
if text.startswith('json'):
text = text[4:]
return json.loads(text.strip())
result = structured_rubric_judge(
'Explain big O notation.',
'Big O describes algorithm time complexity.'
)
print(json.dumps(result, indent=2))Iteracyjne projektowanie rubryki
Aby rubryki działały dobrze, trzeba je iteracyjnie udoskonalać. Należy zacząć od prostej rubryki z trzema kryteriami, uruchomić ją na 20–30 przypadkach testowych i porównać wyniki z ocenami ludzi. Następnie należy dopracować definicje kryteriów, w przypadku których różnice między ocenami sędziego i ludzi są największe.
Częste potrzeby związane z udoskonalaniem obejmują: zbyt szerokie kryterium trafności (należy podzielić je na trafność faktograficzną i spójność logiczną), kryterium jasności łączące czytelność i zwięzłość (należy je rozdzielić) albo słabo zakotwiczony poziom oceny 3 (większość odpowiedzi niejednoznacznie skupia się na tym poziomie).
Sprawdzenie wiedzy: zakotwiczenia ocen
Dlaczego rubryka oceniania powinna zawierać wyraźne opisy znaczenia każdego poziomu oceny (zakotwiczenia ocen)?
Podsumowanie: prompty do oceniania na podstawie rubryki
Ocenianie na podstawie rubryki analizuje odpowiedzi według wielu nazwanych kryteriów (trafność, kompletność, jasność), korzystając z wyraźnych zakotwiczeń ocen definiujących znaczenie każdego poziomu. Zakotwiczenia ograniczają zawyżanie ocen i zwiększają spójność. Ocenianie ważone pozwala nadać priorytet kryteriom, które mają największe znaczenie w danym zastosowaniu. Rubryki właściwe dla zadania (obsługa klienta, kod, twórczość) zapewniają lepsze wyniki niż ogólne rubryki w wyspecjalizowanych zastosowaniach. Sędzia powinien zawsze zwracać JSON, aby wyniki były możliwe do odczytu maszynowego. Spójność rubryki należy testować, wielokrotnie uruchamiając tę samą ewaluację — wysokie odchylenie standardowe sygnalizuje, że rubryka jest niedostatecznie precyzyjna i wymaga udoskonalenia.
Często zadawane pytania
Czy lekcja „Prompty oceniania oparte na rubrykach” jest bezpłatna?
Tak — pełny tekst „Prompty oceniania oparte na rubrykach” 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 „Prompty oceniania oparte na rubrykach”?
Ustrukturyzowane kryteria oceny: dokładność, płynność, trafność i bezpieczeństwo (skale 1–5). Ć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 2 z 4.
Ile czasu zajmuje lekcja „Prompty oceniania oparte na rubrykach”?
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
- Używanie LLM do oceny wyników LLM
- Prompty oceniania oparte na rubrykach
- Ocenianie porównawcze: A kontra B
- Kalibracja i uprzedzenia sędziów LLM