Jak budować przydatne narzędzia z GPT-4?
Jak budować przydatne narzędzia z GPT-4?
Jeśli zdarza Ci się czytać ten newsletter, to wiesz jakie możliwości daje łącznie GPT-4 bezpośrednio z kodem poprzez OpenAI API. Aktualnie rozwijam szereg małych narzędzi optymalizujących różne elementy mojego życia prywatnego i zawodowego. Pomyślałem, że dobrym tematem dla tego wydania będzie pokazanie tego procesu z bliska, w sposób, który zarysuje ogólne schematy praktycznego zastosowania Dużych Modeli Językowych.
Bezpośrednie połączenie z modelem
Jako programista, już praktycznie nie korzystam z ChatGPT i w zamian komunikuję się z modelem poprzez API. Pozwala to na swobodne budowanie nawet złożonych promptów, które mogą wykonywać się w odpowiedzi na moje wiadomości, zdarzenia lub zgodnie z ustalonym harmonogramem. Oznacza to, że nawet w chwili gdy piszę te słowa, gdzieś w tle GPT-4 wykonuje dla mnie różne zadania.
Prawdopodobnie zdarzyło Ci przesłać do ChatGPT tekst, który był tak obszerny, że przekraczał dopuszczalny limit działającego pod spodem modelu. Omijanie tego ograniczenia ręcznie jest czasochłonne i średnio skuteczne. Jednak w przypadku prostego skryptu, mówimy tutaj o wywołaniu kilku funkcji i prostej pętli, aby móc podsumować w ten sposób nawet całą książkę!
Przy takim zastosowaniu AI, mówimy nie tylko o wygodzie, ale także dopasowaniu do naszych potrzeb. To z kolei wymaga ogólnej wiedzy na temat Dużych Modeli Językowych (LLM) i technikach projektowania promptów i za chwilę wyjaśnię dlaczego. Chciałbym tylko zwrócić uwagę na fakt, że:
- powyższy kod zapisany jest w JavaScript, ale możesz skorzystać praktycznie z dowolnego języka programowania, który umożliwia wykonywanie żądań HTTP
- w ramach jednego zapytania do modelu obowiązuje Cię limit "tokenów" (fragmentów słów), których liczbę możesz dość precyzyjnie estymować z pomocą narzędzi tiktoken i encoderów dopasowanych do modelu z którym pracujesz (niekoniecznie musi być to model od OpenAI)
- przy procesowaniu dużych ilości danych zadbaj o obsługę błędów i możliwość wznowienia operacji w miejscu w którym może wystąpić błąd
- jeśli pracujesz z modelami OpenAI, a w szczególności z GPT-4, to pamiętaj o limitach zapytań oraz liczby generowanych tokenów, które obecnie łatwo jest przekroczyć
- pracując nad skryptami, których celem jest autonomiczne lub częściowo autonomiczne przetwarzanie danych, zachowaj staranność na pograniczu perfekcjonizmu i wykonuj testy na mniejszych zestawach różnorodnych danych. Jeśli pracujesz z Langchain, prawdopodobnie zainteresuje Cię narzędzie LangSmith.
Prompt Design & Prompt Engineering
Prawdopodobnie znasz już ogólne zasady projektowania promptów oraz przykłady zastosowania LLM do prostych zadań związanych z klasyfikacją czy podsumowaniami. Choć część z łatwo dostępnych w Internecie informacji wydaje się mało użyteczna w praktyce, to zwykle zmienia się to, gdy spojrzymy na nie przez pryzmat kodu.
Przykładowo sam proces podsumowania treści wydaje się w miarę użyteczny podczas przeglądania aktualności czy nowych filmów na YouTube (podsumowania na podstawie transkrypcji). Jednak rola podsumowania staje się krytyczna podczas przetwarzania długich dokumentów. Jednym z powodów jest fakt, że jakość odpowiedzi generowanych przez model drastycznie rośnie, gdy w prompcie znajdzie się równie jakościowy kontekst. Rzecz w tym, że w przypadku programistycznego sterowania zachowaniem modelu, taki kontekst musi być generowany dynamicznie, nierzadko bez naszego bezpośredniego udziału. A to zmienia zasady gry.
Gdy przyjrzysz się jednej z instrukcji stosowanej przeze mnie do tworzenia podsumowań, to zobaczysz w niej wiele prostych technik pisania promptów, które osobno wydają się być oczywiste i niegodne większej uwagi. Jeśli jednak zobaczymy w jaki sposób łączymy je ze sobą, łamiemy pewne schematy oraz stosujemy dynamiczne elementy, to bez wątpienia dzieje się tutaj coś więcej niż proste przesłanie wiadomości do modelu.
Taki prompt tworzy wysokiej jakości podsumowanie, które dodatkowo jest weryfikowane przez drugi, podobny prompt, którego rolą jest upewnienie się, że istotne wątki nie zostały pominięte. Co więcej, dzięki temu, że te instrukcje wykonywane są przez kod, wynikiem ich działania jest gotowe podsumowanie.
Samo napisanie polecenia dla modelu, nie jest jednak wystarczające, ponieważ stosowanie go w kodzie aplikacji wymaga szeregu dodatkowych umiejętności związanych chociażby z:
- pracą systemem plików i bazami danych
- przetwarzaniem różnych formatów dokumentów
- stosowaniem silników wyszukiwania
- ogólną optymalizacją logiki poprzez asynchroniczność i systemy kolejek
- zaawansowaną obsługę błędów, w których ewentualne naprawianie może być zaangażowany sam model
- wykorzystaniem elementów np. guardrails do adresowania niedeterministycznej natury modeli
- przestrzeganie zaleceń dotyczących bezpieczeństwa i potencjalnych źródeł niepożądanych danych, które nie muszą nawet pochodzić od użytkowników, lecz pojawiać się przypadkowo w dużych zestawach danych (np. fragment artykułu brzmiący jak polecenie dla modelu, może wpłynąć generowaną odpowiedź)
Poniżej widzimy fragment efektu mojej pracy związanej z przygotowaniem obszernych treści na potrzeby systemu RAG (Retrieval-Augmented Generation) i długoterminowej pamięci dla mojego asystenta AI.
Ostatecznie nie mówimy tutaj o niezwykłych technikach pracy, a raczej połączeniu wielu drobnych elementów w całość. Jeśli spojrzymy na to wszystko z boku, to szybko zauważymy, że projektowanie systemów korzystających z Dużych Modeli Językowych w niektórych obszarach swojej logiki, w większości przypomina programowanie klasycznych aplikacji. LLM jest tutaj jedynie jednym z elementów większej układanki.
Przykłady narzędzi korzystających z GPT-4
Zakładając, że mamy już niezbędne umiejętności przydatne do stosowania LLM w kodzie, to nadal nie jest oczywiste, co konkretnie możemy budować. Co więcej, pomysły, które wpadają do głowy w pierwszej kolejności, nie zawsze są najlepsze.
Jednym z nich może być chatbot odpowiadający na nasze pytania na podstawie dokumentacji technologii z którą pracujemy. Niewykluczone jednak, że znacznie łatwiej będzie nam sięgnąć po Perplexity, niż budować takie rozwiązanie od podstaw.
Inny przykład uwzględnia chęć zbudowania narzędzia, które w całości zautomatyzuje jakieś procesy. Takie oczekiwanie (zwykle) nie ma nic wspólnego z praktyką, ponieważ nawet jeśli stworzone przez nas narzędzie działa, to i tak bardzo rekomendowany jest nadzór człowieka. Wówczas i tak zyskujemy tutaj korzyść w postaci ogromnej oszczędności czasu, a jednocześnie adresujemy ewentualne problemy, które mogą się pojawić. Z pewnością nie chcemy, aby w publikacjach naszej firmy znalazły się rzeczy niezgodne ze stanem faktycznym, albo żeby generowany przez AI kod zawierał błędny związane z logiką biznesową. Zapewnienie obecności człowieka, jest więc tutaj krytycznie ważne.
Zatem konkretne zastosowania GPT-4, w kontekście budowania narzędzi przydatnych w naszej codzienności, obejmują:
- Klasyfikowanie: Dokumentów, wiadomości, zadań, wydarzeń, publikacji — opisywanie, porządkowanie, układanie, przypisywanie, przesyłanie mogą wydarzyć się automatycznie lub pół-automatycznie. Zbudowanie logiki realizującej takie zadanie zwykle jest dość proste, a wynikająca z niego oszczędność jest ogromna i trudna do estymacji, ponieważ takie narzędzia mogą działać dla nas przez bardzo długi czas. Konkretnym przykładem jest przypisywanie podyktowanych przeze mnie zadań do konkretnych projektów na mojej liście. Można to zobaczyć na animacji poniżej, na której pojawiają się zadania, a zaraz potem znikają, ponieważ GPT-4 automatycznie przesuwa je do konkretnych projektów.
- Transformacje: Tłumaczenia, korekty, podsumowania, feedback, weryfikacja faktów (również w oparciu o dane z Interentu), weryfikacja spójności z zasadami komunikacji marki, zwiększanie czytelności — to wszystko może odbywać się automatycznie i integrować się bezpośrednio z narzędziami z którymi pracujesz. Poniżej znajduje się przykład tłumaczenia zrealizowany przez Alice (moją asystentkę AI). Całość została zrealizowana bezpośrednio w Notion, z zachowaniem oryginalnego formatowania treści.
- Generowanie: Szkice wiadomości, dokumenty, obrazy, dźwięki, raporty, analizy oraz kod — nie mówimy tutaj jednak o w pełni autonomicznym generowaniu całych książek, filmów czy aplikacji, ale wsparciu realizacji tego procesu. Przykładowo grafiki generowane w Dall-E czy Midjourney nie zawsze są dopasowane do naszych potrzeb, ale połączenie ich z możliwościami nowych wersji Photoshopa i Adobe Firefly, pozwala to zmienić i w rękach doświadczonych designerów, umożliwiają osiągnięcie niezwykłych rezultatów.
🎙 Posłuchaj nagrania
Konkretnych zastosowań i przykładów jest znacznie więcej, jednak zamiast je wymieniać, chciałbym bliżej pokazać budowę jednego z narzędzi, nad którym pracowałem wczoraj.
Przykład z budowy — Podsumowanie długich treści
W ciągu kilku ostatnich tygodni napisałem ~600 000 znaków treści (napisałem, nie generowałem) na potrzeby lekcji zbliżającego się szkolenia AI_Devs 2. Aby ułatwić naukę z tego materiału, pomyślałem, że przygotuję podsumowania, które pozwolą przygotować nagrania audio. Problem w tym, że każda z lekcji ma ~25 000 znaków i nie mogłem ich podsumować poprzez proste zapytanie do ChatGPT. Z kolei podsumowania fragmentami i prostym promptem, nie były zbyt jakościowe — gubiły zarówno istotne fakty, jak i ich ogólny ton był dla mnie nieakceptowalny (brzmiał bardzo nienaturalnie). Pierwsze próby, wyglądały mniej więcej tak:
Jest w nim kilka problemów, które mogą wydawać się mało istotne na pierwszy rzut oka. Po pierwsze model "wita się" przy podsumowaniu fragmentu i zaprasza do kolejnego na końcu podsumowania. Nie ma to żadnego sensu, ponieważ zależy mi na podsumowaniu całości, a nie generowaniu kilku niezależnych fragmentów.
Poza tym tekst uwzględnia niepotrzebne określenia, które momentami brzmią bardzo źle, np. "Czy jesteś gotów na to wyzwanie?" — takie komunikaty nie pojawiają się w oryginale i model dodaje je samodzielnie.
No i ostatecznie uwzględnienie linku do obrazka w podsumowaniu, które ma być przekazane w formie audio, nie ma zwyczajnie żadnego sensu.
Po kilku próbach doszedłem do promptu, który pokazywałem w pierwszej części tego wpisu. Nadanie tam roli podcastera, zaznaczenie faktu streszczania dłuższego tekstu czy nadawanie dynamicznego kontekstu w postaci tytułu dokumentu czy różnych detali dotyczących nazwy lekcji czy nagłówka przetwarzanego akapitu, pozwoliły znacznie zwiększyć jakość podsumowania.
Co ciekawe, opis tonu wypowiedzi charakteryzującej moje publikacje kształtowałem z pomocą GPT-4. Po prostu wspólnie przeanalizowaliśmy kilka moich wpisów, listując ich charakterystyczne cechy. Rezultaty zastosowałem w prompcie odpowiedzialnym za podsumowania.
Po praktycznie pierwszej próbie, dopracowany i wzbogacony prompt pozwolił na wygenerowanie podsumowania zgodnego z moim oczekiwaniem. Jego treść nadal musi być weryfikowana przez człowieka, jednak bez wątpienia ułatwia to opracowanie materiałów ułatwiających odbiór głównej treści szkolenia.
Wiemy już jednak, że sam prompt jest tylko elementem całości i za faktyczne przetworzenie dokumentu odpowiadał skrypt z pierwszego obrazka tego wpisu, który teraz wkleję ponownie:
Widzimy w nim kilka elementów:
- Podział treści zapisanej w formacie Markdown na fragmenty
- Przejście przez poszczególne fragmenty
- Opisanie ich metadanymi uwzględniającymi tytuł dokumentu, numer fragmentu i informację o autorze
- Podsumowanie konkretnych fragmentów
- Zwrócenie odpowiedzi
Oczywiście strategii prowadzenia podsumowań jest wiele i to, na którą się zdecydujemy, głównie będzie zależało od rodzaju treści oraz założonym celem. Przykładowo sam niemal zawsze dążę do tego, aby źródłem danych z którymi pracuję w kontekście LLM, były otwarte formaty, takie jak wspomniany markdown. Dzięki temu z łatwością mogę wykryć nagłówki, linki czy obrazki, co pomaga w rysowaniu kontekstu oraz optymalizacji samego procesu przetwarzania (np. poprzez unikanie przepisywania przez model nierzadko długich adresów URL).
No i ostatnim elementem, jest ludzka weryfikacja. Pomimo dopracowanego promptu, nadal zdarzają się pojedyncze odstępstwa wobec moich oczekiwań, co wymaga ręcznych modyfikacji. Mówimy jednak tutaj o ~1-5% treści, a nie konieczności tworzenia ich w całości, tym bardziej, że tutaj stanowią jedynie opcjonalny dodatek, z którego skorzysta tylko część osób biorących udział w szkoleniu. A skoro o szkoleniu mowa, to serdecznie zapraszam Cię do wzięcia udziału w dzisiejszym, bezpłatnym webinarze "Hiperpersonalizacja AI, czyli GPT-4 dopasowane do Ciebie", podczas którego pokażemy jak budować narzędzia, z którego nie będziemy korzystać wyłącznie sami, ale także nasz asystent AI.
Na wydarzenie można zapisać się tutaj:
Rezerwuję miejsce
Zaczynamy dziś o godzinie 18:00 🚀
- LLM w logice aplikacji
- Prompt design & engineering
- Przykłady przydatnych narzędzi i proces budowy