JuliaLM: własna implementacja systemu RAG dla osobistych baz wiedzy
Programiści często mierzą się z zadaniem przetwarzania dużych ilości dokumentów: PDF, wykładów z YouTube, stron internetowych. Standardowe chat-boty, takie jak ChatGPT, tracą kontekst podczas pracy z wieloma źródłami, a gotowe frameworki RAG słabo radzą sobie ze skanami i filmami. JuliaLM rozwiązuje to poprzez niestandardowy pipeline: jednorazowe ładowanie źródeł, wielostrategiczne wyszukiwanie i budżetowanie kontekstu. System zbudowany jest na Nuxt.js, FastAPI i SurrealDB, zapewniając wyszukiwanie wektorowe, chat i generowanie fiszek.
Architektura stosu i wybór SurrealDB
Frontend w Nuxt.js komunikuje się z backendem przez REST i SSE. FastAPI orkiestruje AI z LangGraph, zarządza kolejką zadań i integruje się z SurrealDB. Baza łączy tabele relacyjne, połączenia grafowe i wyszukiwanie wektorowe w jednej usłudze, zastępując Postgres + Redis + Pinecone.
Frontend (Nuxt.js)
↕ REST + SSE
Backend (FastAPI)
├── LangGraph (orkiestracja AI)
├── Zadania w tle (kolejka zadań)
├── SurrealDB (dane + wektory + graf)
├── Gotenberg (konwersja dokumentów)
└── MiniMax / Embedding API (LLM + wektoryzacja)
Kolejka zadań zaimplementowana jest na bazie SurrealDB z ponownymi próbami (do 5) i wykładniczym wycofywaniem. Dla lekkich źródeł — przetwarzanie synchroniczne (5–10 s), dla ciężkich PDF — asynchroniczne z pollingiem statusów.
Kaskadowe parsowanie źródeł
Przetwarzanie dokumentów wykorzystuje fallbacki dla niezawodności:
- PDF i pliki biurowe: Docling dla Markdown z zachowaniem struktury (nagłówki, tabele). Fallback — Gotenberg oparty na LibreOffice dla PPTX/XLSX.
- YouTube: 1) youtube-transcript-api (napisy w językach: PL→EN→ES→PT); 2) pytubefix (klient Android); 3) Firecrawl/Jina.
- Strony internetowe: Playwright (renderowanie JS, randomizacja UA/viewport) + readability; fallbacki — Jina Reader, HTTP.
- Obrazy: Model wizyjny do OCR tekstu odręcznego.
To zapewnia ekstrakcję tekstu nawet przy awariach YouTube API lub captchach.
Wektoryzacja i wielostrategiczne wyszukiwanie
Tekst dzielony jest na fragmenty ~500 tokenów (nakładanie 15%) z priorytetowymi separatorami: podwójne nowe linie → pojedyncze → kropki. Empiryczna równowaga między precyzją a kontekstem dla tekstów naukowych.
Wyszukiwanie w źródłach łączy cztery strategie równolegle:
- Wyszukiwanie wektorowe — semantyczne po embeddingach (cosine ≥ 0.15).
- Wyszukiwanie tekstowe — BM25 po pełnym tekście.
- Wyszukiwanie po tytułach — po nagłówkach.
- Wyszukiwanie insightów — po podsumowaniach i kluczowych punktach.
Deduplikacja: score +0.05 za każde dopasowanie. Top-5 wyników.
Budżetowanie kontekstu dla długich dokumentów
Ogólny limit — 300 000 znaków (75K tokenów). Na źródło: min 5000, max 40 000.
- Krótkie źródło: w całości.
- Długie + znane zapytanie: insighty + relewantne fragmenty (wewnętrzne wyszukiwanie wektorowe).
- Długie + nieznane zapytanie: insighty + początek tekstu.
Podejście zapobiega przepełnieniu kontekstu przy pracy z książkami.
Fiszki z FSRS
Generacja par „pytanie-odpowiedź” w JSON z walidacją. Powtórki interwałowe według FSRS: parametry stabilności, trudności, stanu (nowa/uczona/powtarzana). Ocena 1–4 przelicza harmonogram. Integracja z notatnikiem eliminuje eksport do Anki.
Rozszerzone wyszukiwanie w bazie
Dwa podstawowe tryby: BM25 i wyszukiwanie wektorowe. „Zapytaj bazę” — graf LangGraph:
- Generacja do 5 podzapytań z instrukcjami.
- Równoległe wyszukiwanie (do 10 wyników/zapytanie).
- Synteza pośrednich odpowiedzi.
Co jest ważne
- Kaskadowe parsowanie gwarantuje ekstrakcję tekstu z dowolnych źródeł, włączając YouTube bez napisów.
- Cztery strategie wyszukiwania zwiększają recall o 20–30% w porównaniu z pojedynczym wyszukiwaniem wektorowym.
- Budżet kontekstu pozwala przetwarzać korpusy >1000 stron bez utraty relewancji.
- Integracja FSRS upraszcza naukę, automatyzując spaced repetition.
- SurrealDB upraszcza wdrożenie: jeden kontener zamiast trzech baz.
— Editorial Team
Brak komentarzy.