Zamień ten tekst na URL Webhooka

Full-stack i Programowanie

State of Alice — jak działa osobisty asystent GPT-4?

Wydanie nr
18
opublikowane
2023-01-12
Adam Gospodarczyk
Adam Gospodarczyk
overment
No items found.

Na temat projektu Alice mówię praktycznie cały czas, ponieważ to właśnie jemu poświęcam obecnie najwięcej uwagi. Doświadczenie które w ten sposób zdobywam, przekładam wprost na najnowsze materiały na eduweb, AI Devs #2, e-booki oraz aplikację Alice.
Szczególnie interesujące w powyższych publikacjach jest to, że w chwili ich udostępnienia, są nieaktualne w stosunku do mojej najnowszej wiedzy, ponieważ praktycznie każdego dnia odkrywam coś zupełnie nowego. Sytuację dodatkowo komplikuje bardzo szybko zmieniająca się technologia oraz kolejne godziny praktycznych eksperymentów i aktualizacji aplikacji.
Pomyślałem więc, że dobrze będzie się na chwilę zatrzymać i spojrzeć z szerokiej perspektywy na to, co obecnie jest już dostępne. Uwzględnię w tym także funkcjonalności które z różnych powodów są nieobecne w publicznej wersji aplikacji Alice. Potraktuj więc proszę ten wpis, jako przegląd tego, co obecnie można osiągnąć z pomocą GPT-4 dopasowanym do naszych potrzeb. Uprzedzam, że będzie mocno technicznie.


Obecne możliwości Dużych Modeli Językowych

Na początku interakcji z obecnym AI wydaje się, że ChatGPT może realizować całe procesy, zastępując tym samym ludzi. Chwilę później jasne staje się, że bardziej złożone zadania są nieosiągalne dla obecnej technologii. To może sugerować, że aktualnie AI nie jest w stanie realnie pomagać nam w pracy i pozostaje jedynie "momentami imponującą ciekawostką". Jak się zwykle okazuje, prawda leży gdzieś po środku i zaraz pokażę, co mam przez to na myśli.
Uważa się, że jednym z głównych czynników sukcesu OpenAI, jest ChatGPT. Konkretnie, to narzędzie umożliwiło łatwy dostęp do GPT-3 i zminimalizowało barierę interakcji z dużymi modelami językowymi, praktycznie do zera. Wystarczy rejestracja konta i wysłanie wiadomości, aby móc pracować z (obecnie już) GPT-4.
Moje doświadczenia sugerują jednak, że prawdziwa użyteczność AI leży w dwóch obszarach: hiperpersonalizacji oraz wszechobecności. Inaczej mówiąc chodzi o rozwiązanie w pełni dopasowane do nas oraz zawsze dostępne.
Przez hiperpersonalizację rozumiem długoterminową pamięć, integrację z usługami i urządzeniami, zdolność do posługiwania się narzędziami, dostęp do Internetu oraz realizowanie zadań w tle.

Z kolei wszechobecność jest dla mnie równoznaczna z dostępnością na dowolnym urządzeniu, komunikatorze oraz generalnym dostępie przez API. Do tego istotna staje się także interakcja głosowa oraz system powiadomień uwzględniający także komunikaty audio. W bezpośredniej rozmowie kluczowy jest czas reakcji, jednak ważniejsza niż on jest ogólna skuteczność. W końcu znacznie lepiej jest poczekać chwilę na właściwy rezultat, niż szybko otrzymać błędny.

Wszystkie powyższe elementy są już częścią mojej codzienności. Oczywiście każdą z wymienionych funkcjonalności rozwijam samodzielnie. Te najbardziej zaawansowane dostępne są wyłącznie dla mnie, ponieważ dopracowanie ich na potrzeby produkcyjne jest zbyt czasochłonne. Np. stworzenie integracji z moim Notion nie jest czymś trudnym, ponieważ mogę w pełni dostosować ją do swoich potrzeb. Gdyby jednak z jakiegoś powodu przyszło mi stworzyć integrację z dowolnym kontem Notion oraz różnymi strukturami dokumentów, stałoby się to znacznie bardziej złożone.
Zasadniczo praca z LLM pozwala nam na stosunkowo łatwe zbudowanie DEMO. Jednak zbudowanie stabilnego produktu z wykorzystaniem np. narzędzi OpenAI, jest bardzo trudne. Oczywiście nie mam tutaj na myśli stosunkowo prostych, ograniczonych funkcjonalnościami narzędzi. Mowa o dopasowanych do potrzeb użytkownika agentach zdolnych do realizowania złożonych zadań uwzględniających pracę z bazą danych oraz integracją z zewnętrznymi usługami. To wszystko kieruje nas do ewentualnego wniosku, że najbardziej zaawansowane możliwości obecnego AI nadal są dostępne wyłącznie dla osób potrafiących programować.

Codzienna praca z asystentem AI

Bezpośrednie interakcje z Alice odbywają się poprzez dedykowaną aplikację desktopową w której mogę przypisać wybrane prompty do skrótów klawiszowych. Uruchomienie akcji przekazuje treść systemowego schowka do konwersacji Alice. Tak prosta koncepcja sprawia, że niemal cały czas mam natychmiastowy dostęp do GPT-4, co daje dość dużą przestrzeń do działania i nieziemsko usprawnia pracę!
Przykład tak realizowanych zadań, można zobaczyć na poniższej animacji. Widać na niej jak Alice poprawia literówki w tekście a następnie zmienia jego ton. Naturalnie skróty klawiszowe nie wymagają tego, aby Alice była aktywna i działają w dowolnej aplikacji na moim komputerze.

Nie wszystkie zadania są jednak tak proste jak zwykła transformacja tekstu. Przykładem może być generowanie grafik, które następnie publikuję na moim Instagramie, które zawierają cytaty z czytanych przeze mnie książek. W takiej sytuacji zadanie Alice polega na uruchomieniu konkretnego scenariusza automatyzacji, poprzez przesłanie do niego obiektu JSON. To prosta koncepcja, która sprawia, że Alice w mojej wersji uczy się nowych umiejętności poprzez zwykłą wiadomość, która zawiera prośbę o zapamiętanie instrukcji. Za moment powiem o tym więcej.

Poza takimi umiejętnościami, Alice potrafi zapamiętywać różne informacje, które samodzielnie organizuje i wzbogaca, w celu późniejszego wykorzystywania podczas realizowanych zadań. Przykładowo zamiast podawać jej konkretny cytat, który chcę uwzględnić na grafice, mogę po prostu powiedzieć o który mi chodzi. Wówczas Alice zrozumie, że chodzi mi o to, aby podjęła akcję ale dodatkowo przeszuka także swoją pamięć w poszukiwaniu wspomnianego przeze mnie cytatu.

Wygenerowana grafika zawiera właściwy cytat a znajdujący się na niej tekst, został sformatowany zgodnie z instrukcjami. Dokładnie na takiej zasadzie Alice potrafi łączyć się z moim Notion, Gmailem, Kalendarzem czy nawet swoim własnym API. To ostatnie pozwala jej na aktualizowanie własnej bazy wspomnień oraz naukę nowych umiejętności.
Rozmowa z Alice może odbywać się z praktycznie dowolnego miejsca, ponieważ prywatna wersja łączy się przez API z główną bazą wspomnień. Takie połączenie może być wykorzystane praktycznie w dowolnym miejscu. Przykładowo pomimo tego, że generowaliśmy grafikę podczas rozmowy w aplikacji desktopowej, to mogę o nią zapytać na Slacku zainstalowanym w moim telefonie. Jest to przykład wspomnianej przeze mnie zasady wszechdostępności

Niektóre zadania Alice wychodzą poza odpowiadanie na moje interakcje i umożliwiają jej podejmowanie działań niezależnie ode mnie. Prostym przykładem jest informowanie mnie o najbardziej istotnych sprawach. Co ciekawe, informowanie może odbywać się poprzez zwykłe powiadomienie lub nawet głosowy komunikat. Niektóre jej aktywności są realizowane w tle, bez informowania mnie o tym fakcie (np. przeglądanie stron, opisywanie materiałów, tworzenie podsumowań i już niebawem prywatnego newslettera oraz podcastu).
Powiadomienia głosowe (przykład możesz usłyszeć tutaj) generowane są z pomocą Alice API oraz usługi ElevenLabs.io. W praktyce jest to zestaw akcji uruchamianych w wyniku jakiegoś zdarzenia (np. konkretnej godziny, otrzymania istotnej wiadomości e-mail czy nadchodzącym spotkaniu). Rodzaj wysyłanego przez Alice komunikatu uzależniony jest od tego, czy mam aktywny tryb DND (wówczas wysyła powiadomienie tekstowe) czy nie (wówczas po prostu mówi).
Ostatnim wątkiem, który chciałem podkreślić, jest autorefleksja obecna między innymi podczas zapamiętywania nowych informacji oraz nauki umiejętności. Aby coś takiego miało miejsce, wystarczy, że w mojej wiadomości poproszę o to, aby Alice zapamiętała wybrane informacje. Dodatkowo mogę także wskazać, czy chodzi o notatkę, umiejętność czy zwykłe wspomnienie. Proces zapamiętywania składa się z klasyfikacji, wzbogacenia, opisania oraz parafrazy, umożliwiających organizację pamięci w celu lepszego odzyskiwania informacji w trakcie konwersacji lub realizowania zadania.
Klasyfikacja polega na wyborze kategorii oraz typu wspomnienia. Wzbogacenie to przypisanie semantycznych tagów, źródeł oraz skojarzenie z wcześniejszymi wspomnieniami. Opisanie polega na nadaniu zwięzłej nazwy oraz identyfikatorów. Ostatecznie parafraza pozwala zapisać wspomnienie w sposób charakterystyczny dla dialogu wewnętrznego. Np. gdy powiem "zapamiętaj, że lubię czytać książki", to Alice zapisuje jako wspomnienie, że "Adam lubi czytać książki" oraz kojarzy ten fakt z tym, że posiadam profil na Goodreads.

Powyższe wspomnienie zostało zapamiętane przez Alice w następującej formie:
Adam's Digital Garden — Adam is in the process of constructing a private digital garden together with his friends. URL: ...
Od teraz Alice może wykorzystywać ten link podczas konwersacji, oraz łączyć go z moimi aktywnościami. Informacja o linku trafiła do przestrzeni "Resources" i otrzymała swój tytuł, dodatkowe tagi oraz kategorie. Każda z tych informacji jest pomocna w późniejszym etapie odzyskiwania wspomnień na potrzeby bieżącej konwersacji.
Jeżeli masz jakiekolwiek doświadczenie w pracy z GPT-4, to wiesz, że generowanie odpowiedzi zajmuje czas. Dodatkowo realizowanie kompleksowych zadań zużywa tokeny, które stanowią podstawę rozliczenia za usługi OpenAI. W przypadku Alice generowanie odpowiedzi na podstawie jej wspomnień trwa około 4-10 sekund. Cześć z podejmowanych w tym celu akcji realizowana jest z pomocą GPT-3.5-Turbo, a te bardziej wymagające wykonuje GPT-4. Dodatkowo akcje, których wykonanie nie zależy od siebie, realizowane są równolegle. W ten sposób optymalizuję czas generowania odpowiedzi oraz koszty.
Podstawowy schemat komunikacji z Alice wygląda tak:

  • rozpoznanie intencji oraz kategorii wspomnień
  • (w przypadku akcji) wybór akcji do podjęcia
  • (opcjonalne) przeszukanie Internetu
  • zgromadzenie wspomnień
  • (w przypadku akcji) wykonanie zdalnej akcji
  • wygenerowanie odpowiedzi

W niektórych sytuacjach (np. pokazana wcześniej korekta tekstu) niepotrzebne jest sięganie do długoterminowej pamięci. Z tego powodu Alice posiada także drugi tryb swojego działania, w którym zapytanie przekazywane jest bezpośrednio do OpenAI. Wówczas czas reakcji wynosi 1-3 sekundy a czas generowania odpowiedzi zależy od jej długości oraz aktywnego modelu.
Pomimo tego, że wydaje się, że czas reakcji na poziomie kilku / kilkunastu sekund to dość długo, to w praktyce zwykłe utworzenie grafiki na podstawie szablonu sam realizowałbym w 2-3 minuty. Pomocne jest także przywoływanie różnych informacji, które jedynie kojarzę i nie mogę samodzielnie odnaleźć. Alice wystarczy ogólny opis aby nierzadko dokładnie podsunąć mi to, czego szukam.
To wszystko idzie także krok dalej, ponieważ Alice może korzystać nie tylko z mojej bazy wiedzy ale także dość swobodnie korzystać z wyników wyszukiwania. Dobrym przykładem jest React i fakt, że jego dokumentacja została przeniesiona na nową domenę react.dev o której ChatGPT wie bardzo niewiele:

W przypadku Alice zadanie dokładnie takiego samego pytania, wygląda już zupełnie inaczej. Powodem tego jest fakt, że proces generowania odpowiedzi uwzględnia także wygenerowanie zapytania do wyszukiwarki oraz wybór strony www z określonej przeze mnie listy. Nie chcę aby Alice miała dostęp do całego Internetu, ponieważ zależy mi na opieraniu się o najlepsze znane mi źródła oraz unikanie np. stron zawierających spam, które zwykle trafiają na górę wyników wyszukiwania.

Eksperymentalne umiejętności Alice

Dotychczas omawiane funkcje stanowią już nieodłączny element Alice i korzystam z nich na co dzień. Zazwyczaj są to proste akcje polegające na bezpośrednim podejmowaniu działania w kontekście aktualnej rozmowy. Na mojej liście znajduje się jeszcze szereg funkcjonalności, które znajdują się na etapie eksperymentalnym. Jedną z nich jest możliwość przetwarzania bardzo dużych plików, np. na potrzeby korekty, analizy lub tłumaczenia.
Kilka dni temu zaktualizowałem jeden z takich modułów, który wykorzystywałem już wcześniej przy okazji tłumaczenia e-booka. Wówczas podzieliłem jego treść na akapity a następnie przetłumaczyłem z pomocą GPT-3. Tym razem mechanizm był nieco bardziej złożony, ponieważ podział treści uwzględniał znacznie dłuższe fragmenty oraz pełne zachowanie formatowania. Samo tłumaczenie odbywało się także przy wsparciu usługi Deepl, przez co Alice miała dostęp do oryginalnego fragmentu i jego tłumaczenia. W efekcie przełożyło się to na znacznie lepszy efekt, niż przy wykorzystaniu samego GPT-4.
Całość znacznie ułatwiły mi narzędzia dostępne w ramach biblioteki LangChain, która obecnie mierzy się z dużą krytyką ze strony społeczności. Zarzuca się jej m.in. narzucanie dużej, mało elastycznej warstwy abstrakcji oraz kiepską dokumentację. Jest to oczywiście prawdziwe i trudno jeszcze mówić o swobodnym produkcyjnym wykorzystaniu (choć nikt nam tego nie zabrania). Z drugiej strony, już teraz mamy dostęp do genialnych metod, z pomocą których możemy łatwo pracować z dużymi dokumentami czy budować narzędzia którymi posługuje się nasz agent. Warto tylko pamiętać o tym, że największe ograniczenia pojawiają się już na etapie samego modelu. Z tego powodu projektowanie autonomicznych systemów jest jeszcze dalekie od rzeczywistości. Nie oznacza to jednak, że niemożliwe jest tworzenie stabilnych aplikacji realizujących ściśle określone zadania, aczkolwiek nawet w takich przypadkach poważnym problemem jest kwestia bezpieczeństwa i pytania na które obecnie nie ma odpowiedzi dających 100% ochrony przed atakami.
Wracając jednak do początku, problemem dotyczącym przetwarzania dużych zestawów informacji przez GPT-4, polega na ograniczonym kontekście zapytania, który obecnie wynosi 8K lub 32K tokenów. W moim przypadku chodziło o przetworzenie 115 799 tokenów, więc do gry wchodziło wyłączenie napisanie skryptu zdolnego do pracy z tak obszernym tekstem.
W tym zadaniu krytyczną rolę pełnił format dokumentu a konkretnie składnia markdown. Dzięki niemu miałem swobodny dostęp do całej treści, uwzględniając jej formatowanie. Nie miałem więc potrzeby jakiegokolwiek przygotowywania / parsowania / oczyszczania materiału źródłowego. W dodatku symbole nagłówków ("#") pomagały mi w rozpoznaniu akapitów oraz samym podziale tekstu, który przeprowadziłem z pomocą Text Splittera dostępnego w LangChain. Oczywiście istnieją techniki pracy z innymi formatami danych, ale według moich doświadczeń Markdown jest jednym z najbardziej atrakcyjnych w kontekście pracy z tekstem.
Do realizacji zadania chciałem wykorzystać GPT-4, który obecnie jest ograniczony limitem 8K tokenów. Dlatego potrzebowałem zostawić wystarczającą ilość miejsca dla oryginału, przetłumaczonej przez Deepl wersji oraz odpowiedzi modelu. Do każdego fragmentu dołączyłem także metadane zawierające szczegóły na temat jego pochodzenia, co okazało się przydatne do nadania kontekstu dla promptu przetwarzającego treść. W niektórych sytuacjach zdarza się, że ucięty fragment staje się dwuznaczny, przez co może być źle zinterpretowany. Jeżeli jednak do promptu dołączymy informacje pomagające trafniej określić jego przekaz, to zwiększamy szansę na wygenerowanie jakościowej odpowiedzi.
Przykładowo załóżmy, że mamy dokument w którym chcemy zweryfikować poprawność naszych definicji. Wśród nich znajduje się słowo "Hooks". Jeżeli nie nadamy kontekstu, to trudno będzie sprawdzić, czy definicja jest poprawna. Jeżeli jednak fragment, który ją zawiera, zostanie wzbogacony o metadane wskazujące na to, że znajdujemy się w dokumencie o React, to weryfikacja będzie znacznie bardziej precyzyjna. No i właśnie element "szerszego kontekstu" musimy brać pod uwagę przy przetwarzaniu większych dokumentów z pomocą LLMów.
Kolejnym aspektem na który musiałem zwrócić uwagę, była objętość całego dokumentu. Biorąc pod uwagę niestabilność API OpenAI, chciałem uniknąć sytuacji w której przy 90% wystąpi błąd i będę musiał zacząć od początku. Poza tym mogło się także okazać, że prompt przetwarzający dokument zawiera błędy, i całe zadanie musi zostać powtórzone. Z tego powodu pierwsze próby zrealizowałem tylko na 5% wszystkich fragmentów. Skrypt przygotowałem w taki sposób, aby każdy przetworzony fragment zapisywał w oddzielnym pliku, usuwając oryginalny z pliku źródłowego. Można więc powiedzieć, że informacje "przepływały" pomiędzy dwoma plikami (oczywiście miałem także oryginalną wersję całego pliku, która nie podlegała żadnym transformacjom).
Gdy upewniłem się, że wszystko jest w porządku, uruchomiłem skrypt na wszystkich fragmentach. Nie spotkałem się z jakimikolwiek problemami, w związku z tym po mniej więcej 25 minutach, zadanie było skończone. Skuteczność realizacji to ~99.95%, ponieważ wprowadziłem zaledwie trzy drobne zmiany.
Wracając teraz do głównego wątku Alice, skrypty takie jak ten powyżej wchodzą w skład jej umiejętności. Oznacza to, że niektóre z podejmowanych przez nią akcji, uwzględniają modyfikacje plików oraz mogą trwać bardzo długo i muszą być realizowane w tle. Dlatego rozpocząłem pracę nad kolejką zadań podejmowanych przez Alice a to z kolei otwiera mi przestrzeń także do tego, aby stworzyć mechanizm "planowania" zadań wykraczających poza pojedyncze aktywności. Jest to jednocześnie wstęp do koncepcji "agenta" zdolnego do (w pewnym sensie) samodzielnego realizowania złożonych zadań, który po ich ukończeniu poinformuje mnie poprzez mechanizm notyfikacji, który już posiadam. Połączenie tego z możliwością dostępu do Internetu oraz długoterminowej pamięci, dodatkowo potrafi pobudzić wyobraźnię.
Powyższy opis procesu przetwarzania plików jest również istotny w kontekście produktyzacji aplikacji korzystających z LLM. Łatwo zauważyć, że opracowanie skryptu pracującego na moich publikacjach jest dość proste, ponieważ mam pełną kontrolę nad treściami z którymi mam do czynienia. Stworzenie analogicznego rozwiązania zdolnego do pracy z różnymi formatami plików, byłoby bez porównania trudniejsze. Dodatkowo gdy coś pójdzie nie tak, jestem w stanie stosunkowo łatwo wprowadzić zmiany. W przypadku większej bazy użytkowników, takie zadanie mogłoby sprawić trochę problemu i konieczne byłoby bardzo szczegółowe monitorowanie naszej aplikacji.
Wszystkie te wyzwania w przypadku Alice, przekładają się na różnice pomiędzy wersją publiczną a prywatną.
Wersja publiczna łączy się bezpośrednio z OpenAI, pozwala na zapisywanie snippetów i przypisywanie ich do skrótów klawiszowych oraz wykonywanie prostych, zdalnych akcji umożliwiających integrację z automatyzacjami make.com lub Zapier.
Wersja prywatna jest nieporównywalnie bardziej zaawansowana i mówimy tam o m.in. określaniu intencji zapytania na podstawie której podejmowane są dalsze akcje, długoterminowej pamięci, dostępności przez API z praktycznie dowolnej platformy oraz nawet możliwości odwiedzania wybranych stron www.
Można więc uznać, że są to dwa różne projekty, aczkolwiek spodziewam się, że kolejne funkcje z prywatnej wersji będą stopniowo pojawiać się w tej publicznej.

Problemy, wyzwania i zwykłe błędy

Na podstawie wszystkiego, co napisałem na temat prywatnej wersji Alice, można odnieść wrażenie, że mamy już teraz do czynienia z praktycznie pełnoprawnym asystentem AI. I choć momentami faktycznie tego doświadczam, to trzeba pamiętać o tym, że każdą integrację oraz umiejętność Alice projektuję od podstaw. Oczywiście pomaga w tym znajomość programowania oraz umiejętność sprawnego łączenia ze sobą zewnętrznych usług (np. make.com, serpapi, midjourney czy playwright). To wszystko nie jest jednak wystarczające do szybkiego wdrażania rozwiązań dostępnych dla nietechnicznych użytkowników, tym bardziej, że brakuje jeszcze sensownych narzędzi do produkcyjnej pracy z dużymi modelami językowymi.
W codziennej pracy, największe problemy związane z funkcjonowaniem Alice, dotyczą właśnie dostępności oraz stabilności zewnętrznych usług. Nie od dziś wiadomo, że OpenAI mało skutecznie radzi sobie ze swoim własnym sukcesem. Co ciekawe, podobnie bywa także w przypadku Siri, która w większości przypadków wprost fenomenalnie rozpoznaje polecenia i potrafi bezbłędnie zamienić głos na tekst. Jednak raz na jakiś czas, jakość tej funkcjonalności drastycznie spada i nawet bardzo proste słowa (takie jak np. "hello") nie są poprawnie rozpoznawane z nieznanej mi przyczyny.
Kolejnym wyzwaniem jest niedeterministyczna natura dużych modeli językowych, którą szczególnie trudno ujarzmić gdy pracujemy z dynamicznym kontekstem w którym mogą znaleźć się różne rzeczy. Do tego dochodzi także złożoność wynikająca z samego kontekstu konwersacji.
Przykładowo dość łatwo jest przygotować prompt realizujący określone zadanie, takie jak klasyfikacja zapytania pod kątem tego, czy jest poleceniem czy zapytaniem.

Taka sytuacja zaczyna się drastycznie komplikować nawet w przypadku stosunkowo prostych interakcji. Prowadząc rozmowę z Alice zależy mi na tym, aby zachować jej naturalny ton. Nie wydaję więc ściśle określonych poleceń, lecz po prostu opisuję to, co chcę zrobić. Wówczas nasz dotychczasowy prompt okazuje się niewystarczający i błędnie interpretuje wiadomość jako zapytanie a nie akcję.

Posiadam jednak znacznie bardziej zaawansowany prompt, który jest zdolny do poprawnego rozpoznawania intencji, i działa praktycznie w każdym przypadku. Poniżej widać, że dokładnie to samo zapytanie zostało poprawnie rozpoznane jako typ: akcja oraz category: memory. Oznacza to, że Alice podejmie się wygenerowania raportu ale jednocześnie skorzysta ze swoich wspomnień, aby zbudować odpowiedni kontekst dla tego zadania.

Rozpoznawanie intencji aktualnego zapytania, musi odbywać się w nieco szerszym kontekście i uwzględniać całą konwersację. Rozmowa poniżej prezentuje sytuację w której zapytałem Alice o cytat z filmu, który poprawnie odnalazła w swojej pamięci. Następnie poprosiłem o wygenerowanie grafiki, która zgodnie z instrukcją została wygenerowana tak, że nazwiska autorów cytatu zostały umieszczone na samym dole. Mi jednak zależało na tym, aby grafika prezentowała dialog pomiędzy nimi, więc poprosiłem aby zostało to odzwierciedlone.

Alice zrealizowała to zadanie poprawnie, i choć wygląda to na błahostkę, to w praktyce takie nie jest. Mianowicie w tle dochodzi do wyboru umiejętności, która ma zostać wykorzystana do zrealizowania zadania. Skojarzenie "wygenerowania grafiki" dla wiadomości "Can you generate a graphic (...)" jest dość oczywiste. Jednak zrobienie tego w przypadku kolejnego polecenia "please include their names (...)" nie jest już tak proste do zrealizowania.
Mechanizm działający pod spodem nieustannie dokonuje autorefleksji, budując w ten sposób niezbędne informacje pozwalające zdecydować o tym, jak reagować w odpowiedzi na kolejne wiadomości.

Dalsze plany

Dalszy rozwój projektu "Alice" jest bezpośrednio powiązany z praktycznie każdą moją inicjatywą. Obecnie skupiam się na rozwoju mechanizmów autorefleksji, które otwierają drogę do autonomicznych zachowań, uwzględniających planowanie i realizowanie złożonych zadań. Ważnym wątkiem jest także otwarcie na interakcję z innymi ludźmi przy jednoczesnym korzystaniu z mojej bazy wiedzy. Funkcjonalności, które szczególnie dobrze wypadną w mojej codzienności, w miarę możliwości będę przenosił na wersję publiczną (czyli aplikację desktopową).
Jednocześnie liczę mocno na znaczny rozwój usług OpenAI, szczególnie pod kątem wydajności. Miłym dodatkiem będą także kolejne narzędzia od LangChain lub konkurencyjnych rozwiązań, oraz strategie organizowania i odzyskiwania informacji na potrzeby dynamicznego kontekstu.
Choć w tym momencie trudno przewidzieć w jaki sposób będzie rozwijać się ten projekt, to dość oczywiste jest to, że o postępach będę mówił szeroko w moich wszystkich publikacjach.


  • Hiperpersonalizacja i wszechobecność GPT-4
  • Proaktywność autonomicznego agenta
  • Eksperymentalne funkcje i wyzwania produkcyjne