더 나은 완성을 향한 길: 새로운 사용자 정의 모델을 사용하여 더 빠르고 스마트한 GitHub Copilot 구축

더 나은 완성을 향한 길: 새로운 사용자 정의 모델을 사용하여 더 빠르고 스마트한 GitHub Copilot 구축

코드 완성은 여전히 ​​가장 널리 사용되는 GitHub Copilot 기능으로, 수백만 명의 개발자가 매일 흐름을 유지하도록 돕습니다. 우리 팀은 개발자 피드백을 바탕으로 GitHub Copilot의 완성 경험을 지원하는 맞춤형 모델을 지속적으로 반복해 왔습니다. 이 작업은 편집기에서 더 빠르고 관련성이 높은 제안을 제공하는 데 큰 영향을 미쳤습니다.

이제 우리는 20% 더 많은 허용 및 유지 문자, 12% 더 높은 수락률, 3배 더 높은 초당 토큰 처리량, 35% 감소된 대기 시간을 제안합니다.

이러한 업데이트는 이제 편집자와 환경 전체에서 GitHub Copilot을 지원합니다. 코드 완성을 위한 사용자 정의 모델을 훈련하고 평가한 방법에 대한 여정을 공유하고 싶습니다.

왜 중요한가요?

Copilot 완성도가 향상되면 편집에 소요되는 시간이 줄어들고 구축에 더 많은 시간이 소요됩니다. 원래 Copilot은 가능한 가장 높은 수용률을 위해 최적화되었습니다. 그러나 우리는 수락률에 지나치게 초점을 맞추면 간단하고 짧은 제안이 많은 것을 잘못 선호하게 될 수 있다는 것을 깨달았습니다.

이것이 실제 개발자 요구 사항을 반영하지 않았거나 최고 품질의 경험을 제공하지 못했다는 피드백을 들었습니다. 그래서 우리는 허용되고 유지되는 문자, 코드 흐름 및 기타 지표를 최적화하기 위해 방향을 전환했습니다.

  • 허용 및 유지되는 문자 수 20% 증가 결과적으로 일시적으로 수락되고 나중에 삭제되는 것이 아니라 더 많은 Copilot 제안이 최종 코드에 유지됩니다. 즉, 제안은 더 적은 키 입력으로 더 많은 가치를 제공합니다.
  • 12% 더 높은 합격률 더 나은 즉각적인 유용성을 반영하여 제안이 더 자주 유용하다는 것을 의미합니다.
  • 처리량 3배 35% 더 낮은 대기 시간 Copilot이 더 빠르게 느껴집니다. 코딩 흐름을 중단하지 않고 한 번에 더 많은 요청을 처리합니다(처리량은 시스템이 전체적으로 처리할 수 있는 작업량을 나타내고 대기 시간은 각 개별 요청이 완료되는 속도를 나타냅니다).

커스텀 모델을 평가하는 방법

Copilot 모델은 다음의 결합된 신호를 사용하여 평가됩니다. 오프라인, 생산 개시 이전그리고 생산 평가. 각 계층은 실제 개발자 워크플로에서 더 나은 품질을 보장하면서 경험의 다양한 측면을 개선하는 데 도움이 됩니다.

1) 오프라인 평가

실행 기반 벤치마크: 오프라인 평가의 일환으로 우리는 모든 주요 언어에 걸쳐 단위 테스트 및 시나리오 적용 범위를 통해 강력한 코드를 사용하여 내부 및 공개 저장소에 대해 먼저 테스트합니다. 각 테스트는 실제 작업을 시뮬레이션하고 제안을 수락하며 빌드 및 테스트 통과율을 측정합니다. 이는 표면의 유창함보다 기능적 정확성을 강조합니다.

다음은 부분 토큰 완료 오류의 예입니다. 생성된 모델 dataet 대신에 dataset.

Dataset_utilities.py라는 파일 내에서 verify_file이라는 함수를 보여주는 Python 코드 편집기의 스크린샷. 이 함수는 두 개의 문자열 인수인 데이터 세트와 파일 이름을 사용하고 문자열을 반환합니다. 독스트링에 따르면 그 목적은 데이터세트에서 파일을 확인하고 파일이 하나만 발견되었음을 확인하는 것입니다. 이 코드는 os.path 및 glob을 사용하여 파일을 찾습니다. path = os.path.join(dat... dat 아래에 오류가 있는 강조 표시된 줄이 있습니다. 이는 변수 이름 오타(데이터 세트 대신 dat)를 나타냅니다. 여러 개의 빨간색 밑줄은 코드의 구문 또는 참조 오류를 나타냅니다.

LLM 심사위원 채점: 실행 기반 평가로 시작하는 동안 여기에는 단점이 있습니다. 코드가 컴파일되는지 여부만 알려주고 결과가 항상 개발자 기본 설정과 일치하지는 않습니다. 가능한 최상의 결과를 보장하기 위해 우리는 독립적인 LLM을 운영하여 세 가지 축에 걸쳐 완료 점수를 매깁니다.

  • 품질: 구문 유효성, 중복/중복, 형식 및 스타일 일관성을 보장합니다.
  • 관련성: 관련 코드에 집중하고 환각과 과도한 접근을 피하세요.
  • 유용성: 수동 작업을 줄이고 오래되거나 더 이상 사용되지 않는 API를 피하세요.

2) 제작 전 평가: 정성적 애그푸드

다음 단계에는 내부 개발자 및 파트너와 협력하여 실제 워크플로에서 모델을 나란히 테스트하는 작업이 포함됩니다(후자를 수행하기 위해 Copilot의 모델 선택기를 통해 개발자에게 미리 보기 모델을 공개했습니다). 가독성, 신뢰도, ‘맛’에 대한 체계적인 피드백을 수집합니다. 이 프로세스에는 언어 전문가와 협력하여 전반적인 완성 품질을 향상시키는 작업이 포함됩니다. 이는 독특합니다. 실행 기반 테스트, LLM 기반 평가, Dogfood 테스트 및 A/B 테스트가 일반적이지만 언어별 평가가 품질 및 스타일 선호도에 따라 더 나은 결과로 이어진다는 것을 알았습니다.

3) 생산 기반 평가: A/B 테스트

궁극적으로, 귀하와 같은 개발자의 실제 경험이 가장 중요합니다. 허용 및 보유 문자, 수락률, 완료 표시 비율, 첫 번째 토큰까지 소요되는 시간, 대기 시간 및 기타 여러 지표를 사용하여 개선 사항을 측정합니다. 실제 개발자 작업 부하에서 통계적으로 중요한 개선이 유지되는 경우에만 출시합니다.

새로운 Copilot 완료 모델을 훈련한 방법

중간 훈련

최신 코드베이스는 최신 API를 사용합니다. 미세 조정에 앞서 우리는 거의 1천만 개에 달하는 리포지토리와 600개 이상의 프로그래밍 언어가 포함된 현대적이고 관용적이며 공용이며 내부 코드로 구성된 중복 제거된 엄선된 코퍼스를 사용하여 중간 학습을 통해 코드별 기본 모델을 구축합니다. (중간 훈련은 기본 모델이 매우 크고 다양한 코퍼스에 대해 사전 훈련된 후 최종 미세 조정 또는 명령 조정을 거치기 전의 단계를 나타냅니다.)

이는 동작, 새로운 언어 구문 및 최신 API 버전이 모델에서 활용되도록 하는 중요한 단계입니다. 그런 다음 감독된 벌금을 사용합니다. 다음 토큰 예측 이상의 목표(입력 및 문서 문자열/함수 쌍 포함)를 혼합하면서 조정 및 강화 학습을 수행하므로 모델은 다음 토큰 예측뿐만 아니라 구조, 이름 지정 및 의도를 학습합니다. 이를 통해 기본 모델을 코드에 유연하고 스타일이 일관되며 상황에 맞게 인식할 수 있으며 감독된 미세 조정을 통해 보다 목표화된 미세 조정을 수행할 수 있습니다.

감독된 미세 조정

최신 범용 채팅 모델은 자연어에서 코드를 생성하는 데에는 적합하지만 FIM(Fill-in-the-Middle) 코드 완성에서는 성능이 낮습니다. 실제로 채팅 모델에서는 커서가 잘못 정렬된 삽입, 커서 앞의 코드 중복(접두사), 커서 뒤의 코드 덮어쓰기(접미사)가 발생합니다.

미세 조정된 동작으로 전환하면서 우리는 훌륭한 FIM 엔진처럼 작동하도록 합성 미세 조정을 통해 완성에 특화된 모델을 훈련했습니다. 실제로 이는 다음을 향상시킵니다.

  • 접두사/접미사 인식: 접미사를 짓밟지 않고 토큰 사이의 정확한 삽입, 중간 줄 연속, 전체 줄 완성 및 여러 줄 블록 완성.
  • 형식 충실도: 로컬 스타일(들여쓰기, 가져오기, 독스트링)을 존중하고 접두사 중복을 피하세요.

그 결과 FIM 성능이 크게 향상되었습니다. 예를 들어, 다음은 OpenAI의 HumanEval Infilling Benchmarks에서 최신 완성 모델을 GPT-4.1-mini와 비교하는 벤치마크입니다.

두 가지 AI 모델에 대한 HumanEval Infilling 벤치마크를 보여주는 차트입니다. 여기에는 Copilot Completions라는 GitHub의 사용자 지정 모델과 OpenAI의 GPT-4o-mini가 포함됩니다. 평가에서는 Copilot Completions 모델에 대한 단일 라인, 다중 라인, 무작위 범위 및 무작위 범위 조명 테스트에서 우수한 성능을 보여줍니다.

강화 학습

마지막으로, 우리는 사용자 정의 강화 학습 알고리즘을 사용하여 보상과 처벌을 통해 모델을 교육하여 세 가지 축을 따라 실제 개발자 시나리오에서 코드 제안을 유용하게 만드는 요소를 내부화했습니다.

  • 품질: 프로젝트 스타일(들여쓰기, 가져오기, 헤더)을 따르는 유효한 구문의 컴파일 가능한 코드입니다.
  • 관련성: 주변 상황과 파일의 의도를 존중하는 작업 제안입니다.
  • 유용성: 수동 작업을 줄이고 최신 API를 선호하는 제안입니다.

이 두 가지를 함께 사용하면 장황하거나 표면적으로 도움이 되는 대신 커서 위치에서 정확하고 관련성이 높으며 실제로 유용한 완성이 만들어집니다.

우리가 배운 것

프로그래밍 언어 전문가와 이야기를 나누고 프롬프트 기반의 성공을 거둔 후 접근 방식에서 가장 중요한 교훈 중 하나는 C++ 헤더 파일과 같은 관련 파일을 훈련 데이터에 추가하는 것이었습니다. 이 외에도 우리는 세 가지 주요 교훈을 얻었습니다.

  • 신중하게 보상하세요: 더 긴 완료를 위해 과도하게 최적화된 초기 강화 학습 버전으로 “보상 해킹” 형태로 댓글이 너무 많이 추가되었습니다. 이 문제를 완화하기 위해 우리는 완료를 간결하게 유지하고 불필요한 설명을 처벌하는 동시에 작업을 진행하는 데 집중하기 위해 설명 가드레일을 도입했습니다.
  • 측정항목의 중요성: 수용률과 같은 지표에 과도하게 집중하면 서류상으로는 좋아 보이는 경험을 얻을 수 있지만 개발자가 만족할 수는 없습니다. 따라서 실제 영향을 미치는 여러 지표를 모니터링하여 성능을 평가하는 것이 중요합니다.
  • 실제 사용을 위한 교육: 우리는 합성 미세 조정 데이터를 실제 사용과 일치시키고 이에 따라 훈련을 조정합니다. 이는 문제가 있는 패턴을 식별하고 교육을 통해 제거하여 실제 결과를 개선하는 데 도움이 됩니다.

다음은 무엇입니까?

우리는 다음을 통해 계속해서 Copilot 완성의 한계를 뛰어넘고 있습니다.

  • 도메인별 조각(예: 게임 엔진, 금융, ERP)으로 확장합니다.
  • 빌드/테스트 성공, 의미론적 유용성(부풀림 없이 사용자의 의도를 발전시키는 편집), 최신 관용적 라이브러리 및 패턴에 대한 API 현대성 선호도를 위한 보상 기능을 개선합니다. 이는 완료 동작을 더욱 정확하게 형성하는 데 도움이 됩니다.
  • 모든 개발자 환경에서 더 빠르고 저렴하며 고품질의 완성을 촉진합니다.

더 빠르고 스마트한 코드 완성을 직접 경험해 보세요. VS Code에서 GitHub Copilot 사용해 보기 >

감사의 말

첫째, 지속적으로 피드백을 제공하고 GitHub Copilot을 통해 가능한 최고의 경험을 제공할 수 있도록 격려해 주신 개발자 커뮤니티에 깊은 감사를 드립니다. 또한 교육 데이터를 선별하고 교육 파이프라인, 평가 제품군, 클라이언트 및 서비스 스택을 구축한 GitHub 및 Microsoft의 연구원, 엔지니어, 제품 관리자, 디자이너에게 큰 감사를 드립니다. 원활한 모델 출시를 위해 GitHub Copilot 제품 및 엔지니어링 팀에 감사드립니다.

작성자:

푸성우

저는 Microsoft CoreAI의 파트너 응용 과학 관리자로서 ML 및 AI를 통해 개발자 생산성을 눈에 띄게 향상시키는 응용 연구 팀을 이끌고 있습니다. 우리는 더 심층적인 상황 인식 지원을 위해 모델을 지속적으로 개선하고 상황 내 학습을 적용하여 완료, 채팅, 코드 검토 및 에이전트 워크플로에서 GitHub Copilot을 발전시킵니다.

존 모겐슨

저명한 소프트웨어 엔지니어, GitHub Copilot

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다