Skip to content

Kaip suprogramuoti ChatGPT plug-in’ą IntelliJ editor’iui

Vėlus vasario vakaras. Laukdami lėktuvo namo, netikėtai užsilaikėme Oslo oro uoste. Šiek tiek atsigaivinome Guinness alumi ir kaip visada pradėjome debatus programavimo temomis. Pokalbis išsirutuliojo į tai, kad ChatGPT yra nuostabus pagalbininkas programuojant, bet įrankiai, deja, vis dar nėra patogūs. Atvirai pasakius, kodo redaktorių nemokami plug-in’ai, bent jau šiai dienai - liūdina.
Mar 3, 2023 10:29:37 AM Martynas Žuravliovas, Senior Java Architect

Iš esmės, darbo seka yra gana rutininė:

  1. programuotojas atrenka kodo gabalą;
  2. įklijuoja jį ChatGPT;
  3. prirašo „generate all unit tests for this code fragment that adhere to given-when-then structure”;
  4. sulaukia atsakymo, įkopijuoja atsakymą į atitinkamą unit testo klasę;
  5. parašo „please refactor this code fragment adhering to clean code practices bla bla bla” ir sulaukęs atsakymo, įkopijuoja atgal.
Labai daug kliksėjimo.
 

Kadangi Guiness’o netrūko, o lėktuvas vis vėlavo ir kai kurių kompiuterių baterijos buvo pakrautos, tai greitai atsirado pirmoji plug-in’o versija.

twoday meme

 

Štai kaip tai veikia:

unnamed

Žinau žinau, jau greitai IntelliJ IDEA turės patikimus ir gerus ChatGPT plug-in’us, na o bet tačiau dirbti reikia jau dabar, todėl dalinuosi patarimais, kaip pačiam suprogramuoti tokį įrankį. Nesijuokite, jei skaitysite šį įrašą tolimoje ateityje ir tokio poreikio Jums nebereikės. Supraskite, 2023 - ųjų vasarį mes tiesiog nenorėjome daug kliksėti! (Tuo labiau nenorėjome kamuotis su primityviais plug-in’ais).

Realizacijos smulkmenos

Pradėkime nuo API:

Užklausai reikės JSON’o, kurio tikisi ChatGPT completion API. Tai paprasčiausias POJO DTO, susidedantis iš atributų: 

  • String prompt (čia reikia sudėti užklausą - reikalingą prierašą ir kodo gabalą);
  • String model (šiai dienai rekomenduoju “text-davinci-003”, kol neturime geriau);
  • int maxTokens (API limitas 4096 tokenų: code + prompt);
  • float temperature (renkamės tarp 0 ir 1. 0 - primityvūs ir expected rezultatai, 1 - daug interpretacijų ir nestandartinių approach'ų).

HttpRequest’o “Content-Type”as turi būti application/json, “Authorization”as turi būti “Bearer ” su tavo API raktu. Ir viskas!

Post’iname šią užklausą į completion API, ir gauname atsakymą JSON’ą, kurį verčiame į POJO DTO su atributais id, object, created, model (visus juos galima ignoruoti) ir, kas mums aktualu, sąrašu atsakymų alternatyvomis (t.y. Choice POJO DTO). Viskas! 

Imame pirmąją alternatyvą (t.y. gptResponse.getChoices().get(0).getText()) ir klijuojame ten, kur reikia. Visa kita yra tiesiog IntelliJ plug-in’ų implementacijos detalės.

Keli patarimai:

  • Plug-in’ui kurti, pasinaudok Intellij New project wizzard’u - iškart gausi visą reikiamą struktūrą.

    unnamed (1)
  • Šio plug-in’o reikalingi veiksmai paveldi klasę com.intellij.openapi.actionSystem.AnAction
  • Vartotojo pasirinktas kodas gaunamas iš AnActionEvent’o:

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
        Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        Project project = e.getRequiredData(CommonDataKeys.PROJECT);
        Document document = editor.getDocument();
        Caret primaryCaret = editor.getCaretModel().getPrimaryCaret();

        String newCode = fetchAdviceFromGPT(primaryCaret.getSelectedText());
        insertCode(project, document, primaryCaret, newCode);

    }

    @Override
    public void update(AnActionEvent e) {
        Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        CaretModel cm = editor.getCaretModel();
        e.getPresentation().setEnabledAndVisible(cm.getCurrentCaret().hasSelection());
}

  • Nereikėtų įsiūti užklausų ChatGPT - geriau padaryti jas konfigūruojamomis. Asmeniškai mėgstu, kad unit testai laikytųsi formato given-when-then, bet nesmerkiu ir kitokių nuomonių. Užklausa (kaip būtent prašome ChatGPT pagalbos) turi būti individualizuojama.
  • Taip, ne visuomet pirmoji dirbtinio intelekto pasiūlyta alternatyva yra geriausia. Rekomenduoju gudresnį UI, kuris vartotojui rodytų ir leistų pasirinkti, kurią iš alternatyvų naudoti.
  • Taip, galima naudoti non-blocking HTTP API, kad galėtum nutraukti užklausą, jei atsibos laukti.
  • Ne, aš nerašysiu plug-in’ų Eclipse’i, tegul tai daro Mantas :P

Jei nori kodo - duok žinoti. Kol kas ten nieko ypatingo ir vis dar likę TODO. 

P.S. šiam įrašui ir šiame įraše minėtam kodui nebuvo panaudota ChatGPT pagalba.

Related posts