LLMy nie kłamią

Sztuczna inteligencja, skrótowo zwana AI wciska się ostatnio wszędzie, czy sens jest, czy go nie ma. Tak naprawdę zaczęliśmy ostatnio określać tym mianem głównie LLMy, ale nie zawsze tak było. Ktoś pamięta takie rzeczy jak algorytmy genetyczne? Niemniej, obecnie jeśli ktoś mówi o AI, to najprawdopodobniej chodzi mu o LLM.

W każdym razie, jak bumerang w wypowiedziach powraca temat „uczłowieczania” AI. Często słyszymy zwrotu typu AI kłamie, AI się myli czy AI rozumie polecenia. Ostatnio spotkałem się z bardzo ciekawym moim zdaniem stanowiskiem, że LLMy nie mogą kłamać. Teraz pewnie wszyscy starają się przypomnieć sobie ostatni niezaprzeczalny dowód na kłamstwo LLMa. Jednak tak naprawdę chodzi o coś innego, niż błędna, niezgodna ze stanem faktycznym odpowiedź. Kwestia jest bardziej filozoficzna. Żeby kłamać, AI musiałoby wiedzieć, co jest prawdą i świadomie udzielić innej odpowiedzi. I podejście takie bardzo mi się podoba.

Tymczasem LLM nie wie, co to jest prawda, nie myśli, nie rozumie pytania. Na podstawie dostarczonych wcześniej danych, na których został wytrenowany, generuje tekst, który ma pasować do zadanego pytania. Czyli: weź wprowadzony tekst, przetwórz go na dane wejściowe, których umiesz używać. Następnie wygeneruj pasującą odpowiedź w swoich danych/języku, przetwórz ją na tekst. Tak w skrócie, bo jest jeszcze prompt, który – podobnie jak pytanie – jest danymi wejściowymi i potrafi wpływać na wynik. Ale znowu, nie w formie rozumienia go przez AI tak, jak my rozumiemy rozumienie. No i AI nie działa deterministycznie. Nawet, jeśli zwykle daje dość powtarzalne (najbardziej prawdopodobne) wyniki.

Łatwiej to wszystko chyba zrozumieć ludziom, którzy bawili się algorytmami genetycznymi czy łańcuchami Markowa tak z ćwierć wieku temu. A niestety odruchowo łatwo jest przypisywać cechy ludzkie czemuś, co zachowuje się podobnie do człowieka[1]. Nawet, jeśli zasada działania jest zupełnie inna.

Dlatego następnym razem, zamiast powiedzieć: LLM kłamie lepiej rzec LLM wygenerował odpowiedź, która nie ma pokrycia w rzeczywistości. Ale nie mam złudzeń, nikt tak mówić nie będzie. Lubimy uproszczenia.

[1] Pewnie nawet można pokusić się o twierdzenie, że mamy – jako gatunek – tendencję do zrównywania komunikacji z myśleniem czy inteligencją. Podobno często niesłyszący traktowani są jako upośledzeni intelektualnie. Przy LLMach byłoby odwrotnie: składa zdania, znaczy myśli.

Debian Trixie

Wczoraj została nowa wersja Debiana, o nazwie kodowej Trixie. Podobnie jak przy okazji Bookworm, wrażenia z instalacji.

Na pierwszy rzut, jeszcze wczoraj, poszedł kontener LXC w którym działa nowy certstream[1]. Nie bardzo miało co pójść nie tak i… nie poszło. Aktualizacja w zasadzie nudna, jedyne o czym warto pamiętać, to zmiana formatu w jakim podawane są źródła apt. Nie była to nowość, bo w końcu na desktopie mam od dawna Debiana Sid.

Rozochociło mnie to i jako drugi zacząłem aktualizować kontener z Linuksem na Chromebooku. No nie polecam. Będę przywracał z backupu. Ale to raczej nie wina Debiana, raczej coś przeoczyłem, lub – co najbardziej prawdopodobne – po prostu są dodatkowe elementy wymagane przy interakcji. Komunikaty niezbyt pomocne, w zasadzie naprowadzają jedynie na zbyt małą ilość przydzielonej pamięci ale… nie wygląda na używaną.

Potem zaktualizowałem jeszcze kontenery LXC w których działają blogi. Wymagane były drobne poprawki związane ze zmianami w składni nginx oraz wersją PHP. Dość standardowo.

Więcej roboty było ze skryptami Pythona i virtual environments. Musiałem wszystkie utworzyć, przy okazji wyszły drobne zmiany w bibliotekach. Problemem jest ilość i konieczność ręcznej roboty, nie stopień komplikacji.

Szybka ściągawka z poleceń, oczywiście polecam lekturę instrukcji:

apt update
apt upgrade
# Zmiana wpisów w sources (sed -i "s/bookworm/trixie/" /etc/apt/sources.list)
apt update
apt upgrade --without-new-pkgs
apt full-upgrade
apt autoremove
apt modernize-sources
# Opcjonalnie
apt list '~o'
apt purge '~o'
apt list '~c'
apt purge '~c'

Jeśli coś ciekawego wyniknie na pozostałych systemach, dam znać.

[1] Notka w trakcie tworzenia, nie ma chronologii, oj, nie ma…

Planeta – reaktywacja

Po nieco ponad kwartale od zatrzymania Planety Joggera, dojrzałem do jej przywrócenia. Nie jest to ta sama planeta, co wcześniej. Główna zmiana to silnik. Skręciłem w stronę o której pisałem czyli prosta planeta, gdzie będą tylko tytuły i daty wpisów. Może tekstowy fragment opisu, bez formatowania HTML.

Zmiana silnika spowodowała też parę zmian. Jest też kilka niedoróbek:

  • Lista blogów w stopce jest generowana dynamicznie. Tylko jeśli uda się pobrać feed, to blog się pojawi na liście źródeł. Wynika z pewnego uproszczenia działania po stronie silnika, może kiedyś zmienię. Albo może i nie zmienię, bo po co oszukiwać, że wpisy z danego źródła są pobierane, skoro nie są?
  • W przeciwieństwie do poprzedniej wersji nie są prezentowane pełne wpisy, a jedynie zajawki. Czyli wykorzystuję pole description z feedu. Powodów jest wiele, ale w sumie przy poprzedniej wersji była sugestia, żeby właśnie tylko zajawkę dawać i… wg mnie jest OK.
  • Nie będą pojawiały się obrazki/zdjęcia. Trochę jest to pokłosie punktu wyżej, a trochę ze względu na bezpieczeństwo.
  • Nie działa feed planety (choć jest linkowany). Nie zrobiłem na razie, ale będzie.

Z niewidocznych zmian: wylatuje kontener LXC, nie ma całego Planet Venus. Nie ma cache. Całość to obecnie jest jeden plik konfiguracyjny (YAML), dwa pliki template i jeden plik z kodem (Python). Uruchomić z crona, najlepiej z wykorzystaniem venv i… to wszystko. Działa szybciej. KISS

Jeśli chodzi o jak to jest zrobione, to silnik – albo raczej: silniczek – opublikuję wkrótce. Na razie przetestowałem działanie ręcznie, teraz uruchomiłem automatyczne odświeżanie z crona. Jeśli zauważycie błędy liczę na informację. Gdy wszystko będzie działało i dorobię generowanie feedu planety, wtedy publikacja kodu. Repo nanoplanet – chwilowo puste – już linkuję, żeby nie musieć aktualizować wpisu.

Dajcie znać jak się podoba i czy widzicie jakieś usterki.