Suwerenne i wiarygodne AI - Od dokumentów firmowych do inteligentnej bazy wiedzy w oparciu o model Bielik i Google Cloud.
Niniejsze repozytorium prezentuje kompletne, bezserwerowe (serverless) rozwiązanie klasy RAG (Retrieval-Augmented Generation) wdrożone w chmurze Google Cloud. Głównym celem aplikacji jest dostarczenie wydajnego i suwerennego inteligentnego asystenta zdolnego do odpowiadania na pytania użytkownika w oparciu o dedykowaną bazę wiedzy (np. wewnętrzne dokumenty, regulaminy).
Podstawowa architektura wdrażanego rozwiązania opiera się na poniższych serwisach i komponentach:
- Modelu językowym LLM: Suwerenny polski model Bielik charakteryzujący się bardzo dobrym zrozumieniem języka polskiego oraz polskiego kontekstu kulturowego. Uruchomiony w usłudze Cloud Run, odpowiada za ostateczne generowanie naturalnej dla użytkownika odpowiedzi.
- Modelu osadzania (Embedding): Wydajny model EmbeddingGemma uruchomiony w usłudze Cloud Run, służący do szybkiej zamiany tekstu (zapytań użytkownika i dokumentów docelowych) na reprezentację wektorową.
- Wektorowej Bazie Wiedzy: Skalowalna hurtownia danych BigQuery z mechanizmem Vector Search zapewniająca wektorowe wyszukiwanie semantycznie dopasowanych fragmentów z pośród milionów dokumentów źródłowych.
- Logice i serwerze aplikacyjnym: Aplikacja napisana w języku Python (z frameworkiem FastAPI), udostępniająca nakładkę graficzną Web UI oraz publiczne API spinające platformy w całość.
Dodatkowo, dzięki prostemu interfejsowi graficznemu, aplikacja pozwala na wygodne porównanie i empiryczne przetestowanie "surowego" modelu Bielik polegającego tylko na sobie w konfrontacji z bogatszym strumieniem odpowiedzi nowocześniejszego RAG wspomaganego dedykowanym własnym kontekstem.
Poniższy diagram ilustruje główne komponenty aplikacji oraz przepływ danych w przypadku zadawania pytania za pośrednictwem mechanizmu RAG:
graph TD
User([Użytkownik])
UI[Web UI <br/> Przeglądarka]
API[FastAPI <br/> Orchestration API]
Emb[EmbeddingGemma <br/> Cloud Run]
BQ[(BigQuery <br/> Vector Search)]
LLM[Bielik LLM <br/> Cloud Run]
User -- "Wpisuje zapytanie" --> UI
UI -- "POST /ask (Szukanie RAG)" --> API
API -- "1. Wysłanie tekstu" --> Emb
Emb -- "2. Zwrócenie wektora" --> API
API -- "3. Wyszukiwanie wektorów" --> BQ
BQ -- "4. Zwrócenie kontekstu dok." --> API
API -- "5. Pytanie + Kontekst" --> LLM
LLM -- "6. Ostateczna odpowiedź" --> API
API -- "Zwrócenie odpowiedzi ekranowej" --> UI
UI -. "POST /ask_direct (Baseline)" .-> API
API -. "Ominięcie RAG" .-> LLM
Przykładowy kod źródłowy zawarty w tym repozytorium pozwala w szczególności na:
-
Skonfigurowanie własnej instancji modelu Bielik w oparciu o silnik Ollama
-
Skonfigurowanie własnej instancji modelu osadzającego (embedding model) EmbeddingGemma w oparciu o Ollama
-
Uruchomienie obu powyższych modeli na platformie typu bezserwerowego: Cloud Run
-
Skonfigurowanie bazy wektorów w BigQuery wraz ze specjalnym zaawansowanym przeszukiwaniem BigQuery Vector Search
-
Uzyskaj kredyt Cloud OnRamp, lub skonfiguruj płatności w projekcie Google Cloud
-
Przejdź do Google Cloud Console: console.cloud.google.com
-
Stwórz nowy projekt Google Cloud i wybierz go aby był aktywny
Tip
Możesz sprawdzić dostępność kredytów OnRamp wybierając z menu po lewej stronie: Billing / Credits
-
Otwórz Cloud Shell (dokumentacja)
-
Zweryfikuj konto które jest zalogowane w Cloud Shell
gcloud auth list
Tip
Jeżeli konto nie jest zalogowane, lub jest to inne konto niż to z dostępem do Twojego projektu Google Cloud, zaloguj się za pomocą komendy: gcloud auth login
- Potwierdź, że wybrany jest odpowiedni projekt Google Cloud
gcloud config get project
Tip
Jeżeli projekt jest nieodpowiedni, zmień go za pomocą komendy: gcloud config set project <ID_TWOJEGO_PROJEKTU>
Caution
Nie pomyl nazwy projektu z ID projektu! Nie zawsze są one takie same.
-
Sklonuj repozytorium z przykładowym kodem i przejdź do nowoutworzonego katalogu
git clone https://github.com/avedave/eskadra-bielik-misja2
-
Przejdź do katalogu z kodem źródłowym
cd eskadra-bielik-misja2 -
Uruchom edytor w katalogu z kodem źródłowym
cloudshell workspace .
-
Przeanalizuj skrypt
setup_env.sh -
Otwórz ponownie terminal Cloud Shell
-
Uruchom skrypt
setup_env.shsource setup_env.sh
Important
Jeżeli z jakiegoś powodu musisz ponownie uruchomić terminal Cloud Shell, pamiętaj aby ponownie uruchomić skrypt setup_env.sh aby wczytać zmienne środowiskowe.
- Włącz potrzebne usługi w projekcie Google Cloud
gcloud services enable run.googleapis.com gcloud services enable cloudbuild.googleapis.com gcloud services enable artifactregistry.googleapis.com gcloud services enable bigquery.googleapis.com
- Uzyskaj uprawnienia do wywoływania usług Cloud Run
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=user:$(gcloud config get-value account) \ --role='roles/run.invoker'
-
Przeanalizuj skrypt
llm/cloud_run.sh -
Uruchom skrypt
llm/cloud_run.shcd llm ./cloud_run.sh -
Sprawdź status usługi
bielikw Cloud Console - Cloud Run - Services -
Przeanalizuj plik
llm/llm_test1.shi zadaj pierwsze pytanie modelowi Bielik uruchamiając ten skrypt./llm_test1.sh
-
Wróć do głównego katalogu projektu
cd ..
-
Przeanalizuj skrypt
embedding_model/cloud_run.sh -
Uruchom skrypt
embedding_model/cloud_run.shcd embedding_model ./cloud_run.sh -
Sprawdź status usługi
embedding-gemmaw Cloud Console - Cloud Run - Services -
Przeanalizuj plik
embedding_model/embedding_test1.shi wygeneruj pierwsze testowe embeddingi (wektory) dla przykładowego tekstu uruchamiając ten skrypt./embedding_test1.sh
-
Wróć do głównego katalogu projektu
cd ..
Projekt wykorzystuje BigQuery z funkcją Vector Search jako bazę z wiedzą kontekstową.
-
Przejdź do katalogu
vector_storecd vector_store -
Zainstaluj wymagane biblioteki (w środowisku deweloperskim)
pip install google-cloud-bigquery
-
Uruchom skrypt inicjalizacyjny, który stworzy zbiór danych i tabelę w BigQuery
python init_db.py
-
Wróć do głównego katalogu projektu
cd ..
-
Przeanalizuj kod aplikacji FastAPI w katalogu
orchestration -
Przejdź do katalogu
orchestrationcd orchestration -
Uruchom skrypt publikujący aplikację na Cloud Run
./cloud_run.sh
-
Po wdrożeniu gcloud wypisze adres URL usługi
orchestration-api. Zapisz go do zmiennej środowiskowejexport ORCHESTRATION_URL=$(gcloud run services describe orchestration-api --region $REGION --format="value(status.url)")
-
Wróć do głównego katalogu
cd ..
-
Zasil bazę BigQuery przykładowymi danymi z pliku CSV
curl -X POST "$ORCHESTRATION_URL/ingest" \ -F "file=@vector_store/hotel_rules.csv"
-
Sprawdź w Google Cloud Console -> BigQuery, czy rekordy pojawiły się w tabeli
rag_dataset.hotel_rules(Proces indeksowania danych do Vector Search może chwilę potrwać, jednak dane tekstowe widoczne są natychmiast). -
Wykonaj testowe zapytanie wykorzystując RAG, dopytujące o informacje z wgranych reguł
Pytanie o częstotliwość pomiaru chloru w basenie:
curl -X POST "$ORCHESTRATION_URL/ask" \ -H "Content-Type: application/json" \ -d '{"query": "Jak często powinien być mierzony poziom chloru w basenie?"}'
Pytanie o godzinę podawania śniadania:
curl -X POST "$ORCHESTRATION_URL/ask" \ -H "Content-Type: application/json" \ -d '{"query": "O której godzinie jest podawane śniadanie?"}'
Pytanie o parking:
curl -X POST "$ORCHESTRATION_URL/ask" \ -H "Content-Type: application/json" \ -d '{"query": "Ile kosztuje parking hotelowy?"}'
Aplikacja udostępnia proste API stworzone przy pomocy frameworka FastAPI, pozwalające nie tylko na zasilanie bazy wiedzy, ale również na zadawanie pytań.
Aplikacja definiuje w pliku orchestration/main.py następujące ścieżki:
GET /– serwuje statyczny plik interfejsu użytkownika (index.html).POST /ingest– przyjmuje plik CSV i indeksuje zawarte w nim informacje jako wektory w BigQuery (wykorzystując model embeddingowyEmbeddingGemma).POST /ask– główny endpoint RAG:- zamienia zapytanie z tekstu na wektor,
- wyszukuje semantycznie 3 najbardziej zbliżone dokumenty wektorowe w tabeli BigQuery,
- buduje prompt z odnalezionym kontekstem,
- wysyła połączony prompt do modelu
Bieliki zwraca ostateczną odpowiedź wraz z wybranym i wykorzystanym kontekstem.
POST /ask_direct– służy jako zestawienie porównawcze (baseline). Przyjmuje zapytanie i wysyła je bezpośrednio do bazowego modeluBielik, z całkowitym pominięciem RAG.
Oprócz interfejsu API, aplikacja udostępnia również prostą nakładkę WWW. Całość pozwala na wygodne sprawdzenie i porównanie działania bazowego modelu Bielik z modelem Bielik wspartym przez RAG.
Interfejs użytkownika zaimplementowano w jednym, statycznym pliku: orchestration/static/index.html.
Skrypt osadzony w pliku HTML wysyła dwa jednoczesne żądania do endpointów /ask (wsparty RAG) oraz /ask_direct (bezpośrednio do modelu Bielik) i prezentuje obie odpowiedzi modelu obok siebie celem zilustrowania różnic. Wyświetla obok również jakich dokładnie fragmentów dokumentów BigQuery model użył w przypadku posiłkowania się dodatkowym kontekstem RAG.
Tip
Zachęcamy Cię gorąco do eksperymentów! Przejrzyj dokładnie kod źródłowy plików orchestration/main.py oraz orchestration/static/index.html, aby zobaczyć, w jak prosty sposób w Pythonie łączy się wyszukiwanie wektorowe BigQuery z modelem LLM i serwuje dla prostej graficznej nakładki JavaScript. Spróbuj również zmodyfikować kod pliku main.py, aby polecić Bielikowi zachowywanie się jak pirat lub ekspert od IT w instrukcjach systemowych!
Aby otworzyć interfejs graficzny testowej aplikacji z poziomu Twojego projektu:
- Wyświetl i kliknij w adres URL usługi
orchestration-apiuruchamiając w terminalu poniższą komendę:echo $ORCHESTRATION_URL
- Po otwarciu opublikowanej strony w Twojej przeglądarce internetowej, wpisz w okno dialogowe dowolne zapytanie (np. "Do której godziny jest otwarty basen?") i kliknij "Zapytaj".
- Porównaj strumień odpowiedzi wyświetlany dla samej bazy wiedzy modelu (bez dodatkowego kontekstu) z bogatszą odpowiedzią RAG wygenerowaną w oparciu o wiedzę z przeszukiwania BigQuery Vector Search.