Fő navigáció

Amit a ChatGPT Apps SDK-val végzett fejlesztésből tanultunk

A ChatGPT Apps SDK-val szerzett gyakorlati tapasztalatok megmutatják, mikor megfelelő ez az architektúra, és hol szükséges nagyobb irányítás.

Vezetői összefoglaló

  • Az Apps SDK praktikus választás, ha hamarosan szüksége van egy munkafolyamatra a ChatGPT-ben, vagy ott szeretné kipróbálni eszközeit, mielőtt egyedi ügynök-infrastruktúrába fektetne. Ha az ügynök működésének minden lépését kézben kell tartania, általában nem ez a megfelelő választás.

  • Válassza az Apps SDK-t, ha a ChatGPT lesz az elsődleges felület, és eszközöket, valamint kisebb felületi elemeket szeretne egy teljes chatalkalmazás fejlesztése nélkül. Építsen saját ügynök-infrastruktúrát, ha szorosan kézben kell tartania a folyamatot, a memóriát, az utasításokat és az írási műveleteket.

  • Az Apps SDK olyan termékekhez illik, amelyek a chatet néhány rövid felületi lépéssel ötvözik. Gyorsabban szállíthat, de némi irányításról lemond.

  • Nálunk az egyértelmű eszközök, a widgetek világos működése és a pontos következő lépések váltak be. A folyamat meghatározását ezekre, nem pedig az LLM-re bíztuk. A modell akkor bizonyult a leghasznosabbnak, amikor a rendszer által már kiválasztott eredményeket magyarázta el.

  • Az alábbiakban először a választást, majd a bevált és a sikertelen megoldásokat mutatjuk be.

A legtöbb csapat még mindig csak MI-kísérleti projekteket futtat, vagy alacsony kockázatú és hozamú periférikus területeken alkalmaz MI-t. Kevesen vezetnek be olyan üzletileg kritikus terméket, amelyet a felhasználók hetente használnak. A ChatGPT Apps SDK segíthet áthidalni ezt a szakadékot, ha a cél a ChatGPT-n belüli megjelenés, nem pedig egy teljes asszisztens saját fejlesztése.

Miért az Apps SDK-t használtuk?

Tapasztalataink egy ügyfélprojektből származnak, ahol a követelmények alapján a ChatGPT volt az elsődleges felület, és olyan gyors megoldás kellett, amelyhez nem kellett teljesen egyedi chatalkalmazást finanszírozni.

Az Apps SDK azért felelt meg ennek, mert az ügyfélnek a következőkre volt szüksége:

  • Ne kelljen külön chatalkalmazást fejleszteni és üzemeltetni – a ChatGPT-n belül akarták elérni a felhasználókat, nem egy újabb önálló asszisztensfelületet létrehozni.

  • Chat és néhány feladatspecifikus felületi elem – pár célzott widgetlépés, nem pedig egy második teljes termék a munkafolyamaton belül.

  • MCP-eszközökön keresztül elérhető háttérrendszeri működés – szabványos eszközhívások, nem pedig teljes egészében saját, egyedi ügynök-futtatókörnyezet.

  • Felfedezhetőség a ChatGPT-ben – a felhasználók ott találkozzanak a munkafolyamattal, ahol már eleve dolgoznak.

A fejlesztés során az ügyféllel közösen ellenőriztük e döntések helyességét. A kompromisszum azonban változatlan: ha a munkamenetet a ChatGPT futtatja, a külső futtatókörnyezet nem az Öné. Befolyásolhatja, de nem irányíthatja teljesen.

Mit nyújt az Apps SDK?

Egy Apps SDK-alkalmazás három dolgot kapcsol össze:

  1. A ChatGPT ügynök-futtatókörnyezete

  2. Az Ön MCP-eszközei

  3. Az Ön widgetfelülete

A folyamat a gyakorlatban:

  1. A felhasználó kér valamit a ChatGPT-től.

  2. A ChatGPT meghívhatja az egyik MCP-eszközt.

  3. A szerver strukturált eszközeredményt küld vissza.

  4. A ChatGPT beolvassa az eredményt, és dönt a következő lépésről: további eszközhívásokról, a felhasználónak adott válaszról vagy mindkettőről. Ha widgetet társított az eszközhöz, az ebben a körben jelenhet meg.

  5. A felhasználó a chatben vagy a widgetben folytatja a műveletet: további szöveget ír, választ, vagy a widgetből eszközhívást indít. Ezzel frissül a beszélgetésszál; a ChatGPT új kört indít, és a 2–4. lépés a feladat befejezéséig ismétlődik.

Éppen a chat, a háttérrendszeri műveletek és a rövid felületi lépések ilyen ötvözése a lényeg. Ez azt is jelenti, hogy a sérülékeny pontok a chat, az eszközök és a felület közötti átadások.

Nem kell a nulláról újraalkotnia a chatfelületet, az eszközkapcsolatokat, a hitelesítési mintákat vagy a widget keretét. Ez sok terméknél jelentősen lerövidíti a fejlesztést, így az üzleti logikára és a védőkorlátokra összpontosíthat.

A ChatGPT-n belüli fejlesztés nem ugyanaz, mint saját ügynököt futtatni. A projekt nehéz része nem az utasítások trükkös megfogalmazása volt. Az eszközöket, a widgeteket és a következő lépéseket kellett olyan egyértelművé tenni, hogy a modell és a felület összhangban maradjon.

Hogyan válasszunk?

Az Apps SDK a megszokott frontendtől eltérő termékfelépítést kínál, ezért fontos tudni, mely helyzetekben ideális.

Használja az Apps SDK-t, ha a következőket szeretné:

  • Gyorsan bevezetni egy ChatGPT-munkafolyamatot.

  • A beszélgetés futtatását a ChatGPT-re bízni.

  • A természetes nyelvet néhány célzott felületi lépéssel ötvözni.

  • Elkerülni saját chatfelület, ügynökkonténer és felfedezési megoldás fejlesztését.

Ez az utolsó szempont különösen fontos, ha felhasználói már eleve a ChatGPT-ben dolgoznak.

Építsen saját ügynököt, ha a következőkre van szüksége:

  • Kódban kikényszeríthető, kötött, lépésről lépésre haladó folyamat.

  • Teljes egészében saját, egyedi felület és megerősítési folyamat.

  • Saját memória- és állapotmodell.

  • Minden futtatáskor kiszámítható működés.

  • Nyomkövetések, naplók és mérőszámok az ügynökhöz.

Ha a tervező, a rendszerutasítások és a teljes munkafolyamat alkotják a terméket, általában az egyedi infrastruktúra a jobb választás.

A kompromisszumok röviden

Kérdés

ChatGPT Apps SDK

Saját ügynökök

Hol érhető el a felhasználói élmény?

A ChatGPT-n belül

A saját termékében

Ki irányítja a beszélgetés lépéseit?

A ChatGPT, az Ön eszközei és felülete által vezérelve

Az Ön ügynökalapú rendszere

Mekkora felületet kell fejlesztenie?

Célzott widgeteket a chatben

Bármekkorát, amekkorára szüksége van

Mennyire irányíthatók az utasítások?

Közvetetten

Teljesen

Mennyire könnyű kötött, megismételhető folyamatokat létrehozni?

Gondos tervezést igényel

Kódban könnyebben kikényszeríthető

Az első bevezetésig eltelt idő

Gyakran rövidebb

Kezdetben gyakran hosszabb

Saját felelősségű platformmunka

Kevesebb

Több

Lehetőség a későbbi irányváltásra

Kisebb

Nagyobb

A projekt során újra és újra az irányítás kérdése került elő: az egyik oldalon a gyorsaság és az ismerős környezet, a másikon a futtatókörnyezet részleges tulajdonlása állt. Az ügyfél ezt a kompromisszumot fogadta el, amikor a teljes infrastruktúra birtoklása helyett azt helyezte előtérbe, hogy a felhasználókat a ChatGPT-ben érje el.

Hol válik nehézzé?

Az ideális folyamat egyszerűnek hangzik: a felhasználó kérdez, az eszköz lefut, az adatok visszaérkeznek, és amikor dönteni kell, megjelenik a widget.

A gyakorlatban az átadások okozták a nehézséget. A widget nem puszta díszítés. Amint megjelenik a képernyőn, megváltoztatja, mit lát és mit tesz ezután a modell. A widget műveleteit ne kötetlen chatként, hanem névvel ellátott eseményekként kezelje.

A projekt technológiai infrastruktúrája egyszerű volt: FastMCP, Pydantic, React és TypeScript. Ezek integrálása nem okozott gondot. A valódi feladat az volt, hogy a modell, az eszközök és a felület ugyanúgy értelmezzék a következő lépést.

Mi vált be?

Tegyen minden átadást egyértelművé

Többé nem kezeltük az eszközeredményeket nyers háttérrendszeri adatcsomagként. Minden visszatérési érték átadási ponttá vált.

Egy jól felépített eszközeredmény:

  • Biztosítja a widget megjelenítéséhez szükséges adatokat.

  • Strukturált tényeket ad a ChatGPT-nek a válasz elkészítéséhez.

  • Ha a folyamat megkívánja, megadja a következő lépést is, így a modellnek nem kell találgatnia.

A widget műveletei ne homályos megfogalmazású szöveget küldjenek vissza a beszélgetésszálba. Pontosan jelezzék, mit tett a felhasználó, és mi következzen ezután.

Az egyértelmű átadásokkal nőtt a megbízhatóság.

A modell követi a rövid, egyértelmű utasításokat, ha azok az eszköz kimenetében és a widget műveleteiben szerepelnek.

Az alábbiakban egy általunk használt, egyszerű Pydantic-sémát mutatunk be. Az output mező tartalmazza a widget megjelenítéséhez szükséges strukturált adatokat, valamint azokat a tényeket, amelyeket a ChatGPT-nek használnia kell a munkamenetben. Az agent_directions mező egy rövid sort tartalmaz arról, mit tegyen ezután az asszisztens. A Reason mező nem kötelező.

Python

from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T")
class AgentDirections(BaseModel): assistant_instruction: str reason: str | None = None
class ToolResults(BaseModel, Generic[T]): agent_directions: AgentDirections output: T

Tartsa kicsiben a widgeteket

A bevált widgetek egyetlen döntést kezeltek, majd visszaadták az irányítást. A rövid listák, megerősítések és tömör ellenőrzőképernyők jobban működtek, mint amikor a widgetből minialkalmazást próbáltunk készíteni. Némi widgetbe épített logika – például egyszerű ellenőrzés vagy kötött következő lépés – akkor is hasznos volt, amikor kiszámíthatóbb folyamatot akartunk.

Harmadik személyű widgetüzenetek

A widgetből érkező üzeneteket már nem a felhasználó chatüzeneteiként írtuk meg (“I selected…,” “I confirmed…”). Ehelyett rövid jelentéseket írtunk arról, mit tett a felhasználó (“The user selected…,” “The user confirmed…”). Azért próbáltuk ki ezt a megközelítést, mert a ChatGPT a widgetüzeneteket felhasználói üzenetek helyett eszközüzenetként adta hozzá.

Közvetlen műveletek, ha egyértelmű a következő lépés

Ha egy gomb egyértelműen meghatározza a következő eszközhívást, jobban működött, ha a widget közvetlenül indította el, mint ha újabb chatkört kényszerítettünk ki. Ez csak akkor alkalmazható, ha a következő eszközhíváshoz nincs szükség a ChatGPT-től származó bemenetre.

Ez segített kikényszeríteni a determinisztikus folyamatokat, és az újabb chatkör elhagyásával a késleltetést is csökkentette.

Hibakezelés

Ha egy eszközhívás sikertelen volt, az eszközből a megfelelő MCP-hibakódokat és rövid, közérthető üzeneteket küldtük vissza. Így a ChatGPT valódi információt kapott a sikertelen hívásokról, ezért elmagyarázhatta a problémát a felhasználónak, és/vagy észszerű következő lépést választhatott.

Az eszközkörnyezet kezelése

A munkamenet állapotát a saját szerverünkön tároltuk. A ChatGPT az eszközhívásokkal együtt elküldi a munkamenethez tartozó környezetet; a FastMCP-ben minden eszköznek adtunk egy Context paramétert, hogy a kezelő olvashassa és frissíthesse ezt az állapotot.

  • A stabil azonosítókat és a korábbi eredményeket a munkamenetben tároltuk, ahelyett, hogy a ChatGPT-vel minden híváskor újból átadattuk volna őket eszközargumentumként.

  • Ha eszközhívási hurkok alakultak ki, észlelni tudtuk az ismétlődő hívásokat, és egyértelmű hibát küldhettünk vissza az eszközeredményben.

  • A munkamenetnaplókat a saját rendszerünkben tartottuk hibakeresési és támogatási célokra.

Mi nem működött?

Arra számítani, hogy a modell kikövetkezteti a következő lépést

Kezdetben megjelenítettünk egy widgetet, feltételeztük, hogy a modell „érti”, majd vártuk a megfelelő következő eszközhívást. Néha megtörtént. Gyakran viszont nem.

Egyértelmű átadás nélkül a ChatGPT összefoglalhatott, amikor műveletet vártunk, megkérhette a felhasználót a választása megismétlésére, vagy tovább tervezhetett, amikor már meg kellett volna állnia.

A megoldás az volt, hogy a strukturált kimenetekben és a widget adatcsomagjaiban pontosan megadtuk a következő lépést, ahelyett, hogy a modell következtetésére hagyatkoztunk volna.

A jelentés szétosztása több réteg között

Az Apps SDK dokumentációját követve megpróbáltuk ötletesen felosztani a válaszokat az eszköz kimenete, a rejtett metaadatok és a chatszöveg között. A widgetekből azonban nem tudtuk kiolvasni a rejtett metaadatokat. Ezért ezt a megoldást nem tudtuk használni.

Eszközök elrejtése a modell elől

Az Apps SDK dokumentációja szerint bizonyos eszközök kihagyhatók az ügynök eszközlistájáról, így az nem választja ki őket, miközben a widgetből továbbra is meghívhatók. Amikor a láthatóságot csak az alkalmazásra állítottuk, ezek az eszközök nemcsak az ügynök, hanem a widget számára is elérhetetlenné váltak. Nem sikerült olyan beállítást találnunk, amelyben az ügynök nem, a widget viszont láthatta az eszközt.

Nem megfelelő hibaüzenetek

Ha semmi hasznos nem történt, a csend vagy az általános „sikeres” üzenet rosszabb volt az egyenes hibajelzésnél. Ezért az eszköz- és widgethibákat teljes értékű kimenetként kezeltük: ha egy lépés nem folytatható, ezt közérthetően jeleztük, és egyértelmű hibát küldtünk vissza, ahelyett, hogy a felhasználót egy megjelenő, de továbblépést nem kínáló widget előtt hagytuk volna. Ez javította a használhatóságot, és megbízhatóbbá tette a modell működését.

Záró gondolatok

Ha kevesebb egyedi platformfejlesztéssel szeretne munkafolyamatot létrehozni a ChatGPT-ben, az Apps SDK praktikus megoldás. A gyorsaságért és azért, hogy a felhasználókat a megszokott munkakörnyezetükben érje el, némi irányításról mond le.

Ha a folyamat minden ágát, a felületet és az egyes lépésekről szóló döntéseket is kézben kell tartania, már a kezdetektől saját ügynök-infrastruktúrával tervezzen. Valószínűleg idővel kinövi a kizárólag ChatGPT-n belüli fejlesztést.

Az Apps SDK-val az MCP-szervert a ChatGPT-ben is futtathatja, mielőtt saját maga építené ki a chatet, a hitelesítést és az ügynök kapcsolati infrastruktúráját, majd a termék igényeinek növekedésekor saját infrastruktúrára válthat.

A hasonló helyzetben lévő csapatok következő lépése: válasszanak egy világos eredményű munkafolyamatot, írják le a chat, az eszközök és a widgetek közötti átadásokat, majd alaposan teszteljék az újrapróbálkozásokat és a hibákat, mielőtt sok időt fordítanának az utasítások finomhangolására.

Szerző

Malan Evans