Dostępnik o asystentce koordynatorów dostępności
Jestem pewien, że koordynatorki i koordynatorzy dostępności bardzo chcą mieć kogoś, kogo mogą zapytać. Jednak wstydzą się swojej niewiedzy i to ich blokuje. Dlatego przygotowałem dla nich Ally.
Dzisiaj powinienem pisać o AutomaticA11y, bo przecież jest czwartek 16 maja. Refleksje zostawiam na kolejny numer Dostępnika. Jednak tu też będzie o sztucznej inteligencji i dostępności. Przygotowałem chatbota, który ma być wsparciem dla osób pełniących funkcję koordynatora do spraw dostępności. Inne osoby też mogą pogadać z Ally o dostępności, bo ma sporo wiedzy. Tu chcę się podzielić tym, jak powstawała Ally, a może ktoś wykorzysta tę wiedzę do zrobienia czegoś lepszego.
Po co właściwie taki chatbot?
To dobre pytanie, bo przecież o wszystko można zapytać Chat GPT, Copilota lub Gemini. Sęk w tym, że one czasem odpowiadają dobrze, a czasem niekoniecznie. I to nawet nie dlatego, że są głupie, tylko nie są wyspecjalizowane. Jak się uprzeć, to można z nich wyciągać poprawne informacje. Tylko to trzeba umieć zrobić. To trochę tak, jak z wyszukiwarką. Wrzucisz do niej hasło w rodzaju “wymiary pochylni” i otrzymasz ścianę wyników z różnych źródeł. Teraz musisz szukać i upewniać się, czy na pewno są to źródła wiarygodne. A potem jeszcze zagłębić się w temat.
Sztuczna inteligencja może służyć temu, by to ona zagłębiła się w temat, a Tobie dała odpowiedź. Ta odpowiedź musi być wiarygodna, a co do tego to chaty ogólnego przeznaczenia się nie sprawdzą. Dlatego trzeba dostarczyć sztucznej inteligencji materiały źródłowe.
Douczanie Ally
Modele językowe, jak GPT, Gemini, czy Mixtral mają pewną pojemność pamięci, którą często nazywa się kontekstem. Jest to określona liczba tokenów, różna w różnych modelach. Token to taka jednostka tekstu stosowana w modelach językowych. Moje doświadczenie podpowiada, że z grubsza 1 token to 2 znaki w tekście. Oczywiście dotyczy to tekstów po polsku, bo w innych bywa inaczej.
Jeżeli zatem konkretny model ma pojemność 8000 tokenów, to zmieści około 16000 znaków, czyli około 5 stron dokumentu Word. I tylko w tej przestrzeni się porusza i tylko to wie. Jeżeli zatem chcemy dać tej wiedzy więcej, to ona się w tym kontekście nie zmieści. A ja chciałem przygotować więcej wiedzy.
Sięgnąłem po opracowania, które są powszechnie uznawane za wiarygodne. W dostępności architektonicznej jest o Budowlane ABC. W obszarze wdrażania ustawy i zadań koordynatorów - 2 publikacje na stronie MFiPR. Na takiej próbce chciałem sprawdzić mechanizmy, aby potem rozszerzać o kolejne zasoby. Dlatego Ally na razie wie niewiele o dostępności cyfrowej, ale poda Ci każdy parametr schodów lub windy.
Wiedza w kawałkach
Z tymi tokenami i pojemnością kontekstu jest jeszcze problem ekonomiczny. Tokeny kosztują, a płacić trzeba zarówno za te wysłane do sztucznej inteligencji, jak i generowane przez nią w okienku chatu. Im więcej tokenów, tym kosztowniejsze są zapytania. Jeżeli nie liczyć się z pieniędzmi, to można wziąć model o znacznie większym kontekście, upchnąć w nim całą publikację i to będzie działać świetnie, tylko drogo. Na szczęście są sposoby na optymalizację tego procesu.
Algorytm jest następujący. Dzielimy tekst na mniejsze kawałki i dopasowujemy do pytania konkretny z tych kawałków. I tylko on trafia do okna kontekstu, dzięki czemu odpowiedź jest dokładniejsza i tańsza. I tak właśnie zacząłem robić.
Skopiowałem treść Budowlanego ABC i pociąłem na mniejsze fragmenty. Akurat w tym zasobie były to zazwyczaj podrozdziały, ale czasem musiałem jakiś podzielić na pół lub połączyć 2 mniejsze. Potem usuwałem zbędne znaki, końce linii i otrzymywałem pojedyńczą linię z treścią. Korzystałem z Visual Studio Code, do którego doinstalowałem 2 rozszerzenia. Jedno liczyło mi tokeny w zaznaczonym tekście, a drugie dostarczało funkcje do czyszczenia tekstu.
To było sporo pracy i wiem, że można łatwiej i szybciej. Można na przykład ciąć pliki na kawałki o stałej liczbie znaków i z zakładkami, żeby zachować kontekst. Ja jednak wolałem to zrobić ręcznie, co daje efekty o wyższej jakości.
Wyszukiwanie fiszki
No dobrze, ale skąd GPT wie, który kawałek tekstu wybrać jako kontekst? Oczywiście nie wie i to moim zadaniem jest dostarczenie mu takiej informacji. Oznaczało to, że muszę znaleźć odpowiednią fiszkę z informacjami i dodać ją do kontekstu. I tu napotkałem wyższą matematykę.
Fiszki z informacjami można znajdować na wiele sposobów. Jeżeli użytkownik wpisze pytanie “Jaka jest szerokość drzwi?”, to można szukać tych słów kluczowych. Jednak takie szukanie sprawi, że dostaniemy kilka lub kilkanaście fiszek ze słowem “drzwi” i “szerokość”. Jeżeli będą tam oba słowa, to można przyjąć, że to jest najlepsza fiszka. Jednak tak wcale nie musi być, a poza tym możemy dostać wiele fiszek z tymi 2 wyrazami i nadal nie wiemy, którą wybrać.
Okazuje się jednak, że naukowcy główkują nad takimi problemami i znajdują rozwiązania. Pojawiły się algorytmy, które potrafią obliczyć podobieństwa między 2 tekstami, a przy tym robią to kontekstowo. Mogę zatem wziąć pytanie użytkownika o szerokość drzwi i porównać je z wszystkimi fiszkami w moim dokumencie z wiedzą. Potem wystarczy posortować i na wierzch wypłyną najbardziej odpowiednie fiszki. Prawdziwa magia.
Problem polega jednak na tym, że same teksty nie nadają się do takiego porównywania. Porównuje się ich wektorową reprezentację, która wygląda - przynajmniej w przypadku Ally - jak bardzo długi ciąg liczb zmiennoprzecinkowych. Wszedłem na grząski grunt, bo nie do końca rozumiałem, jak to właściwie działa. Pracowałem metodą prób i błędów, posiłkowałem się tutorialami i chatem GPT. W końcu objąłem umysłem i zwektoryzowałem zasoby wiedzowe.
Kiedy się już wie, to wszystko wydaje się takie proste. Skrypt w Pythonie i plik tekstowy zamienia się w plik CSV. W 1 kolumnie jest tekst, a w 2 kolumnie - wektor tego tekstu. W ten sposób powstał dokument zrozumiały dla algorytmów porównywania. Można już przystąpić do pisania aplikacji chatu.
Narodziny Ally
Ja nie jestem programistą. To że Ally działa uważam wciąż za coś niezwykłego. Jednak od pewnego momentu umiałem już analizować kod, poprawiać i optymalizować. Korzystałem przy tym z pomocy różnych chatów, bo każdy ma swoje zalety. Bywało, że w 3 zakładkach były 3 różne chatboty. No ale do rzeczy.
Musiałem jakoś ogarnąć interfejs graficzny Ally. Tu użyłem biblioteki Gradio, która została stworzona właśnie do pracy z modelami sztucznej inteligencji. Użyłem funkcji ChatInterface, która daje wszystko, co jest potrzebne do zrobienia chatbota. Okienko do pisania, obsługa historii, potencjalnie kilka wejść i wyjść. Do tego można dodać tytuł i opis aplikacji. Może i nie jest to najpiękniejsza aplikacja, ale służy.
Głównym silnikiem aplikacji była wyszukiwarka fiszek. Po kilku testach zdecydowałem się na bibliotekę Sklearn. Ona potrafi szybko porównywać wektory, a potem je posortować. Dla ciekawych technicznie - korzystam z algorytmu porównania kosinusowego.
Aby te wyszukiwania były możliwe, trzeba było jeszcze jakoś zaimportować dane do pamięci. Użyłem do tego bardzo popularnych bibliotek Pandas i NumPy. Za ich pomocą mogę przetworzyć mój plik CSV na macierz wektorową i na niej wykonywać dalsze operacje.
Wreszcie potrzebowałem biblioteki do komunikowania się z modelem językowym. To on miał przecież generować odpowiedzi na podstawie pytań i odnalezionych fiszek. Mój wybór padł na OpenAI. Próbowałem innych połączeń, w szczególności intensywnie testowałem bibliotekę Transformers. Jednak dobre efekty osiągałem tylko z OpenAI. Nawet wektoryzację robiłem za pomocą ich modelu text-embedding-3-large, bo SciPy się nie sprawdził.
Na koniec musiałem znaleźć mieszkanie dla Ally. Podczas testów mieszkała u mnie na dysku, a rozmawiać z nią można było przez specjalny tunel. To jednak było niepraktyczne. Umieściłem Ally na platformie Huggingface i tam na razie sobie mieszka. Być może przeprowadzi się gdzieś indziej, ale na razie wolę ją bardziej douczyć, niż szukać kolejnych miejscówek.
Podsumowanie
To była dla mnie długa i mozolna podróż. Powtórzę jeszcze raz, że nie jestem programistą, a musiałem programować. Nie jestem informatykiem, a musiałem korzystać z API, różnych bibliotek i systemów do zarządzania projektami. Dużo pracowałem w terminalu i do tego na zmianę w Windows i MacOS. Teraz już umiem to robić i mogę zaprojektować wyspecjalizowanego chatbota na niemal dowolne zapotrzebowanie. Daj mi tylko materiał źródłowy i oczekiwania. A skoro już jesteś w tym miejscu, to zapraszam Cię do poznania Ally. Może się polubicie. I jeszcze pytanie - czy Ally powinna mieć twarz? A jeżeli tak, to jak powinna wyglądać. Ja mam swoje wyobrażenie, ale czekam na sugestie.
Wieści o dostępności
Dużo się obecnie dzieje w dostępności, ale chyba ta informacja jest najważniejsza. Ustawa o zapewnianiu spełniania wymagań dostępności niektórych produktów i usług przez podmioty gospodarcze została podpisana przez Prezydenta RP i w ten sposób stała się obowiązującym aktem prawnym. No ja wiem, że jeszcze publikacja w Dzienniku Ustaw termin do obowiązywania, ale to technikalia. Teraz będziemy rozkminiać, jak tego aktu prawnego używać. Na 12 czerwca Ministerstwo Funduszy i Polityki Regionalnej planuje konferencję na ten temat. Wybieram się.
I to by było na tyle. Putin bez litości pcha na front kolejne tysiące żołnierzy, żeby ginęli za jego ego. Ukraińcy ię bronią i kiedyś powstaną na ten temat pieśni, poematy i powieści. Na razie jednak brakuje im już sił i broni. Jeżeli wierzysz - pomódl się w ich intencji. Jeżeli nie - trzymaj kciuki i dorzuć się do jakiegoś funduszu na zakup broni. Bo po nich możemy być my. Trzymaj też kciuki za AutomaticA11y, żeby wszystko poszło dobrze lub przynajmniej przyzwoicie. Dobrego dnia.
Cześć :) Chciałabym z Tobą porozmawiać o wyspecjalizowani Twojego bota w wiedzę żeglarską i motorowodną anita.marszalek@issa.global