Introducere
Progresele în procesarea limbajului natural (NLP) au fost semnificativ amplificate de dezvoltarea modelelor de limbaj bazate pe transformatori (LLMs). Aceste modele au revoluționat sarcinile NLP, în special în generarea de cod. În ciuda avansurilor lor, provocări rămân în echilibrarea generării de fragmente de cod cu generarea și executarea eficientă a cazurilor de test.
Structura inițială a procesului de generare de cod presupune primirea unui prompt care urmează să fie analizat, înțeles și abstractizat de model, care în primul rând generează pseudocodul care satisface punctele identificate în prompt și în final transformă pseudocodul în cod. Dar acest sistem generează deseori cod care nu funcționează.
S-au născut diferite abordări pentru optimizarea generării de cod, cele care merită menționate fiind:
- Self-Edit: această abordare presupune primirea de teste ca și prompt și testează codul generat cu acestea. O problemă cu această abordare este că utilizatorul trebuie să scrie testele care vor fi folosite de model pentru generarea codului;
- CodeCoT: pentru optimizarea abordării anterioare, CodeCoT presupune atât generarea codului cât și generarea testelor cu care urmează să fie testat codul. Dezavantajul acestei abordări este “trade-off”-ul ce are loc între generarea de cod și generarea de teste, acestea fiind realizate într-o singură conversație de același agent.
Colaborarea multi-agent
Un sistem de tip multi-agent (MAS) este un cadru (“framework”) unde agenți (scripturi program, boți software sau roboți) multipli și autonomi interacționează, fiind capabili să comunice, coopereze, concureze sau să negocieze unul cu celălalt, într-un mediu comun (“shared environment”). Aceștia pot lucra independent sau împreună pentru a pentru a atinge obiective complexe sau rezolva probleme, astfel că integrarea LLMs în cadrul acestor sisteme ce utilizează colaborarea multi-agent reprezintă baseline-ul de la care AgentCoder pleacă, așa cum este precizat și în introducere.
Metodologie
Procesul începe prin inserarea unor cerințe pentru generarea codului, realizata de primul agent. Pe urma, se folosește al doilea agent, care are ca scop generarea de teste și de a verifica corectitudinea codului generat. Al treilea agent colectează codul și testele generate, și le rulează într-un environment local, pentru a obține un feedback. Dacă codul trece toate testele, atunci agentul îl returnează pentru a fi utilizat de către utilizator. Altfel, codul de eroare este retrimis agentului de generare al codului. Aceasta operatie este repetată până codul generat trece toate testele.
Agentul programator (“programmer”)
În framework-ul utilizat, agentul programator este alimentat de către LLMs. Acesta trebuie să ia în considerare doua scenarii: generarea codului și rafinarea codului. Pentru partea de generare, agentul programator întrebuințează un proces de tip CoT (Chain-of-Thought) pentru a putea imita procesul tipic ce are loc în programare și anume, de a sparge metodic în bucăți mai mici și mai ușor de gestionat sarcinile. Cei patru pași cu care este instruit procesul CoT sunt:- clarificarea și înțelegerea problemelor
- selecția de algoritmi și metode
- crearea pseudocodului
- generarea de cod
Agentul proiectant de teste (“test designer”)
Și acest agent este alimentat de LLMs și reprezintă componenta framework-ului menită să testeze și să ofere feedback de încredere agentului programator pentru ca acesta să poată optimiza codul iterativ. Prompt-urile folosite de către agentul test designer în acest framework au fost proiectate pentru ca să îndeplinească următoarele trei așteptări:- să genereze cazuri de testare de bază
- să acopere situațiile limită ale cazurilor de testare
- să acopere inputuri la scară largă
Agentul executant de teste (“test executor”)
Spre deosebire de ceilalți agenți, agentul test executor este implementat în framework prin intermediul unui script Python ce interacționează cu environmentul local și ceilalți doi agenți.
La momentul primirii bucăților de cod de la agentul programmer și a cazurilor de testare generate de către agentul test designer, agentul test executor le validează în enviromentul local. Dacă toate cazurile de testare sunt trecute, acesta returnează codul developerului uman. Altfel, returnează informația erorii agentului programator pentru a putea să repare greșeala identificată.
Evaluarea modelului se realizeaza prin răspunderea la șase întrebări:
- Care e performanța atinsă de AgentCoder?
- o îmbunătățire de 32.7% față de baseline-ul modelului GPT-4
- cu 8.8% mai mult ca abordările CodeCoT state-of-the-art
- Cum contribuie diferiți agenți la ansamblul total?
- Cum afectează rafinarea codului performanta AgentCoder-ului?
- Cat de precise sunt testele generate?
- Cat de adecvate sunt testele generate?
- din realizarea evaluării a cât de multe linii de cod în soluția acoperită de către testele generate de către GPT-3.5-turbo, CodeCoT și AgentCoder, rezultă că cel din urmă generează teste cu cea mai mare acoperire
- Ar trebui rolul agentului de generare și de testare de cod sa fie separate în doi agenți diferiți?
- nu, după cum se poate vedea din datele furnizate în tabelele 6, 7 și 8 de mai jos
Concluzie
Autorii propun AgentCoder, o abordare care integrează mai mulți agenți pentru a îmbunătăți procesul de generare a codului în modelele de generare a codului. AgentCoder este compus din trei agenți: programatorul, designerul de teste și executorul de teste. În timpul generării codului, programatorul creează fragmente de cod, apoi designerul de teste generează cazuri de testare corespunzătoare. Executorul de teste testează codul generat într-un mediu local și, în cazul în care apare o eroare, transmite feedback-ul către programator și designer pentru a corecta problema.
Evaluările demonstrează că AgentCoder are o performanță superioară față de alte metode și modele existente, cum ar fi LLM-urile și metodele de inginerie a comenzilor. De exemplu, în seturile de date HumanEval-ET și MBPP-ET, AgentCoder îmbunătățește semnificativ performanța, creșterea ratei de succes pass@1 de la 69.5% și 63.0% la 77.4% și 89.1%, respectiv.
Niciun comentariu:
Trimiteți un comentariu