Glavna navigacija

Što smo naučili isporučujući proizvode uz ChatGPT Apps SDK

Praktične pouke iz rada s ChatGPT Apps SDK-om pokazuju kada njegova arhitektura odgovara potrebama, a gdje je potreban veći nadzor.

Sažetak

  • Apps SDK praktičan je izbor ako uskoro trebate tijek rada u ChatGPT-u ili ondje želite isprobati svoje alate prije ulaganja u prilagođeni tehnološki sklop za agente. Ako trebate imati nadzor nad svakim korakom ponašanja agenta, obično nije.

  • Odaberite Apps SDK kada ChatGPT treba biti glavno sučelje, a želite alate i manje elemente korisničkog sučelja bez izrade cjelovitog proizvoda za razgovor. Odaberite vlastiti tehnološki sklop za agente kada trebate strog nadzor nad tijekom, memorijom, upitima i operacijama zapisivanja.

  • Apps SDK prikladan je za proizvode koji spajaju razgovor s nekoliko kratkih koraka u korisničkom sučelju. Brže isporučujete, ali odričete se dijela nadzora.

  • Nama su pomogli jasno definirani alati, jasno ponašanje widgeta i jasni sljedeći koraci. Na njih smo se oslanjali pri određivanju tijeka, a ne na LLM. Model je bio najkorisniji kada je objašnjavao ishode koje je sustav već odabrao.

  • U nastavku: kako odabrati te što je funkcioniralo, a što nije.

Većina timova još uvijek provodi pilot-projekte s umjetnom inteligencijom ili je primjenjuje u sporednim slučajevima uporabe s niskim omjerom rizika i koristi. Malo ih isporuči proizvod ključan za poslovanje koji korisnici upotrebljavaju svaki tjedan. ChatGPT Apps SDK jedan je od načina da se taj jaz premosti ako vam je cilj biti prisutan unutar ChatGPT-a, umjesto da sami izradite cijelog asistenta.

Zašto smo upotrijebili Apps SDK

Naša saznanja proizlaze iz angažmana za klijenta čiji su zahtjevi upućivali na ChatGPT kao glavno sučelje i brz pristup koji nije zahtijevao financiranje potpuno prilagođenog proizvoda za razgovor.

Apps SDK odgovarao je tim zahtjevima jer je klijentu trebalo sljedeće:

  • Bez izrade i hostiranja zasebnog proizvoda za razgovor — željeli su doseg unutar ChatGPT-a, a ne još jedno samostalno sučelje asistenta.

  • Razgovor uz malo korisničko sučelje prilagođeno zadatku — nekoliko usmjerenih koraka u widgetu, a ne drugi cjeloviti proizvod unutar tijeka rada.

  • Ponašanje pozadinskog sustava dostupno putem MCP alata — standardno pozivanje alata, a ne prilagođeno izvršno okruženje agenta kojim se u cijelosti upravlja.

  • Otkrivanje unutar ChatGPT-a — korisnici bi trebali pronaći tijek rada ondje gdje već rade.

Te smo odluke tijekom izrade potvrđivali s klijentom. I dalje vrijedi kompromis: kada ChatGPT hostira sesiju, ne upravljate vanjskim izvršnim okruženjem. Usmjeravate ga, ali njime ne upravljate u potpunosti.

Što vam Apps SDK pruža

Aplikacija izrađena s Apps SDK-om povezuje tri elementa:

  1. izvršno okruženje agenta u ChatGPT-u

  2. vaše MCP alate

  3. korisničko sučelje vašeg widgeta

Tijek u praksi:

  1. Korisnik nešto zatraži od ChatGPT-a.

  2. ChatGPT može pozvati jedan od vaših MCP alata.

  3. Vaš poslužitelj vraća strukturirani rezultat alata.

  4. ChatGPT čita taj rezultat i odlučuje o sljedećem koraku: dodatnim pozivima alata, odgovoru korisniku ili oboma. Ako ste tom alatu pridružili widget, on se može prikazati u ovom potezu.

  5. Korisnik nastavlja u razgovoru ili widgetu (dodatnim tekstom, odabirom ili pozivom alata koji pokreće widget). Time se ažurira nit; ChatGPT izvodi novi potez, a koraci od 2 do 4 ponavljaju se dok se zadatak ne dovrši.

Upravo je ta kombinacija razgovora, pozadinskih radnji i kratkih koraka u korisničkom sučelju ključna. To također znači da su osjetljive točke prijelazi između razgovora, alata i korisničkog sučelja.

Ne morate od nule izrađivati sučelje za razgovor, povezivanje alata, obrasce autentifikacije ni okvir widgeta. Za mnoge proizvode to znatno skraćuje vrijeme izrade pa se možete usredotočiti na domensku logiku i zaštitne mehanizme.

Izrada unutar ChatGPT-a nije isto što i pokretanje vlastitog agenta. Najteži dio projekta nisu bili trikovi s upitima. Trebalo je dovoljno jasno definirati alate, widgete i sljedeće korake kako bi model i korisničko sučelje ostali usklađeni.

Kako odabrati

Apps SDK daje proizvodu drukčiji oblik od uobičajenog frontend rješenja, no važno je znati za koje je scenarije idealan.

Upotrijebite Apps SDK kada želite

  • Brzo isporučiti tijek rada u ChatGPT-u.

  • Prepustiti ChatGPT-u hostiranje razgovora.

  • Kombinirati prirodni jezik s nekoliko usmjerenih koraka u korisničkom sučelju.

  • Izbjeći izradu vlastitog sučelja za razgovor, spremnika za agenta i sustava za otkrivanje.

Ta posljednja stavka važna je kada vaši korisnici već rade u ChatGPT-u.

Izradite vlastitog agenta kada trebate

  • Fiksni tijek korak po korak koji možete provesti u kodu.

  • Prilagođeno korisničko sučelje i postupak potvrde kojima u cijelosti upravljate.

  • Vlastiti model memorije i stanja.

  • Ponašanje koje mora biti predvidljivo pri svakom izvođenju.

  • Tragove, zapisnike i metrike za agenta.

Ako su planer, sistemski upiti i cijeli tijek rada vaš proizvod, prilagođeni tehnološki sklop obično je bolji izbor.

Kratak pregled kompromisa

Pitanje

ChatGPT Apps SDK

Vlastiti agenti

Gdje se odvija korisničko iskustvo?

Unutar ChatGPT-a

U vašem proizvodu

Tko upravlja koracima razgovora?

ChatGPT, usmjeren vašim alatima i korisničkim sučeljem

Vaš agentski sustav

Koliko korisničkog sučelja izrađujete?

Usmjereni widgeti u razgovoru

Koliko god trebate

Koliki nadzor imate nad upitima?

Neizravan

Potpun

Koliko je jednostavno izraditi fiksne i ponovljive tijekove?

Zahtijeva pažljivo oblikovanje

Lakše ih je provesti u kodu

Vrijeme do prve isporuke

Često kraće

Često dulje na početku

Rad na platformi za koji ste odgovorni

Manje

Više

Mogućnost kasnije promjene smjera

Manje

Više

Tijekom našeg angažmana stalno smo se vraćali na riječ nadzor: s jedne strane brzina i poznato okruženje, a s druge djelomično upravljanje izvršnim okruženjem. Klijent je prihvatio taj kompromis kada je prednost dao susretu s korisnicima u ChatGPT-u pred upravljanjem cijelim tehnološkim sklopom.

Gdje nastaju poteškoće

Idealan tijek zvuči jednostavno: korisnik postavi zahtjev, alat se pokrene, podaci se vrate, a widget se pojavi kada treba donijeti odluku.

U praksi su problem bili prijelazi. Widget nije ukras. Kada se pojavi na zaslonu, mijenja ono što model vidi i čini u sljedećem koraku. Radnje widgeta tretirajte kao imenovane događaje, a ne kao neobvezan razgovor.

Tehnološki sklop u projektu bio je jednostavan: FastMCP, Pydantic, React i TypeScript. Njihova integracija nije bila problem. Posao se svodio na usklađivanje modela, alata i korisničkog sučelja oko onoga što slijedi.

Što je funkcioniralo

Neka svaki prijelaz bude očit

Prestali smo rezultate alata tretirati kao neobrađene podatke pozadinskog sustava. Svaki vraćeni rezultat postao je prijelaz.

Dobar rezultat alata:

  • Pruža widgetu ono što mu je potrebno za prikaz.

  • Pruža ChatGPT-u strukturirane činjenice na kojima može temeljiti odgovor.

  • Kada tijek to zahtijeva, navodi što treba uslijediti kako model ne bi morao nagađati.

Radnje widgeta ne bi trebale vraćati neodređen tekst u nit. Trebale bi navesti što je korisnik učinio i što treba uslijediti.

Pouzdanost se povećala kada su prijelazi postali jasni.

Model slijedi kratke i jasne upute kada se nalaze u izlazu alata i radnjama widgeta.

U nastavku je mala Pydantic struktura koju smo upotrebljavali. Polje output sadržava strukturirane podatke potrebne widgetu kada ga prikazujete te činjenice koje ChatGPT treba upotrijebiti u sesiji. Polje agent_directions sadržava kratku uputu o tome što bi asistent trebao učiniti sljedeće. Polje Reason nije obvezno.

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

Neka widgeti budu mali

Widgeti koji su funkcionirali omogućili su donošenje jedne odluke, a zatim vratili nadzor. Kratki popisi, potvrde ili sažeti zaslon za pregled funkcionirali su bolje od pretvaranja widgeta u malu aplikaciju. Malo logike u widgetu, poput jednostavne provjere valjanosti ili fiksnog sljedećeg koraka, ipak je pomoglo kada smo željeli predvidljiviji tijek.

Treće lice u porukama widgeta

Prestali smo pisati naknadne poruke widgeta kao korisnikove poruke u razgovoru („I selected…”, „I confirmed…”). Pisali smo ih kao kratka izvješća o tome što je korisnik učinio („The user selected…”, „The user confirmed…”). Isprobali smo taj pristup jer je ChatGPT poruke widgeta dodavao kao poruke alata, a ne kao korisničke poruke.

Izravne radnje kada je sljedeći korak očit

Ako gumb jasno upućuje na sljedeći poziv alata, bolje je funkcioniralo dopustiti widgetu da ga izravno pokrene nego zahtijevati još jedan potez u razgovoru. To vrijedi samo ako sljedeći poziv alata ne zahtijeva ulazne podatke iz ChatGPT-a.

To je pomoglo u provođenju predvidljivih tijekova i smanjilo kašnjenje izbjegavanjem dodatnog poteza u razgovoru.

Obrada pogrešaka

Kada poziv alata nije uspio, iz alata smo vraćali odgovarajuće kodove MCP pogrešaka i kratke, jasne poruke. ChatGPT je tako pri neuspjelim pozivima dobio stvarne podatke koje je mogao pročitati, objasniti problem korisniku i/ili odabrati razuman sljedeći korak.

Upravljanje kontekstom alata

Stanje sesije čuvali smo na svojem poslužitelju. ChatGPT uz pozive alata šalje kontekst ograničen na sesiju; u FastMCP-u smo svakom alatu dodali parametar Context kako bi rukovatelj mogao čitati i ažurirati to stanje.

  • Stabilni ID-ovi i raniji rezultati čuvali su se u sesiji pa nismo od ChatGPT-a tražili da ih pri svakom pozivu ponovno prosljeđuje kao argumente alata.

  • Kada bi se pojavile petlje pozivanja alata, mogli smo otkriti dvostruke pozive i vratiti jasnu pogrešku kroz rezultat alata.

  • Zapisnici sesije ostajali su na našoj strani radi otklanjanja pogrešaka i podrške.

Što nije funkcioniralo

Pretpostavka da će model zaključiti koji je sljedeći korak

U početku bismo prikazali widget, pretpostavili da je model „shvatio” i čekali odgovarajući naknadni poziv alata. Ponekad bi se to dogodilo. Često ne bi.

Bez jasnog prijelaza ChatGPT bi mogao sažeti sadržaj kada smo željeli radnju, zatražiti od korisnika da ponovi odabir ili nastaviti planirati kada je trebao stati.

Rješenje je bilo jasno navesti sljedeći korak u strukturiranim izlazima i podacima widgeta, umjesto nadati se da će ga model zaključiti.

Raspodjela značenja između slojeva

Pokušali smo domišljato raspodijeliti odgovore između izlaza alata, skrivenih metapodataka i teksta razgovora, u skladu s dokumentacijom Apps SDK-a. Međutim, u widgetima nismo mogli čitati skrivene metapodatke. Stoga to nismo mogli upotrijebiti.

Skrivanje alata od modela

Dokumentacija Apps SDK-a opisuje alate koje možete izostaviti s agentova popisa alata kako ih ne bi odabrao, ali ih i dalje pozivati iz widgeta. Kada smo vidljivost postavili samo za aplikaciju, ti alati više nisu bili dostupni ni iz widgeta, a ne samo agentu. Nikada nismo uspjeli postaviti sustav tako da agent ne vidi alat, ali da ga widget i dalje vidi.

Loše poruke o pogreškama

Tišina ili generička poruka „uspjeh” kada se ništa korisno nije dogodilo bili su gori od izravne pogreške. Zato smo pogreške alata i widgeta tretirali kao punopravne izlaze: ako se korak nije mogao nastaviti, to smo jasno naveli i vratili izričitu pogrešku, umjesto da korisnici gledaju widget koji se prikazao, ali ih nije vodio dalje. Time smo poboljšali upotrebljivost i povećali pouzdanost ponašanja modela.

Zaključna razmatranja

Ako vam je cilj tijek rada u ChatGPT-u uz manje rada na prilagođenoj platformi, Apps SDK praktičan je način da ga ostvarite. Dio nadzora mijenjate za brzinu i mogućnost da korisnike susretnete ondje gdje već rade.

Ako trebate upravljati svakom granom tijeka, korisničkim sučeljem i odlučivanjem o svakom koraku, od početka planirajte vlastiti tehnološki sklop za agente. Vjerojatno ćete prerasti izradu isključivo unutar ChatGPT-a.

Apps SDK možete upotrijebiti i za pokretanje svojeg MCP poslužitelja unutar ChatGPT-a prije nego što sami izradite razgovor, autentifikaciju i infrastrukturu agenta, a zatim prijeći na vlastiti tehnološki sklop kada to proizvod bude zahtijevao.

Sljedeći korak za timove u istom položaju: odaberite jedan tijek rada s jasnim ishodom, zapišite prijelaze između razgovora, alata i widgeta, a zatim temeljito testirajte ponovne pokušaje i pogreške prije nego što potrošite mnogo vremena na prilagodbu upita.

Autor

Malan Evans