Stworzenie modeli przetwarzania języka naturalnego (NLP) dla języka polskiego
Technologie
• PyTorch
• PyTorch Lightning
• MLflow
• DVC
• AWS
Wyzwanie
Większa część rozwoju NLP przebiegała w ramach języka angielskiego z uwagi na względną prostotę jego reguł gramatycznych oraz łatwą dostępność anglojęzycznych danych. Niestety, w przypadku języka polskiego, sprawy mają się nieco gorzej.
W związku z tym, nasz zespół specjalistów w dziedzinie uczenia maszynowego musiał zmierzyć się ze sporym wyzwaniem. Naszym celem było stworzenie opartego na modelu uczenia maszynowego chatbota, który mógłby funkcjonować w charakterze polskojęzycznego konsultanta obsługi klienta dla różnych branż – od e-commerce po prawną i energetyczną.
W związku z innowacyjnym charakterem projektu, nasi deweloperzy musieli wytrenować bazowy model od zera. Wykorzystali do tego celu dane z różnych źródeł: polskiej Wikipedii, polskiej wersji CommonCrawl, Narodowego Słownika Języka Polskiego, Korpusu Dyskursu Parlamentarnego https://czytac.com/, i literatury www.wolnelektury.pl.
Aby przygotować się do tego procesu, zespół stworzył odpowiedni procesor tekstu dla każdego zestawu danych. Sprawdziliśmy też każdy zestaw pod kątem elementów do usunięcia, niebędących częścią języka, jak linki czy zduplikowane tytuły.
W momencie planowania projektu, modele typu transformator nie były jeszcze powszechnie stosowane w NLP. Najpopularniejszym podejściem było LTSM. Nasz zespół połączył oba te podejścia, angażując GPT-2 (Generative Pre-Trained Transformer). Wytrenowaliśmy modele z wykorzystaniem treści z różnych źródeł.
Gdy model był już w stanie zrozumieć i wygenerować tekst na podstawowe tematy, kolejnym krokiem było wytrenowanie go w ramach poszczególnych sektorów. Na tym etapie musieliśmy nauczyć nasz algorytmrozwiązywać mniej standardowe zadania, takie jak generowanie umów (dla sektora prawnego) czy klasyfikowanie i przkierowanie zgłoszeń technicznych (dla sektora energetycznego). Developerzy wykorzystali w tym celu niestandardowe otwarte bazy danych w języku polskim oraz bazy danych w języku angielskim przetłumaczone przez API Google Translate, a także dane pozyskane za pośrednictwem web scrapingu.
Przez cały czas trwania procesu, największym problemem było pozyskanie jakościowych danych w wystarczających ilościach. Kolejną przeszkodą do pokonania był wysoki poziom skomplikowania języka polskiego, który jest mocno fleksyjny. W skrócie, oznacza to, że pojedynczy morfem (najmniejsza jednostka mowy) zawiera w sobie wiele gramatycznych, syntaktycznych czy semantycznych cech. Spowodowało to wiele problemów z poprawnością generowanego tekstu i wymagało ponownego uczenia modelu. Gdy modele NLP zaczęły generować zadowalające wyniki, chatbot został wyposażony w dodatkowe funkcje, takie jak generowanie dokumentów PDF, rozpoznawanie zdjęć oraz integracje przez API. Przez cały czas trwania projektu, nasz zespół zajmujący się uczeniem maszynowym współpracował w oparciu o metodologię Scrum.
Nasz zespół stworzył chatbota, który realizuje wiele różnych zadań w języku polskim. Rozwinęliśmy na jego potrzeby model uczenia maszynowego, wykorzystując w tym celu takie biblioteki jak Hugging Face, Pytorchi PytorchLighting. Po zapoznaniu się z literaturą przedmiotu i przeprowadzeniu wstępnych badań empirycznych, zespół zdecydował się wykorzystać algorytm AdamW jako optymizator, trenując jednocześnie model.
Procesy trenowania i uczenia przeprowadziliśmy w środowiskach obliczeniowych wyposażonych w karty graficzne. Przy dużych zestawach danych, uruchamialiśmy proces uczenia na wielu kartach graficznych jednocześnie, korzystając z podejścia obliczeń równoległych. Najpierw przeprowadzony został on w środowisku AWS cloudz zastosowaniem kart NVIDIA Tesla K80. Ze względu na ich brak dostępności, przenieśliśmy jednak nasze obliczenia na lokalne środowisko, wykorzystując tym razem NVIDIA GeForce RTX 3090 Ti.
Model został też manualnie zweryfikowany z wykorzystaniem treści, które nie były częścią zestawu danych. Sprawdziliśmy go, zadając pytania odnośnie wprowadzonego poprzednio fragmentu tekstu. Zadaniem modelu było wskazanie fragmentu, który stanowił odpowiedź na pytanie. Jeśli natomiast tekst nie zawierał odpowiedzi na zadane pytanie, model również powinien to wykazać.
Stworzyliśmy w tym celu prostą aplikację składającą się z dwóch modułów. Pierwszy był przetestowanym już modelem. Drugi natomiast – prostym algorytmem, który wyszukiwał w polskiej Wikipedii fragmenty tekstu mogące zawierać odpowiedź na zadane pytanie. Wyeliminowaliśmy w ten sposób konieczność wyposażania modelu w kontekst za każdym razem, co znacząco ułatwiło ewaluację.
Ze względu na jakość danych wykorzystanych w procesie uczenia, model czasem podawał błędne odpowiedzi – był to jednak zazwyczaj wynik nieprawidłowo zadanego pytania. Po zmodyfikowaniu zapytania (np. Kiedy miał miejsce chrzest Polski -> w którym roku Mieszko I przyjął chrzest Polski?), model dostarczał właściwą odpowiedź.
"Zespół 4soft podszedł do tego wyzwania NLP w kreatywny sposób, wykorzystując dostępne rozwiązania, aby osiągnąć realne postępy w tym trudnym obszarze. Dzięki umiejętnościom i wiedzy zespołu projekt okazał się sukcesem, który otworzył drzwi do dalszych prac, które zapowiadają wiele ekscytujących zastosowań."
Gdybyśmy chcieli stworzyć takiego chatbota w języku angielskim, nie musielibyśmy tworzyć modelu NLP od zera. Wiele takich modeli jest dostępnych jako projekty open-source. Nie jest tak jednak w przypadku języka polskiego.Na ten moment, chatbot bazuje na jednym modelu, wytrenowanym na potrzeby odpowiedzi na pytania. Wykorzystywany jest do zademonstrowania możliwości stworzonych rozwiązań (modele wytrenowane do realizacji poszczególnych zadań) w formie gotowego produktu.