No dobrze, dziś patrzymy na Griptape. Co to jest? A jest to frameworkiem do budowy aplikacji AI, oferującym czyste pythonowe API dla tych, którzy są zmęczeni poziomami abstrakcji LangChain. Proponuje prymitywy do budowy asystentów, systemów RAG i integracji z zewnętrznymi narzędziami. Szczerze mówiąc, z mojego doświadczenia, większość osób zmęczonych LangChainem przechodzi na własnoręcznie pisane wrappery wokół bibliotek niższego poziomu, takich jak OpenAI czy LiteLLM. Ale kto wie, może niepotrzebnie. Przyjrzyjmy się temu.
Trochę historii
Osobiście o Griptape słyszę już jakieś półtora roku i zaczynał on jako swego rodzaju konkurent LangChain z dość podobnymi prymitywami, ale ich drogi stopniowo się rozeszły. W momencie pisania tego posta ma 2.3k gwiazdek na GitHubie, co jest nieco mniej niż 109k LangChaina, ale wciąż wystarczająco, by uznać projekt za całkiem dojrzały. Oprócz otwartego frameworka, dorobił się też własnej chmury, w której można uruchamiać swoje aplikacje, ETL-ki i RAG-i, oraz graficznego kreatora Griptape Nodes, pozwalającego nieprofesjonalistom wyklikać aplikacje myszką w kilka minut (tak naprawdę nie).
Framework
Przejdźmy więc do samego frameworka. Prezentuje on kilka prymitywów, z którymi warto się zapoznać przed przystąpieniem do pracy.
Drivery (Drivers): W zasadzie główne narzędzie, abstrahujące konkretne implementacje czegokolwiek i pozwalające zmieniać je w locie, nie psując logiki biznesowej. Istnieją drivery do niemal wszystkiego, czy to asystentów, promptów, modeli, systemów embeddingu czy baz danych. W gruncie rzeczy, klasy abstrakcyjne i ich implementacje.
Silniki (Engines): Dostarczają gotowe implementacje podstawowych zadań, takich jak RAG i sumaryzacja.
Struktury (Structures): Podstawowe bloki do budowy aplikacji. Wśród nich można znaleźć:
Zadania (tasks): Abstrakcja nad jakimś działaniem, na przykład zapytaniem do modelu, przetwarzaniem odpowiedzi, ładowaniem danych z pliku itp.
Agenci (agents): Trochę dziwny wrapper wokół pojedynczego zadania (chociaż istnieje API do tworzenia agenta na bazie listy zadań, sypie się ono przy próbie przekazania więcej niż jednego zadania, co jest bardzo dziwne). Pozwala przekazać do tego zadania dane wejściowe i listę narzędzi, z których może korzystać.
Pipeline’y (pipelines): Jak agent, ale może uruchamiać wiele zadań sekwencyjnie, przekazując wynik jednego na wejście drugiego.
Workflowy (workflows): Skierowane grafy acykliczne (DAG) składające się z zadań. Pozwalają na optymalne planowanie i uruchamianie zadań równoległych. Dokumentacja wskazuje, że są niesekwencyjne, chociaż później podaje przykłady całkiem sekwencyjnych workflowów. W takim przypadku jest nieco niejasne, po co w ogóle potrzebne są pipeline’y.
Ogólnie rzecz biorąc, taka organizacja jest dość elastyczna i pozwala tworzyć całkiem złożone przepływy wykonania. Fakt, że jest to DAG, narzuca pewne ograniczenia w tworzeniu agentów w sensie, jaki zakładają niektórzy futurystycznie nastawieni ludzie, ale za to pozwala budować niezawodne (na ile to możliwe z probabilistycznymi LLM) i przemyślane systemy.
Narzędzia (Tools): Funkcje dostępne dla LLM. Te funkcje można przekazywać do wyżej wymienionych prymitywów, dając w ten sposób LLM możliwość generowania sekwencji wywołań tych funkcji w celu wykonania jakichś działań. Griptape dostarcza sporo takich narzędzi, ale można też dodawać własne.
Pamięć Zadań (Task Memory): Jedna z ciekawszych funkcji Griptape. Często dane, które trzeba przetworzyć, są albo bardzo wrażliwe, albo bardzo duże, i wysyłanie ich bezpośrednio do LLM może być niepraktyczne. W takim przypadku można poprosić narzędzie, aby nie dostarczało tych danych do LLM, a zwracało pewien deskryptor tych danych, który pozwoli LLM odwoływać się do nich w celu użycia w innych narzędziach.
Pamięć Konwersacji (Conversation Memory): Domyślnie włączona i przekazywana do modelu między kolejnymi uruchomieniami tego samego workflow (lub agenta, lub pipeline’u). Można ją wyłączyć, jeśli nie jest potrzebna. W gruncie rzeczy przydatna tylko dla chatbotów i, szczerze mówiąc, szkodliwa dla wszystkiego innego.
Zestawy Reguł (Rulesets): Ustawienia zachowania LLM, które są przekazywane do każdego promptu. Coś w rodzaju promptów systemowych, ale żeby dokładnie zrozumieć, czym są, trzeba głębiej pokopać.
Na tym kończą się główne prymitywy, jest jeszcze kilka koncepcji, które na tym etapie nie są zbyt ważne, więc je pominę.
Co dalej?
A dalej myślę, żeby głębiej zbadać:
- Kiedy i dlaczego używać agentów, pipeline’ów i workflowów.
- Możliwości frameworka w zakresie ETL i RAG.
- Jak działa Pamięć Poza Promptem (Off-Prompt Memory).
- Integrację i personalizację.
- Co można robić w ich chmurze.
- A także do czego nadaje się Griptape Nodes.
No i oczywiście przetestować różne przykłady, które dostarczają. Będę opisywać postępy na bieżąco.