
Projekt: Warkan – Świadomy kosztowo asystent AI dla bloga
Narzędzia: Python, FastAPI, scikit-learn (TF-IDF), REST API, WordPress API, Cloudflare Workers AI
Opis: Autorski chatbot blogowy oparty na architekturze Retrieval-Augmented Generation (RAG), łączący wyszukiwanie semantyczne z generowaniem odpowiedzi przez model językowy.
Cel: Stworzenie asystenta, który odpowiada wyłącznie na podstawie rzeczywistych treści bloga, z kontrolą kontekstu, logiki działania i kosztów zapytań do modelu.
Dane: Źródłem danych są wpisy blogowe pobierane dynamicznie przez WordPress REST API.
Repozytorium:
Zobacz na GitHub
Wprowadzenie
Warkan to aplikacja backendowa umożliwiająca przeszukiwanie treści bloga i generowanie podsumowań na podstawie najbardziej trafnych wpisów.
Rozwiązanie nie opiera się wyłącznie na generatywnym modelu językowym. Kluczowym elementem jest warstwa wyszukiwania, która selekcjonuje kontekst, zanim zostanie on przekazany do modelu. Dzięki temu odpowiedzi powstają w oparciu o konkretne treści, a nie swobodną generację.
Projekt działa jako publiczna aplikacja webowa podpięta do strony.
Dane
Źródłem danych są wpisy blogowe pobierane dynamicznie przez WordPress REST API.
Zakres przetwarzanych informacji obejmuje:
- tytuł wpisu,
- skrót,
- pełną treść,
- adres URL.
Treści są oczyszczane z HTML i przekształcane do postaci tekstowej przed dalszą analizą.
Architektura rozwiązania
Projekt został zaprojektowany jako lekka architektura typu RAG (Retrieval-Augmented Generation), składająca się z trzech warstw.
1) Warstwa danych
Aplikacja pobiera wpisy z wybranej kategorii bloga i zapisuje je w pamięci serwera.
Indeks budowany jest na podstawie tytułu, skrótu oraz pełnej treści artykułu.
Zastosowano mechanizm TTL cache, który określa maksymalny czas ważności indeksu. Po jego upływie dane są odświeżane.
2) Warstwa wyszukiwania (Retrieval)
Na podstawie treści tworzony jest indeks TF-IDF z wykorzystaniem biblioteki scikit-learn.
Pytanie użytkownika przekształcane jest do tej samej reprezentacji wektorowej, a następnie obliczane jest podobieństwo cosine similarity względem wszystkich wpisów.
Zwracane są wyłącznie najbardziej trafne wyniki (Top-K), spełniające minimalny próg podobieństwa.
Dodatkowo generowany jest fragment kontekstowy wokół dopasowanego słowa kluczowego.
3) Warstwa generowania (Generation)
Do modelu językowego przekazywane są wyłącznie wybrane wyniki wyszukiwania wraz z fragmentami kontekstu.
Prompt został zaprojektowany tak, aby:
- uniemożliwić dopisywanie nowych źródeł,
- wymusić dokładną liczbę opisywanych wyników,
- kontrolować długość odpowiedzi,
- utrzymać spójny język odpowiedzi.
Takie podejście ogranicza ryzyko halucynacji i zwiększa przewidywalność działania systemu.
Decyzje projektowe
W projekcie zastosowano rozwiązania zwiększające stabilność i kontrolę działania:
- separacja warstwy wyszukiwania od warstwy generowania,
- ograniczenie liczby przekazywanych wyników do modelu,
- próg minimalnego podobieństwa,
- kontrola długości przekazywanego kontekstu,
- obsługa sytuacji braku odpowiedzi z API,
- przechowywanie indeksu w pamięci w celu ograniczenia kosztów.
Priorytetem była przewidywalność działania systemu oraz świadome zarządzanie zapytaniami do modelu językowego.
Wyniki
Aplikacja:
- dynamicznie pobiera i indeksuje treści blogowe,
- wyszukuje wpisy na podstawie podobieństwa semantycznego,
- generuje zwięzłe podsumowanie w oparciu wyłącznie o znalezione treści,
- działa jako publiczny komponent strony,
- posiada mechanizm kontrolujący koszty i częstotliwość odświeżania danych.
Dalszy rozwój
Planowane rozszerzenia:
- obsługa wielojęzyczna,
- bardziej precyzyjne filtrowanie kontekstu
Ciasteczko do kawy?