brunch

You can make anything
by writing

C.S.Lewis

by Extreme Code Jul 08. 2021

Github Copilot에 관한 생각

프로그래밍의 신세계가 열리는 걸까?

  며칠 전에 Github에서 Copilot 이라는 놀라운 서비스를 공개했습니다. 아직은 waiting list에 등록하면 소수 인원만 사용 가능한 것으로 보이는데, alpha 버전을 몇 주간 사용한 사람들의 경험담 뿐 아니라 이를 분석한 글들도 꽤 많이 올라오고 있습니다. 저도 이에 관한 생각을 한번 써 보도록 하겠습니다.





Copilot이 무엇인가?

  사실 Copilot이 무엇인지야 너무나 잘 알려졌기 때문에 다시 쓸 필요는 없을 것 같지만, 간단히 설명하자면 Input parameter를 포함한 함수와 그에 관한 description만 넣으면 자동으로 코드를 생성 해 주는 매우 굉장한 툴 입니다. 일단은 VSCode 플러그인으로 제공 될 예정입니다.

공식 페이지의 python example

많은 개발자들이 입사할 때 진행하는 코딩 테스트를 몇 초 만에 완벽하게 풀어버릴 수 있는 어마어마한 기술입니다. 여기까지는 누구나 다 아는 내용이죠. 그리고 이게 OpenAI의 GPT-3 기술을 기반으로 하고 있다는 내용도 다 알고 있을 것입니다. 그렇다면 어떻게 이런 기술들이 나오게 되었는지 한번 생각해 봅시다.



배경

  일단 이와 같은 프로그램을 생성하는 연구의 역사는 오래되긴 했지만, 기존에는 엄격한 프로그램 언어의 문법을 파싱하고 이를 보조하는 툴을 만드는 것을 주로 진행하였습니다. 현재는 어떤 개발자든 쉽게 사용하고 있는 IDE의 auto complete 같은 기능들은 대부분 이에 기반한 것입니다. 그리고 이는 Rule-based system의 영역에 속하죠.


이와 같은 영역에서 머신러닝 같은 데이터를 기반으로 프로그램 작성을 보조하는 연구는 Microsoft가 주로 진행했었습니다. MS의 스테디셀러 제품 중 하나인 MS Excel 의 수식 작성을 보조하는 역할을 구현하기 위해서 여러가지 연구를 진행했었죠. 그리고 MS는 Visual Studio라는 걸출한 IDE도 가지고 있었기 때문에 이런 연구를 꽤 오랫동안 했었습니다.


그러다가 딥러닝 시대가 열리며, 텍스트 분석, 생성 등에서 가능성을 보여 준 RNN기반 모델들을 활용하여 프로그램을 자동으로 생성하거나 자연어를 컴퓨터가 이해 가능한 언어 (Domain Specific Language 나 SQL 등) 으로 변환하는 연구들도 많이 수행이 되었습니다. 그리고 한동안 RNN 계열 모델들의 성능을 개선시키기 위해서 다양한 시도들 (Stack을 쌓거나, Memory 를 활용한다거나) 도 진행이 되었었죠. 이 때의 연구는 Microsoft 뿐 아니라 Google, Facebook 도 다양한 연구를 발표하게 됩니다. 주로 2014년도부터 꽤 최근까지 그래왔습니다.


그렇지만, 실용적으로 사용하기에는 힘들었기 때문에 연구단계 이상은 가기 힘들었습니다. 물론 Kite와 같은 회사나 Tabnine 같이 AI 기반의 auto-complete를 상용 서비스로 제공하는 회사들도 있기는 합니다만, 써보시면 아시겠지만 기존의 IDE에서 제공하던 기능의 +@ 정도 수준에 머무르는 수준이고 AI 라고 하기엔 좀 애매한 면이 많습니다. (아시다시피 요즘에는 모든 서비스에 AI 를 붙이고 있습니다...ㅎㅎㅎ)


이렇게 몇년간 크게 발전이 없고 지지부진한 상황이 이어졌는데 이러한 상황을 완전히 바꾼 것이 OpenAI 의 GPT-3의 등장입니다. GPT-2때도 어느정도 가능성이 보였지만, GPT-3는 정말 말도 안되는 규모의 모델을 학습하였고, 그것이 잘 동작함을 보였습니다. 또한 기존에는 실용적으로 사용하기는 힘들었지만, 이제는 few-shot learning, one-shot learning이 정말로 가능하다는 것을 보여주었습니다. 그리고 이 때 GPT-3 API 데모를 사용할 수 있게 초대받은 사람들이 다양한 결과들을 올리면서 큰 화제가 되었었습니다. 이 때 GPT-3가 코드 생성을 꽤 잘 한다는 것을 보여주었고, 그러한 샘플들은 여기에서 확인할 수 있습니다.


하지만 이러한 큰 규모의 모델은 몇가지 문제점이 있었습니다. 어마어마하게 많은 데이터셋을 매우 큰 모델로 학습하게 되면 당연히 가질 수 있는 의문점이 있습니다. 그냥 이 모델이 검색 (Information Retreival) 처럼 동작하는 것이 아닐까 하는 점입니다. 딥러닝 자체는 black box이기 때문에 모델이 매우 커지게 되면 당연히 가질 수 있는 의문입니다. 실제로 GPT-2를 분석했을 때 특정 쿼리를 넣으면 training data가 그대로 노출되는 문제가 있었습니다. (link) 그리고 GPT-3는 오픈되어 있지는 않아서 아직 확실하지는 않지만 더 모델 규모가 큰 만큼 그러한 문제가 당연히 많이 발생하겠죠.


이 외에도 GPT-3를 사용하여 코드 생성을 할 때 잘 되는 경우도 있지만 잘 안 되는 경우가 더 많다는 것을 염두에 둘 필요가 있습니다. 이러한 문제들을 개선하기 위해서 기존 GPT-3 모델을 코드 생성에만 특화하여 OpenAI 에서는 Codex라는 모델을 만들었습니다. 그리고 이게 Copilot 의 핵심 모델이라고 볼 수 있습니다. Microsoft는 몇년 전에 Github을 인수하였고, OpenAI에도 1조원 이상 투자하고 GPT-3 API도 Azure 기반으로 제공하고 다양한 협업을 이어가고 있습니다. 그러한 상황으로 인해 이런 Copilot 이 나올 수 있게 된 것 같습니다.


참고로 GPT-3를 보고 이를 오픈소스로 구현한 GPT-J 가 있는데, GPT-3보다 30배나 작은데 코드 생성은 GPT-3보다 나은 결과를 보여주는 편이라고 합니다. 왜냐면 GPT-J는 학습 데이터셋이 Github public repository나 StackExchange에 많이 의존하기 때문입니다. 이런 것만 보아도 GPT-3를 코드 생성에 특화하게 만든 Codex라는 모델이 훨씬 잘 동작할 것이라고 예상이 됩니다.


아무튼, 위에서 말한 것 처럼 Copilot 서비스가 코드 검색처럼 동작하지 않을지에 관한 의문을 해소해 주기 위해서 Github에서 직접 테스트를 진행하고 그 결과를 공개하였습니다.



예상 문제점과 Github의 분석내용

  위에서 언급한 것 처럼 Copilot이 검색 모델처럼 동작하지 않을까 하는 걱정이 있었고, 실제로 이와 관련된 연구들도 있습니다. 여기서는 Parroting 이라고 표현하는데요, 앵무새가 말을 그대로 따라하는 것 처럼 training data 에 있었던 텍스트를 그대로 리턴하는 것을 의미한다고 볼 수 있을 것 같습니다.


그러한 문제가 없을 지 내부의 300명의 개발자가 직접 Copilot을 사용 해 보면서 데이터를 분석해 보았다고 합니다. copilot suggestion중 training data와 동일하지 않은 것을 필터링 하고 그 데이터를 수작업으로 분석한 내용을 여기에 써 두었습니다. 


결과만 요약 해 보자면, 453k 개의 샘플 중 473개만 training data 에 있는 것과 동일한 것이었고 그것들도 동일하게 쓰는 게 문제 없을만한 코드들이었다고 합니다. 해당 페이지에는 직접 샘플 결과도 다운받을 수 있으니 궁금하신 분들은 직접 확인해 볼 수 있습니다.


그리고 이렇게 동일한게 나올 확률은 10주간 사용할 때 1번 이벤트가 발생할 확률 정도라고 합니다. 이정도면 거의 문제가 없다고 볼 수 있겠죠. 하지만 이에 관한 반론들도 여전히 존재합니다. 453k 개의 원본 샘플은 공개하지 않았는데, 나머지 것들이 문제가 없는지는 수작업이 아닌 기계적 필터링을 한 것이므로 확실치 않다는 것이죠.


예를 들어 필터링 시 단순히 코드의 word sequence 가 동일한지를 판단하는데, 이 때 코드의 변수가 text prompt의 값에 의해 바뀔 수도 있고, 동일한 operation (예를 들어 ++ 와 +=1 같은) 이지만 필터링에서 걸려졌을 가능성도 있으며, 동일한 로직이 내부에서 순서만 바뀌는 경우도 있지 않을까와 같은 반론들이죠.


(내용추가: 2021/7/9에 OpenAI 의 Codex에 관한 논문이 arXiv에 올라왔습니다. 논문은 Codex의 성능을 평가한 내용입니다.)


물론 이러한 내용들은 실제로 Copilot이 좀 더 많은 개발자가 사용할 수 있게 공개되고 나면 곧 알게 되겠죠?ㅎㅎ



문제점과 파급력

  위에서 언급한 parroting 케이스 외에도 아직 문제점이 많기는 합니다. 코드는 한글자만 틀려도 크게 문제가 생길 수 있는데 과연 Copilot을 신뢰할 수 있는가에 관한 문제부터, public code 위주로 학습한 것이기 때문에 insecure 한 코드나 버그를 Copilot이 포함하고 있을 가능성, 그리고 outdated API 를 그대로 사용하고 있을 수 있는 문제 등 다양한 문제가 제기되고 있죠.


또한 라이센스와 관련된 문제제기도 많이 이뤄지고 있습니다. GPL 라이센스를 가진 코드도 많이 학습했을 텐데 그러면 Copilot이 생성한 코드를 사용하면 그 코드도 GPL을 따라야 하는건지에서 시작해서 다양한 문제점이 제기되고 있습니다.


그리고 Transformer 기반의 NLU모델들이 다 그렇듯이 단지 매칭될 확률이 높은 것을 뽑아주는 것이기 때문에 프로그램이 정확히 맞는지 체크는 안되고 있습니다. 물론 이는 syntax check 나 JIT 기반으로 체크하는 등의 추가적인 후처리가 들어가면 개선될 수는 있겠죠.


다른 한가지 문제점은 프로젝트 내의 다른 클래스를 참조하거나 하는 등의 작업은 아직 무리로 보인다는 것입니다. 물론 아직은 시작 단계이니 다양한 기술 발전을 통해서 나중에는 될 수도 있을 것입니다.


하지만, 이러한 모든 문제 제기에도 불구하고 Copilot은 프로그래머의 행동을 바꿀 것으로 기대되고 있습니다. 이 트윗을 보면 아직까지 부족한 점이 많은 것 같기는 합니다. 하지만 이 코멘트를 보면 10회중 1회는 완전히 생각하던 것과 동일한 원하는 결과를 낸다고 합니다. 물론 10% 확률은 좋은 게 아니지만, Copilot을 사용함으로써 테스트도 더 꼼꼼하게 작성하고 문서화 등도 더 신경쓰게 되어서 프로그래밍 습관이 바뀌었다고 하며, 정말 Pair programming 하는 느낌이라고 합니다. Copilot이 생성한 코드를 100% 신뢰할 수는 없으니 테스트를 더 꼼꼼하게 작성하게 될 확률이 높을 것 같긴 하네요. 아무튼 여러모로 기대되는건 사실입니다.


처음부터 기대만큼 뛰어난 성능을 보이지는 않을 수는 있습니다. 그리고 Copilot이 개발자를 대체할 수도 없을 것입니다. 새로운 좋은 코드를 만드는 게 아니라 기존의 데이터에서 코드를 찾아내는 방식이기 때문입니다. 하지만 프로그래머가 코딩하는 행동 자체를 변화시킬 가능성이 있는 정말 대단한 서비스가 될 가능성이 높습니다.




  OpenAI와 Github이 Copilot이라는 이름을 붙인 것은 정말 딱 들어맞는 것 같습니다. 써 본 사람들에 의하면 정말로 pair programming을 하는 느낌이라고 하니까요. SW를 배우는 방식, 개발하는 방식은 오랜 기간 큰 변화가 없었는데 앞으로 큰 변화를 맞이할 수 있지 않을까요?


물론 첫술부터 배부를 순 없을 것입니다. Copilot이 많은 경우 잘못된 코드를 만들어낼 가능성이 높죠. 하지만 아직 시작단계입니다. static anaylsis 등과의 결합, 지속적인 개선 등을 통해서 성능이 어느 일정 기준을 넘어서게 되면 프로그래밍 패러다임에 큰 변화가 있게 될 것 같습니다. 그리고 사용하는 모델 자체는 거의 알려진 내용이기 때문에, 앞으로 많은 회사들도 유사한 서비스를 제공하고 이러한 경쟁이 더 많은 기술적 발전을 이끌 것입니다. 개발이 더 편해지는 세상이 올 것 같네요!



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari