Glavna navigacija

Šta smo naučili isporučujući rješenja pomoću ChatGPT Apps SDK-a

Praktične lekcije iz rada s ChatGPT Apps SDK-om pokazuju kada njegova arhitektura odgovara potrebama, a gdje je potrebna dodatna kontrola.

Sažetak za rukovodstvo

  • Apps SDK je praktična opcija ako vam uskoro treba tok rada u ChatGPT-u ili ako ondje želite isprobati svoje alate prije ulaganja u prilagođeni skup tehnologija za agente. Ako morate imati potpunu kontrolu nad svakim korakom ponašanja agenta, obično nije.

  • Odaberite Apps SDK kada ChatGPT treba biti glavno sučelje i želite alate uz manje elemente korisničkog sučelja, bez izrade cjelovitog proizvoda za razgovor. Odaberite vlastiti skup tehnologija za agente kada vam treba stroga kontrola nad tokom, memorijom, upitima i operacijama zapisivanja.

  • Apps SDK odgovara proizvodima koji spajaju razgovor s nekoliko kratkih koraka u korisničkom sučelju. Brže isporučujete, ali se odričete dijela kontrole.

  • Nama su pomogli jasni alati, jasno ponašanje widgeta i jasni naredni koraci. Tok smo razradili oslanjajući se na njih, a ne na LLM. Model je bio najkorisniji kada je objašnjavao ishode koje je sistem već odabrao.

  • U nastavku: kako odabrati, a zatim šta je funkcionisalo, a šta nije.

Većina timova i dalje provodi pilot-projekte umjetne inteligencije ili je primjenjuje u sporedne svrhe s malim rizikom i malom mogućom koristi. Malo njih isporučuje proizvod ključan za poslovanje koji korisnici upotrebljavaju svake sedmice. ChatGPT Apps SDK jedan je od načina da premostite taj jaz ako vam je cilj ući u ChatGPT, umjesto da sami gradite cijelog asistenta.

Zašto smo koristili Apps SDK

Naša saznanja potiču iz projekta za klijenta čiji su zahtjevi upućivali na ChatGPT kao glavno sučelje i brzo rješenje koje nije zahtijevalo finansiranje potpuno prilagođenog proizvoda za razgovor.

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

  • Bez izrade i hostovanja posebnog 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 cjelovit proizvod unutar toka rada.

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

  • Otkrivanje unutar ChatGPT-a — korisnici trebaju pronaći tok rada ondje gdje već rade.

Te smo odluke potvrđivali s klijentom tokom razvoja. I dalje vrijedi ovaj kompromis: kada ChatGPT hostuje sesiju, vi ne upravljate vanjskim izvršnim okruženjem. Usmjeravate ga, ali nemate potpunu kontrolu.

Šta vam pruža Apps SDK

Aplikacija izrađena pomoću Apps SDK-a povezuje tri stvari:

  1. Izvršno okruženje za agente u ChatGPT-u

  2. Vaše MCP alate

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

Tok u praksi:

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

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

  3. Vaš server vraća strukturirani rezultat alata.

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

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

Upravo je ta kombinacija razgovora, pozadinskih radnji i kratkih koraka u korisničkom sučelju suština. To ujedno znači da su najosjetljiviji dijelovi prijelazi između razgovora, alata i korisničkog sučelja.

Ne morate od nule praviti sučelje za razgovor, povezivanje alata, obrasce autentifikacije ni okvir widgeta. Mnogim proizvodima to znatno skraćuje razvoj pa se možete usredotočiti na domensku logiku i zaštitne mehanizme.

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

Kako odabrati

Apps SDK nudi drukčiji oblik proizvoda od uobičajenog frontenda, ali važno je znati za koje je scenarije idealan.

Koristite Apps SDK kada želite

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

  • Prepustiti ChatGPT-u da hostuje razgovor.

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

  • Izbjeći izradu vlastitog sučelja za razgovor, okruženja za agente i mehanizma za otkrivanje.

Ova posljednja tačka važna je kada vaši korisnici već rade u ChatGPT-u.

Izradite vlastitog agenta kada vam treba

  • Fiksni tok korak po korak koji možete nametnuti u kodu.

  • Prilagođeno korisničko sučelje i tok potvrde kojima u potpunosti upravljate.

  • Vlastiti model memorije i stanja.

  • Ponašanje koje mora biti predvidljivo pri svakom pokretanju.

  • Tragovi izvršavanja, zapisnici i metrike agenta.

Ako su planer, sistemski upiti i cjelokupan tok rada vaš proizvod, prilagođeni skup tehnologija obično je bolji izbor.

Pregled kompromisa

Pitanje

ChatGPT Apps SDK

Vaši agenti

Gdje se odvija korisničko iskustvo?

Unutar ChatGPT-a

U vašem proizvodu

Ko upravlja koracima razgovora?

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

Vaš agentski sistem

Koliko korisničkog sučelja izrađujete?

Namjenski widgeti u razgovoru

Koliko god vam treba

Koliku kontrolu imate nad upitima?

Posrednu

Potpunu

Koliko je lako napraviti fiksne, ponovljive tokove?

Zahtijeva pažljivo osmišljavanje

Lakše ih je nametnuti u kodu

Vrijeme do prve isporuke

Često brže

U početku često sporije

Rad na platformi za koji ste odgovorni

Manje

Više

Prostor za kasniju promjenu smjera

Manje

Više

Tokom našeg projekta stalno smo se vraćali riječi kontrola: s jedne strane brzina i poznato okruženje, a s druge djelimična kontrola nad izvršnim okruženjem. Klijent je prihvatio taj kompromis kada je susret s korisnicima u ChatGPT-u stavio ispred upravljanja cijelim tehnološkim skupom.

Gdje nastaju poteškoće

Idealan tok zvuči jednostavno: korisnik pita, alat se pokrene, podaci se vrate, a widget se prikaže kada treba nešto odabrati.

U praksi su problem bili prijelazi. Widget nije ukras. Čim se pojavi na ekranu, mijenja ono što model vidi i radi u narednom koraku. Radnje widgeta tretirajte kao imenovane događaje, a ne kao neodređeni razgovor.

Tehnološki skup na projektu bio je jednostavan: FastMCP, Pydantic, React i TypeScript. Njihova integracija nije bila problem. Pravi posao bio je uskladiti model, alate i korisničko sučelje oko onoga što slijedi.

Šta je funkcionisalo

Učinite svaki prijelaz očiglednim

Prestali smo tretirati rezultate alata kao neobrađene podatke iz pozadinskog sistema. Svaki rezultat postao je jasno definiran prijelaz.

Dobar rezultat alata:

  • Daje widgetu ono što mu treba za prikaz.

  • Daje ChatGPT-u strukturirane činjenice na kojima može zasnovati odgovor.

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

Radnje widgeta ne bi trebale slati neodređen tekst natrag u nit. Trebaju navesti šta je korisnik učinio i šta treba uslijediti.

Pouzdanost se povećala čim 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 koristili. Polje output sadrži strukturirane podatke potrebne widgetu kada ga prikažete i činjenice koje ChatGPT treba koristiti u sesiji. Polje agent_directions sadrži kratku uputu o tome šta asistent treba sljedeće uraditi. Polje Reason nije obavezno.

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 funkcionisali obrađivali su jednu odluku, a zatim vraćali kontrolu. Kratke liste, potvrde ili sažet ekran za pregled radili su bolje nego pretvaranje widgeta u malu aplikaciju. Malo logike u widgetu, poput jednostavne provjere valjanosti ili fiksnog narednog koraka, ipak je pomagalo kada smo željeli determinističniji tok.

Treće lice u porukama widgeta

Prestali smo pisati naknadne poruke widgeta kao da ih šalje korisnik („I selected…“, „I confirmed…“). Pisali smo ih kao kratke izvještaje o tome šta je korisnik uradio („The user selected…“, „The user confirmed…“). Isprobali smo ovaj pristup jer je ChatGPT poruke widgeta dodavao kao poruke alata, a ne kao poruke korisnika.

Direktne radnje kada je naredni korak očigledan

Ako dugme jasno podrazumijeva naredni poziv alata, bolje je funkcionisalo da ga widget pokrene direktno nego da se zahtijeva još jedan krug razgovora. To vrijedi samo ako narednom pozivu alata nisu potrebni ulazni podaci iz ChatGPT-a.

To je pomoglo u provođenju determinističkih tokova i smanjilo kašnjenje izbjegavanjem dodatnog kruga razgovora.

Obrada grešaka

Kada poziv alata nije uspio, iz alata smo vraćali odgovarajuće MCP kodove grešaka i kratke, jasne poruke. ChatGPT je tako imao stvarne informacije o neuspjelim pozivima pa je mogao objasniti problem korisniku i/ili odabrati razuman naredni korak.

Upravljanje kontekstom alata

Stanje sesije čuvali smo na svom serveru. ChatGPT uz pozive alata šalje kontekst ograničen na sesiju; u FastMCP-u smo svakom alatu dali parametar Context kako bi obrađivač mogao čitati i ažurirati to stanje.

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

  • Kada bi se pojavile petlje pozivanja alata, mogli smo prepoznati duple pozive i vratiti jasnu grešku kroz rezultat alata.

  • Zapisnici sesija ostajali su kod nas radi otklanjanja grešaka i podrške.

Šta nije funkcionisalo

Pretpostavka da će model zaključiti šta je naredni 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, tražiti od korisnika da ponovi odabir ili nastaviti planirati kada je trebao stati.

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

Raspoređivanje značenja kroz više slojeva

Pokušali smo domišljato rasporediti odgovore između izlaza alata, skrivenih metapodataka i teksta razgovora, u skladu s dokumentacijom za Apps SDK. Međutim, u widgetima nismo mogli čitati skrivene metapodatke. Zato ovo nismo mogli koristiti.

Skrivanje alata od modela

Dokumentacija za Apps SDK opisuje alate koje možete izostaviti s agentove liste alata kako ih on ne bi birao, a ipak ih pozivati iz widgeta. Kada smo vidljivost postavili samo za aplikaciju, ti alati više nisu bili dostupni ni iz widgeta, a ne samo agentu. Nismo uspjeli postaviti sistem tako da agent ne vidi alat, a widget ga i dalje vidi.

Loše poruke o greškama

Tišina ili općenita poruka „uspješno“ kada se ništa korisno nije dogodilo bile su gore od jasne greške. Zato smo neuspjehe alata i widgeta tretirali kao punopravne izlaze: ako se korak nije mogao nastaviti, to smo jasno naveli i vratili izričitu grešku, umjesto da korisnici gledaju widget koji se prikazao, ali ih nije odveo dalje. Time smo poboljšali upotrebljivost i povećali pouzdanost ponašanja modela.

Zaključna razmatranja

Ako vam je cilj tok rada u ChatGPT-u uz manje prilagođenog rada na platformi, Apps SDK je praktičan način da to postignete. Dio kontrole mijenjate za brzinu i mogućnost da korisnike dosegnete ondje gdje već rade.

Ako morate upravljati svakom granom toka, korisničkim sučeljem i odlukom o svakom koraku, od početka planirajte vlastiti skup tehnologija za agente. Vjerovatno ćete prerasti razvoj isključivo unutar ChatGPT-a.

Apps SDK možete koristiti i za pokretanje svog MCP servera unutar ChatGPT-a prije nego što sami izradite razgovor, autentifikaciju i povezivanje agenta, a zatim prijeći na vlastiti skup tehnologija kada to proizvod bude zahtijevao.

Sljedeći korak za timove u istoj situaciji: odaberite jedan tok rada s jasnim ishodom, zapišite prijelaze između razgovora, alata i widgeta, a zatim temeljito testirajte ponovne pokušaje i greške prije nego što uložite mnogo vremena u podešavanje upita.

Autor

Malan Evans