Claude Code dla analityka danych: jak generowanie SQL i Pythona przez AI przestaje być loterią
Jak wykorzystać Claude Code w pracy analityka danych, by generować trafne SQL i utrzymywalny Python. Praktyczne wskazówki: prompty, wydajność, walidacja wyników, testy DQ i bezpieczeństwo danych.
Jak opisać schemat bazy i cel analizy, żeby AI wygenerowało poprawne SQL?
Najważniejsze jest podanie AI minimalnego, ale jednoznacznego opisu danych: jakie tabele istnieją, co oznaczają kluczowe kolumny, po czym można je łączyć i jaki ma być dokładny wynik analizy. Model nie „domyśli się” poprawnej logiki biznesowej, jeśli schemat zostanie opisany ogólnie, np. tylko nazwami tabel.
Opis schematu powinien zawierać dla każdej używanej tabeli: nazwę tabeli, znaczenie biznesowe, najważniejsze kolumny wraz z typem lub rolą, klucz główny oraz relacje do innych tabel. W praktyce wystarczy wskazać np. że orders.order_id jest identyfikatorem zamówienia, orders.customer_id łączy się z customers.customer_id, a order_items.order_id daje relację 1:N do pozycji zamówienia. Jeśli są pułapki, trzeba je nazwać wprost: czy tabela zawiera duplikaty, statusy historyczne, rekordy anulowane, dane archiwalne albo daty w UTC.
Cel analizy trzeba opisać nie jako ogólne hasło, ale jako precyzyjne zadanie analityczne. To znaczy: jaki wskaźnik liczysz, dla jakiego okresu, na jakim poziomie agregacji, z jakimi filtrami i co ma trafić do wyniku. Zamiast „pokaż sprzedaż klientów” lepiej napisać: „policz miesięczny przychód netto per klient za 2024 rok, uwzględnij tylko zamówienia opłacone, wyklucz zwroty, wynik posortuj malejąco po przychodzie”. Taki opis ogranicza ryzyko, że AI wybierze złą tabelę, zły filtr albo błędną definicję metryki.
Dobrą praktyką jest dopisanie reguł biznesowych i ograniczeń technicznych, które SQL ma respektować. Jeśli „aktywny klient” oznacza klienta z co najmniej jednym zamówieniem w ostatnich 90 dniach, trzeba to powiedzieć. Jeśli należy używać konkretnego dialektu, np. PostgreSQL lub BigQuery, również trzeba to wskazać. To samo dotyczy oczekiwanego formatu wyniku: czy ma powstać jeden SELECT, CTE, widok, czy zapytanie z komentarzami.
- Schemat: nazwy tabel, znaczenie, klucze, relacje, istotne kolumny.
- Definicje: jak rozumieć metryki, statusy, daty, zwroty, anulacje, deduplikację.
- Zadanie: co policzyć, dla jakiego zakresu czasu, z jaką agregacją i filtrami.
- Wynik: jakie kolumny ma zwrócić zapytanie i w jakim dialekcie SQL.
Najskuteczniejszy prompt przypomina krótki brief techniczny, a nie luźny opis problemu. Im mniej miejsca na interpretację relacji między tabelami i definicji wskaźników, tym większa szansa, że AI wygeneruje poprawne SQL już w pierwszej wersji.
Jak prosić o zapytania SQL, które są wydajne i nie robią niepotrzebnych skanów tabel?
Najważniejsze jest to, by w promptcie nie ograniczać się do opisu wyniku biznesowego, tylko podać także warunki wykonawcze. Model powinien dostać informację, że zapytanie ma być wydajne, używać filtrów jak najwcześniej, wybierać tylko potrzebne kolumny i unikać pełnych skanów dużych tabel, jeśli da się tego uniknąć. W praktyce warto napisać wprost, że zależy Ci na rozwiązaniu zgodnym z indeksami, partycjonowaniem i typami danych obecnymi w tabelach.
Żeby AI mogło wygenerować sensowny SQL, potrzebuje kontekstu technicznego: wielkości tabel, kluczy głównych i obcych, dostępnych indeksów, kolumn partycjonujących, zakresu dat oraz informacji, które tabele są duże, a które słownikowe. Bez tego model może napisać zapytanie poprawne logicznie, ale kosztowne, na przykład wykonać SELECT *, filtrować po funkcji na kolumnie indeksowanej albo zrobić złączenie przed zawężeniem danych.
Dobre polecenie powinno też narzucać konkretne zasady. Warto poprosić, by SQL filtrował dane w klauzuli WHERE przed agregacją, nie opakowywał kolumn filtrowanych w funkcje typu DATE(column) lub LOWER(column), jeśli to blokuje użycie indeksu, unikał zbędnych DISTINCT, ORDER BY i podzapytań materializujących duże zbiory. Jeśli potrzebujesz tylko istnienia rekordu, poproś o EXISTS zamiast pełnego złączenia. Jeśli zakres jest czasowy, wskaż dokładnie okno dat, aby nie skanować całej historii.
Warto wymagać nie tylko samego SQL, ale także krótkiego uzasadnienia: dlaczego wybrano taki porządek złączeń, które filtry ograniczają wolumen danych i jakie elementy mogą korzystać z indeksów. To pozwala szybko ocenić, czy model rzeczywiście myśli o planie wykonania, a nie tylko o poprawności składni.
Praktyczny wzorzec promptu może brzmieć tak: Napisz zapytanie SQL dla tabel A, B i C. Tabela A ma ok. 200 mln wierszy i jest partycjonowana po event_date, indeks na user_id i event_date. Tabela B ma 2 mln wierszy, indeks na order_id. Potrzebuję tylko kolumn X, Y, Z za ostatnie 30 dni. Unikaj SELECT *, funkcji na kolumnach filtrowanych, zbędnego DISTINCT i pełnych skanów dużych tabel. Zastosuj filtry jak najwcześniej i dopisz krótko, które warunki powinny użyć indeksów.
Jeżeli chcesz ograniczyć ryzyko kosztownego SQL jeszcze bardziej, poproś model o dwie rzeczy: wersję zapytania oraz listę potencjalnych miejsc, w których może dojść do full table scan. Wtedy dostajesz nie tylko wynik, ale też wstępną kontrolę jakości. Ostatecznie jednak wydajność potwierdza się dopiero przez EXPLAIN lub odpowiednik w danym silniku bazodanowym, więc AI warto traktować jako pomoc w przygotowaniu dobrej wersji roboczej, a nie jako gwarancję optymalnego planu wykonania.
Jak weryfikować, czy SQL od AI nie zniekształca wyników (duplikaty, joiny, filtry)?
Najważniejsza zasada jest prosta: nie oceniaj zapytania po tym, że „się wykonuje”, tylko po tym, czy zachowuje oczekiwaną krotność danych i logikę biznesową. SQL wygenerowany przez AI bardzo często wygląda poprawnie składniowo, ale może zawyżać lub zaniżać wyniki przez błędny JOIN, niepełny warunek łączenia, filtr zastosowany w złym miejscu albo niejawne mnożenie wierszy.
W praktyce trzeba sprawdzić trzy rzeczy. Po pierwsze, czy każda tabela ma właściwy poziom szczegółowości, na przykład jeden wiersz na użytkownika, zamówienie albo pozycję zamówienia. Jeżeli AI łączy tabelę zagregowaną z tabelą szczegółową bez kontroli relacji, wynik może się zwielokrotnić. Po drugie, czy warunki JOIN używają pełnego klucza, a nie tylko jego fragmentu. Po trzecie, czy filtry są założone tam, gdzie rzeczywiście powinny działać: filtr w WHERE po LEFT JOIN może niechcący zmienić go w INNER JOIN i usunąć część rekordów.
Najpewniejsza metoda to porównanie liczności przed i po każdym etapie. Sprawdza się, ile wierszy i ile unikalnych kluczy jest w źródle, a potem po każdym dołączeniu kolejnej tabeli. Jeżeli po joinie liczba wierszy rośnie, a nie powinna, to zwykle znak relacji jeden-do-wielu albo źle dobranego klucza. Jeżeli spada po operacji, która miała tylko „wzbogacić” dane, to najczęściej filtruje się za dużo albo użyto zbyt restrykcyjnego typu złączenia.
Warto też wykonać kontrolne zapytania diagnostyczne. Dla potencjalnych duplikatów sprawdza się, czy klucz biznesowy nadal jest unikalny, na przykład przez GROUP BY i HAVING COUNT(*) > 1. Dla joinów dobrze jest policzyć, ile rekordów z tabeli głównej nie znalazło dopasowania oraz ile rekordów ma więcej niż jedno dopasowanie. Dla filtrów należy porównać wynik z wersją bez filtra i upewnić się, że usunięte zostały dokładnie te przypadki, które miały zostać usunięte.
Szczególną ostrożność trzeba zachować przy agregacjach. AI bywa skłonne „naprawiać” duplikaty przez DISTINCT, ale to zwykle maskuje problem zamiast go rozwiązywać. Jeżeli suma przychodu zgadza się dopiero po dodaniu DISTINCT, to najczęściej błąd leży wcześniej: w joinie lub w poziomie ziarnistości danych. Poprawna weryfikacja polega na potwierdzeniu, że agregujesz po właściwym kluczu i z właściwej tabeli bazowej, a nie na mechanicznym usuwaniu powtórzeń.
Dobra praktyka to wymaganie od AI, aby jawnie opisało założenia: jaki jest klucz każdej tabeli, jaka relacja zachodzi między tabelami, czy join ma być jeden-do-jednego, jeden-do-wielu czy wiele-do-jednego, oraz jaki efekt mają dawać filtry. Dzięki temu łatwiej wychwycić moment, w którym zapytanie jest formalnie poprawne, ale semantycznie błędne. Ostatecznie poprawność SQL trzeba potwierdzić nie tylko technicznie, lecz także przez zgodność z kontrolnymi metrykami, które już znasz, na przykład liczbą zamówień, liczbą klientów albo sumą wartości w dobrze rozumianym wycinku danych.
Jak generować w Pythonie pipeline do czyszczenia i transformacji danych, który da się utrzymać?
Pipeline, który da się utrzymać, powinien być przede wszystkim deterministyczny, modularny i testowalny. W praktyce oznacza to, że kod do czyszczenia i transformacji danych nie może być jednym długim skryptem z mutowaniem DataFrame w wielu miejscach, tylko zbiorem małych, nazwanych funkcji, z których każda odpowiada za jeden jasno określony krok: walidację wejścia, normalizację typów, obsługę braków, standaryzację wartości czy wyliczenie nowych kolumn. Taki podział pozwala łatwo zrozumieć, co robi pipeline, zmienić pojedynczy etap bez psucia reszty oraz szybko znaleźć źródło błędu.
Najważniejsza zasada brzmi: każdy krok powinien mieć jawne wejście i jawne wyjście. Funkcja transformująca dane powinna przyjmować DataFrame i zwracać nowy DataFrame albo przewidywalnie zmodyfikowaną kopię, zamiast polegać na ukrytym stanie, zmiennych globalnych czy efektach ubocznych. Dobrą praktyką jest także zapisanie kontraktu dla każdego etapu: jakie kolumny są wymagane, jakie typy danych są oczekiwane i jakie warunki muszą być spełnione po transformacji. Dzięki temu pipeline nie tylko przetwarza dane, ale też egzekwuje ich jakość.
Żeby kod generowany w Pythonie był utrzymywalny, warto wymuszać strukturę opartą na prostym wzorcu: funkcje typu load, validate, clean, transform, aggregate, save, a w środku krótkie operacje opisane nazwą biznesową lub techniczną. Zamiast pisać logikę w stylu „zmień kilka kolumn, odfiltruj coś, potem popraw daty”, lepiej rozdzielić to na kroki takie jak normalize_column_names(df), parse_dates(df), drop_invalid_rows(df) czy calculate_margin(df). Taki kod jest czytelny także po kilku miesiącach, gdy pierwotny autor nie pamięta już szczegółów implementacji.
Utrzymywalność zależy też od tego, by reguły czyszczenia były jawne, a nie zaszyte w przypadkowych warunkach. Jeżeli puste wartości w jednej kolumnie mają być zastępowane zerem, a w innej oznaczać rekord do odrzucenia, to ta logika powinna być wyrażona wprost w kodzie lub w konfiguracji, a nie ukryta w kilku liniach bez komentarza semantycznego. W podobny sposób warto oddzielać dane konfiguracyjne od logiki, na przykład przez przekazywanie map typów, list dozwolonych wartości czy progów walidacyjnych jako parametrów. Dzięki temu zmiana reguł nie wymaga przebudowy całego pipeline.
Kluczowe jest również wbudowanie walidacji po każdym istotnym etapie. Po wczytaniu danych warto sprawdzić obecność wymaganych kolumn i typów, po czyszczeniu liczbę braków lub duplikatów, a po transformacji sensowność zakresów i zgodność kluczy. Taka walidacja nie powinna być dodatkiem „na końcu”, tylko integralną częścią pipeline. Jeśli dane nie spełniają założeń, kod powinien zgłosić jednoznaczny wyjątek z informacją, który warunek został naruszony. To jest znacznie bardziej utrzymywalne niż ciche naprawianie błędów albo generowanie błędnych wyników bez ostrzeżenia.
W praktyce dobrze utrzymywalny pipeline w Pythonie ma też stały styl operowania na danych. Warto unikać mieszania wielu paradygmatów i bibliotek w jednym przepływie bez potrzeby, bo utrudnia to debugowanie i rozwój. Jeżeli transformacje są realizowane w DataFrame, lepiej utrzymać spójną konwencję nazewniczą, kolejność kroków i sposób obsługi braków czy typów. Równie istotne jest ograniczenie liczby „magicznych” skrótów: zwięzły kod nie zawsze jest lepszy, jeśli po tygodniu trudno odczytać jego intencję.
Jeśli pipeline ma być generowany przez AI, trzeba zadbać o to, by model produkował kod z narzuconą strukturą: krótkie funkcje, typowe nazwy etapów, sekcję walidacji, brak ukrytych zależności i brak zbędnego łączenia logiki biznesowej z techniczną. Najbardziej użyteczny jest kod, który od razu nadaje się do przeglądu, testów i modyfikacji przez człowieka, a nie tylko „działa na próbce”. W tym sensie dobry pipeline to nie ten, który jednorazowo przetworzy dane, ale taki, który można bezpiecznie uruchamiać wielokrotnie, rozszerzać o nowe reguły i diagnozować, gdy zmieni się źródło danych.
Minimalny standard utrzymywalności to więc: małe funkcje o jednej odpowiedzialności, jawne kontrakty wejścia i wyjścia, brak ukrytego stanu, walidacja danych w kluczowych punktach oraz kod czytelny na poziomie intencji, a nie tylko składni. Jeśli te warunki są spełnione, pipeline do czyszczenia i transformacji danych w Pythonie pozostaje zrozumiały i odporny na zmiany, zamiast zamieniać się w trudny do naprawy skrypt jednorazowego użytku.
Jak prosić AI o kod w Pandas, który jest czytelny i testowalny?
Najważniejsze jest to, by nie prosić wyłącznie o „działający kod”, tylko o kod spełniający konkretne wymagania jakościowe. W promptcie warto od razu narzucić strukturę rozwiązania: wejście i wyjście funkcji, nazwy kolumn, oczekiwane typy danych, sposób obsługi braków danych oraz zakaz umieszczania całej logiki w jednym łańcuchu operacji. Jeśli chcesz kod czytelny, poproś o małe funkcje z jednoznacznymi nazwami, bez zbędnych skrótów i z krótkimi komentarzami wyjaśniającymi tylko nietrywialne fragmenty.
Kod testowalny w Pandas to przede wszystkim kod, który nie zależy od ukrytego stanu. Dlatego warto wymagać, aby AI generowało funkcje przyjmujące DataFrame jako argument i zwracające nowy DataFrame albo serię wynikową, zamiast czytać pliki, korzystać z globalnych zmiennych czy mieszać transformację z prezentacją wyniku. Dobrą praktyką jest też doprecyzowanie, że funkcja ma nie modyfikować danych wejściowych w miejscu, chyba że jest to wyraźnie uzasadnione. Dzięki temu łatwiej porównać wynik z oczekiwanym rezultatem w prostych testach.
W samym poleceniu dobrze jest podać minimalny przykład danych wejściowych i oczekiwany rezultat. To zmusza model do dopasowania logiki do konkretnego przypadku i ogranicza ryzyko wygenerowania efektownego, ale nieprecyzyjnego kodu. Jeśli zależy Ci na jakości, poproś też o uwzględnienie przypadków brzegowych, na przykład duplikatów, wartości pustych, niejednoznacznych typów lub brakujących kolumn. W praktyce AI znacznie lepiej pisze kod Pandas, gdy wie nie tylko co policzyć, ale też jak rozpoznać, że wynik jest poprawny.
Dobry prompt powinien też określać styl implementacji. Możesz zażądać, aby model unikał nadmiernie zagnieżdżonych wyrażeń, nie łączył wielu transformacji w jeden trudny do debugowania łańcuch oraz rozdzielał etapy: walidację danych, czyszczenie, transformację i agregację. W Pandas to szczególnie ważne, bo kod da się napisać bardzo zwięźle, ale taka zwięzłość często pogarsza możliwość testowania i utrzymania.
Praktycznie skuteczna prośba brzmi mniej więcej tak: napisz funkcję w Pythonie z użyciem Pandas, która przyjmuje DataFrame z określonymi kolumnami, wykonuje konkretną transformację, zwraca nowy DataFrame, nie modyfikuje wejścia, zawiera krótkie komentarze, ma czytelne nazwy zmiennych oraz prosty zestaw testów pokazujących oczekiwane wyniki dla przykładowych danych. Taki poziom precyzji zwykle daje lepszy efekt niż ogólne polecenie „napisz kod w Pandas”.
Jeżeli pierwsza odpowiedź nadal jest zbyt zwięzła albo zbyt „magiczna”, warto iterować: poprosić o refaktoryzację na mniejsze funkcje, dopisanie testów, usunięcie skrótowych konstrukcji lub wyjaśnienie, dlaczego wybrano konkretną metodę. W kontekście Pandas dobra współpraca z AI polega więc nie na jednorazowym wygenerowaniu kodu, lecz na precyzyjnym wymuszeniu cech, które decydują o czytelności i testowalności.
6 - Jak automatycznie tworzyć kontrolne zestawienia i testy jakości danych (DQ checks)?
Automatyzacja kontrolnych zestawień i testów jakości danych polega na zamianie ręcznie pisanych, jednorazowych kontroli w powtarzalne reguły, które można generować i uruchamiać dla każdej tabeli, źródła lub kroku transformacji. W praktyce AI może przyspieszyć przygotowanie takich kontroli, jeśli dostanie jasny kontekst: schemat tabeli, definicje pól, oczekiwaną logikę biznesową oraz informację, jaki typ testów ma powstać. Wtedy zamiast prosić o „sprawdź jakość danych”, lepiej zlecić wygenerowanie konkretnych kontroli, na przykład SQL tworzącego zestawienie liczby rekordów, udziału wartości NULL, liczby duplikatów klucza, zakresów dat, zgodności relacji między tabelami czy porównania wartości przed i po transformacji.
Najważniejsze jest rozdzielenie dwóch rzeczy: zestawień kontrolnych i testów DQ. Zestawienie kontrolne ma charakter diagnostyczny — pokazuje metryki, które analityk może przejrzeć, np. liczba rekordów dziennie, liczba unikalnych identyfikatorów, minimum i maksimum wartości, rozkład kategorii. Test DQ idzie krok dalej i zawiera warunek zaliczenia lub błędu, np. „udział NULL w kolumnie email musi być mniejszy niż 1%” albo „każdy rekord sprzedaży musi mieć istniejący identyfikator klienta”. AI dobrze sprawdza się w generowaniu obu typów artefaktów, ale warunki akceptacji muszą wynikać z realnych wymagań danych, a nie z domysłów modelu.
Najbezpieczniejszy sposób pracy to użycie szablonów. Dla każdej tabeli lub modelu danych można zdefiniować standardowy zestaw kontroli: kompletność, unikalność, spójność typów, zgodność zakresów, świeżość danych, integralność referencyjną i zgodność agregatów z poprzednim etapem. Następnie AI generuje na tej podstawie kod SQL lub Python, podstawiając nazwy tabel, kolumn i progów alarmowych. Dzięki temu wynik nie jest „kreatywny”, tylko przewidywalny i porównywalny między zbiorami danych. To właśnie odróżnia użyteczne DQ checks od losowo generowanych zapytań.
W praktyce dobra specyfikacja dla AI powinna zawierać: nazwę tabeli, listę kolumn z typami, wskazanie klucza głównego lub kluczy biznesowych, informację które pola są obowiązkowe, jakie relacje istnieją z innymi tabelami oraz jakie odchylenia są dopuszczalne. Na tej podstawie można wygenerować np. jedno zapytanie tworzące tabelę kontrolną z metrykami albo zestaw osobnych testów zwracających status PASS/FAIL. Jeżeli dane są przetwarzane cyklicznie, warto wymagać także porównania do poprzedniego dnia, tygodnia lub ostatniego poprawnego wsadu, bo wiele problemów jakościowych ujawnia się dopiero jako nagła zmiana wolumenu lub struktury danych.
Kluczowe jest też to, by wynik działania AI był weryfikowalny. Wygenerowany test powinien jasno wskazywać: co sprawdza, na jakiej tabeli, według jakiego warunku i jaki wynik oznacza błąd. Dobre testy DQ nie kończą się na samym kodzie — powinny produkować czytelny rezultat, np. liczbę naruszeń, próbkę błędnych rekordów albo metrykę odchylenia. Dzięki temu kontrola nie jest czarną skrzynką i można ją łatwo utrzymać po zmianach w modelu danych.
Największa korzyść z użycia AI pojawia się wtedy, gdy automatyzacja obejmuje nie tylko jednorazowe wygenerowanie kodu, ale cały wzorzec pracy: opis danych wejściowych, generowanie kontroli, uruchamianie ich po każdym ładowaniu oraz zapis wyników do tabeli audytowej lub raportu. W takim układzie kontrolne zestawienia i DQ checks stają się częścią procesu analitycznego, a nie ręcznym dodatkiem wykonywanym tylko przy problemach.
Jak zabezpieczyć dane wrażliwe, gdy korzystasz z AI do pisania zapytań i skryptów?
Najważniejsza zasada brzmi: nie przekazuj do modelu żadnych danych, których nie musisz ujawniać. Jeśli AI ma pomóc napisać SQL lub skrypt, zwykle wystarczy opis schematu, nazwy techniczne kolumn, przykładowe wartości zanonimizowane i precyzyjny opis celu. Nie trzeba wklejać rekordów z danymi klientów, numerów dokumentów, adresów e-mail, identyfikatorów użytkowników ani fragmentów tabel zawierających dane osobowe, finansowe czy medyczne.
W praktyce oznacza to, że przed użyciem AI należy zastosować minimalizację danych i redakcję treści. Zamiast rzeczywistych danych wstawiaj wartości zastępcze, maskuj identyfikatory, usuwaj dane wolnotekstowe i ograniczaj kontekst tylko do tego, co potrzebne do wygenerowania poprawnej logiki zapytania. Jeżeli problem dotyczy struktury tabeli, podaj strukturę. Jeżeli dotyczy błędu w transformacji, pokaż zsyntetyzowany przykład. Modelowi do pracy nad składnią lub algorytmem zwykle nie są potrzebne prawdziwe rekordy.
Trzeba też rozróżnić dwa poziomy ryzyka: treść promptu i dostęp narzędzia do środowiska. Nawet jeśli nie wklejasz danych do rozmowy, zagrożenie wraca, gdy narzędzie AI ma bezpośredni dostęp do repozytorium, bazy, logów lub plików roboczych. Dlatego dostęp powinien być ograniczony zasadą najmniejszych uprawnień: tylko do niezbędnych katalogów, tylko do odczytu tam, gdzie to możliwe, bez dostępu do produkcyjnych sekretów, kluczy API, pełnych dumpów baz i plików konfiguracyjnych zawierających hasła.
Bezpieczne korzystanie z AI wymaga również kontroli organizacyjnej. Warto przyjąć prostą regułę: do zewnętrznego modelu nie trafiają dane poufne ani dane osobowe, chyba że organizacja świadomie dopuściła taki przepływ i ma do tego podstawy prawne, techniczne oraz umowne. Jeśli takich warunków nie ma, używaj danych testowych, środowisk odseparowanych i sztucznie przygotowanych przykładów. To samo dotyczy logów błędów i fragmentów kodu, w których często ukryte są tokeny, connection stringi lub nazwy zasobów wewnętrznych.
Na końcu trzeba pamiętać, że wygenerowany przez AI kod też może naruszać bezpieczeństwo danych. Przed uruchomieniem sprawdź, czy skrypt nie wypisuje wrażliwych danych do logów, nie eksportuje nadmiarowych kolumn, nie wykonuje zbyt szerokich zapytań i nie utrwala wyników w niekontrolowanych plikach tymczasowych. Ochrona danych przy pracy z AI nie polega więc tylko na „niewklejaniu PESELI”, ale na całym procesie: ograniczeniu wejścia, ograniczeniu dostępu, anonimizacji przykładów i przeglądzie tego, co model wygenerował.
Jak budować bibliotekę gotowych promptów i szablonów kodu dla zespołu analitycznego?
Najlepiej traktować taką bibliotekę jak wewnętrzny zasób operacyjny, a nie zbiór luźnych notatek. Jej celem jest ograniczenie zmienności wyników generowanych przez AI i skrócenie czasu przygotowania powtarzalnych analiz. W praktyce oznacza to standaryzację dwóch rzeczy jednocześnie: sposobu formułowania poleceń dla modelu oraz struktury kodu, który zespół uznaje za poprawny, czytelny i bezpieczny.
Punktem wyjścia powinny być najczęstsze zadania analityczne, na przykład generowanie zapytań SQL do agregacji, przygotowanie walidacji jakości danych, budowa wykresów w Pythonie czy tworzenie funkcji do czyszczenia danych. Dla każdego takiego przypadku warto przygotować gotowy prompt z jasno określonym kontekstem: opisem tabel lub danych wejściowych, wymaganym formatem odpowiedzi, ograniczeniami technicznymi oraz zasadami stylu. Dobry prompt nie może być ogólny. Powinien zawierać konkretne instrukcje typu użyj tylko składni zgodnej z danym silnikiem SQL, nie stosuj SELECT *, dodaj komentarze tylko do kluczowych kroków albo zwróć wynik w postaci jednej funkcji.
Równolegle warto budować szablony kodu, czyli sprawdzone szkielety rozwiązań, które AI ma uzupełniać zamiast tworzyć wszystko od zera. W SQL mogą to być wzorce dla CTE, walidacji duplikatów, testów spójności kluczy czy agregacji okresowych. W Pythonie będą to na przykład szablony funkcji z sekcją wejścia, walidacją parametrów, logowaniem, obsługą błędów i zwracanym wynikiem w ustalonym formacie. Im bardziej taki szablon odzwierciedla standard zespołu, tym mniejsze ryzyko, że model wygeneruje kod formalnie poprawny, ale trudny do utrzymania.
Kluczowe jest też wersjonowanie i opis metadanych. Każdy element biblioteki powinien mieć nazwę, krótki opis zastosowania, przykładowe wejście i wyjście, wskazanie dla jakiego środowiska działa oraz datę ostatniej weryfikacji. To pozwala odróżnić szablon nadal aktualny od takiego, który powstał dla starszej struktury danych albo nie uwzględnia obecnych reguł jakości. Bez tego biblioteka szybko zamienia się w archiwum niepewnych fragmentów.
Żeby taka baza była użyteczna zespołowo, musi być oparta na zasadzie najpierw wzorzec, potem adaptacja. Analityk nie powinien zaczynać od pustego promptu, tylko od wybrania najbliższego gotowego wariantu i uzupełnienia zmiennych: nazwy tabeli, zakresu dat, definicji metryki czy oczekiwanego formatu wyniku. Dzięki temu odpowiedzi modelu są bardziej porównywalne między osobami i łatwiej je recenzować.
Biblioteka wymaga również prostego procesu przeglądu. Jeśli prompt lub szablon doprowadził do błędnego kodu, trzeba poprawić wzorzec, a nie tylko jednorazowy wynik. Jeśli jakiś wariant regularnie daje dobre rezultaty, powinien zostać oznaczony jako rekomendowany. Tylko wtedy baza staje się narzędziem uczenia organizacyjnego, a nie miejscem przechowywania przypadkowych przykładów.
W praktyce dobra biblioteka gotowych promptów i szablonów kodu ma trzy cechy: jest zbudowana wokół realnych zadań zespołu, zawiera jednoznaczne instrukcje techniczne oraz jest stale weryfikowana na podstawie jakości wygenerowanych rezultatów. To właśnie sprawia, że użycie AI w analizie danych przestaje zależeć od indywidualnego wyczucia konkretnej osoby i zaczyna działać w sposób powtarzalny.
Majczęściej zadawane pytania i odpowiedzi odnośnie Claude Code dla analityka danych: jak generowanie SQL i Pythona przez AI przestaje być loterią
Najlepiej zacząć od przygotowania krótkiego, technicznego briefu do każdego zadania. Taki opis powinien zawierać schemat danych, relacje między tabelami, definicje metryk, zakres czasu, filtry oraz oczekiwany format wyniku. Dzięki temu AI nie zgaduje logiki biznesowej, tylko pracuje na jasnych założeniach i częściej zwraca poprawny SQL już w pierwszej wersji.
AI potrzebuje tylko tych informacji, które eliminują niejednoznaczność w schemacie i definicjach. W praktyce najlepiej podać:
- nazwy tabel i ich znaczenie biznesowe,
- klucze główne oraz relacje między tabelami,
- ważne kolumny i ich rolę,
- pułapki typu duplikaty, statusy historyczne, anulacje czy daty w UTC.
Taki opis zwykle wystarcza, by model nie wybrał błędnego źródła danych albo niewłaściwego sposobu łączenia tabel.
Poprawny SQL powinien zachowywać właściwą krotność danych i zgodność z logiką biznesową. Sam fakt, że zapytanie się uruchamia, nie oznacza jeszcze poprawnego wyniku. Trzeba sprawdzić liczność rekordów przed i po joinach, unikalność kluczy biznesowych oraz wpływ filtrów na końcowe agregacje. Dopiero zgodność z kontrolnymi metrykami daje sensowną podstawę do zaufania wynikowi.
Tak, bo krótkie uzasadnienie pozwala szybciej wychwycić błędne założenia modelu. Gdy AI opisze, jaki klucz łączy tabele, gdzie ogranicza wolumen danych i jaki efekt mają filtry, łatwiej ocenić poprawność semantyczną zapytania. To szczególnie przydatne przy relacjach jeden-do-wielu, gdzie składnia może wyglądać dobrze, ale wynik bywa zawyżony lub zaniżony.
Najskuteczniej działa dopisanie do promptu wymagań wykonawczych, a nie tylko celu biznesowego. Warto wskazać rozmiary tabel, indeksy, partycjonowanie, zakres dat i zasady pisania zapytania. Dobrze też poprosić o miejsca ryzyka full table scan oraz później sprawdzić plan przez EXPLAIN. Dzięki temu AI częściej proponuje SQL bliższy realnym ograniczeniom środowiska.
Dobry prompt powinien wymuszać strukturę opartą na małych funkcjach i jawnych kontraktach wejścia oraz wyjścia. Najlepiej poprosić o kod, który:
- dzieli etapy na walidację, czyszczenie, transformację i zapis,
- nie opiera się na ukrytym stanie,
- zawiera czytelne nazwy funkcji i zmiennych,
- sprawdza jakość danych po kluczowych krokach.
Taki kod łatwiej testować, poprawiać i rozwijać po zmianie źródła danych.
Najczęściej dlatego, że model domyślnie dąży do zwięzłości, a nie do czytelnej struktury. Bez precyzyjnych wymagań AI może łączyć wiele operacji w jeden łańcuch, modyfikować dane wejściowe w miejscu albo mieszać walidację z transformacją. Żeby temu zapobiec, trzeba wyraźnie zażądać małych funkcji, prostych testów i oddzielenia logiki biznesowej od technicznej.
Najlepiej używać AI na bazie szablonów i jasno zdefiniowanych reguł akceptacji. Model powinien dostać schemat tabeli, klucze, pola obowiązkowe, relacje oraz dopuszczalne odchylenia. Wtedy może wygenerować sensowne zestawienia kontrolne i testy PASS lub FAIL zamiast przypadkowych kontroli. Kluczowe jest też to, by wynik testu pokazywał liczbę naruszeń albo próbkę błędnych rekordów.