AI · programowanie

AI jako pomoc w programowaniu — wykrywanie błędów w wygenerowanym kodzie

AI w programowaniu na 45 minut: trzy wymyślone fragmenty kodu z ukrytymi błędami (średnia, maksimum, liczba pierwsza), testy brzegowe i poprawki. Ćwiczenie w Pythonie, trzy zadania.

45 minutPoziom podstawowyPliki i rozwiązania

Materiał redakcyjny TablicaPro · liceum i technikum

uruchom("srednia", kod)  # lista niezaliczonych testow
Błędy wykryte testami.
Poprawione funkcje przechodzą wszystkie testy.

Asystent AI potrafi napisać działającą funkcję w kilka sekund — ale równie szybko potrafi napisać funkcję, która wygląda dobrze i jest błędna. Błędy bywają subtelne: dzielenie przez złą liczbę, zła wartość początkowa, pętla o jeden obrót za krótka. Jedyną skuteczną obroną są testy, w szczególności testy wartości brzegowych. Na lekcji uczniowie uruchamiają zestaw testów na trzech wymyślonych fragmentach „wygenerowanego” kodu, znajdują błędy i je poprawiają.

Scenariusz jest przeznaczony na 45 minut dla klasy znającej funkcje, listy i instrukcje if w Pythonie — na przykład po lekcji o testowaniu funkcji. Fragmenty kodu są wymyślone i nie pochodzą z konkretnego asystenta; ich błędy dobrano tak, by pokazać typowe pomyłki (nie wszystkie błędy AI wyglądają w ten sposób). Program uruchamia kod z tekstu poleceniem exec — rozwiązanie na lekcji, ale nie wolno w ten sposób uruchamiać nieznanego kodu pochodzącego z internetu lub od asystenta bez przeczytania go.

Przygotowanie stanowisk

Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.

Cele i plan lekcji

Po zajęciach uczeń potrafi:

  • przeczytać kod wygenerowany przez asystenta krytycznie, zamiast zakładać, że działa;
  • napisać testy, w tym wartości brzegowe (pusta lista, liczby ujemne, 1, kwadrat liczby pierwszej);
  • zlokalizować błąd na podstawie nieprzechodzącego testu i go poprawić;
  • sformułować zasady bezpiecznego korzystania z AI przy programowaniu.
CzasPraca na lekcji
0–5 minProblem: kod, który wygląda dobrze
5–15 minTypowe błędy i testy brzegowe
15–22 minUruchamianie testów
22–37 minTrzy zadania
37–42 minZasady korzystania z AI przy kodzie
42–45 minPytania kontrolne

Trzy fragmenty z błędami

FunkcjaBłądJak go wykryć
sredniadzieli przez len(lista) + 1test [2, 4, 6] → 4,0 (otrzymano 3,0)
maksimumwartość początkowa 0test na liczbach ujemnych: [-5, -2, -9] → −2 (otrzymano 0)
czy_pierwszarange(2, int(n ** 0.5)) pomija ostatni dzielnik; brak obsługi n < 2testy 9, 25 i 1

Testy brzegowe

Najwięcej błędów kryje się na granicach: pusta lista, jeden element, liczby ujemne, zero, najmniejsza dopuszczalna wartość (1), kwadraty liczb pierwszych (9, 25, 49). Dobry zestaw testów zawiera przypadek typowy i kilka brzegowych.

Procedura pracy z kodem od AI

  1. Przeczytaj kod — zrozum, co robi każda linia.
  2. Przetestuj na własnych danych, nie tylko na przykładzie z odpowiedzi.
  3. Napraw na podstawie nieprzechodzącego testu; popraw przyczynę, nie objaw.
  4. Nie uruchamiaj nieznanego kodu na ważnych danych i nie wklejaj do asystenta haseł ani danych osobowych.
  5. Sprawdź licencje i zasady szkoły dotyczące korzystania z AI.

Program

Funkcja uruchom wykonuje kod z tekstu (exec), pobiera funkcję o podanej nazwie i porównuje wyniki z oczekiwanymi. Zwraca listę niezaliczonych testów.

Zadania

Zadanie 1. Testy. Uruchom testy na trzech wygenerowanych fragmentach kodu i opisz, które testy nie przeszły oraz dlaczego.

Zadanie 2. Poprawki. Sprawdź poprawione wersje funkcji tym samym zestawem testów.

Zadanie 3. Nowy test. Sprawdź błędną funkcję czy_pierwsza dla liczby 49 i wyjaśnij wynik.

Dla chętnych: napisz test, który wykryłby, że srednia nie obsługuje pustej listy, i zdecyduj, co powinna zwracać.

Rozwiązanie i wyniki

# UWAGA: kod ponizej to WYMYSLONE "odpowiedzi asystenta" z celowo ukrytymi bledami - cwiczenie wykrywania usterek.
WYGENEROWANE = {
    "srednia": """def srednia(lista):
    return sum(lista) / (len(lista) + 1)
""",
    "maksimum": """def maksimum(lista):
    wynik = 0
    for x in lista:
        if x > wynik:
            wynik = x
    return wynik
""",
    "czy_pierwsza": """def czy_pierwsza(n):
    for d in range(2, int(n ** 0.5)):
        if n % d == 0:
            return False
    return True
""",
}
POPRAWIONE = {
    "srednia": """def srednia(lista):
    return sum(lista) / len(lista)
""",
    "maksimum": """def maksimum(lista):
    wynik = lista[0]
    for x in lista:
        if x > wynik:
            wynik = x
    return wynik
""",
    "czy_pierwsza": """def czy_pierwsza(n):
    if n < 2:
        return False
    for d in range(2, int(n ** 0.5) + 1):
        if n % d == 0:
            return False
    return True
""",
}
TESTY = {
    "srednia": [([2, 4, 6], 4.0), ([5], 5.0)],
    "maksimum": [([3, 9, 2], 9), ([-5, -2, -9], -2)],
    "czy_pierwsza": [(2, True), (9, False), (25, False), (1, False), (13, True)],
}


def uruchom(nazwa, kod):
    przestrzen = {}
    exec(kod, przestrzen)
    funkcja = przestrzen[nazwa]
    niezaliczone = []
    for argument, oczekiwane in TESTY[nazwa]:
        wynik = funkcja(argument)
        if wynik != oczekiwane:
            niezaliczone.append((argument, oczekiwane, wynik))
    return niezaliczone


# Zadanie 1: testy wygenerowanego kodu
for nazwa, kod in WYGENEROWANE.items():
    bledy = uruchom(nazwa, kod)
    print(nazwa, "-", "wszystkie testy OK" if not bledy else str(len(bledy)) + " z " + str(len(TESTY[nazwa])) + " testow nie przeszlo")
    for argument, oczekiwane, wynik in bledy:
        print("    dane", argument, "oczekiwano", oczekiwane, "otrzymano", wynik)

# Zadanie 2: poprawione wersje
for nazwa, kod in POPRAWIONE.items():
    print(nazwa, "po poprawce:", "OK" if not uruchom(nazwa, kod) else "nadal bledy")

# Zadanie 3: dlaczego testy sa wazne - wlasny test dodatkowy
przestrzen = {}
exec(WYGENEROWANE["czy_pierwsza"], przestrzen)
print("czy_pierwsza(49) w kodzie z bledem:", przestrzen["czy_pierwsza"](49))

Program wypisze:

srednia - 2 z 2 testow nie przeszlo
    dane [2, 4, 6] oczekiwano 4.0 otrzymano 3.0
    dane [5] oczekiwano 5.0 otrzymano 2.5
maksimum - 1 z 2 testow nie przeszlo
    dane [-5, -2, -9] oczekiwano -2 otrzymano 0
czy_pierwsza - 3 z 5 testow nie przeszlo
    dane 9 oczekiwano False otrzymano True
    dane 25 oczekiwano False otrzymano True
    dane 1 oczekiwano False otrzymano True
srednia po poprawce: OK
maksimum po poprawce: OK
czy_pierwsza po poprawce: OK
czy_pierwsza(49) w kodzie z bledem: True

Funkcja srednia dzieli przez 4 zamiast 3, więc pierwszy test zwraca 3,0 zamiast 4,0 (drugi: 2,5 zamiast 5,0). maksimum zwraca 0 dla liczb ujemnych. czy_pierwsza uznaje za pierwsze liczby 9, 25 i 1, a także 49, bo pętla nie sprawdza dzielnika równego pierwiastkowi: dla 9 przechodzi tylko po d = 2. Plik rozszerzenie.py pokazuje różnicę zakresów range(2, 3) i range(2, 4) dla liczby 9.

Plik rozszerzenie.py (zadanie dla chętnych) wypisze:

3 [2] [2, 3]

Typowe błędy

ObjawCo sprawdzić
„Kod działa, bo przykład z odpowiedzi działał”Przykład podany przez asystenta często omija przypadki brzegowe.
Testowanie tylko jednej wartościDodaj testy brzegowe i typowe.
Poprawianie testu zamiast koduTest opisuje oczekiwane zachowanie; zmieniaj kod.
Kopiowanie kodu bez czytaniaPrzeczytaj i zrozum każdą linię.
Uruchamianie obcego kodu z exec na ważnych danychKod z nieznanego źródła mógłby zrobić szkody — czytaj przed uruchomieniem.
Przypisanie błędu „AI” zamiast sprawdzeniaOdpowiedzialność za działający kod ma autor programu.

Pytania kontrolne i punktacja

  1. Dlaczego warto testować wartości brzegowe?
  2. Dlaczego nie wystarczy sprawdzić przykładu z odpowiedzi asystenta?
  3. Co zrobisz, gdy test nie przejdzie?

Odpowiedzi: Bo błędy najczęściej pojawiają się na granicach zakresów (puste dane, zero, wartości ujemne, najmniejsze i największe wartości). Bo przykład zwykle obejmuje tylko przypadek typowy, a nie sprawdza zachowania na brzegach. Znajdę przyczynę w kodzie, poprawię ją i uruchomię ponownie wszystkie testy.

Proponowana punktacja (razem 10 punktów): zadanie 1 — trzy analizy błędów 3 pkt; zadanie 2 — poprawione funkcje 2 pkt; zadanie 3 — wyjaśnienie 49 2 pkt; zasady pracy z kodem od AI 3 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.

Materiały do pobrania

Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.

Co dalej?

Następny krok to pisanie własnych testów, debugowanie i dokumentowanie kodu. Ten materiał rozwija dział o odpowiedzialnym korzystaniu z AI w kursie AI w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.

Źródła techniczne: testowanie oprogramowania w Wikipedii oraz dokumentacja Pythona o exec. Zobacz też lekcję o halucynacjach AI.

Poprowadź kolejne lekcje AI

Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.

Kup dostęp do kursu AI →

Zobacz program kursu