Claude Architect · Oppitunti

Vakavuuskriteerit esimerkkien avulla

Ankkuroi jokainen vakavuustaso koodiesimerkillä.

Oppitunti 3/413 vaihetta

Vakavuuskriteerit esimerkkien avulla on ilmainen Claude Architect-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Claude Architect-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Claude Architect-kurssilla on yhteensä 4 oppituntia.

Miksi vakavuus tarvitsee kriteerit

Kun pyydätte Claudelta koodin tarkistamista, heikoin mahdollinen ohje on epämääräinen: be more precise tai only flag important issues. Mallilla ei ole yhteistä määritelmää sille, mikä on "important", joten sen raja vaihtelee tiedostosta toiseen.

Tehtävän perusperiaate on selvä: täsmälliset kriteerit voittavat epämääräiset adjektiivit. Vakavuusasteikko (Critical / High / Medium / Low) on hyödyllinen vain, jos jokaiselle tasolle on kirjallinen sääntö, jota malli voi soveltaa yhdenmukaisesti — ja luotettavin tapa täsmentää sääntö on ankkuroida se konkreettisella koodiesimerkillä.

Tässä oppitunnissa rakennetaan CI/CD-tarkistusagentille vakavuusluokittelu taso kerrallaan ja sidotaan jokainen taso esimerkkiin.

Virheellinen toimintatapa: ankkuroimattomat adjektiivit

Tällainen kehote näyttää hyvältä mutta toimii huonosti. Siinä nimetään vakavuustasot, mutta niitä ei koskaan määritellä, joten malli arvaa — ja arvaa eri tavoin jokaisella suorituskerralla.

Tuloksena on juuri se toimintamalli, josta tehtävä varoittaa: meluisissa tarkistuksissa sekä puuttuva null-tarkistus että väärin kirjoitettu kommentti merkitään tasolle "High". Tarkistajat lakkaavat luottamasta luokituksiin.

system = (
    "You are a code reviewer. "
    "Rate each issue as Critical, High, Medium, or Low. "
    "Be precise and only report important problems."
)

# Problem: 'important', 'precise', and the four levels are
# never defined. The bar is whatever the model infers today.

Korjaus: yksi sääntö ja yksi esimerkki tasoa kohden

Korjaus on rakenteellinen. Antakaa mallille jokaisesta vakavuustasosta kaksi asiaa:

  • Sääntö — testattava ehto ("aiheuttaa tietojen menetyksen, tietoturvaloukkauksen tai tuotantoympäristön kaatumisen").
  • Ankkuriesimerkki — lyhyt katkelma, joka kuuluu yksiselitteisesti kyseiselle tasolle.

Tämä on luokitteluun sovellettua few-shot-kehotusta: 2–4 kohdennettua esimerkkiä kutakin epäselvyyttä kohti. Malli yleistää ankkureista — se ei vain toista niitä — joten muutama hyvin valittu esimerkki kalibroi koko asteikon.

Critical — ankkuroikaa tietoturvaesimerkkiin

Critical on varattu ongelmille, jotka aiheuttavat tietojen menetyksen, tietoturvaloukkauksen tai tuotantoympäristön kaatumisen. Ankkuroikaa taso kiistattomaan esimerkkiin — tässä tapauksessa raakadatan merkkijonointerpolaatioon SQL-kyselyssä.

Huomatkaa, että ankkuri palvelee kahta tarkoitusta: se määrittää asteikon ylärajan, joten malli tietää, ettei mikään lievempi tapaus saa tätä tasoa.

CRITICAL = """
Critical: causes data loss, a security breach, or a
production crash. Always report, even if low-confidence.

Example (SQL injection):
    query = f"SELECT * FROM users WHERE id = {user_input}"
    db.execute(query)
Why: user_input is interpolated unescaped -> injectable.
"""

High — ankkuroikaa logiikkavirheeseen

High kattaa virheellisen toiminnan, joka ei kaada prosessia mutta tuottaa vääriä tuloksia — esimerkiksi logiikkavirheen, rikkinäisen rajatapauksen tai yhden poikkeaman virheen. Ankkuri tekee rajan Critical-tasoon konkreettiseksi: tietoturvaloukkausta tai kaatumista ei ole, mutta tulos on väärä.

HIGH = """
High: produces incorrect results or a test failure, but
does not breach security or crash production.

Example (off-by-one):
    for i in range(len(items) - 1):
        process(items[i])     # last item never processed
Why: range stops one element early; silent wrong output.
"""

Medium ja Low — ankkuroikaa asteikon hiljainen pää

Asteikon alapäässä epämääräiset kehotteet tuottavat eniten vääriä positiivisia, joten ankkuroikaa se yhtä huolellisesti.

  • Medium — ylläpidettävyyteen tai luotettavuuteen liittyvä riski, joka ei vielä ole virhe (esimerkiksi puuttuva aikakatkaisu tai käsittelemätön mutta harvinainen virhepolku).
  • Low — vain tyyliin ja nimeämiseen liittyvä ongelma; ei vaikutusta toimintaan.

Low-tason täsmällinen määrittely mahdollistaa myöhemmin ohjeen "älkää raportoiko Low-tason ongelmia ennen yhdistämistä suoritettavissa tarkistuksissa" ilman, että malli alkaa väitellä.

MEDIUM = """
Medium: reliability or maintainability risk, not yet a bug.
Example:
    requests.get(url)        # no timeout -> can hang forever
"""

LOW = """
Low: style or naming only, no behavioral impact.
Example:
    def calc(x): return x*2  # name 'calc' is unclear
"""

Kootkaa luokittelu järjestelmäkehotteeseen

Ankkuroitujen tasojen kuvauksesta muodostetaan yksi lohko järjestelmäkehotteeseen. Pitäkää tämä lohko muuttumattomana ja ensimmäisenä — se on sama jokaiselle tarkistettavalle tiedostolle, joten se sopii erinomaisesti kehotteen välimuistitettavaksi etuliitteeksi. Tiedostokohtainen diff sijoitetaan käyttäjäviestiin välimuistiin tallennetun luokittelun jälkeen.

import anthropic

client = anthropic.Anthropic()

system = [{
    "type": "text",
    "text": "You are a code reviewer.\n"
            + CRITICAL + HIGH + MEDIUM + LOW
            + "\nAssign exactly one level per finding using the\n"
              "rules and examples above. When unsure between two\n"
              "levels, pick the lower one.",
    "cache_control": {"type": "ephemeral"},
}]

Pakottakaa rakenne: vakavuus enum-arvona

Kirjallinen luokittelu kertoo mallille, miten päätös tehdään; strukturoitu tuloste takaa vastauksen muodon. Sitokaa vakavuus JSON Scheman enum-arvoon, jotta kenttä ei voi koskaan olla vapaa tekstimuotoinen adjektiivi, kuten "prettyBad".

Muistettava sääntö: merkitkää kenttä required-kentäksi vain, jos se esiintyy aina. severity ja line ovat todellisessa löydöksessä aina olemassa, joten ne ovat pakollisia; valinnainen suggested_fix ei ole.

finding_schema = {
    "type": "object",
    "properties": {
        "line": {"type": "integer"},
        "severity": {
            "type": "string",
            "enum": ["critical", "high", "medium", "low"],
        },
        "rule": {"type": "string"},
        "suggested_fix": {"type": "string"},
    },
    "required": ["line", "severity", "rule"],
    "additionalProperties": False,
}

Yhdistäkää luokittelu tarkistuspyyntöön

Yhdistäkää nyt välimuistissa oleva, ankkuroitu luokittelu enum-rajoitettuun skeemaan yhdessä pyynnössä. Diff on ainoa muuttuva osa, joten se sijoitetaan viimeiseksi käyttäjäviestiin.

Tämä yhdistelmä — täsmälliset kriteerit päätökselle ja strukturoitu tuloste muodolle — on tehtävän suosittelema malli luotettavaan poimintaan ja luokitteluun.

resp = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=4096,
    thinking={"type": "adaptive"},
    system=system,                      # cached rubric prefix
    output_config={
        "format": {
            "type": "json_schema",
            "schema": {
                "type": "object",
                "properties": {"findings": {
                    "type": "array", "items": finding_schema}},
                "required": ["findings"],
                "additionalProperties": False,
            },
        }
    },
    messages=[{"role": "user", "content": diff_text}],
)

Vakavuus ohjaa portinvartiointia, ei malli

Kun vakavuus on selkeä enum-arvo, yhdistämisen estämisestä päättäminen on determinististä koodia, ei mallin harkintaa. Malli luokittelee; putkenne määrittää raja-arvot.

Tämä vastaa tehtävän hook-periaatetta: kun virheellä on todellisia seurauksia (rikkinäinen yhdistäminen), valvokaa sitä deterministisellä koodilla, ei todennäköisyyksiin perustuvalla kehotteella. Luokittelu tekee mallin merkinnöistä riittävän luotettavia portinvartiointiin.

import json

findings = json.loads(resp.content[0].text)["findings"]

BLOCKING = {"critical", "high"}
blockers = [f for f in findings if f["severity"] in BLOCKING]

if blockers:
    print(f"BLOCK MERGE: {len(blockers)} issue(s)")
    raise SystemExit(1)
print("OK to merge (medium/low only)")

Älkää antako mallin suodattaa vakavuuksia itse

Yksi hienovarainen ansa on pyytää mallia löydöksen käsittelyvaiheessa "raportoimaan vain Critical- ja High-tason ongelmat". Tämä heikentää kattavuutta: malli jättää hiljaisesti pois matalamman tason ongelmiksi arvioimansa tapaukset, ja menetätte mahdollisesti haluamanne kattavuuden.

Luotettava toimintamalli on pyytää mallia raportoimaan jokainen löydös vakavuuksineen ja suodattamaan tulokset vasta erillisessä myöhemmässä vaiheessa (esimerkiksi BLOCKING-joukon tai riippumattoman tarkistuskierroksen avulla). Ensin kattavuus, sitten tärkeysjärjestys. Ankkuroitujen kriteerien ansiosta myöhempi luokittelu on luotettavaa.

Pikatarkistus: vakavuuden ankkurointi

Soveltakaa oppitunnin sisältöä realistiseen suunnitteluratkaisuun.

Kertaus: kriteerit, joihin voitte viitata

Keskeiset opit:

  • Epämääräiset adjektiivit muuttuvat; kirjatut säännöt eivät. Korvatkaa "important" testattavalla ehdolla jokaisella vakavuustasolla.
  • Ankkuroikaa jokainen taso koodiesimerkkiin. 2–4 kohdennettua few-shot-ankkuria kalibroi asteikon — malli yleistää niiden perusteella.
  • Lukitkaa luokitus enum-arvolla. Strukturoitu tuloste varmistaa, että severity on aina yksi sallituista arvoista; vaatikaa vain aina esiintyvät kentät.
  • Välimuistittakaa luokittelu ja vaihtakaa diffiä. Pitäkää vakaat kriteerit ensimmäisenä järjestelmäkehotteessa ja sijoittakaa tiedostokohtainen koodi viimeiseksi.
  • Luokitelkaa mallissa ja valvokaa koodissa. Raportoikaa kaikki löydökset vakavuuksineen ja suodattakaa tai estäkää ne deterministisesti myöhemmin — älkää koskaan suodattako itse löydösvaiheessa.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
26
Oppitunnit
104

Usein kysytyt kysymykset

Onko oppitunti ”Vakavuuskriteerit esimerkkien avulla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Claude Architect-oppimispolun 3 oppituntia, myös oppitunnin “Vakavuuskriteerit esimerkkien avulla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Claude Architect-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Vakavuuskriteerit esimerkkien avulla”?

Ankkuroi jokainen vakavuustaso koodiesimerkillä. Harjoittelet Claude Architect-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Claude Architect-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Claude Architect-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Vakavuuskriteerit esimerkkien avulla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Claude Architect-oppitunnilla?

Kyllä. Jokainen Claude Architect-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Eksplisiittiset kriteerit epämääräisten ohjeiden sijaan
  2. Luokittelevat esimerkit
  3. Vakavuuskriteerit esimerkkien avulla
  4. Väärien positiivisten vähentäminen
← Takaisin: Claude Architect