8P by neo 15일전 | ★ favorite | 댓글 1개
  • 코드 작성 시 LLM에 “더 나은 코드 작성”을 반복적으로 요청하면 실제로 코드가 개선되는지 실험한 내용임
  • 원본 사례는 ChatGPT의 DALL-E 이미지 생성 기능에서 “더 ~스럽게 만들어 달라”는 밈에서 영감을 얻음

단순 반복 프롬프트 실험

  • Claude 3.5 Sonnet에 Python 코딩 프롬프트를 제공하여 간단하지만 최적화할 수 있는 문제를 해결하도록 요청함.
  • 기본 구현
    • 1에서 100,000 사이 무작위 정수 백만 개 중, 자릿수 합이 30인 수의 최솟값과 최댓값 차이를 구하는 문제
    • 단순 구현 시 657ms 걸렸음 (파이썬 str 변환 방식 사용)
  • Iteration #1
    • Claude에게 "더 나은 코드 작성"을 요청하여 코드를 개선하도록 함
    • Claude는 코드를 Python 클래스 형태로 리팩토링하고 객체 지향적으로 만들고, 모든 숫자에 대한 digit sum을 미리 계산해둠
    • 2.7배 빨라짐
  • Iteration #2
    • Claude는 멀티스레딩과 벡터화된 numpy 연산을 사용하여 코드를 더욱 최적화함
    • 5.1배 빨라짐
  • Iteration #3
    • 코드가 오히려 복잡해지고 문자열 변환 방식 회귀
    • 4.1배 빨라짐
  • Iteration #4
    • numba Python 라이브러리를 사용하여 JIT 컴파일러를 호출하고, Python의 asyncio를 사용하여 병렬화를 구현
    • 100배까지 속도 향상
    • “코드가 우주적으로 변한다”는 표현 대신 오버엔지니어링된 “엔터프라이즈급” 코드가 됨

프롬프트 엔지니어링 적용

  • LLM의 출력을 최적화하기 위해 프롬프트 엔지니어링이 필요함
  • Claude 3.5 Sonnet은 강력한 프롬프트 준수 능력을 가지고 있어, 명확한 지침을 제공하면 더 나은 결과를 얻을 수 있음
  • 단순히 “더 나은 코드 작성” 대신 세밀한 지침을 포함한 시스템 프롬프트 사용
  • 초기 프롬프트
    • “최적화된 코드” 정의를 세부적으로 제시 (알고리즘, 병렬화, 불필요 코드 최소화 등)
    • 첫 구현에서 Numba로 digit sum 최적화 → 59배 빨라짐
  • Iteration #1
    • Claude가 병렬화를 추가했으나, 이상한 비트 시프트 연산(16진수용) 도입해 버그 발생
    • 성능 9.1배로 오히려 떨어짐
  • Iteration #2
    • Claude는 SIMD 연산을 사용하여 성능을 개선하려 했으나, 여전히 잘못된 비트 시프트 연산을 사용함.
    • 초기 구현보다 65배 빠르게 실행됨
  • Iteration #3
    • Claude는 해시 테이블을 사용하여 성능을 최적화함
    • 초기 구현보다 100배 빠르게 실행됨
  • Iteration #3
    • Claude는 잘못된 비트 시프트 연산을 수정하여 성능을 약간 저하시킴.
    • 초기 구현보다 95배 빠르게 실행됨

결론

  • “더 나은 코드”라는 모호한 프롬프트만으로도 단계적 개선이 가능함
  • 프롬프트 엔지니어링으로 원하는 방향(숫자 연산, JIT, 병렬화 등)을 명확히 제시하면 더 빠르게 발전된 코드가 나옴
  • 자동화된 최적화 아이디어는 새 도구(numba 등)를 발견하는 계기가 되지만, 여전히 엔지니어가 버그 검증 및 선택적으로 사용해야 함
  • 실제 현업 시스템에서 LLM이 제안한 모든 코드를 그대로 쓰기에는 도메인별 제약과 검증 필요성이 큼
  • 본 실험은 파이썬 코드 기준이나, Rust 등 다른 언어와 연동하는 방식(PyO3 등)에서도 LLM 최적화 아이디어가 적용될 여지가 큼
Hacker News 의견
  • 코드 최적화에서 숫자가 최소값보다 작거나 최대값보다 큰지를 먼저 테스트하는 것이 효과적임. 이는 디지털 합계를 계산하기 전에 수행하여 속도를 5.5배 향상시킬 수 있음. Numba를 사용하지 않고도 numpy로 이 작업을 수행할 수 있음

  • GPT와 같은 LLM은 처음에 중간 수준의 결과를 제공하는 경우가 많음. 특정 위협을 통해 더 나은 결과를 얻을 수 있다고 주장함

  • LLM은 상황별 시뮬레이션 엔진으로, 텍스트 예측을 통해 현실 세계의 모델을 시뮬레이션함. 정확한 텍스트 예측을 위해서는 현실 세계의 정확한 모델이 필요함

  • LLM은 초보자 코드 작성에 치우치는 경향이 있으며, 패키지를 명시하고 간단한 코드를 요청하는 것이 효과적임

  • Android/Kotlin에서 ChatGPT는 비효율적이며, 유효하지 않거나 사용 중단된 메서드를 자주 호출함

  • 코딩 세션을 시작할 때 "코드 작성" 대신 "개방형 계획"으로 시작하는 것이 중요함. LLM의 가정에 대해 명확히 하고, 코드 작성 전에 계획을 수정하는 것이 필요함

  • PostgreSQL을 Debian에서 완전히 제거하고 재설치하는 방법에 대해 설명함. 데이터 디렉토리를 보존하여 기존 데이터베이스를 유지함

  • 코드 최적화는 조기에 수행하면 안 좋을 수 있으며, 필요할 때만 최적화하는 것이 좋음

  • "더 나은 코드 작성"을 반복적으로 요청하는 것이 성능을 저하시킬 수 있음. 이는 해결책을 작동하지 않게 만들 수 있음

  • LiveCode에서의 계산이 Python보다 빠르며, 반복문을 사용하여 합계를 계산하는 방법을 설명함