Jedinica 5 / 12

Otklanjanje pogrešaka i rješavanje problema

Dobici:

  • Sposobnost učinkovitog opisivanja greške umjetnoj inteligenciji s porukom o pogrešci, praćenjem niza i najmanjom instancom reprodukcije
  • Sposobnost pokretanja sustavnog tijeka otklanjanja pogrešaka s umjetnom inteligencijom kako bi se pronašao glavni uzrok hipotezom i sužavanjem korak po korak
  • Sposobnost provjere da je popravak koji je AI predložio stvarno riješio problem reprodukcijom i regresijskim testiranjem

Otklanjanje pogrešaka zadatak je otkrivanja zašto se program ponaša drugačije od očekivanog i popravljanja toga, a većini inženjera oduzima puno vremena. Dobro otklanjanje pogrešaka ne temelji se na igri pogađanja, već na sustavnom sužavanju: razjasnite simptom, postavite hipotezu, testirajte hipotezu, dođite do temeljnog uzroka. AI je vrlo moćan partner u ovom ciklusu; Ali samo ako mu date točne podatke. Reći "kôd ne radi, popravi ga" prisiljava AI da pogađa i daje opće prijedloge. Dajte mu potpunu poruku o pogrešci, praćenje hrpe i najmanji reprodukcijski uzorak, i zajedno ćete pronaći glavni uzrok.

U ovoj jedinici vidjet ćemo kako učinkovito opisati grešku AI-ju, suziti hipoteze korak po korak i potvrditi regresijskim testiranjem da predloženi popravak stvarno rješava problem. Upamtite: "popravljanje" buga i "suzbijanje simptoma buga" dvije su različite stvari; Ispravak učinjen bez pronalaženja temeljnog uzroka premješta pogrešku na drugo mjesto.

Koncepti: Stack trace: Dump koji pokazuje koje su funkcije pozivane kojim redoslijedom u trenutku pogreške. Minimalni repro: Najjednostavniji, najkraći kod/unos koji pokreće pogrešku. Glavni uzrok: pravi izvor problema, a ne simptom. Regresijsko testiranje: Testiranje koje osigurava da se ista pogreška ne ponavlja.

Opisivanje greške AI-ju

Vjerojatnost da umjetna inteligencija pronađe glavni uzrok izravno je proporcionalna kvaliteti informacija koje pružate. Dobar opis pogreške uključuje: što ste pokušali učiniti, što ste očekivali, što se dogodilo, točan tekst pogreške i praćenje hrpe, uključeni kod, okruženje (jezik/verzija/OS) i najmanji uzorak koji je proizveo pogrešku.

  1. Pojasnite simptom. U formatu "Očekivani X, ostvareni Y".
  2. Zalijepite cijeli tekst pogreške i praćenje hrpe. Nemojte ga skraćivati, cenzurirati, ali nemojte razbijati strukturu.
  3. Dajte najmanju reprodukciju. Minimalni unos i kôd koji pokreće pogrešku.
  4. Navedite okruženje. Jezična verzija, verzija knjižnice, runtime okruženje.

Prompt za učinkovit opis pogreške: "Ispravljam pogrešku s greškom. Informacije: - Što pokušavam učiniti: [X] - Očekivano ponašanje: [Y] - Stvarno ponašanje: [Z] - Potpuna poruka o pogrešci i praćenje hrpe: [zalijepi] - Okruženje: [jezik/verzija, biblioteka/verzija] - Minimalni uključeni kod: [kod] Nemojte mi dati izravni popravak. Prvo navedite 3 najvjerojatnija temeljna uzroka redoslijedom vjerojatnost i reci mi koju provjeru da provjerim za svaku."

Sužavanje toka pomoću hipoteze

Sustavno otklanjanje pogrešaka je umijeće eliminiranja mogućnosti jedne po jedne. Koristite AI za generiranje hipoteza i dizajnirajte eksperiment za testiranje svake hipoteze; Zatim pokrenite eksperiment i vratite rezultat. Ovaj je ciklus puno brži od navike nasumičnih promjena i zaustavljanja, zvane "shotgun debugging".

Uputa pomoćnika za binarno pretraživanje (polavljanje): "Ova pogreška nije bila tu jučer, postoji danas. Želim saznati koja je od zadnjih 20 promjena donijela pogrešku s bisektom. Dajte mi plan korak po korak: koju točku trebam testirati, na koju polovicu trebam ići ovisno o rezultatu. Također mi recite točno što da provjerim u svakom koraku."

Prompt strategije umetanja dnevnika: "Ne mogu pronaći pogrešku jer ne mogu vidjeti međuvrijednosti u ovoj funkciji. Recite mi u kojim točkama trebam dodati retke dnevnika koji ispisuju koje varijable. Dodajte objašnjenje 'što ću naučiti iz ovog dnevnika' za svaki zapisnik. Također odredite upozorenja koja će me spriječiti da bilježim povjerljive podatke."

Savjet: ako ne možete riješiti pogrešku, većinu vremena problem je negdje gdje ste pogrešno pretpostavili. Pitajte AI "koja bi moja pretpostavka mogla biti pogrešna?" Pitanje će vam razbiti sljepoću. Najteže pogreške kriju se na mjestu gdje kažete "Siguran sam da ovo radi kako treba".

Slab upit / Jak upit

SLABO:"Moj kod daje pogrešku, popravite je: [200 redaka koda]" (Rezultat: AI ne zna koja je pogreška, što se očekuje; daje općenite prijedloge temeljene na nagađanjima, većina njih je beskorisna.)JAKO: "Dobivam NullPointerException. Očekivano: popis korisnika trebao bi biti vraćen. Stvarno: Eksplodira na poziv getUsers(). Stack trace: [paste].Okruženje: Java 17. Minimalno ponavljanje: Događa se kada je popis korisnika prazan, ali ne i kada je pun Povezanih 15 redaka: [kod]. Objasnite glavni uzrok i zašto se pokreće prazni popis, a zatim predložite popravak.

Moćni prompt stavlja pogrešku u kontekst: u kojem se slučaju događa (prazan popis), u kojem se slučaju ne događa (puni popis). Ovaj jedini trag ("događa se kada je prazno") gotovo izravno ukazuje na glavni uzrok. Budući da ove informacije nisu dostupne u slabom upitu, AI nagađa na slijepo.

Provjera popravka

Popravak je pravi popravak samo ako čini tri stvari:

kontrola

Pitanje

Kako provjeriti

Je li greška nestala?

Radi li isti unos sada?

Ponovno pokrenite minimalnu reprodukciju

Nema novih grešaka?

Je li još nešto pokvareno?

Pokrenite cijeli paket testova

Zar se neće ponoviti?

Hoće li se ista pogreška ponoviti?

Dodajte regresijski test za ovaj scenarij

Ispravci učinjeni bez pronalaženja temeljnog uzroka često potiskuju simptom. Na primjer, prešućivanje nulte pogreške s "skip if null" čini pravi razlog, "zašto podaci dolaze null?" nevidljiv, a pogreška se ponavlja negdje drugdje.

Mini kućišta

Slučaj 1 — Zamka za suzbijanje simptoma. Tim utišava povremenu nultu pogrešku pokušajem hvatanja; Greška nestaje, ali nakon 2 tjedna podaci nedostaju. Pravi razlog je taj što usluga vraća null nakon isteka vremena. Kada pitate umjetnu inteligenciju "zašto postaje nulta?", pojavljuje se glavni uzrok; Pravi popravak traje 1 sat, ali je trajan.

Slučaj 2 — Minimalna reprodukcijska snaga. Programer ne može popraviti bug koji kaže "sruši se s vremena na vrijeme." Smanjuje pogrešku na najmanji unos uz prijedlog AI-ja: problem se javlja samo s nazivima datoteka koji sadrže turske znakove (pogreška kodiranja). Kada se 300 redaka neizvjesnosti svede na 5 redaka konačne reprodukcije, rješenje postaje očito.

Slučaj 3 — Antiregresijski test. AI ispravlja pogrešku u izračunavanju datuma. Inženjer nije s tim zadovoljan; dodaje regresijski test za pogrešan scenarij (kraj mjeseca, 31. siječnja + 1 mjesec). Kada druga promjena dotakne isto područje 4 mjeseca kasnije, test postaje crven i greška je uhvaćena prije nego što stigne u proizvodnju.

Uobičajene greške

  • To znači "ne radi, popravi to". Bez teksta pogreške, očekivanja i ponavljanja, AI pogađa.
  • Ne daje praćenje hrpe. Stack trace često izravno ukazuje na glavni uzrok.
  • Nastavite s nasumičnim promjenama. Eksperimenti bez postavljanja hipoteze gube vrijeme.
  • Potiskivanje simptoma i propuštanje temeljnog uzroka. Pogreška se ponovno rađa negdje drugdje.
  • Ne osigurava se ispravak regresijskim testiranjem. Ista se pogreška tiho vraća u budućnosti.

Ukratko

Učinkovito uklanjanje pogrešaka je sustavno sužavanje, a ne nagađanje. Davanje AI-u punog teksta pogreške, traga snopa, minimalne reprodukcije i informacija o okolišu eksponencijalno povećava šanse za pronalaženje temeljnog uzroka. Koristite AI za generiranje hipoteza i dizajnirajte eksperiment za testiranje svake hipoteze; Pokrenite eksperiment. Smatrajte da je popravak "gotov" tek kada vidite da je bug nestao, da nema novih bugova i da je zaštićen regresijskim testiranjem.

Zadatak aplikacije

Razmotrite stvarnu ili umjetnu pogrešku. Najprije grešku svesti na najmanju reprodukciju (u kojem se unosu pojavljuje, u kojemu ne). Koristeći upit o učinkovitom bug receptu, zatražite od umjetne inteligencije 3 hipoteze o uzroku i korak provjere za svaku. Pronađite glavni uzrok testiranjem hipoteza jednu po jednu, popravite to, zatim napišite i pokrenite regresijski test za ovaj scenarij kako biste pokazali da je greška nestala i da test pruža zaštitu.

popis za provjeru

  • [ ] Simptom sam pojasnio kao "očekivano u odnosu na ostvareno".
  • [ ] AI-ju sam dao cijeli tekst pogreške i praćenje hrpe.
  • [ ] Grešku sam sveo na najmanju reprodukciju.
  • [ ] Testirajući hipoteze jednu po jednu, pronašao sam glavni uzrok.
  • [ ] Umjesto da potisnem simptom, popravio sam glavni uzrok.
  • [ ] Dodao sam i pokrenuo regresijski test za istu grešku.