Eszközök

Mennyi specifikáció kell az ügynökalapú fejlesztéshez?

A cikk szerzője Markus Eisele arra figyelmeztet, hogy az ügynökalapú fejlesztésben a túl kevés specifikáció rejtett költségeket hoz, míg a teljes körű formális specifikáció nagy kezdeti ráfordítást igényel.

Mennyi specifikáció kell az ügynökalapú fejlesztéshez?

Markus Eisele szerint az ügynökalapú fejlesztés körül egy gyakori tévhit él: elegendő egy homályos céldeklarációt adni a modelnek, majd majdnem ad hoc módon javítgatni a visszakapott eredményeket. Ez látszólag gyors és olcsó, de a javítási ciklusok kínzó költségeit eltakarja.

Egy rövid, egyszerű prompt vonzónak tűnik, mert azonnal elindítja a implementációt. A gyakorlatban azonban következik a korrekciók sorozata: kimenet áttekintése, cél tisztázása, változtatások kérése, tesztek újrafuttatása, az újabb hiányosságok felderítése és újrakezdés. Minden ilyen körnél valakinek el kell döntenie, hogy a rendszer valóban megfelel-e a szándéknak — ez a személy lesz az "orákulum".

A másik véglet, a teljes, formális specifikáció elkészítése, jelentős kezdeti költséggel jár. Elfogadási kritériumok, szerződéses tesztek vagy viselkedésvezérelt fejlesztés (BDD) forgatókönyvei időigényesek. Ugyanakkor a későbbi költségszerkezet más: az orákulum egy része végrehajthatóvá válik, egy automatizált teszt ugyanazt a feltételt ellenőrzi minden alkalommal, fáradtság és hangulatváltozás nélkül.

Valódi kompromisszumról van szó: nem arról, hogy a specifikáció jó vagy rossz, hanem arról, hol van az összköltség szempontjából optimális pont. A legtöbb ügynökalapú munkánál ez a középmező: elég struktúra a tevékenység korlátozásához, elég példák a szándék konkretizálásához, és elég végrehajtható ellenőrzés ahhoz, hogy az áttekintés ne találgatássá váljon. Nulla specifikáció nem intelligens takarékosság, hanem költséges "vibe-coding".

A szűk keresztmetszet elmozdult, nem eltűnt

A szoftvermérnökség sosem csak a kód írásáról szólt; mindig arról döntöttünk, mi létezzen, mi ne történjen meg, mely kompromisszumok számítanak, és mit jelent a „kész” a valós világban. Korábban a hiányzó specifikációra gyakran emberi súrlódás világított rá: egy reviewer észrevett egy szélső esetet, a QA talált egy nem leírt utat, vagy egy tapasztalt fejlesztő hordozta a követelmények egy részét a fejében.

Az ügynökök azonban átalakítják ezt: az implementáció gyorsabbá és olcsóbbá válik, így egy hiányosan megadott ötlet hihető rendszerként jelenhet meg még azelőtt, hogy bárki pontosan meghatározta volna a célját. A régi világban a homályos követelményeket az emberi lassúság fékezte; az ügynökök világában a gépi sebesség gyorsítja le a megjelenést. Emiatt a specifikáció újra fontos lesz — valójában mindig is az volt. Ahogy az implementáció olcsóbbá válik, a nehézség áthelyeződik arra, hogy mit jelent a „helyes”, és hogyan ellenőrizhető megbízhatóan.

A specifikáció írása önmagában nem elég

Gyakran kihagyott lépés, hogy a specifikációt felül kell vizsgálni. Még egy alaposnak tűnő írás is hibázhat: lehetnek benne ellentmondások, lefedi a kellemes útvonalat, de semmit sem mond a retry-okról, a rate limit-ekről vagy a részleges hibákról. Lehetnek ellenőrizhetetlen állítások, vagy pontatlanul fogalmazott részletek, amelyek azt mondják, amit leírtak, nem azt, amit valójában gondoltak.

Ha egy agent hűségesen végrehajt egy hibás specifikációt, a kudarc nehezebben diagnosztizálható: a kód koherensnek tűnhet, és akár a megadott ellenőrzéseket is teljesítheti, miközben a valós probléma a specifikációban él. Ezért a specifikáció validálását külön tételként kell kezelni. A következő kérdéseket fel kell tenni megkezdés előtt:

  • Belsőleg konzisztens-e a spec?
  • Elég teljes-e a feladathoz?
  • Mely részek automatizálhatók tesztekké?
  • Hol támaszkodunk még emberi ítéletre?
  • Mely hibaállapotok hiányoznak, mert mindenki feltételezett valamit?

Az ügynökök segíthetnek a specifikáció tesztelésében, de nem akkor, ha csak annyit kérünk tőlük, hogy "írjanak követelményeket". Az ilyen prompt gyakran csupán polírozott ködöt ad. Hasznosabb egy konkrétabb instrukció: írjuk meg a lehető legkisebb specifikációt, amely lehetővé tenné, hogy egy másik agent biztonságosan implementálja a feladatot — tartalmazzon feltételezéseket, nongoal-okat, elfogadási kritériumokat, szél-eseteket, megfigyelhető kimeneteket és nyitott kérdéseket, és jelölje, mely állítások válhatnak automatizált tesztté.

Ezt a tervezetet aztán adjuk át másik agentnek, hogy támadja meg: keressen ellentmondásokat, homályos kifejezéseket, rejtett függőségeket, ellenőrizhetetlen állításokat és hiányzó hibaállapotokat. Ez az egyszerű munkafolyamat jelentősen csökkenti a használható specifikációig jutás költségét.

Miért kell erősebb szerződés a multi-agent rendszerekhez?

Egyetlen agent, kis, jól behatárolt feladattal, gyakran kijavítja a laza instrukciókat: a hurok rövid, a hatás körülhatárolt, és egy ember visszatéríti, ha elkalandozik. Multi-agent rendszerek esetén azonban interpretációs sodródás halmozódik. Az Agent B nem veszi észre, ha Agent A 10%-kal félreértett valamit: egyszerűen tényként kezeli A kimenetét. Mire egy ember látja a végeredményt, az eredeti hiba több, kompetensnek tűnő réteg alatt rejtőzhet.

Ilyenkor a specifikáció nem pusztán útmutató, inkább szerződés. Ennél több kell, mint egy bekezdésnyi szándék: séma (schema), invariánsok, megengedett homályosság, validációs szabályok és explicit hiba viselkedés. Sok esetben contract tesztekre, típusos interfészekre és géppel ellenőrizhető átadási formátumokra is szükség van. A handoff maga a termék része — kevésbé látványos, de a valóság szempontjából lényeges.

Itt talál otthont a BDD és az executable acceptance test: értékük nem csupán módszertan, hanem az, hogy a humán orákulum egy részét ismételhetővé tették. Amint a viselkedés elég stabil ahhoz, hogy pontosan meg lehessen határozni, egy végrehajtható specifikáció gyakran olcsóbb, mint még egy review-ciklus.

A specifikációnak lejárati ideje legyen

Egy gyakori hiba, hogy a csapatok úgy gondolják, több szöveg mindig biztonságosabb. A jelenlegi modellek esetében ez nem igaz. A probléma részben az a megfigyelés, hogy a modellek teljesítménye csökken, ahogy a bemenet nő, még egyszerű feladatoknál is. További gond, hogy a tervezési próza, példák, kommentek, ticketek és régi elfogadási kritériumok együttesen elmoshatják, mely részek aktív utasítások és melyek történelmi jegyzetek.

Ez nem klasszikus prompt injection; inkább önmagunk által okozott instrukció-sodródás. A kontextus régi tervezési szándékokat, félvalid példákat, régi generált terveket és talán már nem létező osztályokat írhat le. Ilyenkor a modell nem egy spec-et olvas, hanem több, versengő igazság átlagát. Ekkor az overspecification már nem segít, hanem zavaróvá válik: az agent nem tudja eldönteni, mi az aktív követelmény és mi a történeti megjegyzés.

Ezért érdemes a tervezési dokumentációt idővel csökkenteni: mi az, ami még szükséges (üzleti indoklás, non-goalok, biztonsági korlátok, külső szerződések és az a néhány invariáns, amit nem akarunk újra felfedezni próbálgatással), és mi az, ami már csak megismétli a létező osztályok és metódusok működését — azt töröljük.

Az API-k kód-szerűsége mint specifikáció

Optimistább megközelítés: egyes kódbázisok hamarabb eljutnak oda, hogy a „kód maga a specifikáció”. Az API-tervezés sokat számít itt. Ha egy belső API konvenciók, gyenge típusok, setup-mágia és általános hibák mögé rejti a viselkedést, az agent nem tudja a kódot tekinteni specifikációnak; vissza kell építenie a szabályokat szétszórt próza és próbálgatás alapján.

Ezzel szemben egy jól megtervezett API — explicit nevekkel, feladat-szintű metódusokkal, erős típusokkal, olvasható validációval, hasznos példákkal és akcióképes hibaüzenetekkel — konkrét támaszt nyújt az agentnek. Ha az agent meg tudja vizsgálni a felületet, látja, mit csinál egy metódus, érti, mi a legális input és hogyan lehet hibából felépülni anélkül, hogy találgatnia kellene, akkor a kód sokkal nagyobb részt vállal át a specifikáció terhéből.

Ez nem csak publikus SDK-kra vonatkozik: belső szolgáltatáshatárokra, könyvtárkliensekre, repo-abstractions-re és a monorepo segédosztályaira is. Minél könnyebb egy API-t felfedezni és megvizsgálni, annál inkább tekintheti az agent a kódot szerződésnek ahelyett, hogy több prózát húzna be a kontextusba.

Hova érdemes befektetni?

Eisele álláspontja szerint nincs univerzális, mindenre alkalmas mennyiségű specifikáció. A helyes mérték a feladat típusától függ:

  • Kis, jól behatárolt feladatoknál a strukturált cél: a cél, néhány példa, nongoal-ok és világos elfogadási kritériumok gyakran elegendő.
  • Determinisztikus munkáknál (CRUD-flows, API-integrációk, adattranzformációk) az optimális pont jobbra tolódik: ezek könnyen korlátozhatók és tesztelhetők, így a több specifikáció gyorsan visszahozza az árát. Itt a BDD, a contract tesztek és a végrehajtható elfogadási kritériumok különösen hasznosak.
  • Felfedező munkáknál (architektúra-választások, kutatási összegzések, új termékötletek) az optimális pont balra tolódik: a túlzott specifikáció elfojthatja az ügynök rugalmasságát. Ilyenkor a határokat érdemes definiálni, nem a kimenetet: mi legyen igaz, mi ne történjen meg, milyen bizonyíték kell, és mely döntés igényel emberi közbeavatkozást.
  • Multi-agent csővezetékeknél ismét jobbra tolódik: minden határ felé szerződés kell.

Közös szabály minden esetben: validáljuk a specifikációt, mielőtt skálázzuk az implementációt.

Mi marad meg az Agile-ből és az XP-ből?

Eisele szerint az ügynökök nem teszik feleslegessé az Agile- és XP-elveket, de újra strukturálják, mi a hasznos és mi volt csupán tűrhető költség. A ceremóniák, amelyek elsősorban az emberek óránkénti koordinációjára szolgáltak (napi státuszok, felfújt backlog-ritusok, túl magabiztos becslések), gyengülhetnek. Ugyanakkor a visszacsatolási logika életben marad: rövid ciklusok, vékony vertikális szeletek, stakeholder-áttekintés és működő szoftver továbbra is számítanak — talán most még jobban, mert az agentek gyorsan sok meggyőző, de hibás kódot tudnak előállítani.

A XP-ből különösen sok marad: tesztelő gondolkodás, folyamatos integráció és refaktorálás továbbra is fontosak, mert az implementáció olcsóbbá válása növeli a végrehajtható ellenőrzések értékét, és az agentek is tudnak „tiszta”, de hosszú távon tarthatatlan kódot generálni. A pair programming is átalakulhat: néha az ember dolgozik egy kódoló agenttel, néha egy model generál, egy másik pedig review-olja annak kódját. A lényeg a gyors tervezési visszajelzés fenntartása.

Kisebb kiadások (small releases) is túlélnek; sőt, fontosabbá válhatnak: nagy, olcsó változtatások csábítása veszélyes, a review, rollback és diagnózis könnyebb kis lépésekben.

A tényleges ütőkártya

Az ügynökalapú fejlesztés ígérete valós: az implementáció jelentősen olcsóbb lehet. Ahogy azonban a kód olcsóbb lesz, a sikert vagy bukást a specifikáció és annak verifikálása fogja eldönteni. A legtöbb előnyt azok a csapatok érik el, amelyek jól tudják, mikor elég három tétel, mikor kell valódi szerződés, és mikor kell a szerződést végrehajthatóvá tenni.

Az ügynökök egyre jobbak; a döntések még mindig a miénk.

— Markus Eisele (eredeti cikk alapján)