TSM - Optimizarea performanței și eficienței utilizând o arhitectură de chatbot LLM

Adrian Căliman - Solution Architect @ PitechPlus

Arhitectura proiectului, pe care o vom prezenta mai jos, s-a născut dintr-o inițiativă de cercetare a unui jucător important din sectorul de externalizare a proceselor de business (BPO). Serviciile BPO includ: consultanță, asistență comercială, servicii juridice, vânzări și suport tehnic.

În cadrul acestor servicii, suportul tehnic se diferențiază prin complexitate, care derivă din obiectivele serviciului, diversitatea canalelor de comunicare folosite și din volumul mare de muncă manuală necesară.

Soluția existentă urmărește să respecte mai multe angajamente cheie precum: îmbunătățirea experienței clienților și a utilizatorilor prin rezolvarea rapidă a problemelor tehnice, implementarea unor procese personalizate de gestionare a tichetelor, asigurarea monitorizării non-stop și a unui răspuns prompt la incidente.

Totuși, în acest cadru, fiecare echipă de suport trebuie să parcurgă un training pe baza cunoștințelor și proceselor specifice clientului. Această etapă de formare necesită mult timp și este costisitoare. În plus, vine cu provocări semnificative atunci când vorbim de extinderea echipelor și devine, în cele din urmă, un obstacol redutabil.

Pentru a simplifica și optimiza acest proces, o abordare este integrarea unui chatbot pentru automatizarea conversațiilor scrise între utilizatori și echipele de suport tehnic.

Chatboturile se dovedesc deosebit de valoroase atunci când intenția utilizatorului este clară, iar informațiile necesare pot fi furnizate prin intermediul unor reguli și condiții predefinite.

Cu toate acestea, în ciuda așteptărilor inițiale de îmbunătățire semnificativă a eficienței conversației, implementarea în lumea reală a dezvăluit câteva limitări notabile:

Modelele de limbaj de mari dimensiuni (LLM)

Pentru a răspunde acestor provocări, am explorat o alternativă promițătoare: modelele GPT ale OpenAI. Documentele care descriu aceste modele evidențiază abilitatea lor de a obține o înțelegere robustă a limbajului natural prin pre-antrenament generativ și ajustare fină, valorificând un corpus vast de text.

Cu entuziasm, în martie 2023, OpenAI a lansat API-ul ChatGPT, care permite utilizarea practică a acestor modele prin intermediul interfețelor de programare.

OpenAI - limitări

Deși inițial modelele ChatGPT pot părea o soluție "plug-and-play" convenabilă pentru a îmbunătăți chatbotul, am întâlnit trei limitări semnificative care împiedică aplicarea lor directă în cazul nostru specific:

Pe baza cercetării noastre, am stabilit că modelele GPT explorate au un potențial promițător pentru a fi utilizate, dar vor avea nevoie de personalizare. Pentru a utiliza în mod eficient LLM-urile, avem în vedere dezvoltarea arhitecturii unei aplicații "middleware" care poate gestiona procesarea intrărilor și ieșirilor. Scopul său principal va fi să personalizeze atât intrarea, cât și ieșirea răspunsurilor pe care le primesc utilizatorii, pentru a asigura exactitatea factuală întemeiată pe baza noastră de cunoștințe proprietare.

Ingineria prompturilor (Prompt engineering) este un proces crucial care implică crearea și ajustarea precisă a prompturilor (mesajul de intrare trimis către LLM) pentru a îmbunătăți performanța modelelor de învățare automată, asigurând răspunsuri mai precise și mai relevante din punct de vedere contextual. În special în cazul modelelor de limbaj de mari dimensiuni precum ChatGPT, prompturile de intrare joacă un rol vital nu numai în specificarea rezultatului dorit, ci și în furnizarea unui context esențial pentru întrebările noastre.

Pentru cazul nostru specific, acesta este un avantaj semnificativ: înseamnă că avem posibilitatea de a proiecta prompturi care includ informațiile necesare pentru ca modelul să răspundă cu precizie întrebărilor noastre. Prin elaborarea atentă a prompturilor, putem ghida înțelegerea modelului, putem îmbunătăți relevanța și acuratețea răspunsurilor sale.
Ingineria promptului ne permite să valorificăm eficient capacitățile modelului, aliniindu-l mai îndeaproape cu nevoile și cerințele specifice soluției noastre de chatbot.

Arhitectura LLM Chatbot

Să ne imaginăm că dezvoltăm un chatbot special conceput pentru a oferi informații despre utilizarea diferitelor funcționalități ale Dacia Duster. Să luăm în considerare un scenariu în care un utilizator întreabă: "Cum pot dezactiva controlul tracțiunii pe Dacia Duster Adventure?" Pentru a ne asigura că chatbotul furnizează un răspuns precis, putem proiecta strategic prompt-ul astfel: "

----

Given the following context, answer my question:

// pasting entire user manual

Question: How can I deactivate Traction control on my Dacia Duster Adventure?

----

Aceasta, totuși, nu ar fi o soluție practică, deoarece mesajele au limită de dimensiune. Limitele sunt exprimate în număr de tokeni, unde un token reprezintă aproximativ 0,75 cuvinte. Cel mai performant model GPT disponibil în prezent (iunie 2023) are o limită maximă de 8192 de tokeni pe suma întrebare + răspuns. De asemenea, ar fi nepractic să includem întregul manual de utilizare în prompt, deoarece modelul are nevoie doar de secțiunile referitoare la controlul tracțiunii pentru a citi și extrage ceea ce se dorește a fi obținut.

Prin urmare, o abordare mai practică ar fi aceea de a construi promptul astfel:

-----

*Given the following context, answer my question:*

```// pasting relevant section

// pasting relevant section```

…

Question: How can I deactivate Traction control on my Dacia Duster Adventure?

-----

Provocarea actuală constă în identificarea secțiunilor relevante din baza noastră de date. Pentru a o rezolva, ne vom folosi de conceptul de "embeddings", care este practic reprezentarea matematică a unor concepte textuale. Distanța dintre doi vectori ndică relația dintre ei, distanțele mai mici sugerând o relație mai mare, iar distanțele mai mari sugerând o relație mai mică.

Acest lucru ne permite să determinăm matematic ce secțiuni din baza de cunoștințe sunt similare din punct de vedere semantic cu întrebarea utilizatorului.

Pentru a pregăti datele, am împărțit baza de cunoștințe în fragmente de text care conțin fiecare aproximativ 200-500 de cuvinte . Apoi, utilizând un alt model din familia GPT3, Ada 002, așa cum a fost sugerat de OpenAI, am generat "embeddings" pentru fiecare fragment de text. Un "embedding" așadar este un vector cu dimensiunea de 1536 numere reale care servesc drept bază pentru găsirea de conținut similar.

Prin combinarea tuturor acestor componente, am conceput o arhitectură care acționează ca un intermediar între utilizatorul final și modelele de ultimă generație. Arhitectura ilustrată în diagrama următoare cuprinde două faze independente.

Faza de pregătire

Această etapă se realizează o singură dată pentru fiecare bază de cunoștințe sau ori de câte ori o anumită parte se modifică. Secvența de evenimente este următoarea:

  1. Datele din baza de cunoștințe a clientului sunt citite. Acestea pot fi structurate sau nu și pot fi localizate oriunde ne putem conecta la ele.

  2. După ce datele sunt citite, acestea sunt împărțite în bucăți de text între 200 și 500 de cuvinte.

  3. Pentru fiecare fragment de text se apelează interfața de programare de "embedding" pentru a genera vectorul corespunzător.

  4. Fiecare bucată de text împreună cu "embedding"-ul corespondent sunt stocate în baza de date.

După finalizarea acestui proces, sistemul este pregătit să folosească aceste date și să le ofere drept context atunci când utilizatorul adresează o întrebare.

Faza de utilizare (etapele în verde în figura de mai sus)

Această fază va avea loc numai după finalizarea părții de training. Secvența următoare va fi executată pentru fiecare întrebare a utilizatorului:

  1. Utilizatorul adresează o întrebare.

  2. Sistemul preia întrebarea în forma sa originală și obține "embedding" vectorul folosind aceeași interfață ca în faza de pregătire.

  3. Apoi compară "embedding"-ul întrebării cu "embedding"-urile din toate datele și calculează similitudinea cosinusului pentru a determina ce fragmente de text din baza de date sunt cele mai asemănătoare cu întrebarea.

  4. După determinarea fragmentelor relevante de text pe baza distanței dintre "embedding" vectori, primele X potriviri (configurabil) sunt preluate și sortate în funcție de similaritate.

  5. Pentru fiecare fragment, calculăm numărul de tokeni și continuăm să-i adăugăm până când ajungem la limita de 4096 de tokeni.

  6. După obținerea conținutului cel mai relevant pentru întrebare, îl includem în prompt și folosim interfața de comunicare ChatCompletion pentru a obține un răspuns. Obiectivul va fi utilizarea modelelor GPT 3.5 / GPT 4.

Prin această abordare, împiedicăm și răspunderea la întrebări în afara domeniului nostru, adăugând restricții clare ca parte a promptului.

Concluzii

Integrarea modelelor GPT ale OpenAI în procesul de suport tehnic prin intermediul unui chatbot este promițătoare, dar are anumite limitări. Printre acestea amintim: accesul restricționat la bazele de cunoștințe proprietare, necesitatea de a se concentra pe subiecte specifice și posibilitatea de a furniza informații inexacte. Pentru a aborda aceste provocări, a fost dezvoltată o aplicație "middleware" pentru a personaliza răspunsurile chatbotului, folosind baza noastră de cunoștințe.

Ingineria promptului a avut un rol esențial în ghidarea înțelegerii modelului și îmbunătățirea relevanței și acurateței răspunsurilor sale. "Embedding"-urile au fost utilizate pentru a determina similaritatea semantică între întrebările utilizatorului și conținutul din baza de cunoștințe, permițând identificarea informațiilor relevante.

Arhitectura Chatbotului LLM descrisă, care constă într-o fază de pregătire și o fază de utilizare, îmbunătățește eficiența suportului tehnic prin furnizarea de răspunsuri precise din domeniul specificat. Progresele ulterioare ale modelelor de limbaj pot fi integrate pentru a îmbunătăți permanent performanța chatbotului. Dezvoltarea și personalizarea continue a modelelor LLM pot revoluționa industria de suport tehnic și transforma furnizarea de servicii către clienți.