AI는 전체 소프트웨어 개발 라이프사이클에서 코드를 생성, 최적화 및 변환하여 애플리케이션 개발을 혁신할 수 있습니다. 생성형 AI를 도입하면 일관된 소프트웨어 개발, 개발자의 창의성 활용, 개발자 기술 향상으로 이어질 수 있습니다. 예를 들면 다음과 같습니다.
애플리케이션 개발에 생성형 AI를 적용하면 다음과 같은 주요 잠재적 이점이 있습니다.
생성형 AI를 소프트웨어의 코드 검토, 리팩터링, 기업 코딩 표준 적용에 활용하면 코드를 작성한 개발자가 누구인지와 관계없이 보다 일관된 소프트웨어를 만들 수 있으며, 예를 들어, 반복적으로 발생하는 문제를 해결하는 공통 접근 방식, 공통 코드 구조, 자체 설명형 코드 등이 이에 해당합니다. 이로 인해 유지 관리자가 코드의 각 부분 구조나 특성을 먼저 이해해야 할 필요가 줄어들어 애플리케이션을 더 쉽게 문제 해결하고 유지 관리할 수 있습니다.
다른 분야와 마찬가지로 생성형 AI는 단순하거나 반복적인 코드 작성 또는 문제를 일으키는 버그의 원인 식별과 같은 낮은 가치의 작업에서 애플리케이션 개발자를 해방시킬 잠재력이 있습니다. 더 높은 가치의 작업에 집중할 시간이 늘어나면 개발자는 더 짧은 개발 주기, 소프트웨어 릴리스당 더 많은 기능, 더 작고 더 빈번한 변경을 가능하게 할 수 있습니다.
마지막으로 생성형 AI를 애플리케이션 개발에 적용하면 개발자의 역량을 강화하여 주니어 개발자가 시니어 또는 전문가 수준의 작업을 수행할 수 있게 합니다. 시니어 개발자는 릴리스 주기에 모델 학습을 포함하여 코드가 개선되는 과정에서 선도적인 개발 관행을 반영할 수 있습니다. 생성형 AI는 주니어 인력에게 전문가 멘토 역할을 하여 시니어 개발자가 다른 작업에 집중할 수 있도록 하고 전체 개발 팀의 역량 수준을 향상시킬 수 있습니다.
생성형 AI는 애플리케이션 개발에서 여러 가지 주요 사용 사례에 적용될 수 있습니다. Llama 2와 같은 많은 범용 모델은 여러 현대 프로그래밍 언어로 작성된 애플리케이션 코드를 기반으로 학습되었으며 코드 생성을 위해 조정된 모델도 사용할 수 있습니다.
생성형 AI의 이점을 얻을 수 있는 사용 사례에는 다음이 포함됩니다.
각 사용 사례는 아래에서 설명합니다.
대규모 언어 모델(LLM)의 기본 텍스트 생성 기능을 활용하면 자연어 프롬프트로부터 새로운 코드를 생성할 수 있습니다. 예를 들어 개발자는 "고객 테이블에서 고객의 이름과 성을 조회하는 SQL 쿼리를 작성하라"라는 프롬프트를 제출하고 그에 대한 SQL 쿼리를 받을 수 있습니다.
코드 생성에 LLM을 사용하면 주니어 개발자나 비개발자의 애플리케이션 개발 역량을 크게 강화할 수 있지만 요구되는 결과가 더 복잡해지거나 프롬프트에 필요한 세부 수준이 생성될 코드에 가까워질수록 효용이 빠르게 감소하는 지점에 도달할 수 있습니다.
코드를 더 높은 성능과 더 나은 구조로 개선하는 과정인 코드 최적화와 리팩터링은 LLM의 두 가지 기능인 텍스트 생성과 텍스트 요약의 결합으로 볼 수 있습니다. 범용 또는 조정된 LLM을 사용하면 개발자는 코드의 성능을 높이거나 중복 코드를 제거하도록 특정 코드 조각을 최적화하거나 재구성하도록 프롬프트를 제공할 수 있습니다.
LLM은 모델의 컨텍스트 창에 들어갈 수 있는 비교적 작은 코드 조각의 최적화와 리팩터링에는 잘 작동하지만 더 큰 코드 조각이나 전체 소프트웨어 시스템에서 적절한 결과를 얻기 위해서는 전체 소프트웨어 애플리케이션의 메타데이터를 유지하는 더 큰 솔루션이 필요합니다.
코드 최적화와 마찬가지로 LLM은 함수 및 변수 이름 지정, 코드 구조, 기업 코딩 규칙과 같은 영역에서 기업 코딩 표준을 적용하고 준수하도록 하는 데 사용할 수 있습니다. 일반적으로 코드 검토 및 커밋 과정의 일부로 저장소 수준에서 적용되며, 기업 코딩 표준에 맞게 조정된 LLM은 제출된 코드를 기업 표준에 맞도록 변환할 수 있습니다. 이러한 표준에는 기업이 규제 기준을 준수하도록 돕는 보안 강화 규칙도 포함될 수 있습니다.
프로그래밍 언어도 다른 언어와 마찬가지이므로 LLM의 기본 텍스트 번역 기능을 활용하면 한 프로그래밍 언어로 작성된 소프트웨어를 다른 언어로 변환할 수 있으며, 예를 들어 C#을 Java로 변환할 수 있습니다.
코드 최적화와 마찬가지로 LLM만으로도 모델의 컨텍스트 창에 들어가는 작은 코드 조각을 변환하는 데는 잘 작동하지만 더 큰 코드 조각이나 전체 소프트웨어 시스템을 변환하려면 메타데이터와 기타 중요한 컨텍스트 정보를 유지하는 더 큰 솔루션이 필요합니다.
코드 변환 기능을 통해 생성형 AI는 COBOL 코드를 Java로 변환하는 것처럼 서로 다른 프로그래밍 언어 간 코드 변환도 지원할 수 있습니다. 이는 다중 언어 환경이나 시스템 마이그레이션 과정에서 특히 유용하며 개발자가 코드를 수동으로 다시 작성하는 데 필요한 시간과 노력을 절약할 수 있습니다.
코드 이해는 코드 생성에 대응되는 개념입니다. 자연어 프롬프트를 코드로 변환하는 대신 코드 설명은 코드 조각을 입력으로 받아 해당 코드의 기능을 자연어로 설명하는 내용을 생성합니다. 예를 들어 "이 Python 코드 조각의 기능을 설명하라"와 같은 프롬프트 뒤에 Python 코드 일부를 입력하면 코드의 목적에 대한 줄 단위 설명과 전체 요약을 생성할 수 있습니다.
이 기능은 모델에 "이 코드 조각이 실패하는 이유를 식별하라."라고 프롬프트를 입력하여 코드의 오류를 탐지하는 데에도 사용할 수 있으며, 이를 버그 탐색이라고 합니다.
API 및 라이브러리 선택은 검색 증강 생성(RAG)을 기업 API 및 소프트웨어 라이브러리 관리에 적용한 것입니다. 애플리케이션에 사용할 API를 찾는 개발자는 API 이름, 설명, 엔드포인트 등으로 구성된 기업 데이터베이스를 조회하는 RAG 프롬프트를 작성하여 "xyz를 수행하는 API가 있습니까?"와 같은 질문에 대한 답을 얻을 수 있습니다. API와 코드 라이브러리 설명이 높은 품질과 적절한 키워드로 유지되는 경우 이러한 애플리케이션은 일관된 응답을 제공하도록 조정할 수 있으며 이는 애플리케이션 개발 속도와 개발자 온보딩을 모두 향상시킬 수 있습니다.
아키텍트는 LLM을 활용한 애플리케이션 개발 솔루션을 설계할 때 여러 중요한 아키텍처 결정을 내려야 합니다.
모델이 면책 / 저작권 보호를 제공하는지, 그리고 생성된 코드가 라이선스 조건에 의해 제한되는지 어떻게 식별할 수 있는지 고려해야 합니다. 허용적 라이선스로 학습된 모델이라도 원 저작권자에게 출처를 명시해야 하는 조항과 같은 라이선스 조건에 의해 제한될 수 있습니다.
기업 코딩 표준을 적용하고 준수하도록 하는 솔루션을 설계하는 아키텍트는 LLM이 기업 표준을 이해하도록 조정하는 데 필요한 노력을 고려해야 하며 유사한 기능을 구현하는 데 린팅 툴과 같은 다른 방법이 더 적합한지에 대해서도 신중하게 판단해야 합니다.
자동 완성 방식의 코드 지원은 개발자의 사고 흐름을 방해하지 않도록 빠르게 응답해야 합니다. 아키텍트는 개발자 지원 모델의 배치와 연결성을 고려하여 이러한 지원이 개발자에게 도움이 되면서도 방해가 되지 않도록 해야 합니다.
대규모 언어 모델은 기능적으로 올바른 코드를 항상 생성한다고 보장할 수 없으며 특히 생성되거나 수정된 코드가 더 큰 소프트웨어 시스템에 통합되어야 하는 경우에는 더욱 그렇습니다. 이 문제에 대한 직접적인 해결책은 없지만(LLM이 발전하면서 그 영향은 점차 줄어들고 있음) 아키텍트는 LLM이 생성한 코드도 사람이 작성한 코드와 동일한 품질 보증 및 보안 검증 절차를 거쳐야 한다는 점을 인식해야 합니다.
일반적으로 사용 가능한 LLM은 Python, Javascript, C# 등 소수의 현대 프로그래밍 언어를 중심으로 학습되어 있습니다. 더 오래된 언어나 특수한 언어를 지원해야 하는 솔루션 아키텍트는 사용할 수 있는 모델 선택지가 제한적일 수 있으며 특정 요구 사항을 충족하기 위해 범용 모델을 크게 조정해야 할 수도 있습니다.