AI Engineering Academy · Oppitunti

Itsekorjaus ja reflektiivinen kehottaminen

Toteuttakaa reflektiovaihe, jossa agentti tarkistaa oman tulosteensa alkuperäistä tavoitetta vasten, tunnistaa puutteet tai virheet ja muodostaa korjatun suunnitelman ennen uutta yritystä.

Oppitunti 2/413 vaihetta

Itsekorjaus ja reflektiivinen kehottaminen on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu AI Engineering Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mitä reflektiivinen kehottaminen on

Reflektiivinen kehottaminen on tekniikka, jossa agenttia pyydetään arvioimaan oma tulosteensa ennen sen viimeistelyä. Sen sijaan että agentti tuottaisi vastauksen ja lopettaisi, se tarkistaa vastauksensa alkuperäistä tavoitetta vasten, tunnistaa puutteet tai virheet ja tuottaa korjatun version. Tämä jäljittelee tapaa, jolla ihmiset oikolukevat omaa työtään, ja parantaa merkittävästi tulosteiden laatua monimutkaisissa tehtävissä ilman erillistä kriitikkamallia.

Reflektoi ja korjaa -silmukka

Perustason reflektiivisessä silmukassa on kolme vaihetta: tuota alustava vastaus, kritiikoi vastausta selkeiden kriteerien perusteella ja korjaa vastausta kritiikin pohjalta. Silmukka voidaan suorittaa kerran tai useita kertoja. Jokainen iteraatio parantaa vastausta, kunnes kritiikki toteaa sen tyydyttäväksi tai korjausten enimmäismäärä saavutetaan. Kritiikkivaihe on itsessään LLM-kutsu, jolla on erityinen reflektiokehote.

async def reflect_and_revise(task: str, max_rounds: int = 2) -> str:
    response = await generate_initial(task)
    for round_num in range(max_rounds):
        critique = await critique_response(task, response)
        if critique.is_satisfactory:
            break
        response = await revise_response(task, response, critique.feedback)
    return response

Tehokkaan kritiikkikehotteen kirjoittaminen

Kritiikkikehotteessa on määriteltävä konkreettiset arviointikriteerit sen sijaan, että mallia pyydettäisiin vain ”parantamaan” vastausta. Luetelkaa tarkistettavat asiat: Onko jokainen väite totta? Vastataanko kaikkiin kysymyksen osiin? Puuttuuko jokin vaihe? Onko mukana tarpeetonta täytettä? Kritiikkikehote, jossa on selkeät tarkistuslistan kohdat, tuottaa käyttökelpoista palautetta, jota korjausvaihe voi hyödyntää suoraan.

CRITIQUE_PROMPT = '''
You are reviewing an AI-generated response to this task: {task}

Response to evaluate:
{response}

Check each criterion and provide specific feedback:
1. COMPLETENESS: Does it address all parts of the task?
2. ACCURACY: Are all factual claims correct?
3. CONCISENESS: Is there unnecessary padding or repetition?
4. FORMAT: Does it match the requested output format?
5. ACTIONABILITY: Can the user act on this response?

For each issue found, state exactly what to fix.
If the response is satisfactory on all criteria, say APPROVE.
'''

Kritiikkivastauksen jäsentäminen

Jäsentäkää kritiikin tulos Pydantic-malliksi, jotta voitte päättää ohjelmallisesti, tarvitseeko vastausta muokata. is_satisfactory-kenttä määrittää silmukan lopettamisen. issues-lista kertoo muokkausvaiheelle täsmällisesti, mitä pitää korjata. severity-kentän avulla voitte ohittaa muokkauksen lievien tyyliseikkojen kohdalla ja tehdä muokkauksen aina asiavirheiden tapauksessa.

from pydantic import BaseModel
from typing import List, Literal

class Issue(BaseModel):
    criterion: str
    description: str
    severity: Literal['critical', 'moderate', 'minor']

class Critique(BaseModel):
    is_satisfactory: bool
    issues: List[Issue]
    overall_verdict: str

# is_satisfactory=True means no revision needed
# is_satisfactory=False means issues must be addressed

Muokkauskehote

Muokkauskehote saa syötteenä alkuperäisen tehtävän, alkuperäisen vastauksen ja kritiikkipalautteen. Pyytäkää mallia tuottamaan parannettu versio, joka käsittelee erityisesti kaikki kritiikissä tunnistetut ongelmat ja säilyttää samalla alkuperäisen vastauksen oikeat osat. Sisällyttäkää aina sana 'only', jotta malli ei tee tarpeettomia muutoksia asioihin, jotka kritiikissä jo hyväksyttiin.

def build_revision_prompt(task: str, response: str, critique: Critique) -> str:
    issues_text = '\n'.join(
        f'- [{i.severity.upper()}] {i.criterion}: {i.description}'
        for i in critique.issues
    )
    return f'''
Original task: {task}

Your previous response:
{response}

Issues to fix:
{issues_text}

Write an improved response that fixes ONLY the issues listed above.
Do not change parts that were not flagged as problems.
'''

Itsensä korjaaminen koodin generoinnissa

Itsensä korjaaminen on erityisen tehokasta koodin generoinnissa. Kun koodi on generoitu, ajakaa sille linteri tai tyyppitarkistin, välittäkää virhetuloste takaisin mallille ja pyytäkää sitä korjaamaan virheet. Tämä suoritukseen perustuva reflektio on luotettavampaa kuin pelkkään kieleen perustuva kritiikki, koska palaute tulee objektiiviselta työkalulta eikä toisen LLM:n arviolta.

import subprocess
import sys

async def self_correct_code(task: str, max_rounds: int = 3) -> str:
    code = await generate_code(task)
    for _ in range(max_rounds):
        # Write code to temp file and run mypy
        with open('/tmp/agent_code.py', 'w') as f:
            f.write(code)
        result = subprocess.run(
            [sys.executable, '-m', 'mypy', '/tmp/agent_code.py', '--ignore-missing-imports'],
            capture_output=True, text=True
        )
        if result.returncode == 0:
            break  # No type errors
        code = await fix_code(code, result.stdout + result.stderr)
    return code

Liiallisen korjaamisen välttäminen

Reflektiivisten järjestelmien yleinen ongelma on liiallinen korjaaminen: malli pahentaa alkuperäistä ongelmaa yrittäessään korjata jotain muuta. Rajoittakaa muokkauksen laajuutta kirjoittamalla muokkauskehotteeseen nimenomaisesti: 'do not change anything that was not flagged.' Verratkaa muokattua vastausta myös alkuperäiseen diff-tarkistuksella — jos muokattu versio poikkeaa radikaalisti, jokin meni pieleen ja alkuperäinen kannattaa säilyttää.

from difflib import SequenceMatcher

def safe_revision(original: str, revised: str, max_change_ratio: float = 0.7) -> str:
    similarity = SequenceMatcher(None, original, revised).ratio()
    if similarity < (1 - max_change_ratio):
        print(f'Revision changed too much (similarity: {similarity:.2f}). Keeping original.')
        return original
    return revised

Reflektio monivaiheisissa agenttitehtävissä

Lisätkää monivaiheiseen agenttiin reflektiotarkistuspiste tietyn vaihejoukon suorittamisen jälkeen — esimerkiksi kaiken tutkimusaineiston keräämisen jälkeen mutta ennen loppuraportin kirjoittamista. Agentti tarkistaa keräämänsä tiedot, tunnistaa puutteet ja päättää, kerätäänkö lisää tietoa vai jatketaanko. Tehtävän aikainen reflektio estää agenttia siirtymästä synteesivaiheeseen puutteellisen tai ristiriitaisen näytön perusteella.

async def research_with_reflection(question: str) -> str:
    # Phase 1: gather evidence
    evidence = await gather_evidence(question)

    # Reflection checkpoint
    assessment = await assess_evidence_completeness(question, evidence)
    if not assessment.is_complete:
        for gap in assessment.gaps:
            more_evidence = await targeted_search(gap.search_query)
            evidence.extend(more_evidence)

    # Phase 2: synthesize
    return await synthesize_answer(question, evidence)

Reflektion tulosten kirjaaminen

Kirjatkaa jokainen reflektiokierros: kritiikkipisteet, tunnistetut ongelmat ja se, ratkaistiinko ne muokkauksessa todella. Näistä tiedoista näette, ovatko reflektiokehotteet tehokkaita. Jos muokattu vastaus tuo jatkuvasti uudelleen esiin samoja ongelmia, jotka kritiikissä nostettiin esille, muokkauskehote ei ole riittävän täsmällinen. Jos useimmissa kritiikeissä lukee ensimmäisellä kierroksella 'APPROVE', alkuperäisen generoinnin laatu on jo korkea eikä reflektiosta koituva lisäkustannus välttämättä ole hyötynsä arvoinen.

import structlog

log = structlog.get_logger()

def log_reflection_round(task_id: str, round_num: int, critique: Critique, action: str):
    log.info(
        'reflection_round',
        task_id=task_id,
        round=round_num,
        is_satisfactory=critique.is_satisfactory,
        issue_count=len(critique.issues),
        critical_issues=sum(1 for i in critique.issues if i.severity == 'critical'),
        action=action  # 'approved', 'revised', 'max_rounds_reached'
    )

Milloin reflektiota kannattaa käyttää

Reflektio lisää viivettä ja kustannuksia — kaksikierroksinen reflektio- ja muokkausprosessi vähintään kolminkertaistaa tehtävän LLM-kutsujen määrän. Käyttäkää reflektiota harkiten: aina suuririskisissä tuloksissa (esimerkiksi suoritettavassa koodissa ja merkittäviä liiketoimintapäätöksiä koskevissa vastauksissa), valinnaisesti käyttäjille näytettävissä vastauksissa ja ei koskaan sisäisissä välivaiheissa, jotka työkalu tarkistaa heti. Kustannus on perusteltu, kun laatu on nopeutta tärkeämpää.

# Reflection decision matrix:
# Task type:              Use reflection?
# SQL query generation    YES (run+verify)
# Final report writing    YES (review before delivery)
# Tool argument prep      NO  (tool result verifies it)
# Short factual answer    MAYBE (if accuracy is critical)
# Internal agent thought  NO   (intermediate, not final)
# Code generation         YES  (run linter/tests)

USE_REFLECTION = {'report', 'code', 'email', 'analysis'}

Reflektion tehokkuuden mittaaminen

Seuratkaa, parantaako reflektio todella tuloksia, tekemällä A/B-testejä: käsitelkää 50 % tehtävistä satunnaisesti valittuna reflektion kanssa ja 50 % ilman reflektiota, ja arvioikaa sitten molemmat joukot LLM-arvioijalla. Jos reflektiota käyttävä ryhmä saa selvästi paremmat pisteet ja parannus ylittää lisäviiveen ja -kustannukset, reflektio kannattaa. Jos pisteet ovat samankaltaiset, alkuperäisen generoinnin laatu on jo riittävän korkea ja reflektio aiheuttaa vain lisäkustannuksia ilman hyötyä.

async def reflection_ab_test(tasks: list) -> dict:
    import random
    results = {'with_reflection': [], 'without_reflection': []}
    for task in tasks:
        if random.random() < 0.5:
            response = await reflect_and_revise(task, max_rounds=2)
            group = 'with_reflection'
        else:
            response = await generate_initial(task)
            group = 'without_reflection'
        score = await judge(task, response)
        results[group].append(score.overall)
    return {
        'mean_with': sum(results['with_reflection']) / len(results['with_reflection']),
        'mean_without': sum(results['without_reflection']) / len(results['without_reflection'])
    }

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte agenttien itsensä korjaamisen ja reflektiiviset kehotteet.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että reflektio- ja muokkaussilmukat parantavat tulosten laatua, koska agentti arvioi ja korjaa omat vastauksensa; konkreettiset kritiikkikriteerit tuottavat toimivaa palautetta epämääräisten parannusehdotusten sijaan; ja suoritukseen perustuva reflektio objektiivisten työkalujen, kuten linterien, avulla on erityisen tehokasta koodin generoinnissa. Seuraavaksi toteutamme agentin tarkistuspisteet ja tehtävän jatkamisen.

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
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Itsekorjaus ja reflektiivinen kehottaminen” ilmainen?

Kyllä – oppitunnin ”Itsekorjaus ja reflektiivinen kehottaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko AI Engineering Academy-kurssin, päivitä CoddyKit PROhon. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Itsekorjaus ja reflektiivinen kehottaminen”?

Toteuttakaa reflektiovaihe, jossa agentti tarkistaa oman tulosteensa alkuperäistä tavoitetta vasten, tunnistaa puutteet tai virheet ja muodostaa korjatun suunnitelman ennen uutta yritystä. Harjoittelet AI Engineering Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni AI Engineering Academy-opiskelun?

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

Kuinka kauan ”Itsekorjaus ja reflektiivinen kehottaminen”-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ä AI Engineering Academy-oppitunnilla?

Kyllä. Jokainen AI Engineering Academy-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. Agentin virhetilanteiden luokittelu
  2. Itsekorjaus ja reflektiivinen kehottaminen
  3. Tarkistuspisteet ja tehtävän jatkaminen
  4. Ihmisen osallistumista edellyttävä eskalointi
← Takaisin: AI Engineering Academy