Zyski:
- Możliwość mapowania trybu czatu w celu skorygowania typu zadania z wbudowanym uzupełnianiem
- Możliwość pisania potężnych podpowiedzi produkcyjnych, które obejmują kontrakty wejścia/wyjścia, przypadki brzegowe i ograniczenia stylu
- Możliwość sprawdzenia wygenerowanego kodu i wszelkich nowych proponowanych zależności przed połączeniem
Pierwszym punktem kontaktu programisty z sztuczną inteligencją jest często autouzupełnianie — funkcja, która sugeruje następny wiersz w trakcie pisania — lub powiedzenie „wpisz tę funkcję” w oknie czatu. Oba korzystają z tego samego silnika, ale wymagają różnych dyscyplin. W tej jednostce przekształcamy generowanie kodu z losowego „zapisywania” w etap inżynieryjny, którego wyniki są przewidywalne i weryfikowalne.
Celem jest przekształcenie sztucznej inteligencji z narzędzia przyspieszającego maszynę do pisania w ucznia pracującego w ramach ustalonych przez Ciebie ograniczeń. Dobrze prowadzony praktykant oszczędza czas; Uczeń bez przewodnika tworzy bałagan, który trzeba później posprzątać.
Dwa tryby użytkowania: uzupełnianie inline i czat
Uzupełnianie inline wchodzi w grę podczas pisania w edytorze; Wpisujesz sygnaturę funkcji lub linię komentarza, a ona sugeruje resztę. Jest świetny pod względem szybkości, ale ma wąski kontekst: widzi tylko kod w bezpośrednim obszarze. Dlatego najlepiej działa, gdy jasno napiszesz swoją intencję w komentarzu. Na przykład // sprawdź poprawność adresu e-mail użytkownika, wyrzuć błąd ValidationError, jeśli nieprawidłowy komentarz znacznie poprawia poniższą sugestię.
Tryb czatu przeznaczony jest do większych i uporządkowanych zadań: „Dodaj paginację do tej klasy”, „Wyodrębnij interfejs tej usługi”. Tutaj masz luksus nadania roli, kontekstu i formatu. Ogólna zasada brzmi: dokończenie małych i płynnych zadań, rozmowa w przypadku zadań wymagających myślenia i uporządkowania.
Wskazówka: nie akceptuj na ślepo sugestii ukończenia za pomocą „Tab”. Przeczytaj przez sekundę sugerowany wiersz; Najczęściej wycieka stąd niepoprawna nazwa zmiennej lub odwrócony warunek.
Kroki, aby przełożyć intencję na kod
- Zdefiniuj umowę. Jakie jest zachowanie funkcji na wejściu, wyjściu i przy błędach? Na przykład „Odbierz e-mail, normalizuj, jeśli jest prawidłowy, zgłoś błąd, jeśli jest nieprawidłowy”.
- Podaj ograniczenia. Nie używać zależności zewnętrznych? Konkretny przewodnik po stylu? Czy istnieje limit wydajności?
- Podaj przykład. Para wejście-wyjście („ali@x.com → ważny, ali@ → błąd”) przesuwa sposób rozumienia intencji modelu z przewidywania na precyzję.
- Poproś o małe kawałki. Jedna funkcja, jedna odpowiedzialność. Następnie przejdź do następnego.
- Przeczytaj i uruchom wygenerowany kod. Kompilacja + szybka ręczna próba to najtańszy krok zapewniający pewność.
Trzy mini etui
Przypadek 1 — Produkcja oparta na komentarzach zwiększa dokładność. Programista najpierw zażądał funkcji analizowania daty z pustą treścią i uzyskał poprawny wynik w 3 rundach. Przy drugiej próbie, gdy zdefiniowałem funkcję za pomocą 4-liniowego komentarza (zaakceptowane formaty, reguła strefy czasowej, warunek błędu) i zażądałem tego, pojawił się kod, który działał w pierwszej rundzie. Ten sam model, ten sam dzień; różnica polegała jedynie na jasności intencji.
Przypadek 2 — Nieokreślenie wersji jest kosztowne. Jeden zespół miał problemy ze starszym interfejsem API opartym na wywołaniach zwrotnych, zastępującym fs.promises w kodzie tworzonym dla Node.js. Po dodaniu wiersza „Użyj węzła 20, ESM, async/await” do zachęty produkcja po raz pierwszy podążała za projektem; Wyzerowano średnią z 12 minut spędzonych na korekcie.
Przypadek 3 – Rzeczywisty zysk w kodzie standardowym. Mikrousługa wymagała 6 nowych DTO (Data Transfer Object — prostej klasy danych przenoszącej dane pomiędzy warstwami) i zasad ich walidacji. To, co dawniej stanowiło około 90 minut pracy ręcznej, zostało skrócone do 35 minut po wyprodukowaniu i sprawdzeniu przez sztuczną inteligencję; Ponieważ powtarzalność kodu jest duża, a wzór jasny, sztuczna inteligencja zadziałała tutaj w najbardziej efektywnym obszarze.
Cztery szablony do kopiowania
Generowanie funkcji na podstawie kontraktu:
Rola: Jesteś sumiennym programistą w języku {{language}}. Kontrakt funkcyjny:- Nazwa: {{name}}- Dane wejściowe: {{typy i ich znaczenie}}- Dane wyjściowe: {{typ i znaczenie}}- Status błędu: {{co jest wyrzucane/zwracane, gdy}}Ograniczenia: {{brak zewnętrznych zależności / stylu / wydajności}}Przykłady:- {{input_1}} -> {{output_1}}- {{entry_2}} -> {{error_2}}Najpierw podaj podpis + krótki plan, a potem kod. Pisanie testów, po prostu działanie.
Aby dopasować istniejący styl (dostosować do bazy kodu):
Poniżej znajduje się przykładowa funkcja z naszego projektu; Dowiedz się tutaj o nazewnictwie, obsłudze błędów i stylu komentowania. Napisz funkcję dla {{new_task}} w tym samym stylu. Przykład: {{current_code}}
Od szkieletu do wypełnienia (odgałęzienie → implementacja):
Wypełnij poniższy szkielet funkcji zgodnie z zadaniami TODO w komentarzach. ZMIEŃ podpis i typ zwrotu. Nie twórz funkcji pomocniczej, która nie istnieje; w razie potrzeby daj znać "ten pomocnik jest potrzebny". {{skelet_kod}}
Alternatywne porównanie aplikacji:
Podaj 2 różne implementacje dla {{task}}: (a) nadanie priorytetu czytelności, (b) nadanie priorytetu wydajności. Pod każdym z nich zapisz po 1 zdaniu „kiedy jest to preferowane”.
Słaba zachęta/silna zachęta
Słabe: „Napisz mi funkcję weryfikacji adresu e-mail”.
Mocne: „TypeScript 5, tylko biblioteka standardowa. Zapisz isValidEmail(input: string): wartość logiczna. Przytnij spacje, nie uwzględniaj wielkości liter, a@b.co jest prawidłowe, a@, @b.co, pusty ciąg znaków jest nieprawidłowy. Jeśli zamierzasz używać wyrażeń regularnych, nie bądź zbyt skomplikowany; dodaj 2 linie komentarzy.
Potężna wersja; Zwraca język, wersję, podpis, przypadki Edge i ograniczenie stylu. W ten sposób wygenerowany kod zarówno działa, jak i pasuje do Twojego projektu.
Podejście
Kiedy używać
Uwaga
Uzupełnianie inline
Małe wstawki w przepływie
Nie przyjmuj sugestii bez jej przeczytania
Produkcja kontraktowa na czacie
Nowa funkcja/klasa
Podaj przykład i przypadek brzegowy
Produkcja według próbki stylu
Dodanie do istniejącego kodu
Wybierz bieżący przykładowy kod
farsz szkieletowy
Podpis poprawiony, treść pusta
Zmiana podpisu
Powielanie kodu i pułapka zależności
Sztuczna inteligencja często zaleca nową bibliotekę, aby ułatwić jej pracę. Czasami jest to trafne, czasami dodaje niepotrzebną zależność do projektu lub sugeruje pakiet, który nie istnieje (halucynacja). Reguła: potwierdzasz każdą nową zależność. Nie dodawaj go do projektu bez sprawdzenia, czy pakiet faktycznie istnieje, jest utrzymywany i posiada odpowiednią licencję. W większości przypadków pomocnik już obecny w projekcie jest lepszy niż nowy pakiet.
Uwaga: przejrzyj linie importu sugerowane przez sztuczną inteligencję. Nieistniejąca nazwa pakietu (która może również przypominać fałszywe pakiety zwane „literówką”) zarówno psuje kompilację, jak i stwarza zagrożenie bezpieczeństwa.
Typowe błędy
- Posiadający podpis określony przez model. Jeśli nie naprawisz typów wejść/wyjść, każda produkcja będzie miała inny podpis, a integracja stanie się trudna.
- Nie mówiąc już o przypadkach Edge. Puste dane wejściowe, null, liczba ujemna, bardzo duża wartość — jeśli ich nie określisz, model zapisze „szczęśliwą ścieżkę”, pomijając krawędzie.
- Łączenie sugestii bez jej testowania. Kod, który wydaje się działać, nie oznacza, że działa.
- Akceptacja niepotrzebnej zależności. Dodanie całej biblioteki do jednej linijki tworzy dług techniczny.
- Niespójność stylu. Inne nazewnictwo i obsługa błędów niż w pozostałej części projektu powodują, że baza kodu jest niejednolita.
Podsumowując
Generowanie kodu ma ogromną moc, jeśli przełożysz intencje na jasną umowę. Używaj uzupełniania wbudowanego w przypadku małych zadań typu in-stream oraz zadań ustalających strukturę konwersacji. Określasz typy wejścia/wyjścia, przypadki brzegowe, wersję i styl; Podaj przykład modelu; weryfikuj każdą nową zależność; i biegaj i czytaj każdy wyprodukowany kawałek. Sztuczna inteligencja najlepiej się opłaca w przypadku schematycznego, powtarzalnego kodu — uruchamiaj go od razu, w ramach ustawionych limitów.
Zadanie aplikacji
Wybierz małą funkcję ze swojego projektu, którą chcesz napisać. Najpierw wydrukuj go do AI za pomocą szablonu „generowania funkcji w oparciu o kontrakt”, podając typy danych wejściowych/wyjściowych, dwa przypadki brzegowe i ograniczenie stylu. Skompiluj wygenerowany kod i wypróbuj go z dwoma różnymi danymi wejściowymi. Następnie ponownie zadaj tę samą funkcję, tym razem „napisz mi to” bez żadnego kontekstu i porównaj dwa wyniki linia po linii: które przypadki brzegowe zostały pominięte, ile poprawek było wymaganych?
lista kontrolna
- [ ] Wiem, gdzie używać trybu czatu z uzupełnianiem wbudowanym.
- [ ] Określam kontrakt wejścia/wyjścia i przypadki brzegowe w generowaniu funkcji.
- [ ] Przyzwyczaiłem się do dodawania informacji o języku i wersji do podpowiedzi.
- [ ] Kompiluję i testuję każdy wyprodukowany element przed jego złożeniem.
- [ ] Potwierdzam każdą nową zależność zaproponowaną przez AI, weryfikując jej istnienie i konieczność.
- [ ] Sprawdzam, czy wygenerowany kod jest zgodny ze stylem projektu.