Przykładowy kod źródłowy pozwalający na:
-
Skonfigurowanie własnej instancji modelu Bielik w oparciu o Ollama
-
Skonfigurowanie prostych systemów agentowych przy wykorzystaniu Agent Development Kit
-
Uruchomienie obu powyższych serwisów na Cloud Run
-
Przejdź do Google Cloud Console: console.cloud.google.com
-
Zaloguj się
-
Wybierz projekt o nazwie PolishLLMs i projekt ID opole04-kkalfas
Tip
Pokażę to krok po kroku w Cloud Shell / konsoli GCP.
W Cloud Shell wpisz:
gcloud config set project opole04-kkalfasgcloud config get-value projectJeśli komenda zwróci opole04-kkalfas, to znaczy, że nowy projekt jest ustawiony jako aktywny.
-
Otwórz Cloud Shell (dokumentacja)
-
Sklonuj repozytorium z przykładowym kodem i przejdź do nowoutworzonego katalogu
git clone https://github.com/cloudstateu/polish-llm.git cd polish-llm -
Zmień nazwę pliku
.env.samplena.envmv .env.sample .env
-
Zaktualizuj odpowiednie na tym etapie zmienne środowiskowe w pliku
.envBIELIK_EVENT_ID- Identyfikator warsztatów zgodny z kodem użytym w OnRamp CreditsGOOGLE_CLOUD_LOCATION- zmienną definiującą region Google CloudBIELIK_SERVICE_NAME- domyślną nazwę dla usługi gdzie uruchomimy BielikaBIELIK_MODEL_NAME- wersję Bielika z której będziemy korzystać
Tip
W terminalu Cloud Shell dostępny jest edytor po wybraniu opcji Open Editor. W menu "View" jest zaznaczona opcja "Toggle Hidden Files", co pozwala na wyświetlenie ukrytych plików systemowych w eksploratorze projektu.
Important
Jeżeli zmieniasz w BIELIK_MODEL_NAME domyślny model Bielika na inną wersję, to zaktualizuj tę informację również w pliku ollama-bielik/Dockerfile
ENV MODEL SpeakLeash/bielik-4.5b-v3.0-instruct:Q8_0-
Wczytaj zmienne środowiskowe korzystając z podręcznego skryptu
source reload-env.sh
-
Ustal domyślne konto serwisowe dla wybranego projektu
default service accountgcloud builds get-default-service-account
-
Poniższa komenda stworzy nową usługę w Cloud Run o nazwie takiej jak wartość zmiennej
$BIELIK_SERVICE_NAME. Na podstawie definicji wollama-bielik/Dockerfilenardzędziegcloudstworzy odpowiedni kontener, skonfiguruje usługę Ollama oraz wczyta odpowiednią wersję modelu Bielik.gcloud run deploy $BIELIK_SERVICE_NAME --source ollama-bielik/ --region $GOOGLE_CLOUD_LOCATION --concurrency 7 --cpu 8 --set-env-vars OLLAMA_NUM_PARALLEL=4 --gpu 1 --gpu-type nvidia-l4 --max-instances 1 --memory 16Gi --allow-unauthenticated --no-cpu-throttling --no-gpu-zonal-redundancy --timeout 600 --labels dev-tutorial=codelab-dos-$BIELIK_EVENT_ID
Caution
Flaga --allow-unauthenticated udostępnia usługę publicznie w internecie i każdy kto zna URL, może zaczać z niej korzystać. W środowisku produkcyjnym zazwyczaj trzeba tę flagę usunąć i odpowiednio skonfigurować reguły dostępu.
bash gcloud projects add-iam-policy-binding project-7f3879f0-2feb-446b-a41j --member="serviceAccount:94861095468-compute@developer.gservice
-
Uruchom poniższą komendę, aby sprawdzić pod jakim URL jest dostępny Bielik
gcloud run services describe $BIELIK_SERVICE_NAME --region=$GOOGLE_CLOUD_LOCATION --format='value(status.url)'
Tip
Odpowiedz twierdząco, jeżeli system spyta o włączenie odpowiednich API oraz stworzenie rejestru artefaktów
- Przypisz powyższy URL do zmiennej środowiskowej
OLLAMA_API_BASEw pliku.envi następnie wczytaj zmienne środowiskowe ponownie:source reload-env.sh
- Sprawdź w Google Cloud console czy nowy serwis jest już dostępny
- Sprawdź czy otwierając URL w przeglądarce zobaczysz informację:
Ollama is running - Sprawdź przez API jakie modele są dostępne lokalnie na serwerze Ollama
curl "${OLLAMA_API_BASE}/api/tags" - Wyślij zapytanie przez API
curl "${OLLAMA_API_BASE}/api/generate" -d "{ \"model\": \"$BIELIK_MODEL_NAME\", \"prompt\": \"Kto zabił smoka wawelskiego?\", \"stream\": false }"
Wygeneruj mi artykuł blogowy na długość 1000 znaków ze spacją o tym jak wygląda życie w Opolu.
curl "${OLLAMA_API_BASE}/api/generate" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Wygeneruj mi artykuł blogowy na długość 1000 znaków ze spacją o tym jak wygląda życie w Opolu.\",
\"stream\": false
}" | jq -r .responseCzym jest NFZ i kiedy został utworzony?
curl "${OLLAMA_API_BASE}/api/generate" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Czym jest NFZ i kiedy został utworzony?\",
\"stream\": false
}" | jq -r .responseZ którego roku pochodzi obecna Konstytucja RP i kiedy została uchwalona? Dlaczego ta data jest symboliczna?
curl "${OLLAMA_API_BASE}/api/generate" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Z którego roku pochodzi obecna Konstytucja RP i kiedy została uchwalona? Dlaczego ta data jest symboliczna?\",
\"stream\": false
}" | jq -r .responsePodaj art.30 Konstytucja RP
curl "${OLLAMA_API_BASE}/api/generate" -H "Content-Type: application/json" -d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Podaj art.30 Konstytucji RP\",
\"stream\": false
}" | jq -r .responseTeraz sprawdzimy, jak parametr temperature wpływa na kreatywność i powtarzalność odpowiedzi modelu. Wykonaj to samo zapytanie trzy razy, ustawiając temperaturę 0.001, i porównaj otrzymane odpowiedzi.
curl "${OLLAMA_API_BASE}/api/generate" -H "Content-Type: application/json" -d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Dokończ tę historię w 2-3 zdaniach: 'Pacjent wszedł do przychodni i powiedział lekarzowi...'\",
\"stream\": false,
\"options\": {\"temperature\": 0.001, \"num_predict\": 1000}
}" | jq -r .responseTeraz wykonamy to samo zapytanie, ale z temperaturą ustawioną na 0.7. To ustawienie pozwala modelowi na większą różnorodność odpowiedzi, przy jednoczesnym zachowaniu sensu i spójności.
curl "${OLLAMA_API_BASE}/api/generate" -H "Content-Type: application/json" -d "{
\"model\": \"$BIELIK_MODEL_NAME\",
\"prompt\": \"Dokończ tę historię w 2-3 zdaniach: 'Pacjent wszedł do przychodni i powiedział lekarzowi...'\",
\"stream\": false,
\"options\": {\"temperature\": 0.7, \"num_predict\": 1000}
}" | jq -r .responseWięcej o temperaturze przeczytaj w dokumentacji ollama LINK
-
Skonfiguruj swój własny klucz Gemini API
- Stwórz lub skopiuj istniejący Gemini API key z Google AI Studio.
- Dodaj wartość klucza ze swojego Gemini API key jako wartość zmiennej
GOOGLE_API_KEYw pliku.env
GOOGLE_API_KEY=TWÓJ_KLUCZ
-
Wczytaj zmienne środowiskowe ponownie
source reload-env.sh -
Przejdź do katalogu z agentami
cd adk-agents -
Stwórz i aktywuj wirtualne środowisko Python
python -m venv .venv source .venv/bin/activate -
Zainstaluj wymagane komponenty
pip install -r requirements.txt
Ten prosty system agentowy, działający jedynie w oparciu o model Bielik, jest prostym przykładem wykorzystania LLM Agents oraz Workflow Agents dostępnych w ADK. System ma na celu generowanie artykułów dla różnych grup docelowych (dzieci, kadra zarządzająca) w oparciu o temat zasugerowany przez użytkownika.
content_creator_agent- Główny, sekwencyjny agent, uruchamia pod-agentów jeden po drugimtopic_identifier_agent- Agent LLM odpowiedzialny za zidentyfikowanie tematu którym interesuje się użytkownik.topic_expander_agent- Agent LLM odpowiedzialny za rozwinięcie tematu. Generuje listę ciekawych faktów związanych z tematem.authoring_agent- Agent równoległy - uruchamia pod-agentów równolegle. Zawiera dwóch pod-agentów, po jednym na każdą grupę docelowąchildren_audience_agent- Agent LLM odpowiedzialny za tworzenie treści skierowanych do dzieci.executive_audience_agent- Agent LLM odpowiedzialny za tworzenie treści skierowanych do kadry zarządzającej.
graph TD
subgraph content_creator_agent [content_creator_agent:SequentialAgent]
direction LR
topic_identifier_agent("topic_identifier_agent:Agent") --> topic_expander_agent("topic_expander_agent:Agent");
topic_expander_agent --> authoring_agent;
end
subgraph authoring_agent [authoring_agent:ParallelAgent]
direction TB
children_audience_agent("children_audience_agent:Agent");
executive_audience_agent("executive_audience_agent:Agent");
end
-
Upewnij się, że jesteś w katalogu
adk_agentsoraz że wszystkie zmienne środowiskowe są załadowane -
Uruchom agenta w konsoli Cloud Shell i rozpocznij interakcję
adk run content_creator/
Ten hybrydowy system agentowy, działający w oparciu o modele Gemini i Bielik, jest przykładem wykorzystania Agentów LLM (LLM Agents), funkcji-jako-narzędzi (Function Tools) oraz agentów-jako-narzędzi (Agent-as-a-tTool) dostępnych w ADK.
System ma na celu pełnienie roli międzynarodowego przewodnika kulinarnego, który deleguje zadania do wyspecjalizowanych pod-agentów lub narzędzi w zależności od kraju, o który pyta użytkownik.
culinary_guide_agent- Główny agent, który komunikuje się z użytkownikiem w języku angielskim. Jego zadaniem jest zrozumienie prośby o rekomendacje kulinarne, identyfikacja kraju i preferencji dietetycznych, a następnie delegowanie zadania do odpowiednich narzędzi.polish_expert_tool- Narzędzie typu AgentTool, które opakowuje agenta polish_culinary_expert_agent, umożliwiając głównemu agentowi korzystanie z jego wyspecjalizowanych zdolności.polish_culinary_expert_agent- Wyspecjalizowany Agent LLM oparty na modelu Bielik, ekspert w dziedzinie kuchni polskiej. Przyjmuje zapytania i odpowiada wyłącznie w języku polskim.german_food_tool- Proste narzędzie oparte na funkcji Pythona, które dostarcza rekomendacji kulinarnych dla Niemiec w oparciu o zdefiniowaną logikę.
graph TD
subgraph Culinary Recommendation System
direction TB
%% Define the Root Agent
A[fa:fa-robot culinary_guide_agent]
%% Define the Tools
subgraph polish_expert_tool
direction TB
B[fa:fa-wrench AgentTool] --> C[fa:fa-robot polish_culinary_agent]
end
D[fa:fa-wrench german_food_tool]
%% Define the relationships
A --> B
A --> D
end
-
Upewnij się, że jesteś w katalogu
adk_agentsoraz że wszystkie zmienne środowiskowe są załadowane -
Uruchom agenta w konsoli Cloud Shell i rozpocznij interakcję
adk run culinary_guide_agent/
Ten hybrydowy system agentowy, działający w oparciu o modele Gemini i Bielik, jest przykładem wykorzystania Agentów LLM (LLM Agents), funkcji-jako-narzędzi (Function Tools) oraz agentów-jako-narzędzi (Agent-as-a-tTool) dostępnych w ADK.
System ma na celu pełnienie specjalisty od polskiego prawa konsumenckiego, który deleguje zadania do wyspecjalizowanych pod-agentów lub narzędzi w zależności od tego, czy użytnikowi przysługuje prawo zwrotu, reklamacja, lub nie przysługuje żadne z nich.
polish_consumer_law_agent- Główny agent, który komunikuje się z użytkownikiem w języku polskim. Jego zadaniem jest zrozumienie prośby o pomoc w reklamacji/zwrocie towaru, a następnie delegowanie zadania do odpowiednich narzędzi.polish_complaints_law_expert_tool- Narzędzie typu AgentTool, które opakowuje agenta polish_complaints_law_expert_agent, umożliwiając głównemu agentowi korzystanie z jego wyspecjalizowanych zdolności.polish_complaints_law_expert_agent- Wyspecjalizowany Agent LLM oparty na modelu Bielik, ekspert w dziedzinie reklamacji. Przyjmuje zapytania i odpowiada wyłącznie w języku polskim.polish_return_policies_expert_tool- Narzędzie typu AgentTool, które opakowuje agenta polish_return_policies_expert_agent, umożliwiając głównemu agentowi korzystanie z jego wyspecjalizowanych zdolności.polish_return_policies_expert_agent- Wyspecjalizowany Agent LLM oparty na modelu Bielik, ekspert w dziedzinie polityk zwrotów. Przyjmuje zapytania i odpowiada wyłącznie w języku polskim.no_return_complain_possible_response- Proste narzędzie oparte na funkcji Pythona, które zwraca użytkownikowi informację o braku możliwości zwrotu/reklamacji.
graph TD
subgraph Order Complaint System
direction TB
%% Define the Root Agent
A[fa:fa-robot polish_consumer_law_agent]
%% Define the Tools
B[fa:fa-wrench AgentTool polish_complaints_law_expert_tool] --> C[fa:fa-robot polish_complaints_law_expert_agent]
D[fa:fa-wrench AgentTool polish_return_policies_expert_tool] --> E[fa:fa-robot polish_return_policies_expert_agent]
F[fa:fa-wrench Python function no_return_complain_possible_response]
%% Define the relationships
A --> B
A --> D
A --> F
end
-
Upewnij się, że jesteś w katalogu
adk_agentsoraz że wszystkie zmienne środowiskowe są załadowane -
Uruchom agenta w konsoli Cloud Shell i rozpocznij interakcję
adk run order_complaint_agent/
- Upewnij się, że jesteś w katalogu
adk_agentsoraz że wszystkie zmienne środowiskowe są załadowane - Uruchom środowisko ADK Web
adk web
- Zmień port w Web View (jeżeli potrzeba, zazwyczaj jest to port 8000)
- Zaakceptuj zmiany poprzez: Change and Preview
- Z rozwijanego menu po lewej stronie ekranu wybierz system z którym chcesz pracować
- Upewnij się, że jesteś w katalogu
adk_agentsoraz że wszystkie zmienne środowiskowe są załadowanegcloud run deploy adk-agents --source . --region $GOOGLE_CLOUD_LOCATION --allow-unauthenticated --set-env-vars GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION --set-env-vars OLLAMA_API_BASE=$OLLAMA_API_BASE --set-env-vars GOOGLE_API_KEY=$GOOGLE_API_KEY --labels dev-tutorial=codelab-dos-$BIELIK_EVENT_ID
Caution
Flaga --allow-unauthenticated udostępnia usługę publicznie w internecie i każdy kto zna URL, może zaczać z niej korzystać. W środowisku produkcyjnym zazwyczaj trzeba tę flagę usunąć i odpowiednio skonfigurować reguły dostępu.
PROJECT_ID=""
PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
- Narzędzie
gcloudstworzy kontener na podstawie konfiguracji zawartej wadk-agents/Dockerfilei uruchomi usługę w Cloud Run, podając URL pod którym serwis będzie dostępny - Wywołaj otrzymany URL w przeglądarce WWW aby mieć dostęp do środowiska ADK Web
