Într-o lume a schimbării și inovației constante, participarea la hackathoane reprezintă o oportunitate extraordinară de a-ți testa abilitățile, de a colabora cu colegii și de a construi ceva inovator. Recent, am avut ocazia de a participa la ShipIt, un hackathon de 24 de ore organizat de Accesa, ediția de anul acesta fiind axată pe implementarea diferitelor soluții interne bazate pe posibilitățile pe care le aduce inteligența artificială. Mai exact, echipa noastră a avut ca scop dezvoltarea unui chat-bot care centralizează cunoștințele din întreaga companie și recuperează informații relevante pentru toate întrebările interne, folosind o tehnică numită retrieval augmented generation (RAG) și API-ul OpenAI.
Dar să vedem cum am început. Din munca noastră zilnică și din discuțiile cu colegii, știm că găsirea documentelor și a informațiilor relevante în cadrul companiei necesită adesea un efort semnificativ. Pentru a rezolva problema aceasta, ne-am imaginat o soluție în care colegii noștri pot cere ușor informații relevante care sunt stocate de către companie. Să spunem, de exemplu, că dorim să știm dacă avem voie să aducem câinele la serviciu. Cu siguranță, această informație există undeva, doar că găsirea ei sau a unei persoane care ne-ar putea ajuta necesită mult timp.
Același lucru se aplică și dacă ne gândim la întrebări referitoare la procese specifice sau la orice informație îngropată adânc în politicile interne ale companiei. Aceste informații sunt, însă trebuie să știm unde să le căutăm. Cu un chat-bot la îndemână, recuperarea informațiilor relevante devine mult mai rapidă, mai ales când este capabil să facă referire la documentele din care își ia conținutul.
În continuare, vă vom oferi o scurtă prezentare a arhitecturii soluției, urmată de o analiză mai detaliată a tehnologiilor front-end și back-end, utilizate în proiectul nostru și de modul în care acestea au contribuit la crearea unei soluții eficiente și prietenoase cu utilizatorul. În cele din urmă, încheiem cu o scurtă sinteză despre experiența echipei noastre în hackathon și succesul soluției noastre.
Pentru a ne atinge obiectivele, am decis să utilizăm o tehnică de inteligență artificială numită retrieval augmented generation (RAG). În esență, sistemele RAG capabile să ofere noi cunoștințe unui model lingvistic mare (LLM) fără a fi nevoie să-l reantrenăm sau să-l ajustăm. Ideea este să oferim context relevant LLM-ului care conține cunoștințele de care are nevoie pentru a formula un răspuns corespunzător.
Diagrama de mai jos arată arhitectura aplicației. Fluxul utilizatorului începe la nivelul front-end-ului, care este o interfață simplă de chat cu un design dinamic. Atunci când un utilizator pune o întrebare în front-end, aceasta va fi transmisă la un backend Python. Backend-ul verifică mai întâi dacă aceasta este o primă interogare sau dacă a existat vreo altă interacțiune anterior, astfel încât să poată reține istoricul conversației. În continuare, interogarea utilizatorului este folosită pentru a verifica cunoștințele existente într-o bază de date vectorială bazată pe similitudine. Dacă se găsesc cunoștințe relevante, interogarea utilizatorului este transmisă la LLM (GPT-4) împreună cu istoricul anterior al chatului și cunoștințele relevante. Răspunsul LLM-ului este apoi trimis înapoi la frontend, care îl afișează într-o manieră asemănătoare unui chat. În continuare, vom aborda mai în detaliu ceea ce se întâmplă exact din punct de vedere tehnologic, argumentând de ce am ales aceste tehnologii.
În încercarea noastră de a dezvolta o aplicație eficientă pentru a satisface nevoile utilizatorilor, am ales să folosim următoarele tehnologii de UI care promit o experiență plăcută pentru utilizator.
Fig.1 Arhitectura aplicației AI Chatbot
Am început cu Next.js, renumit pentru capabilitatea sa de a randa componente pe server și de a genera site-uri statice. Cu capacitățile sale robuste, Next.js poate pune bazele unei aplicații web rapide și eficiente. Împreună cu React, unul dintre cele mai utilizate framework-uri din industrie, am reușit să creăm componente reutilizabile, ce ne-au ajutat sa fim productivi într-un timp foarte scurt. Pentru a alinia designul chat-botului nostru cu toolul nostru de comunicare internă, am ales Material-UI, folosindu-ne de colecția sa bogată de componente integrate și ușor adaptabile. Și, totuși, ca să adăugăm puțină personalitate aplicației noastre, am folosit Tailwind CSS. Acesta ne-a permis să creăm o aparență vizuală atractivă și personală, folosind clase predefinite pentru o stilizare rapidă.
Ca să adăugăm o interacțiune suplimentară la experiența utilizatorului, am încorporat Typed.js în setul nostru de instrumente. Această bibliotecă dinamică JavaScript injectează animații de text în timp real. Scopul a fost de a oferi utilizatorilor o experiență extrem de plăcută în comunicarea cu chatbot-ul nostru și de a face această interacțiune cât mai realistă posibil, simulând prezența unei persoane reale care vrea să ofere suport.
Selectarea limbajului Python ca limbaj de bază pentru backend a fost motivată de ușurința de învățare și de suportul solid pentru dezvoltarea AI, în special prin intermediul bibliotecilor precum LangChain, care simplifică integrarea cu modelele lingvistice mari (LLM) ale OpenAI.
Pentru ca informațiile AI să se bazeze pe faptele și datele inerente Accesa, primul pas a fost proiectarea unui canal care să preia documente reale și să le transforme într-un format utilizabil. Am început cu documente reale din SharePoint, pe care le-am stocat în backendul nostru pentru a demonstra conceptul. Următorul pas ar fi să integrăm direct SharePoint pentru a avea acces la toate tipurile de date. Aceste documente au fost analizate și împărțite în bucăți de lungime fixă, cu unele suprapuneri pentru a menține continuitatea semantică. Fiecare bucată a fost adnotată cu numele documentului și cu URL-ul locației de stocare originale, ceea ce ajută ulterior la urmărirea sursei informațiilor utilizate de LLM.
Bucățile sunt apoi convertite în vectori prin apelarea API-ului de încorporare al OpenAI, care ia orice șir de cuvinte - adică o bucată - și îi încorporează semnificația într-un vector numeric. Vectorul este apoi stocat într-o bază de date de vectori, pentru care am folosit FAISS (Facebook AI Similarity Search) de la Meta. Această bază de date de vectori conține acum toți vectorii corespunzători tuturor fragmentelor și poate fi interogată în termeni de similaritate.
Când o întrebare a unui utilizator intră prin intermediul frontendului, întrebarea este primită în backend și transformată într-o reprezentare vectorială, folosind din nou API-ul de încorporare OpenAI. Această reprezentare vectorială este apoi comparată cu toți vectorii din baza de date vectorială, utilizând similitudinea cosinusului încorporată în FAISS. Ideea din spatele acestui lucru este că dorim să recuperăm exact acele documente care se aseamănă cel mai mult cu întrebarea de intrare. În cazul în care vectorii sunt suficient de asemănători cu interogarea utilizatorului, bucățile corespunzătoare ar trebui să fie transmise către LLM ca și context.
Pe lângă context și interogarea de intrare, solicitarea conține și un mesaj de sistem, care joacă un rol esențial în modelarea răspunsului LLM, ghidându-l în ceea ce privește modul de răspuns, formatul rezultatului și instruindu-l în mod explicit să își bazeze răspunsurile pe contextul furnizat. Elaborarea acestui mesaj - sau "prompt engineering" - a apărut ca un aspect crucial, echipa descoperind că instrucțiunile prea restrictive ar putea împiedica capacitatea LLM de a oferi răspunsuri. Mesajul de sistem include, de asemenea, directive pentru LLM de a cita sursele pe care le-a obținut din context într-un format JSON specific, astfel încât răspunsul LLM să poată fi trimis direct la frontend, care se ocupă de analiza JSON și afișează PDF-urile la care face referire în mod corespunzător. Pentru a realiza acest lucru, am folosit o tehnică numită one-shot prompting, astfel încât LLM să înțeleagă formatul pe care dorim să-l obținem. Această metodă a arătat că, deși LLM poate construi în mod adecvat JSON și poate face referințe exacte la sursele pe care le utilizează, a existat un compromis în ceea ce privește eficiența utilizării tokenurilor. Cu toate acestea, această abordare a fost preferată pentru simplitatea și eficiența implementării sale.
În cele din urmă, integrarea LangChain a permis asamblarea fără probleme a interogării utilizatorului, a contextului relevant și a mesajului sistemului într-un singur mesaj. Răspunsul LLM, bazat pe această solicitare a fost apoi transmis către frontend. Pentru a sprijini conversația continuă, fiecare interacțiune - care cuprinde interogarea utilizatorului, solicitarea și răspunsul LLM - este, de asemenea, salvată în backend. Acest istoric al conversației a asigurat păstrarea contextului interacțiunilor anterioare, îmbunătățind experiența utilizatorului cu răspunsuri ulterioare relevante și coerente.
După aproape 24 de ore de colaborare intensă, am reușit să facem o demonstrație live a chat-botului nostru în fața juriului, arătând funcțiile soluției noastre pe baza mai multor exemple de interogări. Sistemul nostru a răspuns corect la întrebări, făcând în același timp referințe exacte la PDF-urile pe care le-a folosit pentru a genera răspunsurile. Am verificat, de asemenea, dacă chat-botul va răspunde la orice intrare care nu se bazează în mod specific pe contextul furnizat, lucru pe care l-a reușit. Dacă ar exista un aspect care trebuie îmbunătățit, acesta ar fi latența - ideal, o soluție productivă ar trebui să analizeze găzduirea unor LLM-uri mai rapide la nivel local, deoarece noi am folosit API-ul GPT-4 relativ lent.
În general, experiența hackathonului a fost intensă, iar implicarea activă a întregii echipe a făcut-o memorabilă, aspect datorat nu în ultimul rând organizării bune a evenimentului în sine, cu obiective, direcții, termene și așteptări clar comunicate. Per total, în cadrul echipei și, din câte am aflat, în toate celelalte opt echipe, atmosfera a fost productivă, entuziastă și, cel mai important, foarte distractivă. Demonstrația tuturor soluțiilor dezvoltate a fost, probabil, cea mai interesantă parte: să vedem ce au construit colegii noștri în această perioadă scurtă de timp și cum au folosit inteligența artificială generativă pentru diferite soluții a fost pur și simplu remarcabil.
Noile tehnologii SAP ABAP