Hoppa till innehållet
AI-grafen
F· AI engineeringagenter-verktyg· ca 90 min· volatil — kontrolleras ofta· verifierad 2026-09-20

Planering och nedbrytning i delmål

Kunna låta en agent planera, följa upp och omplanera.

Förkunskaper

Intuition

En agent utan plan tar ett steg i taget och kan gå i cirklar. En agent med plan bryter ner målet i delmål först, och håller sedan reda på vilka som är klara.

Planen ska vara data, inte prosa — då kan din kod validera den, visa den för användaren och avbryta om den ser fel ut:

{"steg": [
  {"id": 1, "mal": "hämta orderdata", "verktyg": "sok_order", "beroenden": []},
  {"id": 2, "mal": "kontrollera leveransstatus", "verktyg": "sok_leverans", "beroenden": [1]},
  {"id": 3, "mal": "skriv svar till kund", "verktyg": null, "beroenden": [1, 2]}
]}

Omplanering sker när ett steg misslyckas eller ger oväntat resultat — men med ett tak, annars planerar agenten om i evighet.

Kod

from dataclasses import dataclass, field

@dataclass
class Steg:
    id: int
    mal: str
    verktyg: str | None
    beroenden: list[int] = field(default_factory=list)
    status: str = "väntar"        # väntar|klar|misslyckades
    resultat: str | None = None

def validera_plan(steg: list[Steg], tillatna: set[str], max_steg: int = 10) -> None:
    if not 1 <= len(steg) <= max_steg:
        raise ValueError(f"planen har {len(steg)} steg (tillåtet 1–{max_steg})")
    ids = {s.id for s in steg}
    for s in steg:
        if s.verktyg and s.verktyg not in tillatna:
            raise ValueError(f"okänt verktyg: {s.verktyg}")
        if any(b not in ids or b >= s.id for b in s.beroenden):
            raise ValueError(f"steg {s.id} har ogiltigt beroende")   # fångar även cykler

def kor_plan(steg, utfor, llm, max_omplaneringar=2):
    omplaneringar = 0
    while (nasta := next((s for s in steg if s.status == "väntar"
                          and all(any(x.id == b and x.status == "klar" for x in steg) for b in s.beroenden)), None)):
        nasta.resultat = utfor(nasta)
        nasta.status = "klar" if nasta.resultat is not None else "misslyckades"
        if nasta.status == "misslyckades":
            if omplaneringar >= max_omplaneringar:
                return {"status": "gav_upp", "steg": steg}
            steg = llm.omplanera(steg, misslyckat=nasta)
            omplaneringar += 1
    return {"status": "klar" if all(s.status == "klar" for s in steg) else "delvis", "steg": steg}

Valideringen är inte formalia: den fångar hallucinerade verktygsnamn och cirkulära beroenden innan något körs.

Behärskning innebär

  • Låter en agent producera en granskbar plan
  • Följer upp och omplanerar vid avvikelse
  • Sätter stoppvillkor för omplanering

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser