
A Codex CLI(új ablakban nyílik meg) a platformfüggetlen helyi szoftverügynökünk, amelyet arra terveztünk, hogy kiváló minőségű, megbízható szoftvermódosításokat hozzon létre, miközben biztonságosan és hatékonyan működik a gépén. Rengeteg mindent tanultunk arról, hogyan kell világszínvonalú szoftverügynököt építeni, mióta áprilisban elindítottuk a CLI-t. Ezen ismeretek kibontásához ez az első bejegyzés egy folyamatban lévő sorozatban, amelyben a Codex működésének különböző aspektusait, valamint a nehezen megszerzett tanulságokat vizsgáljuk meg. (A Codex CLI felépítésének még részletesebb megtekintéséhez tekintse meg nyílt forráskódú adattárunkat a https://github.com/openai/codex címen (új ablakban nyílik meg). Tervezési döntéseink számos finomabb részletét GitHub-problémákban és pull requestekben rögzítjük, ha többet szeretne megtudni.)
Kezdésként az ügynökhurokra fogunk összpontosítani, amely a Codex CLI alapvető logikája, és felelős a felhasználó, a modell és a modell által a szoftveres munka elvégzéséhez meghívott eszközök közötti interakció összehangolásáért. Reméljük, hogy ez a bejegyzés jó betekintést nyújt abba, hogy milyen szerepet játszik az ügynökünk (vagy „harness”) egy LLM használatában.
Mielőtt belemerülnénk, egy gyors megjegyzés a terminológiáról: az OpenAI-nál a „Codex” egy sor szoftverügynök-ajánlatot foglal magában, beleértve a Codex CLI-t, a Codex Cloud-ot és a Codex VS Code bővítményt. Ez a bejegyzés a Codex harness-re összpontosít, amely biztosítja az összes Codex-élmény alapjául szolgáló alapvető ügynöki ciklust és végrehajtási logikát, és a Codex CLI-n keresztül jelenik meg. Az egyszerűség kedvéért a „Codex” és a „Codex CLI” kifejezéseket felcserélhetően használjuk.
Az ügynöki ciklus
Minden MI-ügynök szívében van egy úgynevezett „ügynöki ciklus”. Az ügynöki ciklus egyszerűsített illusztrációja így néz ki:
Kezdésként az ügynök bemenetet fogad a felhasználótól, hogy beillessze a modellhez előkészített szöveges utasítások halmazába, amelyet promptnak nevezünk.
A következő lépés a modell lekérdezése az utasításaink elküldésével és a válasz generálására való felkéréssel, ezt a folyamatot következtetésnek nevezzük. A következtetés során a szöveges promptot először bemeneti tokenek sorozatává(új ablakban nyílik meg) – egész számokká, amelyek a modell szókincsébe indexelődnek – fordítják le. Ezeket a tokeneket ezután a modell mintavételezésére használják, ami egy új kimeneti tokenek sorozatát hozza létre.
A kimeneti tokeneket visszafordítják szöveggé, amely a modell válaszává válik. Mivel a tokenek inkrementálisan jönnek létre, ez a fordítás a modell futása közben is megtörténhet, ezért sok LLM-alapú alkalmazás streamelt kimenetet jelenít meg. A gyakorlatban a következtetés általában egy szövegen működő API mögé van beágyazva, amely elvonja a tokenizálás részleteit.
A következtetési lépés eredményeként a modell vagy (1) egy végső választ ad a felhasználó eredeti bemenetére, vagy (2) egy eszközhívást kér, amelyet az ágensnek végre kell hajtania (pl. „futtassa az ls parancsot és jelentse a kimenetet”). A (2) esetben az ágens végrehajtja az eszközhívást, és hozzáfűzi a kimenetét az eredeti prompthoz. Ezt a kimenetet egy új bemenet generálására használják, amelyet a modell újbóli lekérdezésére használnak; az ágens ezután figyelembe veheti ezt az új információt, és újra próbálkozhat.
Ez a folyamat addig ismétlődik, amíg a modell leállítja az eszközhívások küldését, és ehelyett egy üzenetet generál a felhasználó számára (az OpenAI modellekben asszisztens üzenetnek nevezik). Sok esetben ez az üzenet közvetlenül válaszol a felhasználó eredeti kérésére, de lehet egy további kérdés is a felhasználó számára.
Mivel az ágens olyan eszközhívásokat hajthat végre, amelyek módosítják a helyi környezetet, a „kimenete” nem korlátozódik az asszisztens üzenetre. Sok esetben a szoftverágens elsődleges kimenete az a kód, amelyet a gépen ír vagy szerkeszt. Mindazonáltal minden kör mindig egy asszisztens üzenettel zárul – például „Hozzáadtam a kért architecture.md fájlt” –, amely egy befejezési állapotot jelez az ágens ciklusában. Az ágens szempontjából a munkája befejeződött, és a vezérlés visszakerül a felhasználóhoz.
A diagramon látható, a felhasználói beviteltől az ágens válaszáig tartó utat egy beszélgetés egyik körének nevezzük (a Codexben szálnak). Bár ez a beszélgetési kör számos iterációt tartalmazhat a modellkövetkeztetés és az eszközhívások között. Minden alkalommal, amikor új üzenetet küld egy meglévő beszélgetésbe, a beszélgetési előzmények az új kör promptjának részeként jelennek meg, amely tartalmazza az előző körök üzeneteit és eszközhívásait:
„Többkörös ágensciklus” című ábra, amely bemutatja, hogyan fogadja iteratívan egy MI-ágens a felhasználói bemenetet, hogyan generál műveleteket, konzultál az eszközökkel, frissíti az állapotot és adja vissza az eredményeket. Címkézett lépéseket, nyilakat és példaeszköz-kimeneteket tartalmaz, amelyek az ágens érvelési ciklusát illusztrálják.