News Feed

AI 코딩 툴의 환각을 줄이는 방법 8가지

컨텐츠 정보

  • 조회 696

본문

안드로이드도 꿈을 꾸지만, 그 꿈은 종종 기이하다. 초기의 생성형 AI는 여덟 개의 손가락을 가진 사람의 손과 접착제로 만든 피자 반죽 레시피와 같은 황당한 결과물을 만들곤 했다. 현재 개발자들은 AI 코딩 툴에서 이런 환각 현상을 발견하고 있다.

마이크로소프트의 선임 엔지니어 미틸레시 라마스와미는 “코딩 툴에서 AI 환각이 발생하는 이유는 모델의 확률적 특성 때문이다. 결정론적 논리보다는 통계적 가능성에 기반해 출력을 생성한다”라고 설명했다. 접착제로 만든 피자 레시피처럼 때때로 이런 환각은 통제를 벗어나 출력된다.

오늘날 AI 코딩 툴은 빠른 속도로 보편화하고 있다. 스택 오버플로우(Stack Overflow)의 2024년 5월 개발자 설문조사에 따르면, 응답자 62%가 사용하고 있다. 그렇다면 AI 환각이 코드를 망치는 것을 어떻게 방지할 수 있을까? AI 코딩 툴을 활용하는 개발자와 기술 업계 베테랑에게 팁을 물었다.

AI 환각이 코드를 오염시키는 방법

매일 AI 툴을 사용하는 마이크로소프트의 라마스와미는 “컴파일되지 않는 코드, 지나치게 복잡하거나 비효율적인 코드, 자체적으로 모순되거나 애매한 동작을 하는 함수나 알고리즘” 등이 AI 환각의 대표적인 사례라고 설명했다. 또한 “AI가 존재하지 않는 함수를 만들어내는 경우도 있다. 생성된 코드가 문서를 참조하더라도 실제 코드의 동작과 문서에서 설명하는 내용이 일치하지 않는 경우도 있다”라고 말했다.

AI 개발사 헤라헤븐닷에이아이(HeraHaven.ai) 설립자 코므니노스 차치파파스는 “우리는 자바스크립트 백엔드에서 사용자 ID를 기반으로 크레딧을 차감하는 함수를 사용하고 있다. 이 함수는 ID 값을 포함하는 객체를 매개변수로 기대했지만, 코딩 툴은 단순히 ID 값만 매개변수로 전달하도록 코드를 생성했다”라고 말했다.

차치파파스는 자바스크립트처럼 느슨한 타입을 사용하는 언어에서는 이런 문제가 언어 파서에서 쉽게 걸러지지 않는다고 지적하며 “우리가 경험한 오류는 스테이징 환경을 망가뜨렸지만 다행히 프로덕션에 배포되기 전에 발견됐다”라고 덧붙였다.

이런 코드가 어떻게 프로덕션 단계까지 넘어갈까?

세일즈포스에서 AI 플랫폼 조직을 이끄는 모노짓 바너지는 AI 코딩 툴이 생성하는 코드가 “그럴듯해 보이지만 실제로는 잘못되었거나 작동하지 않는 경우가 많다”라고 지적했다. SAS의 수석 소프트웨어 개발자 브렛 스미스는 경험이 적은 개발자가 AI 툴의 자신감 넘치는 출력을 신뢰하는 경향이 높어 결함 있는 코드가 프로덕션으로 넘어갈 위험이 크다고 지적했다.

잘못된 AI 코드의 결과는 심각할 수 있다. 많은 소프트웨어 기업이 보안 취약점과 컴플라이언스 문제를 가장 우려하지만, 즉각적으로 드러나지 않는 문제도 존재한다. AI가 생성한 결함 있는 코드는 기술 부채(technical debt)를 증가시키며 코딩 툴이 목표로 하는 ‘효율성 향상’을 오히려 저해할 수 있다. 마이크로소프트의 라마스와미는 “AI 환각으로 생성된 코드는 종종 비효율적인 설계나 해킹으로 이어진다. 결국 코드 수정이 필요해 장기적으로 유지보수 비용을 증가시킨다”라고 지적했다.

필자가 인터뷰한 개발자들은 AI가 생성한 코드의 정확성과 보안을 확보하는 다양한 방법을 제시했다. 이들의 조언은 크게 2가지 범주로 나뉜다. 코드 환각 발생 가능성을 줄이는 것과 이미 생성된 코드에서 환각을 찾아내는 방법이다.

코드에서 AI 환각을 줄이는 방법

AI 환각을 아예 경험하지 않는 것이 가장 이상적이지만, 현재의 기술 수준에서는 완전히 피하는 것은 어렵다. 하지만 다음과 같은 예방 조치를 따르면 환각 현상을 줄일 수 있다.

명확하고 상세한 프롬프트 작성

“쓰레기가 들어가면 쓰레기가 나온다(garbage in, garbage out)”라는 컴퓨터 과학 분야의 오랜 격언은 LLM에도 적용된다. 자동 완성 기능이 아닌 프롬프트를 통해 코드를 생성할 때 특히 그렇다. 많은 전문가는 개발자가 프롬프트 엔지니어링을 제대로 익히는 것이 중요하다고 강조했다. 컨플루언트(Confluent)의 기술 전략 책임자 앤드루 셀러스는 “가급적 한정된 범위의 질문을 던지고, 결과를 비판적으로 검토하는 것이 최선이다. 이런 툴이 사용하는 데이터를 보면 질문 범위가 좁을수록 출력이 더 정확한 경향이 있다. 작은 코드 블록을 자주 검토하면 오류를 더 잘 포착할 수 있다”라고 조언했다.

참고 자료 요청

챗GPT 같은 LLM은 학술 논문이나 법률 문서에서 존재하지 않는 출처를 생성하는 문제로 악명 높다. 하지만 AI 코딩 툴은 이 부분에서 상당한 발전을 이뤘다. 세일즈포스의 바너지는 “현재 많은 모델이 출처 제공 기능을 지원한다. 개발자는 가능한 한 출처나 API 문서를 함께 제공하도록 요청하는 것이 환각 최소화에 도움이 된다”라고 말했다.

최신 정보 학습 여 확인

대부분의 생성형 AI 챗봇은 어제저녁 어떤 야구팀이 이겼는지 알지 못한다. 마찬가지로 소프트웨어의 최신 업데이트를 따라가는 데도 한계가 있다. 드리믹스(Dreamix) CEO 스토얀 미토프는 “AI 툴이 환각을 일으키거나 편향된 출력을 제공할 가능성을 예측하는 한 가지 방법은 해당 모델의 지식 단절(knowledge cut-off)을 확인하는 것이다. 최신 라이브러리나 프레임워크를 사용할 계획이라면 AI 툴이 해당 정보를 알지 못할 가능성이 높고, 그럴 경우 생성된 코드가 오류를 포함할 확률이 상당히 높다”라고 말했다.

원하는 방식으로 작동하도록 학습

이노베이티브 솔루션즈(Innovative Solutions)의 CTO 트래비스 렐은 생성형 AI가 제대로 작동하기 위해 가장 중요한 것이 컨텍스트라고 강조했다. 렐은 “원하는 결과와 작업 방식에 대한 좋은 예시를 제공해야 한다. 특정 패턴을 유지하도록 지시하거나, 일관된 방법을 사용하도록 반복해서 상기시켜야 한다. 그렇지 않으면 AI는 새로운 방식이나 다른 접근법을 만들어낼 위험이 있다”라고 지적했다. 이를 놓치면 코드에 예상치 못한 안티패턴(anti-pattern)이 스며드는 미묘한 유형의 환각이 발생할 수 있다. 예를 들어 API 호출 시 특정 작업 방식을 사용해야 하지만, LLM은 전혀 다른 방식으로 수행할 수 있다. 기술적으로는 문제가 없더라도 기존 패턴을 따르지 않으면 코드 일관성이 깨지고 표준과 어긋나게 된다.

이 개념을 논리적으로 확장한 것이 검색 증강 생성(Retrieval-Augmented Generation, RAG)이다. RAG는 모델이 사용자가 지정한 ‘신뢰할 수 있는 정보 원천’을 참조해 코드를 생성하는 방식이다. 이 정보 원천은 사용자 맞춤 코드나 사용자가 검증한 코드가 될 수 있다. 드리믹스의 미토프는 “그라운딩(grounding, 모델을 새 데이터에 연결하는 작업)은 AI 출력을 신뢰할 수 있는 데이터 소스와 비교해 잘못된 정보가 생성된 가능성을 줄인다. RAG는 가장 효과적인 그라운딩 방법 중 하나다. 외부 데이터 소스, 내부 코드베이스, API 레퍼런스를 실시간으로 활용해 LLM 출력을 개선한다”라고 설명했다.

현재 사용할 수 있는 많은 코딩 어시스턴트는 이미 RAG 기능을 통합하고 있다. 예를 들어, 커서(Cursor)의 AI 코딩 어시스턴트에는 @codebase라는 RAG 기능이 포함돼 있다. 만약 자체적인 내부 코드베이스를 구축해 LLM이 이를 참조하도록 만들고 싶다면, 해당 데이터를 벡터 데이터베이스에 저장해야 한다. 세일즈포스의 바너지는 가장 널리 사용되는 벡터 데이터베이스 중 하나로 크로마(Chroma)를 추천했다.

코드에서 AI 환각을 찾는 방법

이런 모든 조치에도 불구하고 AI 코딩 툴은 여전히 실수할 수 있다. 다행히도 코드에서 발생하는 환각은 일반적인 텍스트 생성 사례에서보다 상대적으로 발견하기 쉽다. 코드는 실행할 수 있으며, 테스트할 수 있기 때문이다. 이노베이티브 솔루션즈의 렐은 “코딩은 주관적이지 않다. 코드가 잘못되면 작동하지 않는다”라고 말했다.

AI를 사용한 코드 평가

믿기 어렵겠지만 AI 코딩 툴은 AI가 생성한 코드를 평가해 환각을 발견할 수 있다. 엠패시 퍼스트 미디어(Empathy First Media) CEO 다니엘 린치는 “코드에 대한 지원 문서를 작성한 후 AI가 해당 코드가 주어진 요구 사항과 의도된 사용례를 충족하는지 평가하도록 요청하라”라고 조언했다.

AI 툴은 다른 AI 툴의 출력 검증 그 이상을 할 수 있다. 헤라헤븐의 차치파파스는 “LLM은 같은 입력에 대해 서로 다른 품질의 다양한 응답을 생성하는 문제가 있다. 이를 해결하려면 테스트 시점에서 연산을 확장해야 한다”라고 말했다. 구현하는 방법은 여러 가지가 있지만, 가장 간단한 방법은 LLM에 동일한 질문을 여러 번 쿼리한 후, 규모가 더 작은 ‘검증용’ AI 모델을 활용해 최적의 답변을 선택하는 방식이다. 조금 더 정교한 방법으로는 여러 개의 응답을 클러스터링한 후 가장 큰 클러스터에서 하나를 선택하는 방식이다. 후자의 접근 방식에서는 더 많은 암묵적 ‘투표’를 받은 답변을 선택함으로써 신뢰도를 높이는 효과를 기대할 수 있다.

인간의 개입과 전문성 유지

대부분 전문가는 기계의 도움을 받더라도 AI 환각에 대한 최종 방어선은 여전히 사람 개발자라고 보고 있다. 가까운 미래에도 코딩 과정에서 사람의 개입이 필수적일 것이라고 전문가들은 입을 보았다. 마이크로소프트 라마스와미는 “AI는 가이드로 활용해야지 진실의 원천으로 여기면 안 된다. AI 생성 코드를 인간의 전문성을 대체하는 것이 아니라 제안으로 받아들여야 한다”라고 강조했다.

전문성에는 단순히 프로그래밍 전반에 대한 지식뿐만 아니라 자신이 다루는 애플리케이션의 코드베이스에 대한 깊은 이해도 포함된다. 렐은 “코드베이스에 익숙하지 않으면 AI 환각을 발견하기 어려울 때가 있다”라고 지적했다. 예를 들어 특정 메서드나 코드 패턴에서 벗어나는 부분을 감지하려면 코드베이스에 대한 실무 경험이 필수적이다.

코드 테스트 및 검토

다행히 IDE 툴부터 유닛 테스트까지 잘 운영되는 개발 조직에서 사람의 실수를 잡아내는 기술과 방법은 AI 환각도 감지할 수 있다. 컨플루언트의 셀러스는 “AI가 생성한 코드라도 사람이 작성한 것처럼 풀 리퀘스트와 코드 리뷰를 계속해야 한다. 개발자들이 CD(Continuous Deployment)를 위해 AI 툴을 활용해 자동화를 늘리는 것은 매력적인 선택이지만, 자동화를 확대할수록 QA 통제에 우선순위를 두는 것이 매우 중요하다”라고 강조했다.

SAS의 스미스는 “개발 과정 전반에 걸쳐 좋은 린팅 툴과 SAST(Static Application Security Testing) 스캐너를 활용해야 한다. IDE 플러그인, CI(Continuous Integration) 연동, 풀 리퀘스트 검토는 AI 환각이 프로덕션에 반영되지 않도록 하기 위한 최소한의 조치”라고 말했다.

개발 라이프사이클 동안 모든 코드가 유닛 테스트를 거치는 성숙한 데브옵스 파이프라인도 필요하다. 세일즈포스의 바너지는 “데브옵스 파이프라인은 테스트와 빌드를 통과한 코드만 스테이징과 프로덕션 단계로 승격시킨다. 또한 CD를 통해 장애가 발생했을 때 신속하게 롤백할 수 있어야 한다”라고 강조했다.

AI 생성 코드 하이라이트

AWS의 머신러닝 엔지니어 데반시 아가르왈은 “나만의 작은 작은 실험”이라고 부르는 기법을 추천했다. 코드 리뷰 UI에서 AI가 생성한 코드 부분을 명확하게 표시하는 방식이다. 아가르왈은 “수백 줄의 유닛 테스트 코드가 리뷰어의 코멘트 없이 승인되는 경우가 종종 있다. 이런 유닛 테스트는 나를 포함해 많은 개발자가 AI를 활용하는 대표적인 사례다. AI가 생성한 코드임을 명확하게 표시하면 리뷰어는 더 신중하게 검토하는 경향이 있다”라고 말했다. 이는 AI 환각 포착에 도움이 될 뿐만 아니라 “팀원 모두에게 훌륭한 학습 기회가 된다. AI는 때때로 놀라운 성능을 발휘할 때가 있는데, 이를 보고 배워 직접 적용하고 싶어지는 경우”도 있다.

운전석에는 언제나 개발자를

생성형 AI는 결국 하나의 도구 그 이상도, 이하도 아니다. 다른 모든 도구와 마찬가지로 고유한 특성이 있다. AI가 프로그래밍의 일부 측면을 변화시키고 개발자의 생산성을 높일 수는 있지만, 환각 문제로 인해 가까운 미래에도 주도권은 여전히 사람이 쥐고 있어야 한다.

이노베이티브 솔루션즈의 렐은 “코딩은 점차 QA와 제품 정의 중심 작업이 될 것이다. 개발자의 핵심 목표는 코드 패턴을 이해하고 테스트 방법을 익히며, 코드가 해결해야 할 비즈니스 목표를 명확하게 정의하는 것”이라고 강조했다.
dl-itworldkorea@foundryco.com

관련자료

댓글 0
등록된 댓글이 없습니다.