Ludzie kontra AI

Nie będzie to wpis o tym, czy faktycznie AI odbiera pracę albo komu. Będzie o sprzeciwie. I o tym, że ludzie są przeciw AI. Być może pierwszym zauważalnym, na pewno godnym odnotowania.

Zaczęło się niewinnie. Jarosław Juszkiewicz, który był przez 15 lat polskim głosem w Google Maps, został zwolniony przez koncern Google. Kilka dni temu pożegnał się w social media:

Jak podaje Wikipedia, nie jest to pierwsza próba zastąpienia go automatem. Z pierwszej Google się wycofało. Tym razem, gdy syntezator oparty jest o AI – nie.

Dramatu zwalnianego człowieka razem tu nie ma, bo lektor pracę szybko znalazł – dziś pojawiły się doniesienia o tym, że zatrudnił się w Orlenie. Ale nie o tym ma być ten wpis.

Chodzi o reakcję ludzi na tę sytuację. Oczywiście zwolnienie lektora nie spodobało się użytkownikom, którzy dają wyraz niezadowoleniu. Ocena aplikacji Google Maps w sklepie Google Play spada na pysk. Wczoraj było to 2,2. Dziś rano – 2,1. A gdy piszę ten wpis jest 1,9. Przy 17,68 mln ocen. Przypadek? Nie sądzę.

Czy to zaboli Google? Niekoniecznie. Monopolista zapewne sobie poradzi. Na systemach z Android Google Maps chyba są instalowane domyślnie. Uznanych alternatyw brak. Google maps mają ponad 10 mld pobrań. Jeśli dobrze widzę, kolejne aplikacje na frazę „maps” to Google Maps Go oraz – także powiązana z Google – nawigacja samochodowa Waze mają po 500 mln. Zresztą, nie zdziwiłbym się, gdyby Google skorygowało ocenę w swoim sklepie. W końcu Nazwa.pl zrobiła kiedyś podobnie.

Ale może wydarzenie przejdzie do historii jako pierwszy(?) zauważalny(?) bunt ludzi przeciwko AI. W zasadzie nie tyle chodzi o to, że ludzie są przeciw AI, co przeciw chciwości koncernu, a AI jest tylko w tle, no ale…

Dict, set, list!

Przy okazji niedawnego code review dostałem pytanie, czemu w skrypcie napisanym w Pythonie nie korzystam z obiektu typu set, tylko z dict. Chodziło o cache na kilka tysięcy elementów, odpytywany kilkaset tysięcy razy. Z przyzerowym hit ratio. Zdziwiłem się, bo kojarzyłem, że czytelna konstrukcja wykorzystująca in dla obiektu typu list

data = [x for x in range(1000)]
y = 1001
if y in data:
    print("Hit")

jest raczej wolna. Zwłaszcza w porównaniu z nieco mniej czytelnym wariantem z użyciem dict:

data = {x: True for x in range(1000)}
y = 1001
if data.get(y):
    print("Hit")

Odpisałem o co chodziło i usłyszałem, że przecież set jest szybki. Coś mi zaświtało. Bo niby set jest bardziej podobny w użyciu do listy, ale pod spodem ma parę ciekawych właściwości. Zresztą, gdy poprosimy LLM o optymalizację pod kątem szybkości, otrzymamy coś w stylu[1]:

data = {x for x in range(1000)} # Converted 'data' to a set
y = 1001
if y in data:  # Checking membership still works the same way
    print("Hit")

Różnice w czasie wykonania możemy zgrubnie i niezbyt elegancko sprawdzić w następujący sposób:

Jak już jesteśmy przy tego typu ciekawostkach. A co jeśli mamy w cache ciągi znaków i chcemy sprawdzić, czy nasz ciąg znaków nie kończy się jednym z ciągów z cache? LLM poproszony o optymalizację znowu podpowiada, że lepszy jest set. Ale nieoczekiwanie sugeruje też wykorzystanie regexpów. I co? Ku mojemu zaskoczeniu regexp w stylu

pattern = re.compile("("+"|".join(our_set)+")"$")
return bool(pattern.search(tested_value))

okazuje się najszybszym rozwiązaniem! Nie to, że uważam regexpy za szczególnie wolne, co to, to nie. Oczywiście pattern wykonujemy raz, nie dla każdej testowanej wartości.

Dalsza lektura:
O’reily High performance Python Dictionaries and Sets

[1] Tak, różnica niezbyt rzuca się w oczy przy takim zapisie. Mało widać różnicę między dict a set. Kiedyś już o tym wspominałem. Czytelniejszy zapis – którego chyba nikt nie używa – tamże.

MacOS 14.2 – nie działa hidutil

Ja jeszcze nie zaktualizowałem MacOS do wersji Sonoma, ale znajomi zdążyli to zrobić i narzekają, że polecenie hidutil przestało działać. Nie zwraca błędu, ale nie mapuje klawiszy. W związku z tym polecane kiedyś przeze mnie mapowanie klawiszy bez użycia Karabiner Elements również nie będzie działać.

Sprawdzonego rozwiązania w tej chwili nie podam, zamiast tego odsyłam do wątku na forum Apple oraz wątku na Reddicie. Jest tam wiele pomysłów na rozwiązanie, można przymierzyć – może ktoś znajdzie satysfakcjonujące dla siebie.

Ludzie zgłaszają błąd do Apple, więc liczę, że błąd zostanie poprawiony w kolejnej aktualizacji. Mapowanie bez dodatkowych programów było eleganckie.