BlogDevelopment

Development · 5 min čitanja

Kako smo booking chatbot preradili oko modela za odlučivanje

U staroj verziji našeg chatbota za rezervacije otprilike je pola poruka prolazilo kroz LLM. Sada je to otprilike svaka deseta. Većinu ostalih obrađuje Jev, model koji ništa ne piše, nego samo bira između odgovora koje mu ponudimo.

Za jedan zagrebački autoklub vodimo chatbot preko kojeg se naručuju termini za servis, na web chatu i WhatsAppu. U rujnu smo ga napisali iznova i iz Botpressova vizualnog editora prebacili u kod.

U staroj verziji otprilike je pola svih poruka prolazilo kroz poziv LLM-u, i to ne računajući OpenAI Assistanta koji je preuzimao razgovor kad god bi korisnik tražio drugi termin. U novoj je to otprilike svaka deseta. Korisnici imaju isti razgovor kao i prije. Razlika je u tome što većinu poruka sada umjesto LLM-a obrađuje Jev, model za odlučivanje.

Većina poruka nisu otvorena pitanja

Razgovor o rezervaciji uglavnom se svodi na to da bot pita nešto na što postoji tek nekoliko smislenih odgovora. Koja vam usluga treba? Jeste li član kluba? Odgovara li vam neki od ovih termina? Onome tko na pitanje o članstvu odgovori „naravno da jesam“ ne treba model koji bi mu mogao napisati esej. Treba mu netko tko će shvatiti da je rekao da.

Upravo to rade modeli za odlučivanje. Daš im kontekst i pitanje s unaprijed zadanim odgovorima, a oni za svaki odgovor vrate vjerojatnost. Ne pišu rečenice, pa nema što parsirati i nemaju što izmisliti. Jev nam odgovara za otprilike četvrt sekunde, barem pet puta brže od poziva LLM-u u istom botu, a plaća se samo ulaz.

Ovakvi modeli su prilično novi, ali brzo se šire i ljudi im stalno nalaze nove primjene. Jev, iz TypeSafea, jedan je od prvih, a OpenAI je nedavno predstavio svoj. Nisu zamjena za LLM. Jev ne zna pisati, sažimati ni objasniti kako je došao do odgovora, a prima najviše 64.000 tokena konteksta. Namijenjen je brzim odlukama ispred većeg modela, a upravo nam je to i trebalo.

Model čita, kod odlučuje

Na svakom koraku bot Jevu šalje pitanje koje je upravo postavio i odgovore koji tu imaju smisla, plus nekoliko koji imaju smisla uvijek: kreni ispočetka, promijeni nešto što je već odabrano, pitanje o nečemu drugom i ništa od navedenog.

Što se dalje događa, odlučuje kod. Ako jedan odgovor jasno pobijedi, kod ga provede. Ako su dva blizu, bot pita na koji je korisnik mislio: tko na „Jeste li član?“ odgovori „bio sam prošle godine“, dobije potpitanje, a ne nagađanje. Ako ništa nije jasno, bot pita ponovno. Jev sam ništa ne mijenja. Rezervacija, slobodni termini, SMS provjera i konačna potvrda ostaju u kodu.

Kako „idući četvrtak“ postaje datum

Najmanje smo bili sigurni oko vremena. „Može idući četvrtak oko pola 10?“ izgleda kao posao za LLM, ili barem za parser datuma.

Pokazalo se da Jev to dobro rješava, samo ako mu postavimo prava pitanja. Snalazi se i s dugim popisom mogućih odgovora ako je svaki jasno opisan, pa odgovori mogu biti sam kalendar: tjedni koji dolaze i dani u njima, svaki s kratkom napomenom što je. Jedno pitanje može i ovisiti o odgovoru na drugo. Prvo pitamo na koji tjedan korisnik misli, a tek onda koji dan u tom tjednu i u koliko sati. Svako pitanje je dovoljno malo da odgovor bude pouzdan, a zajedno dođu do četvrtka, 22. listopada u 9:30.

Jev nikad ne računa s datumima. Bira između datuma koje je kod već izračunao, a pretragu radi kod. To nam je bila glavna pouka iz ovog dijela: model za odlučivanje može zaključiti puno više od da ili ne, ako su pitanja dobro složena.

Kad popis nije dovoljan

Neki zahtjevi ne stanu ni u kakav popis. „Bilo koji dan osim ponedjeljka“ ili „ne prije 10 i ne poslije 12“ nemaju odgovor među tjednima, danima i satima. Zato Jev odgovara na još jedno pitanje: mogu li ovi odgovori obuhvatiti sve što je korisnik rekao? Kad ne mogu, poruka ide LLM-u, koji od nje napravi pretragu, a kod provjeri svaku vrijednost prije nego što je upotrijebi.

LLM piše i odgovor kad god korisnik nešto utipka, pa na „ima li i u 13?“ dobije izravan da ili ne, a ne opći popis termina. Zato razgovor i dalje izgleda isto. LLM je i dalje tu da razgovara, samo više ne odlučuje što će se dogoditi.

Što se promijenilo

Prije prelaska je u starom botu 51 % poruka išlo uz poziv LLM-u, ne računajući Assistanta. U novom je to 11 %. Gledano po poruci korisnika, to je pad s više od jednog poziva LLM-u na otprilike jedan na svake četiri poruke.

To znači puno manje trenutaka u kojima korisnik čeka jezični model, a uz isti model račun bi bio otprilike petina dosadašnjeg. U prva četiri dana otprilike je pola svih razgovora završilo rezervacijom u kalendaru.

Ovo radi za razgovor s jasnim koracima, u kojem svaki korak ima točan odgovor, a zadnji upisuje termin u stvarni kalendar. Kod bota koji treba razgovarati o bilo čemu, recimo asistenta koji odgovara na otvorena pitanja o proizvodu, nema popisa odgovora koji bi pokrio razgovor. Tamo bi razgovor vodio LLM, a model za odlučivanje pomagao bi samo u manjim odlukama usput, npr. kamo usmjeriti pitanje.

Chatbotovi su samo jedno mjesto za ovakav model. Ljudi ih već koriste za usmjeravanje zahtjeva, rangiranje rezultata pretrage, provjeru citata prema izvorima, pa čak i za igranje Subway Surfersa. Naš je primjer mali i praktičan: većini onoga što korisnici pišu u chatu za rezervacije LLM nikad nije ni trebao, a bot je bez njega brži.

Ivan

Piše

Ivan Cvitanović

Ivan je jedan od programera u Threennovateu. Ako u svoj proizvod uvodite AI i želite da ostane brz i predvidljiv, vjerojatno ćete razgovarati s njim.

Pročitajte i ovo · Development · 6 min čitanja

Kako smo složili backup baza tako da ga može održavati AI agent

Backup za self-hosted Supabase i Postgres podešavamo u Git repozitoriju, a ne u dashboardu, pa AI agent ima sve što mu treba da ga mijenja. Četiri mjeseca nakon što smo zadnji put dirali kod, novu bazu dodali smo u backup za otprilike pet minuta.

Radite chatbot?

Pomoći ćemo vam da bude brži i predvidljiviji.

Vašu poruku čitaju isti ljudi koji ovdje pišu.