똑똑하지만 서툰 AI, 결국 스스로를 자동화하다
LLM은 방대한 코드를 분석하고 수정하는 데 탁월하지만, 본질적으로 비결정론적이고 실수를 반복하기 쉽습니다. 개발자는 LLM의 이러 한계를 극복하기 위해 빠르고 확실한 결정론적 도구와 엄격한 워크플로우로 AI를 샌드위치처럼 감싸는 아키텍처를 제안합니다. 궁극적으로 반복되는 AI의 작업을 AI 스스로가 스크립팅하여 자동화하게 만들고, 안정적인 도구로 대체함으로써 'AI의 자동화'를 이뤄내는 개발 철학을 확인할 수 있습니다.
한때 안드레이 카파시(A. Karpathy)는 OpenAI 연구원들이 AI를 개선함으로써 사실상 '자신들의 존재를 자동화(Automating themselves away)'하고 있다고 말한 적이 있습니다. 현재 저는 Anthropic의 모델을 활용해 Beagle SCM을 개발하고 있으며, 이 모델은 산더미 같은 코드에서 사소한 오류를 찾아내고 티켓을 등록한 뒤 수정하는 등 정말 훌륭한 능력을 보여줍니다. 하지만 어제는 프로젝트에 build/ 디렉터리를 무려 두 번이나 커밋하는 실수를 저질렀습니다. 뛰어나지만, 어딘가 서툴기도 한 것입니다. 대규모 언어 모델(LLM)의 특성상 모델이 더 발전한다고 해서 이러한 문제가 사라지는 것은 아닙니다. 이들은 본래 정확하지 않고 비결정론적(non-deterministic)이기 때문입니다. 파서 생성기인 레이젤(Ragel)은 1만 줄(10 KLoC)에 달하는 공식적으로 올바른 파서를 즉각적이고 결정론적으로 '작성'할 수 있습니다. 클로드(Claude)는 어떨까요? 음, 저는 지시문에 모두 대문자로 '절대로, 어떤 것도 수동으로 파싱하지 마세요(DO NOT PARSE ANYTHING MANUALLY, EVER)'라고 적어두었습니다. 그 과정은 고문과 같을 뿐만 아니라 오류가 발생하기 쉬우니 절대 하지 말라는 뜻입니다. 그럼에도 불구하고 클로드는 어김없이 파싱을 시도하므로, 저는 주기적으로 코드베이스를 스캔하여 수동 파싱 시도를 찾아 지우라고 지시합니다. 이 방법이 대부분은 먹힙니다. 모델은 점점 더 똑똑해지지만, 서투른 성질은 여전합니다. 비싸고, 느리고, 서툴지만 뛰어난 LLM을 다루는 방법은 빠르고 강력하며 결정론적인 도구를 제공하는 것, 그리고 전체 시스템을 결정론적이고 공식적인 워크플로우로 구축하는 것입니다. 작업을 더 빠르게 만들고, 적절한 시점에 관련 정보를 볼 수 있게 하며, 서투름을 줄이고 스스로 교정할 수 있게 해야 합니다. 즉, 뛰어나지만 일관성 없는 비결정론적 특성을, 강력한 결정론적 도구와 공식적인 프로세스 사이에 샌드위치처럼 끼워 넣는 것입니다. 만약 우리가 이러한 도구와 프로세스를 유연하게 다룰 수 있게 만든다면, 이 이야기는 훨씬 더 흥미로워집니다. 그렇게 하면 클로드가 특정 작업의 순서를 너무 자주 수행할 경우 우리는 그것을 자동화합니다. 무언가에서 반복적으로 실패한다면, 검증 단계를 자동화합니다. 본질적으로 우리는 단순하고 신뢰할 수 있는 결정론적 도구를 위해 LLM이 스스로를 자동화(Automating away)하도록 만드는 것입니다. Beagle SCM은 LLM이 JavaScript로 자신만의 루틴을 스크립팅할 수 있게 해줍니다. 모든 무거운 작업은 C 언어로 구현되어 거의 건드리지 않지만, 도구 계층(샌드위치의 아랫부분)과 워크플로우 계층(윗부분)은 전부 JavaScript로 이루어져 있으며, node_modules 방식처럼 파일 시스템에서 코드를 가져옵니다. 거의 모든 언어의 소스 파일을 토큰화하고, 파일 기록과 커밋 기록을 조사하며, 링크를 교차 확인하는 것은 물론 기본적으로 git이 내부적으로 접근할 수 있는 모든 데이터에 도달할 수 있는 git 훅(git hooks)을 상상해 보십시오. 그것이 바로 Beagle입니다.