-
LLM을 사용한 코드 개선 실험
- 2023년 11월, OpenAI가 ChatGPT에 DALL-E 3를 통한 이미지 생성 기능을 추가한 후, 사용자가 LLM에 기본 이미지를 제공하고 "더 _X_하게 만들어줘"라는 요청을 반복하는 밈이 유행했음.
- 이러한 밈은 빠르게 사라졌지만, 코드에 비슷한 접근 방식을 적용하면 어떻게 될지 궁금해짐.
- LLM이 생성한 코드는 엄격한 규칙을 따르기 때문에 이미지와 달리 객관적으로 품질을 측정할 수 있음.
-
LLM과의 캐주얼 코딩
- LLM 코드 보조 도구를 사용하는 것이 생산성에 큰 영향을 주지 않는다고 생각했으나, Claude 3.5 Sonnet의 뛰어난 프롬프트 준수 능력 덕분에 다시 생각하게 됨.
- Claude 3.5 Sonnet은 다양한 기술 및 창의적 작업에서 GPT-4o보다 뛰어난 성능을 보임.
-
초기 요청
- Claude 3.5 Sonnet에 Python 코딩 프롬프트를 제공하여 간단하지만 최적화할 수 있는 문제를 해결하도록 요청함.
- 1백만 개의 1부터 100,000 사이의 랜덤 정수 리스트에서 각 자리 숫자의 합이 30인 가장 작은 수와 가장 큰 수의 차이를 찾는 문제임.
-
첫 번째 반복
- Claude에게 "더 나은 코드 작성"을 요청하여 코드를 개선하도록 함.
- Claude는 코드를 Python 클래스 형태로 리팩토링하고 객체 지향적으로 만듦.
- 이 최적화는 초기 구현보다 2.7배 빠르게 실행됨.
-
두 번째 반복
- Claude는 멀티스레딩과 벡터화된 numpy 연산을 사용하여 코드를 더욱 최적화함.
- 이 구현은 초기 구현보다 5.1배 빠르게 실행됨.
-
세 번째 반복
- Claude는 코드에 큰 변화 없이 약간의 성능 저하를 보임.
- 초기 구현보다 4.1배 빠르게 실행됨.
-
네 번째 반복
- Claude는 numba Python 라이브러리를 사용하여 JIT 컴파일러를 호출하고, Python의 asyncio를 사용하여 병렬화를 구현함.
- 이 구현은 초기 구현보다 100배 빠르게 실행됨.
-
더 나은 코드 생성을 위한 프롬프트 엔지니어링
- LLM의 출력을 최적화하기 위해 프롬프트 엔지니어링이 필요함.
- Claude 3.5 Sonnet은 강력한 프롬프트 준수 능력을 가지고 있어, 명확한 지침을 제공하면 더 나은 결과를 얻을 수 있음.
-
초기 요청
- Claude에게 명확한 최적화 계획을 세우도록 요청함.
- Claude는 numpy와 numba를 사용하여 초기 구현보다 59배 빠르게 실행되는 코드를 생성함.
-
첫 번째 반복
- Claude는 병렬화를 추가했으나, 잘못된 비트 시프트 연산으로 인해 성능이 저하됨.
- 초기 구현보다 9.1배 빠르게 실행됨.
-
두 번째 반복
- Claude는 SIMD 연산을 사용하여 성능을 개선하려 했으나, 여전히 잘못된 비트 시프트 연산을 사용함.
- 초기 구현보다 65배 빠르게 실행됨.
-
세 번째 반복
- Claude는 해시 테이블을 사용하여 성능을 최적화함.
- 초기 구현보다 100배 빠르게 실행됨.
-
네 번째 반복
- Claude는 잘못된 비트 시프트 연산을 수정하여 성능을 약간 저하시킴.
- 초기 구현보다 95배 빠르게 실행됨.
-
결론
- LLM에게 "더 나은 코드 작성"을 요청하면 코드가 개선되지만, 프롬프트 엔지니어링을 통해 더 빠르고 일관된 성능 개선을 얻을 수 있음.
- LLM은 고성능 코드를 생성하는 데 최적화되어 있지 않으므로, 인간의 개입이 필요함.
- Python의 성능 한계를 극복하기 위해 Rust와 같은 언어를 사용하는 것도 고려할 수 있음.