|
생성형 AI 모델 기반의 코딩 어시스턴트는 자연어와 코드를 학습한 AI 모델을 활용하여 개발 생산성을 높여줍니다. 대량의 학습 데이터를 통해 패턴을 파악하고 이를 기반으로 코드를 생성하거나 분석할 수 있는 코딩 어시스턴트의 특성과 설계 배경, 한계점, 한계를 보완한 신기능들을 소개합니다. |
들어가며
안녕하세요, 삼성리서치 SE팀의 양준모라고 합니다. 이번 블로그 포스팅에서는 code.i라는 삼성의 AI 코딩 어시스턴트를 개발하며 개발자들의 업무 효율성 개선을 위해 고민했던 디자인 선택 및 설계 과정을 공유하고자 합니다.
AI 코딩 어시스턴트의 필요성은 요즘 이미 많은 분들이 공감하고 계신 것 같습니다. 자연어와 코드를 학습한 언어모델을 활용해 소프트웨어 개발 생산성을 높여주는 AI 코딩 어시스턴트는 현재 개발자를 보조하며 필요한 정보를 제공하는 수준입니다. 하지만 미래에는 더욱 발전된 AI 코딩 어시스턴트가 개발 프로세스를 크게 단축시킬 것으로 예상됩니다.
AI 코딩 어시스턴트 이해
AI 코딩 어시스턴트에 대해 설명하기 전 언어모델에 대해 짚고 넘어가야 할 것 같습니다. AI 코딩 어시스턴트는 자연어와 코드를 학습한 언어모델을 활용합니다.
그림 1. 생성형 언어 모델의 동작구조
언어 모델은 트랜스포머 구조를 바탕으로 대량의 말뭉치 데이터를 학습해 자연어 처리 작업을 수행합니다. 언어 모델을 활용해 코드를 생성하는 것은 주어진 코드 맥락에서 적절한 코드 라인을 생성하는 과정입니다. 그러나 이러한 언어 모델에는 한계가 존재합니다. 무엇보다, 낮은 품질의 질문이 들어오면 답변 역시 품질이 낮아질 가능성이 큽니다. 이 문제를 해결하기 위해 상황 맞춤형 프롬프트 최적화 작업이 중요합니다. 또한 모델이 알지 못하는 새로운 정보가 들어올 경우 검색을 통해 모르는 부분을 보충해주어야 합니다.
code.i에서는 이러한 한계를 감안해 개발자에게 필요한 9가지 주요 시나리오를 고려한 태스크별 특화 프롬프트를 설계하였으며, 모델이 알지 못하는 질문 관련 문서나 코드 분석 정보 등을 함께 제공하여 추론의 정확도를 높였습니다.
AI 코딩 어시스턴트 설계
이러한 언어모델의 한계를 보완하면서 개발자에게 도움이 되는 기능을 만들기 위해 AI 코딩 어시스턴트 개발 시 디자인 선택을 신중하게 고민했습니다. 그 중에서도 code.i의 개선된 프롬프트 구성, RAG 프레임워크, 단위 테스트 생성 기능, 코드 리뷰 자동화 기능에 대해 알아보겠습니다.
그림 2. code.i의 기본/맥락 정보 프롬프팅
1. code.i의 프롬프트는 기본 프롬프트와 사용자 입력에 따른 맥락 정보 , 태스크별 코드/문서/예제 등을 제공합니다. 기본 응답 요구사항 및 제약이 정의된 시스템 프롬프트와 단위 테스트, 문서 생성 등을 지원하는 특화된 프롬프트가 존재합니다. 또한 사용자 질의를 분석해 관련된 코드나 문서 정보, Few-shot 예제 등을 제공하며, 이전 대화 내용이 포함된 사용자 입력을 맥락 정보에 반영합니다. 각 태스크 시나리오별로 우선 순위에 따라 정보를 구성하는 프롬프트를 설계했습니다.
그림 3. code.i의 RAG 프레임워크 구성
2. code.i에 도입된 RAG(Retrieval-Augmented Generation: 검색 증강 생성) 기능은 언어모델의 한계를 극복하는 데 중점을 두고 있습니다. 언어모델은 학습 이후 발생한 새로운 정보나 특정 도메인의 지식을 알지 못하므로 부정확한 답변을 제공하는 경우가 많습니다. RAG는 이런 문제를 해결하기 위해 필요한 지식을 모델 외부에서 검색하고 활용합니다.
code.i의 RAG 프레임워크는 벡터 DB와 연동되어 있어 모델이 학습하지 못한 최신 정보를 임베딩해 놓습니다. 이렇게 함으로써 사용자의 질문에 따라 필요한 정보를 검색하여 모델의 답변이 보정될 수 있습니다. 검색을 통해 증강된 입력을 활용하여 모델이 학습하지 못한 정보를 제공함으로써 좀더 정확한 추론 결과를 기대할 수 있습니다.
그림 4. 단위 테스트 생성 프롬프트 구성
3. 또한 code.i의 단위 테스트 생성 기능이 강화되었습니다. 이는 개발자들의 가장 큰 요구사항 중 하나였는데요. 효과적인 단위 테스트 생성을 위해 AI를 기반으로 테스트 전문가의 역할을 수행하도록 Few-shot 예제 등을 활용하여 프롬프트를 보강했고, 코드 구조 분석을 통해 맥락 정보를 제공하여 더욱 정확한 단위 테스트가 이루어지도록 하였습니다.
예를 들어, 'Car' 클래스의 'check_engine' 함수를 테스트한다고 가정해보겠습니다. 만약 'Engine' 객체 관련 정보가 제공되지 않는다면 모델이 해당 함수에 대한 단위 테스트를 제대로 생성하지 못할 것입니다. 따라서 우리는 간단한 코드 분석을 통해 참조되는 객체의 타입 정보를 파악하고 이를 맥락 정보로 활용합니다. 이러한 방식을 통해 모델에 추가적인 코드 정보를 제공하여 답변 품질을 개선합니다.
4. 마지막으로, 코드 리뷰 자동화 기능이 있습니다. 코드 리뷰는 작성된 코드를 병합하고 배포하기 전에 동료에게 평가받는 과정으로, 이해, 검토, 수정 제안 단계로 이루어집니다. 여기에는 CRB.i라는 서비스가 사용됩니다. CRB.i 서비스는 코드 리뷰에 필요한 정보를 자동으로 추출하고, API 오사용을 감지하며, 리팩토링, 단위 테스트 생성, 잠재적 결함 수정을 제안하는 기능을 제공합니다. 코드 리뷰 자동화는 코드 변경점을 분석하고, 관련된 정보를 검색하며, 생성된 결과로 리뷰를 생성하는 단계로 이루어집니다.
code.i 개발에 활용하기
지금까지 code.i의 디자인 선택과 설계에 대해 알아보았는데요. 이제 개발자 입장에서 개발에 활용하는 과정을 소개하겠습니다.
우선, 코드 자동 완성 기능은 코드 설명과 함수 시그니처를 제공하거나 실시간 자동 완성을 이용해 중간에도 코드를 추가할 수 있습니다. 또한 인터랙티브 생성 모드로 다양한 코드 생성 추천을 받을 수 있습니다.
그림 5. code.i의 RAG를 활용한 챗 생성
챗 생성은 자연어를 이용한 질의응답이 가능하며, 챗 히스토리가 제공되어 이전 대화 기록을 확인하거나 이어서 대화할 수 있습니다. 학습하지 않은 데이터에 대한 답변에는 한계가 있지만 이 경우 RAG 기능을 활용할 수 있습니다. RAG 기능은 API, Feature, Confluence 등과 같은 사내 문서와 연동해 특정 질의를 통한 문서 검색 후 그에 따른 답변을 제공합니다.
단위 테스트 생성 기능을 통해 사용자가 원하는 클래스나 함수를 대상으로 테스트를 생성하고 다양한 테스트 입력을 지정할 수 있습니다. 추가적으로 레퍼런스 코드를 제공해 모델을 참고하게 할 수도 있습니다. API 문서 작성 역시 code.i를 통해 자동으로 지원되며, 클래스나 함수 단위로 문서 생성이 가능합니다. 코드 리뷰는 Github 등과 같은 리뷰 플랫폼에서 이루어지며, CRB.i를 사용해 코드 리뷰 요청에 대한 변경점 요약과 Review Description을 생성합니다. 또한 API 오용 감지 서비스를 통해 잘못 사용된 API 사례를 분석합니다.
마치며
이렇게 삼성의 AI 코딩 어시스턴트는 강화된 프롬프트와 RAG 기법 등으로 소프트웨어 개발의 주요 활동을 지능화하고 있습니다. 저희는 이러한 기능들을 통해서 개발자들이 더 품질 높고 생산성 높은 활동을 할 수 있게 되기를 기대합니다.
지금까지 삼성 AI 코딩 어시스턴트 code.i 개발기를 들려드렸는데요. 코딩 어시스턴트를 사용하거나 이해하고자 하시는 많은 개발자 분들에게 도움이 되었으면 합니다.
감사합니다.
|
|
