AI, Backend

Co warto wiedzieć o IntelliCode? Trenowanie modelu i team completions

Dwa lata temu podczas konferencji Microsoft Build 2018 został ogłoszony IntelliCode, czyli rozszerzenie do Visual Studio IntelliSense, które ma wykorzystywać sztuczną inteligencję (ang. AI). Przez pewien czas część mojego zespołu korzystała z tego rozszerzenia, dziś jest ono dostępne publicznie. W artykule przyjrzymy się temu czym jest IntelliCode, poznamy kilka przykładów jego użycia i czy faktycznie przyczynia się usprawnienia pracy developerów. Prześledźmy jego funkcjonalności, również te, które są jeszcze w wersji preview.

Paweł Skaruz. Senior Specialist, developer aplikacji webowych pracujący w Netcompany. Pasjonat programowania rozwijający się przy projektach komercyjnych oraz jako kontrybutor open source. Po pracy dzieli się swoją wiedzą, prowadząc bloga o .NET i bezpieczeństwie aplikacji. W wolnym czasie lubi pobiegać za piłką, a także obejrzeć dobry film lub serial.


Czym jest IntelliCode?

Na początku jednak kilka informacji o tym, czym tak właściwie jest IntelliCode i w czym może pomóc programistom. IntelliCode jest rozszerzeniem do Visual Studio, które zwiększa możliwości wbudowanego IntelliSense. Rozszerzenie to ma wykorzystywać AI do analizy kodu i pomocy programistom poprzez:

  • Generowanie podpowiedzi IntelliSense na podstawie kontekstu,
  • Informowanie programistów, aby przestrzegali wzorców i stylów swojego zespołu,
  • Znajdowanie trudnych do wychwycenia bugów,
  • Zwracanie uwagi na obszary kodu, które naprawdę mają znaczenie podczas code review.

IntelliCode instalowane jest razem z Visual Studio 2019 od wersji 16.1. Może zostać również zainstalowane jako rozszerzenie do Visual Studio 2017 oraz Visual Studio Code.

Podpowiedzi do C#

Rekomendacje IntelliCode zostały zbudowane na podstawie analizy tysięcy projektów open source umieszonych w repozytoriach Github, z których każde posiada ponad 100 gwiazdek. W połączeniu z kontekstem w naszym kodzie, IntelliCode będzie proponował najbardziej prawdopodobne uzupełnienia.

Przyjrzyjmy się generowanym, „inteligentnym” podpowiedziom. Działa to rzeczywiście tak, jak można się spodziewać. Podpowiedzi wywnioskowane z kontekstu, na którym pracujemy, wędrują na samą górę listy oznaczone gwiazdką.

W większości przypadków wygenerowane podpowiedzi są trafne, więc potrafią przyśpieszyć i ułatwić pracę.

Warto wspomnieć, że IntelliCode w Visual Studio potrafi wygenerować podpowiedzi do innych języków:

  • C++,
  • TypeScirpt/JavaScript,
  • XAML.

Natomiast w Visual Studio Code dostępne jest rozszerzenie wspierające Javę, Pythona oraz składnię SQL Server.

Trenowanie modelu i team completions

Wszystkie wspomniane wcześniej rekomendacje dotyczą tylko wbudowanych w .NET Framework klas, metod lub właściwości (ang. properties). IntelliCode może również wygenerować podpowiedzi dotyczące kodu, na którym pracujemy. Wcześniej jednak należy wytrenować model. Można to zrobić na dwa sposoby:

  • Lokalnie – wytrenowany model będzie dostępny tylko dla nas,
  • Zespołowo – udostępniając model automatycznie dla członków naszego zespołu.

W przypadku lokalnego modelu, jest również możliwość późniejszego udostępnienia go poprzez wygenerowanie linku. Link można przekazać innym osobom pracującym w tym samym repozytorium git. Przyjrzymy się jednak drugiej opcji, ponieważ chcemy, aby podpowiedzi były automatycznie dostępne dla wszystkich pracujących nad samym kodem. Aby tego dokonać, wystarczy jedno kliknięcie w następującym miejscu:

View -> Other Windows -> Train IntelliCode model for this repository

Nastąpi stworzenie modelu na podstawie kodu z naszego repozytorium, a następnie wysłanie go na serwery IntelliCode. Tam rozpocznie się proces trenowania przy użyciu machine learning. W naszym przypadku trwało to około pół godziny.

[IntelliCodeCli I] IntelliCode train model is starting.
[IntelliCodeCli I] CLI Information: 0 : IntelliCode CLI Version 1.1.93+g6560ab4f7b
[IntelliCodeCli I] CLI Information: 0 : Model record successfully retrieved from server. Attempting upload of extracted data.
[IntelliCodeCli I] CLI Information: 0 : Extracted data successfully uploaded to the server. Attempting notification.
[IntelliCodeCli I] CLI Information: 0 : Model training requested successfully for language csharp
[IntelliCodeCli I] CLI Information: 0 : A model is training for commit 4bff3f4d2b5b. When finished, it will be available in Visual Studio when that commit is in the history and team model acquisition is enabled. https://aka.ms/vsic-auto-acquire
[IntelliCodeCli I] [
[IntelliCodeCli I]   {
[IntelliCodeCli I]     "Repository": "https://{repository_url}",
[IntelliCodeCli I]     "ModelAvailableForRetrainingAt": "2020-06-05T06:59:20.833036Z",
[IntelliCodeCli I]     "TrainRequestStatus": "TrainRequested",
[IntelliCodeCli I]     "TrainingStatus": "Processing",
[IntelliCodeCli I]     "ModelId": "27872B98262F6A1CAFDDA87B8B24CFXXXXXX",
[IntelliCodeCli I]     "Language": "csharp",
[IntelliCodeCli I]     "Created": "2020-03-03T12:48:13.881763Z",
[IntelliCodeCli I]     "Updated": "2020-06-05T06:59:27.492123Z",
[IntelliCodeCli I]     "LastTrainedAt": "2020-06-05T06:59:27.492122Z"
[IntelliCodeCli I]   }
[IntelliCodeCli I] ]
[IntelliCodeCli I] Done

Warto poruszyć kwestię bezpieczeństwa. Microsoft zapewnia, że kod nigdy nie opuszcza naszej lokalnej maszyny. Budowany model zawiera jedynie nazwy klas, metod oraz jak często i gdzie są używane. Dodatkowo wszystkie dane wysyłane są przez HTTPS po wcześniejszym zalogowaniu się na nasze konto w Visual Studio. Wytrenowany model jest dostępny tylko dla uwierzytelnionego użytkownika, który wcześniej go wysłał oraz dla użytkowników, którzy mają dostęp do repozytorium. Oznacza to, że model pozostaje prywatny dla autora oraz reszty członków zespołu.

Po pewnym czasie wytrenowany model powinien zostać automatycznie pobrany w Visual Studio. Dostępne podpowiedzi są podobne do wspomnianych wcześniej.

Zasada działania jest taka sama, z tym, że rekomendacje będą dotyczyć również naszego kodu.

Warto również wspomnieć o bardziej zaawansowanych podpowiedziach. IntelliCode analizując nasz kod doszukuje się powtórzeń. Jeśli doszuka się miejsca, w którym spodziewa się odpowiedniego fragmentu, to może zasugerować jego automatyczne wstawienie. Zostało to zaprezentowane na poniższym zrzucie ekranu.

Niektóre z wymienionych funkcjonalności są jeszcze w fazie preview i są domyślnie wyłączone. Można je skonfigurować w opcjach IntelliCode (Tools -> Options).

Integracja z AzureDevops

Generowanie modelu oraz jego trenowanie nie zajmuje dużo czasu, ale ma spory minus. Musi być robione co jakiś czas, aby był oparty na aktualnej wersji kodu. Na dłuższą metę byłoby to kłopotliwe, ale z pomocą przychodzi integracja z AzureDevops. Istnieje (aktualnie w wersji Preview) rozszerzenie do AzureDevops, które możemy dodać do istniejącego już pipelnie build.

Spróbujmy jednak utworzyć nowe zadanie, które będzie uruchamiać się raz na tydzień.

Po uruchomieniu tego zadania otrzymamy ten sam efekt, jak przy tworzeniu modelu na naszej maszynie. Model zostanie zbudowany oraz wysłany na serwery IntelliCode. Po ukończonym trenowaniu, osoby pracujący w tym samym repozytorium będą mogły automatycznie otrzymać wygenerowane podpowiedzi.

Podsumowanie

IntelliCode w aktualnej formie jest rozszerzeniem, które może wspomóc pracę programistów. Na pewno nie w znaczący sposób, ponieważ poprzez wyróżnione sugestie IntelliSense zaoszczędzamy co najwyżej kilka kliknięć. Natomiast niektóre funkcjonalności, które są jeszcze w fazie preview, zapowiadają się interesująco. Zachęcam do śledzenia zmian i wypróbowania IntelliCode w swoim zespole.


Zdjęcie główne artykułu pochodzi z unsplash.com.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://justjoin.it/blog/co-warto-wiedziec-o-intellicode" order_type="social" width="100%" count_of_comments="8" ]