{"id":32379,"date":"2025-10-29T05:00:00","date_gmt":"2025-10-29T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=32379"},"modified":"2025-12-17T15:29:30","modified_gmt":"2025-12-17T14:29:30","slug":"automatyczne-streszczanie-kodu-i-generowanie-commit-message-z-wykorzystaniem-llm","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/automatyczne-streszczanie-kodu-i-generowanie-commit-message-z-wykorzystaniem-llm\/","title":{"rendered":"Automatyczne streszczanie kodu i generowanie commit message z wykorzystaniem LLM"},"content":{"rendered":"\n<p>Du\u017ce modele j\u0119zykowe (ang. Large Language Model, LLM) s\u0105 coraz cz\u0119\u015bciej wykorzystywane do analizy i generowania tre\u015bci zwi\u0105zanych z kodem \u017ar\u00f3d\u0142owym. W szczeg\u00f3lno\u015bci dwa obszary \u2013 <strong>streszczanie kodu oraz opisywanie zmian w kodzie<\/strong> (generowanie \u201ecommit message\u201d) \u2013 s\u0105 przedmiotem aktywnych bada\u0144 i eksperyment\u00f3w ze wzgl\u0119du na mo\u017cliwo\u015b\u0107 usprawnienia dokumentowania zmian w repozytoriach kodu.<\/p>\n\n\n\n<p>Niniejszy wpis przedstawia <strong>przegl\u0105d zastosowa\u0144, aktualnych rozwi\u0105za\u0144, narz\u0119dzi i benchmark\u00f3w<\/strong> w tym zakresie oraz <strong>podsumowuje wyniki eksperyment\u00f3w <\/strong>przeprowadzonych na repozytorium LangChain przy u\u017cyciu modeli OpenAI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zastosowanie LLM w analizie kodu<\/strong><\/h2>\n\n\n\n<p>LLM-y s\u0105 wykorzystywane w szerokim zakresie zada\u0144 zwi\u0105zanych z tzw. <a href=\"https:\/\/arxiv.org\/abs\/2401.00288\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >code intelligence<\/a> [1]. W\u015br\u00f3d przyk\u0142adowych zastosowa\u0144 wymieni\u0107 mo\u017cna:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>generowanie kodu,<\/li>\n\n\n\n<li>t\u0142umaczenie mi\u0119dzy j\u0119zykami programowania, migracja mi\u0119dzy pakietami\/wersjami,<\/li>\n\n\n\n<li>generowanie test\u00f3w, danych syntetycznych, mock\u00f3w,<\/li>\n\n\n\n<li>refaktoryzacj\u0119,<\/li>\n\n\n\n<li>wykrywanie b\u0142\u0119d\u00f3w i luk bezpiecze\u0144stwa,<\/li>\n\n\n\n<li>streszczanie i dokumentowanie kodu,<\/li>\n\n\n\n<li>wsparcie w tworzeniu pull request\u00f3w i commit\u00f3w.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przypadki u\u017cycia<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Poprawa jako\u015bci dokumentacji zmian<\/strong><\/h3>\n\n\n\n<p>Commit message to podstawowy mechanizm dokumentowania zmian w kodzie. Dobrze sformu\u0142owane wiadomo\u015bci:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>u\u0142atwiaj\u0105 przegl\u0105danie historii zmian (git log, git blame),<\/li>\n\n\n\n<li>wspomagaj\u0105 debugowanie i analiz\u0119 regresji,<\/li>\n\n\n\n<li>s\u0105 u\u017cywane do automatycznego generowania changelog\u00f3w i release notes.<\/li>\n<\/ul>\n\n\n\n<p>Jednak w praktyce wiele commit\u00f3w zawiera:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>lakoniczne wiadomo\u015bci typu \u201efix\u201d, \u201eupdate\u201d, \u201echanges\u201d,<\/li>\n\n\n\n<li>niepe\u0142ne lub niezgodne z rzeczywist\u0105 zmian\u0105 opisy,<\/li>\n\n\n\n<li>zb\u0119dne szczeg\u00f3\u0142y techniczne, kt\u00f3re nie wyja\u015bniaj\u0105 celu zmiany.<\/li>\n<\/ul>\n\n\n\n<p>Automatyzacja <strong>mo\u017ce poprawi\u0107 sp\u00f3jno\u015b\u0107 i jako\u015b\u0107 takich opis\u00f3w<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Redukcja obci\u0105\u017cenia programist\u00f3w<\/strong><\/h3>\n\n\n\n<p>Pisanie dobrych commit\u00f3w wymaga czasu i koncentracji. Wiadomo\u015bci commit\u00f3w s\u0105 cz\u0119sto traktowane jako zadanie poboczne. Automatyzacja tego procesu pozwala odci\u0105\u017cy\u0107 programist\u00f3w przy jednoczesnym zachowaniu standardu jako\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wsparcie dla standard\u00f3w organizacyjnych<\/strong><\/h3>\n\n\n\n<p>W wi\u0119kszych firmach i projektach open-source obowi\u0105zuj\u0105 konwencje commit\u00f3w, np.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Conventional Commits (feat:, fix:, refactor:, docs:),<\/li>\n\n\n\n<li>Semantic Versioning (patch\/minor\/major),<\/li>\n\n\n\n<li>Gitmoji, PR templates itd.<\/li>\n<\/ul>\n\n\n\n<p>Automatyczne generowanie commit\u00f3w pozwala egzekwowa\u0107 takie standardy programowo, bez r\u0119cznego pilnowania konwencji przez code reviewers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wspomaganie analizy zmian przez inne zespo\u0142y<\/strong><\/h3>\n\n\n\n<p>W projektach z podzia\u0142em na zespo\u0142y (np. backend, QA, DevOps), commit message mo\u017ce s\u0142u\u017cy\u0107 jako \u017ar\u00f3d\u0142o informacji:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dla QA: co testowa\u0107, jakie funkcjonalno\u015bci uleg\u0142y zmianie,<\/li>\n\n\n\n<li>dla DevOps: kt\u00f3re komponenty wymagaj\u0105 deploymentu,<\/li>\n\n\n\n<li>dla analityk\u00f3w biznesowych: kt\u00f3re zg\u0142oszenia z JIRA zosta\u0142y zrealizowane.<\/li>\n<\/ul>\n\n\n\n<p>LLM mo\u017ce wzbogaci\u0107 wiadomo\u015b\u0107 o informacje typu: \u201eZmiana dotyczy walidacji danych wej\u015bciowych dla endpointu \/user\/register \u2013 potencjalny wp\u0142yw na rejestracj\u0119 nowych u\u017cytkownik\u00f3w\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wsparcie przy generowaniu changelog\u00f3w i automatyzacji release\u2019\u00f3w<\/strong><\/h3>\n\n\n\n<p>W narz\u0119dziach typu Release Drafter tre\u015b\u0107 commit\u00f3w jest u\u017cywana do generowania changelog\u00f3w. Automatyczne generowanie sp\u00f3jnych i tre\u015bciwych opis\u00f3w zmian pozwala tworzy\u0107 changelogi bez dodatkowego nak\u0142adu pracy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Metody klasyczne vs. LLM<\/strong><\/h2>\n\n\n\n<p>Punktem wyj\u015bcia dla automatycznego streszczanie zmian w kodzie jest wynik git diff (unified diff format). Dodatkowo wykorzysta\u0107 mo\u017ce:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pierwotne pliki z kodem \u017ar\u00f3d\u0142owym,<\/li>\n\n\n\n<li>opisy z systemu \u015bledzenia zg\u0142osze\u0144 (JIRA, GitHub),<\/li>\n\n\n\n<li>zale\u017cno\u015bci w kodzie (wynik statycznej analizy kodu: relacje wywo\u0142uj\u0105cy-wo\u0142any).<\/li>\n<\/ul>\n\n\n\n<p>W okresie poprzedzaj\u0105cym powszechne u\u017cycie LLM-\u00f3w, generowanie commit\u00f3w opiera\u0142o si\u0119 na:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>podej\u015bciach regu\u0142owych (szablony w postaci: Modyfikacja funkcji X w pliku Y),<\/li>\n\n\n\n<li>analizie sk\u0142adniowej \u2013 zamiast analizy zmian plik\u00f3w z kodem analizowane s\u0105 zmiany w AST (Abstract Syntax Tree),<\/li>\n\n\n\n<li>prostych metodach tekstowych lub statystycznych modelach j\u0119zyka.<\/li>\n<\/ul>\n\n\n\n<p>Przegl\u0105d takich metod zawiera publikacja <a href=\"https:\/\/arxiv.org\/abs\/1909.04352\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Automatic Code Summarization: A Systematic Literature Review<\/a>.<\/p>\n\n\n\n<p>Obecnie dominuj\u0105 modele typu transformer, trenowane na du\u017cych korpusach kodu i komentarzy. Modele takie jak CodeT5+, CodeLlama, DeepSeek-Coder czy GPT-4 mog\u0105 by\u0107 wykorzystywane do t\u0142umaczenia kodu na j\u0119zyk naturalny, generowania streszcze\u0144 lub automatycznych commit\u00f3w. Wi\u0119cej na ten temat mo\u017cna znale\u017a\u0107 w pracy <a href=\"https:\/\/arxiv.org\/abs\/2407.07959\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Source Code Summarization in the Era of Large Language Models.<\/a><\/p>\n\n\n\n<p>Ewaluacj\u0119 generowania commit message przeprowadza si\u0119, por\u00f3wnuj\u0105c otrzymany tekst z referencj\u0105 w postaci oryginalnego wpisu. Standardowe metryki oparte na N-gramach, takie jak BLEU czy ROUGE, maj\u0105 problem z uchwyceniem niuans\u00f3w semantycznych, st\u0105d du\u017c\u0105 popularno\u015bci\u0105 ciesz\u0105 si\u0119 metody ewaluacji wykorzystuj\u0105ce podobie\u0144stwo semantyczne w przestrzeni embadding\u00f3w oraz stosowanie du\u017cych modeli j\u0119zykowych jako \u201es\u0119dzi\u00f3w\u201d (ang. LLM-as-a-judge). &nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/arxiv.org\/abs\/2404.14824\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Badania empiryczne<\/a> [2] pokazuj\u0105 wysok\u0105 zgodno\u015b\u0107 mi\u0119dzy ocen\u0105 eksperck\u0105 a ocen\u0105 dostarczon\u0105 przez modele j\u0119zykowe. Dodatkowo, ewaluacja w oparciu o LLM-as-a-judge pozwala w \u0142atwy spos\u00f3b okre\u015bli\u0107 kryteria ewaluacji: <strong>na czym si\u0119 skupi\u0107, co ignorowa\u0107<\/strong>.<\/p>\n\n\n\n<p>Wykorzystanie modeli j\u0119zykowych do oceny jako\u015bci generowanych przez nie opis\u00f3w mo\u017ce budzi\u0107 skojarzenia z \u201epodnoszeniem si\u0119 na w\u0142asnych sznur\u00f3wkach\u201d. Ta metoda ewaluacji wykorzystuje jednak fakt, \u017ce por\u00f3wnywanie i ocena tekst\u00f3w jest \u0142atwiejsza ni\u017c ich <a href=\"https:\/\/arxiv.org\/pdf\/2411.15594\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >generowanie<\/a> [3]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-683x1024.jpg\" alt=\"Baron Munchhausen wyci\u0105gaj\u0105cy si\u0119 z bagna za w\u0142osy\" class=\"wp-image-32380\" style=\"width:285px;height:auto\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-683x1024.jpg 683w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-200x300.jpg 200w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-768x1152.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1.jpg 1024w\" sizes=\"(max-width: 683px) 100vw, 683px\" \/><figcaption class=\"wp-element-caption\">Ryc. 1 Baron Munchhausen wyci\u0105gaj\u0105cy si\u0119 z bagna za w\u0142osy<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ewaluacja i benchmarki<\/strong><\/h2>\n\n\n\n<p>Ocena jako\u015bci generowanych opis\u00f3w zmian wymaga odpowiednich zbior\u00f3w danych. Wymieni\u0107 tutaj mo\u017cna:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/arxiv.org\/abs\/2403.05188\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >CommitBench<\/a>: ponad 11 000 commit\u00f3w z projekt\u00f3w open-source. Dane zawieraj\u0105 git diff, oryginalne wiadomo\u015bci commit\u00f3w i metadane.<\/li>\n\n\n\n<li><a href=\"https:\/\/arxiv.org\/abs\/2102.04664\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >CodeXGLUE<\/a>: repozytorium benchmark\u00f3w do wielu zada\u0144 zwi\u0105zanych z kodem (m.in. streszczenia i generowanie dokumentacji).<\/li>\n\n\n\n<li><a href=\"https:\/\/arxiv.org\/abs\/1909.09436\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >CodeSearchNet<\/a>: ponad 6 mln funkcji z docstringami, repozytorium na potrzeby generowania podsumowa\u0144 oraz przeszukiwania kodu na podstawie zapyta\u0144 w j\u0119zyku naturalnym.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Eksperymenty na repozytorium LonhChain<\/strong><\/h2>\n\n\n\n<p>Eksperymenty z automatycznym streszczaniem zmian w kodzie prowadzone by\u0142y w oparciu o publiczne repozytorium dla pakietu <a href=\"https:\/\/github.com\/langchain-ai\/langchain\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >LangChain<\/a>.<\/p>\n\n\n\n<p>Wybranych zosta\u0142o 100 commit\u00f3w, w kt\u00f3rych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>modyfikowany by\u0142 co najmniej 1 plik .py z modu\u0142\u00f3w core lub community,<\/li>\n\n\n\n<li>zmiany dotyczy\u0142y nie wi\u0119cej ni\u017c 10 plik\u00f3w,<\/li>\n\n\n\n<li>commit powi\u0105zany by\u0142 z jednym zg\u0142oszeniem (jeden numer z issue trackera).<\/li>\n<\/ul>\n\n\n\n<p>W eksperymentach korzystano g\u0142\u00f3wnie z modeli GPT-4o, GPT-3.5, o3-mini, o4-mini. Do statycznej analizy kodu wykorzystano pakiety AST oraz PyCG (arXiv:2103.00587).<\/p>\n\n\n\n<p>Do oceny przydatno\u015bci modeli j\u0119zykowych wykorzystano nast\u0119puj\u0105ce zadania:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Identyfikacja zmodyfikowanych element\u00f3w kodu (lista klas, funkcji, metod, kt\u00f3rych dotyczy\u0142y zmiany) na podstawie git diff: podstawowe zadanie pozwalaj\u0105ce oceni\u0107, na ile LLM \u201erozumie\u201d, czego dotyczy\u0142y zmiany wprowadzone w kodzie.<\/li>\n\n\n\n<li>Wydobycie zale\u017cno\u015bci mi\u0119dzy komponentami (lista par: caller \u2192 callee): kolejny test, na ile LLM \u201erozumie\u201d zale\u017cno\u015bci w kodzie. Zale\u017cno\u015bci mi\u0119dzy komponentami pozwalaj\u0105 oceni\u0107 wp\u0142yw zmian na pozosta\u0142e elementy aplikacji oraz u\u0142atwi\u0107 analiz\u0119 zmian przez inne zespo\u0142y (np. na potrzeby test\u00f3w).<\/li>\n\n\n\n<li>Generowanie tre\u015bci commit message na podstawie kodu i r\u00f3\u017cnic (git diff): docelowe zadanie.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Identyfikacja element\u00f3w kodu, kt\u00f3rych dotyczy\u0142y zmiany z commitu<\/strong><\/h2>\n\n\n\n<p>Rysunek poni\u017cej przedstawia schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji element\u00f3w kodu, kt\u00f3rych dotyczy\u0142y zmiany pochodz\u0105ce z danego commitu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dane wej\u015bciowe to git diff (unified diff format) oraz plik \u017ar\u00f3d\u0142owy przed modyfikacjami.<\/li>\n\n\n\n<li>Dane wej\u015bciowe przetwarzane s\u0105 przez LLM w oparciu o prompt podany w ramce (przedstawiony poni\u017cej prompt jest mocno uproszczony i ma jedynie oddawa\u0107 charakter instrukcji zleconych LLM-owi).<\/li>\n\n\n\n<li>Wynikiem dzia\u0142ania LLM-a jest lista klas, funkcji oraz metod, kt\u00f3rych dotyczy\u0142y zmiany: zmodyfikowane fragmenty kodu pokrywa\u0142y si\u0119 z kodem tych element\u00f3w. Przyj\u0119to, \u017ce zmiany dotycz\u0105ce element\u00f3w podrz\u0119dnych oznaczaj\u0105 zmian\u0119 elementu nadrz\u0119dnego: zmiany w metodzie danej klasy oznaczaj\u0105 r\u00f3wnie\u017c modyfikacj\u0119 klasy.<\/li>\n\n\n\n<li>Ocena jako\u015bci wynik\u00f3w dostarczonych przez LLM polega na ich por\u00f3wnaniu z referencj\u0105 otrzyman\u0105 ze statycznej analizy kodu. Metryka, na kt\u00f3rej bazujemy, to precyzja: liczba element\u00f3w zidentyfikowanych przez LLM i maj\u0105cych pokrycie w referencji do ca\u0142kowitej liczby element\u00f3w zidentyfikowanych przez LLM.\u00a0 \u00a0<\/li>\n<\/ul>\n\n\n\n<p>Modele GPT-4o, o3-mini oraz o4-mini poradzi\u0142y sobie bardzo dobrze z tym zadaniem.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"497\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-1-1024x497.png\" alt=\"Schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji element\u00f3w kodu\" class=\"wp-image-32382\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-1-1024x497.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-1-300x145.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-1-768x372.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-1.png 1429w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 2 Schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji element\u00f3w kodu<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wykrywanie zale\u017cno\u015bci w kodzie<\/strong><\/h3>\n\n\n\n<p>Rysunek poni\u017cej przedstawia schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji zale\u017cno\u015bci semantycznych\/funkcjonalnych typu caller \u2192 callee):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dane wej\u015bciowe to plik \u017ar\u00f3d\u0142owy oraz lista nazw z importowanych w danym pliku pakiet\u00f3w\/modu\u0142\u00f3w.<\/li>\n\n\n\n<li>Dane wej\u015bciowe przetwarzane s\u0105 przez LLM w oparciu o prompt podany w ramce.<\/li>\n\n\n\n<li>Wynikiem dzia\u0142ania LLM-a jest lista par: funkcja wywo\u0142uj\u0105ca, funkcja wo\u0142ana. W analizie ograniczamy si\u0119 tylko do funkcji wo\u0142anych pochodz\u0105cych spoza analizowanego pliku oraz funkcji wo\u0142anych, kt\u00f3re nie s\u0105 funkcjami ze standardowych pakiet\u00f3w Python.<\/li>\n\n\n\n<li>Ocena jako\u015bci wynik\u00f3w dostarczonych przez LLM polega na ich por\u00f3wnaniu z referencj\u0105 otrzyman\u0105 ze statycznej analizy kodu przy u\u017cyciu pakietu PyCG. Analizowane metryki to: precyzja oraz czu\u0142o\u015b\u0107.<\/li>\n<\/ul>\n\n\n\n<p>Na podstawie uzyskanych wynik\u00f3w widzimy, \u017ce modele nie radz\u0105 sobie z zadaniem wykrywania zale\u017cno\u015bci semantycznych w kodzie i maj\u0105 du\u017cy problem z halucynacjami.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"487\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image3-1024x487.png\" alt=\"Schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji zale\u017cno\u015bci semantycznych\/funkcjonalnych\" class=\"wp-image-32384\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image3-1024x487.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image3-300x143.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image3-768x365.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image3.png 1431w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 3 Schemat przep\u0142ywu danych i sterowania w realizacji zadania identyfikacji zale\u017cno\u015bci semantycznych\/funkcjonalnych<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Generowanie tre\u015bci commit message<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dane wej\u015bciowe: zestaw plik\u00f3w \u017ar\u00f3d\u0142owych modyfikowanych w ramach commitu w ich wersji przed wprowadzeniem zmian oraz zestaw zmian w postaci unified git diff.<\/li>\n\n\n\n<li>Dane wej\u015bciowe przetwarzane s\u0105 przez LLM w oparciu o prompt podany w ramce.<\/li>\n\n\n\n<li>Wynikiem dzia\u0142ania LLM jest commit message.<\/li>\n\n\n\n<li>Wygenerowany commit message jest por\u00f3wnywany z oryginalnym commit message pochodz\u0105cym z repozytorium. Ocena w skali 1-5 wykonywana jest przez LLM (LLM-as-a-judge).<\/li>\n\n\n\n<li>Ocena wykonywana jest na podstawie przedstawionego poni\u017cej promptu. LLM ma ignorowa\u0107 brak odwo\u0142ania do informacji, do kt\u00f3rych nie ma dost\u0119pu w trakcie generowania, np. issue number.<\/li>\n<\/ul>\n\n\n\n<p><strong>P<\/strong><strong>rompt:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Read generated and reference commit message. Check if the generated message captures all important changes described in the reference message. Ignore minor wording differences; focus on the meaning and completeness. If anything important is missing, mention what was omitted. Ignore lack of references to tasks or issues or persons or standards or guidelines in generated commit message. Score adequacy of generated message 1 (low) &#8211; 5 (high).<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"496\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image4-1024x496.png\" alt=\"Generowanie tre\u015bci commit message\" class=\"wp-image-32386\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image4-1024x496.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image4-300x145.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image4-768x372.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image4.png 1429w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 4 Generowanie tre\u015bci commit message<\/figcaption><\/figure>\n\n\n\n<p>Przyk\u0142ad commit message z wysok\u0105 ocen\u0119 (czarna ramka \u2013 wygenerowany commit message, niebieska ramka \u2013 referencja).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"451\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5-1024x451.png\" alt=\"Przyk\u0142ad commit message z wysok\u0105 ocen\u0119 \" class=\"wp-image-32388\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5-1024x451.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5-300x132.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5-768x339.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5-370x162.png 370w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image5.png 1429w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 5 Przyk\u0142ad commit message z wysok\u0105 ocen\u0119<\/figcaption><\/figure>\n\n\n\n<p>Przyk\u0142ad commit message z nisk\u0105 ocen\u0105 (czarna ramka \u2013 wygenerowany commit message, niebieska ramka \u2013 referencja).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"449\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6-1024x449.png\" alt=\"Przyk\u0142ad commit message z nisk\u0105 ocen\u0105 \" class=\"wp-image-32390\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6-1024x449.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6-300x132.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6-768x337.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6-370x162.png 370w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image6.png 1430w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 6 Przyk\u0142ad commit message z nisk\u0105 ocen\u0105<\/figcaption><\/figure>\n\n\n\n<p>Do oceny generowanych commit message u\u017cyto GPT-4o.<\/p>\n\n\n\n<p>Wykres poni\u017cej pokazuje, jak model wypada w testowych przypadkach kontrolnych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hard negative \u2013 dane pochodz\u0105ce z tego samego commit, co referencyjny commit message; LLM generuj\u0105cy commit message zosta\u0142 poinstruowany, \u017ceby wygenerowa\u0107 odpowied\u017a przypominajac\u0105 prawid\u0142owy opis, ale wprowadzaj\u0105c\u0105 w b\u0142\u0105d.<\/li>\n\n\n\n<li>Negative \u2013 commit message wygenerowany dla danych pochodz\u0105cych z innego commita ni\u017c referencyjny (oczekiwany score: 1).<\/li>\n\n\n\n<li>Negative (paraphrased) \u2013 tak jak negative, ale tre\u015b\u0107 zosta\u0142a sparafrazowana przez LLM.<\/li>\n\n\n\n<li>Reference \u2013 referencyjny commit message (oczekiwany score: 5).<\/li>\n\n\n\n<li>Reference (paraphrased) \u2013 tak ja reference, ale tre\u015b\u0107 zosta\u0142a sparafrazowana przez LLM.<\/li>\n<\/ul>\n\n\n\n<p>Wybrany model dobrze radzi sobie z ocen\u0105 komunikat\u00f3w na zbiorze kalibracyjnym.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"695\" height=\"432\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image7.jpg\" alt=\"Jak model wypada w testowych przypadkach kontrolnych\" class=\"wp-image-32392\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image7.jpg 695w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image7-300x186.jpg 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><figcaption class=\"wp-element-caption\">Ryc. 7 Jak model wypada w testowych przypadkach kontrolnych<\/figcaption><\/figure>\n\n\n\n<p>Wyniki przeprowadzonych eksperyment\u00f3w zosta\u0142y przedstawione na rysunku poni\u017cej.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jako modele generuj\u0105ce commit message najlepiej wypadaj\u0105: GPT-4o, o3-mini oraz o4-mini, \u015brednia ocena powy\u017cej 3.5.<\/li>\n\n\n\n<li>Model GPT-3.5-turbo ma mniejsze okno kontekstowe i wymaga dzielenia tre\u015bci commit\u00f3w na mniejsze porcje (ang. chunks). Model ten ma stosunkowo nisk\u0105 jako\u015b\u0107 generowanych commit message. Chunkowanie commit\u00f3w nie wp\u0142ywa znacz\u0105co na jako\u015b\u0107 generowania dla GPT-4o.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"699\" height=\"432\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image8.jpg\" alt=\"Wyniki przeprowadzonych eksperyment\u00f3w \" class=\"wp-image-32394\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image8.jpg 699w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image8-300x185.jpg 300w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><figcaption class=\"wp-element-caption\">Ryc. 8 Wyniki przeprowadzonych eksperyment\u00f3w<\/figcaption><\/figure>\n\n\n\n<p>Przedstawiony wy\u017cej proces generowania commit message mo\u017cna rozszerzy\u0107 do procesu generowania change log\u00f3w\/podsumowa\u0144 wydania (ang. release summary) poprzez agregacj\u0119 wygenerowanych commit message\u2019y oraz do\u0142\u0105czenie informacji z grafu zale\u017cno\u015bci (ang. dependency graph).<\/p>\n\n\n\n<p>Jak zosta\u0142o pokazane, LLM ca\u0142kiem dobrze radzi sobie z identyfikacj\u0105 element\u00f3w, kt\u00f3rych dotycz\u0105 zmiany. Generowanie grafu zale\u017cno\u015bci lepiej jednak oprze\u0107 na statycznej analizie kodu. \u0141\u0105cz\u0105c te dwa komponenty, mo\u017cemy rozszerzy\u0107 wej\u015bcie LLM o list\u0119 obszar\u00f3w projektu, na kt\u00f3re wp\u0142yw maj\u0105 zmiany wprowadzone w commicie.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"434\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image9-1024x434.png\" alt=\"Proces generowania commit message \" class=\"wp-image-32396\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image9-1024x434.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image9-300x127.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image9-768x326.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image9.png 1431w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ryc. 9 Proces generowania commit message<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/kariera\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-PL-k-4.jpg\" alt=\"oferty pracy\" class=\"wp-image-32398\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-PL-k-4.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-PL-k-4-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wnioski i podsumowanie<\/strong><\/h2>\n\n\n\n<p>Zastosowanie LLM do analizy i dokumentowania kodu przynosi mierzalne korzy\u015bci. Modele dobrze rozpoznaj\u0105 lokalne zmiany, potrafi\u0105 generowa\u0107 sp\u00f3jne i zrozumia\u0142e wiadomo\u015bci commit\u00f3w, a ich ocena przez inne modele j\u0119zykowe okazuje si\u0119 skuteczna.<\/p>\n\n\n\n<p>LLM maj\u0105 trudno\u015bci z analiz\u0105 zale\u017cno\u015bci semantycznych w kodzie (relacje caller-callee), dlatego warto \u0142\u0105czy\u0107 LLM z klasyczn\u0105 analiz\u0105 kodu (np. PyCG) w celu poprawy dok\u0142adno\u015bci.<\/p>\n\n\n\n<p>Wyspecjalizowane LLM trenowane na potrzeby code intelligence (CodeLlama, DeepSeek-Coder) mog\u0105 r\u00f3wnie\u017c by\u0107 efektywne w zadaniach tego typu. Wymaga to jednak osobnej oceny.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Literatura<\/strong><\/h2>\n\n\n\n<p>[1] <a href=\"https:\/\/arxiv.org\/abs\/2401.00288\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Deep Learning for Code Intelligence: Survey, Benchmark and Toolkit<\/a><\/p>\n\n\n\n<p>[2] <a href=\"https:\/\/arxiv.org\/abs\/2404.14824\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Automated Commit Message Generation with Large Language Models: An Empirical Study and Beyond<\/a><\/p>\n\n\n\n<p>[3] <a href=\"https:\/\/arxiv.org\/pdf\/2411.15594\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >A Survey on LLM-as-a-Judge<\/a>; <a href=\"https:\/\/www.evidentlyai.com\/llm-guide\/llm-as-a-judge\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >LLM-as-a-judge: a complete guide to using LLMs for evaluations<\/a>; <a href=\"https:\/\/arxiv.org\/pdf\/2407.07959\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Source Code Summarization in the Era of Large Language Models<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;32379&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Automatyczne streszczanie kodu i generowanie commit message z wykorzystaniem LLM&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Du\u017ce modele j\u0119zykowe (ang. Large Language Model, LLM) s\u0105 coraz cz\u0119\u015bciej wykorzystywane do analizy i generowania tre\u015bci zwi\u0105zanych z kodem &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/automatyczne-streszczanie-kodu-i-generowanie-commit-message-z-wykorzystaniem-llm\/\">Continued<\/a><\/p>\n","protected":false},"author":749,"featured_media":32400,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[5440,2871,2863,1546,1512,680],"class_list":["post-32379","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-core-ai","tag-agenci-ai","tag-llm","tag-przeglad-narzedzi","tag-poradnik","tag-ai"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/AI_3-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32379"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/749"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=32379"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32379\/revisions"}],"predecessor-version":[{"id":32402,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32379\/revisions\/32402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/32400"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=32379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=32379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=32379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}