Deljenje znanja važan je aspekt kulture u Levi9, a organizujući Meetup-e na kojima okupljamo IT zajednicu, koristimo priliku da podelimo stečeno znanje i iskustvo. Tokom rođendanskog aprila, organizovali smo Meetup pod nazivom „AI-Driven Software Development: the good, the bad and the ugly“, na kojem su svoje iskustvo delili Stefan Atanasković, Python Developer u Levi9, i Zoran Nikić, Test Lead u Levi9.
Stefan i Zoran su sa oko 100 eksternih gostiju podelili svoja iskustva u razvoju interne Chatbot aplikacije u Levi9, svaki iz svoje perspektive. Ovaj tekst ćemo iskoristiti da sumiramo ovaj Meetup i iskustva rada na Chatbot aplikaciji.
Faze razvoja interne ChatBot aplikacije
Stefan je sa publikom podelio detalje o različitim fazama razvoja naše interne Chatbot aplikacije. Bilo ih je ukupno 7, a to su:
1. Analiza i planiranje: Na početku smo pažljivo analizirali zahteve naših korisnika i identifikovali ključne funkcionalnosti koje naš Chatbot treba da ima. Ovaj korak je bio ključan za definisanje domena znanja i za postavljanje jasnih ciljeva razvoja.
2. Odabir tehnologije: Nakon analize, odlučili smo se za korišćenje OpenAI servisa zbog njihove široke upotrebljivosti i pouzdanosti. Osim toga, odabrali smo da implementiramo rag-pattern pristup zbog njegove sposobnosti kombinovanja pretrage i generisanja teksta.
3. Priprema baze znanja: Sledeći korak bio je priprema naše interne baze znanja za korišćenje sa Chatbotom. Ovo je uključivalo organizaciju i strukturiranje podataka, kao i optimizaciju teksta kako bismo smanjili broj tokena i olakšali komunikaciju sa OpenAI servisom.
4. Implementacija Rag-patterna:Implementacija rag-patterna zahtevala je detaljno razmatranje načina na koji ćemo podeliti našu bazu znanja na manje delove radi efikasnijeg korišćenja tokena. Koristili smo algoritme poput recursive character splitting kako bismo osigurali da delovi teksta budu semantički povezani i da ne dođe do gubitka informacija.
5. Rešavanje izazova: Tokom razvoja, naišli smo na nekoliko izazova, uključujući ograničenje u broju tokena prilikom komunikacije sa OpenAI servisom, tačnost odgovora, i sigurnosne rizike poput prompt injection-a. Svaki od ovih izazova zahtevao je poseban pristup i implementaciju rešenja koja su obuhvatala metode poput minimalne sličnosti, limitiranja fragmenata u promptu, i korišćenje OpenAI Moderations API-a za filtriranje sumnjivih upita.
6. Testiranje i iteracija: Nakon implementacije, sproveli smo obimno testiranje kako bismo proverili funkcionalnost, tačnost i sigurnost našeg Chatbota. Dobijene povratne informacije koristili smo za iterativno poboljšanje performansi i korisničkog iskustva.
7. Puštanje u produkciju i održavanje:Konačno, nakon uspešnog testiranja, Chatbot je pušten u produkciju. Redovno pratimo njegove performanse i reagujemo na povratne informacije korisnika kako bismo osigurali kontinuiranu optimizaciju i održavanje.
Testiranje ChatBota
Kako testirati chatbota? To je ključno pitanje. Zoran Nikić, Test Lead u Levi9 je objasnio da je osnovni princip testiranja komunikacija s aplikacijom postavljanjem pitanja i dobijanjem odgovora. Međutim, ključno je razumeti da se aplikacija ne ograničava samo na korisničko iskustvo već i na interakciju putem API-ja.
Testiranje preko API-ja omogućava bolju kontrolu i razumevanje procesa generisanja odgovora, omogućavajući analizu konteksta i veličine članaka koji se prosleđuju.
Kada je u pitanju kreiranje liste pitanja za testiranje, Zoran ističe da je važno imati raznoliku listu koja obuhvata različite aspekte aplikacije. To uključuje pitanja koja pokrivaju različite delove dokumentacije, negativne scenarije i čak generisanje pitanja direktno iz dokumentacije pomoću GPT-a.
Verifikacija odgovora je ključni korak u testiranju. Zoran naglašava da, iako je moguće prepoznati tačne odgovore ako smo upoznati s dokumentacijom, postavlja se pitanje kako verifikovati odgovore kada nismo eksperti u svim oblastima. Ovde dolaze u obzir dve opcije: dobijanje predefinisanih odgovora od stručnjaka ili korišćenje GPT-a za generisanje odgovora na osnovu dokumentacije.
Analiza rezultata je sledeći važan deo procesa testiranja. Analizom zapravo možemo da razumemo zašto se pojavljuju određeni problemi s odgovorima. To može biti zbog sistema prompta aplikacije, nedostatka jasnih odgovora u dokumentaciji ili čak zbog „halucinacija“ LLM modela.
Automatizacija testiranja je takođe važna. Zoran objašnjava kako su koristili dodatni API poziv direktno ka GPT-u kako bi verifikovali odgovore i olakšali proces testiranja.
Nakon opisa procesa testiranja, Zoran je u okviru predavanja podelio i izazove s kojima su se suočavali. Primeri koje je naveo ukazuju na probleme s tačnošću odgovora, naročito kada se odgovori generišu iz dokumentacije koja možda nije precizna ili nedostaje. Takođe, istakao je problematiku vektorizacije i konteksta u testiranju, naglašavajući važnost normalizacije fajlova i kvaliteta promptova. A za kraj, svi prisutni su mogli da vide i kratak demo, i tako uobliče sliku o Levi9 ChatBotu.
Zaključak je da nema univerzalnog rešenja ili idealne prakse za testiranje chatbota. Svaki projekat zahteva prilagođen pristup, a testiranje u produkciji i analiza rezultata su kontinuirani procesi. Kroz iskustvo i iteraciju, timovi mogu prilagoditi svoje prakse i rešiti izazove s kojima se susreću u testiranju aplikacija zasnovanih na AI.
Drago nam je da smo kroz ovaj meetup imali priliku da podelimo izazove i rešenja koja smo iskusili tokom razvoja naše interne Chatbot aplikacije u Levi9, ali i da učestvujemo u aktivnoj diskusiji sa publikom i čujemo i njihove uvide. Verujemo da je ovo okupljanje bilo korisno za sve, a mi se radujemo već sledećoj prilici za deljenjem znanja:
Novi Levi9 Meetup: Beyond Boundaries: Serverless Testing with AWS Step Functions
Ovaj put će Danka Šuka, Test Lead iz novosadske Levi9 kancelarije govoriti na temu Beyond Boundaries: Serverless Testing with AWS Step Functions. Meetup će se održati 18. juna u Novom Sadu na Cafe brodu Zeppelin, sa početkom u 18h. Ulaz je slobodan, ali je neophodno osigurati svoje mesto popunjavanjem forme na linku. Očekujemo vas da ponovo razmenjujemo iskustvo i znanje!
Reason #612: We love to share our knowledge.