Najprostszy RAG na LangGraph z własnym API

Wprowadzenie
Finał serii. Z części pierwszej mamy teorię i mapę pojęć, z drugiej — przetestowane klocki: model przez OpenRouter, lokalne embeddingi, splitter, vector store w pamięci i graf retrieve → generate. Dziś składamy z nich to samo API, które w poprzedniej serii zbudowaliśmy na LlamaIndex: POST /index przyjmuje ścieżkę do pliku Markdown na dysku, POST /ask odpowiada na pytania o zaindeksowane dokumenty. Bez bazy wektorowej, bez persystencji, bez zaawansowanych strategii.
Przygotowanie środowiska
| |
Klucz do OpenRouter — wyłącznie jako zmienna środowiskowa:
| |
Kompletny kod — main.py
| |
Uruchomienie:
| |
Jak to działa
Struktura jest identyczna jak w wersji na LlamaIndex — warto porównać oba pliki obok siebie:
/index— wczytuje plik, tnie na chunki splitterem (tu robimy to jawnie — w LlamaIndex działo się to pod maską), pakuje wDocumentz nazwą pliku w metadanych i dodaje do vector store./ask— nie woła vector store ani LLM bezpośrednio, tylko odpala graf:graf.invoke({...}). Węzełretrieveznajduje fragmenty,generatebuduje prompt i pyta model, a końcowy stan zawiera i odpowiedź, i użyty kontekst — dzięki temu do wyniku dokładamy źródła./documents— lista zaindeksowanych plików.
Największa różnica względem LlamaIndex jest architektoniczna: cała logika pytanie-odpowiedź żyje w grafie, a API tylko go wywołuje. Chcesz dodać krok sprawdzający jakość odpowiedzi albo przeformułowanie pytania? Dopisujesz węzeł i krawędź — endpointy nie zmieniają się ani o znak.
Testujemy
| |
Interaktywna dokumentacja jak zwykle pod http://127.0.0.1:8000/docs. Pierwsze indeksowanie może chwilę potrwać — model embeddingów pobiera się przy pierwszym użyciu.
LlamaIndex czy LangGraph?
Po dwóch seriach mamy dwa identyczne funkcjonalnie RAG-i, więc porównanie nasuwa się samo. LlamaIndex dał krótszy kod i szybszy start — indeksowanie i odpytywanie dostaliśmy niemal za darmo. LangChain + LangGraph wymagał złożenia klocków samodzielnie, ale w zamian każdy krok jest widoczny i podmienialny, a graf naturalnie rośnie w stronę bardziej złożonych przepływów agentowych. Do prostego „pytaj o dokumenty" wystarczy LlamaIndex; jeśli planujesz rozbudowę o wieloetapową logikę — graf od początku będzie dobrą inwestycją.
Podsumowanie
Seria zamknięta: teoria, klocki i ~100 linijek Pythona z grafem retrieve → generate opakowanym w API. Razem z poprzednią serią masz dwa kompletne, minimalne RAG-i do porównania i dalszych eksperymentów. A jeśli myślisz o podobnym rozwiązaniu na własnych dokumentach w firmie — odezwij się do nas.