Emacs-copilot: Emacs를 위한 대규모 언어 모델 (LLM) 코드 완성
요약
Emacs Copilot은 Emacs 환경에서 로컬 LLM을 활용하여 코드 완성을 지원하는 LISP 기반의 경량 도구입니다. 사용자의 로컬 편집 이력을 기억하며, 스트리밍 방식으로 코드를 생성하고 언어에 구애받지 않는 페어 프로그래밍 경험을 제공합니다.
핵심 포인트
- 약 100줄의 LISP 코드로 구현된 가볍고 강력한 Emacs용 코드 완성 도구
- 로컬 LLM을 사용하여 파일별 편집 이력을 기억하고 컨텍스트를 유지
- WizardCoder, Phi-2 등 다양한 사양의 로컬 모델(llamafile 등)과 호환 가능
- 언어에 구애받지 않으며 파일 확장자를 통해 프로그래밍 언어를 자동으로 인식
- 토큰 스트리밍 지원 및 C-g를 통한 즉각적인 생성 중단 기능
Emacs Copilot
copilot-complete 함수는 Github Copilot과 VSCode가 유명하게 수행하는 작업을 Emacs가 수행하기 위해 약 100줄의 LISP만 있으면 충분하다는 것을 보여주며, 심지어 품질과 자유도 측면에서 두 도구보다 우수합니다.
Emacs Copilot은 Emacs 버퍼(buffer) 내에서 코드 완성(code completions)을 생성하는 로컬 실행 LLM(Large Language Model)과 함께 페어 프로그래밍(pair programming)을 할 수 있도록 도와줍니다. LLM은 서브 커맨드(sub-command)로 실행되며 파일별로 사용자의 로컬 편집 이력을 기억합니다. 토큰(Tokens)은 생성되는 대로 지연 없이 버퍼로 스트리밍되며, 언제든지 C-g를 눌러 LLM을 중단할 수 있습니다. Emacs 버퍼에서 코드와 정확히 일치하는 부분을 삭제할 때, LLM의 컨텍스트(context)에서도 이력과 메모리를 삭제할 수 있습니다. Copilot은 언어에 구애받지 않으며(language agnostic), 사용 중인 프로그래밍 언어는 파일 확장자에 의해 결정됩니다.
현재 정말 좋은 LLM 중 하나는 HumanEval에서 GPT-4와 동일한 점수를 기록한 WizardCoder 34b입니다. 이를 사용하려면 Mac Studio M2 Ultra와 같은 컴퓨터가 필요합니다. 만약 일반적인 Macbook Pro를 사용 중이라면 Q3 버전을 시도해 보세요. 평범한 PC를 가지고 있다면 WizardCoder-Python-13b llamafile을 다운로드하는 것을 고려해 볼 수 있습니다. 이 모델은 성능이 거의 비슷하면서도, 최소 AVX2와 2200 MT/s RAM을 갖춘 CPU 전용 시스템에서도 수용 가능한 수준으로 빠르게 작동합니다. 컴퓨팅 자원이 훨씬 더 부족하여 Raspberry Pi 같은 것을 사용한다면 Phi-2를 시도해 보세요.
시작하려면 함수의 첫 번째 줄을 직접 작성해 보세요. 예를 들어, 에디터에서 hello.c라는 이름의 파일을 열고 다음과 같이 입력할 수 있습니다:
bool is_prime(int x) {
그런 다음 커서(caret)를 줄 끝에 두고 C-c C-k를 눌러 제어권을 LLM에 넘기면, LLM이 함수의 나머지 구현부를 생성해 줄 것입니다. 또한 LLM이 함수가 완성되는 즉시 멈추도록 조정되어 있습니다. 설명이나 다른 종류의 ELI5(초등학생도 이해할 수 있는 수준의 설명) 주석도 피하도록 설정되어 있습니다.
나중에 다음과 같은 내용을 작성한다면:
int main() {
for (int i = 0; i < 100;
그리고 LLM에게 그것을 완성해 달라고 요청하면, LLM은 현재 지시문에서는 단 두 줄만을 고려하고 있음에도 불구하고 이전에 여러분이 is_prime() 함수를 작성했다는 사실을 기억해낼 가능성이 높습니다. 그러면 아마도 LLM이 소수(primes)를 출력하는 코드를 생성하기로 결정하는 것을 보게 될 것입니다.
참조 구현 (Reference Implementation)
LLM을 다운로드했다면 (아래 참조), 여러분에게 정말로 필요한 것은 이 코드를 Emacs 버퍼(buffer)에 복사하여 붙여넣고 M-x eval-buffer를 실행하는 것뿐입니다. 여러분의 개인적인 취향에 맞게 코드를 조정하고 싶을 것입니다. 그렇기 때문에 여기서는 간결한 코드 예시로서 전체 코드를 제시합니다.
(defun copilot-complete ()
(interactive)
(let* ((spot (point))
...
```%s\n%s" (if (file-exists-p cash) "" system) lang lang code)))}
;; 에디터 내에서 삭제된 텍스트를 반복하여 프롬프트(prompt)에서 제거
(when kill-ring
(save-current-buffer
(find-file hist)
(dotimes (i 10)
(let ((substring (current-kill i t)))
(when (and substring (string-match-p "\n.*\n" substring))
(goto-char (point-min))
(while (search-forward substring nil t)
(delete-region (- (point) (length substring)) (point))))))
(save-buffer 0)
(kill-buffer (current-buffer))))
;; 현재 상호작용을 위한 프롬프트를 기존의 거대한 프롬프트에 추가
(write-region prompt nil hist 'append 'silent)
;; llamafile을 실행하여 stdout을 버퍼로 스트리밍하며 ctrl-g를 포착
(with-local-quit
(call-process "wizardcoder-python-34b-v1.0.Q5_K_M.llamafile"
nil (list (current-buffer) nil) t
"--prompt-cache" cash
"--prompt-cache-all"
"--silent-prompt"
"--temp" "0"
"-c" "1024"
"-ngl" "35"
"-r" "```"
"-r" "\n}"
"-f" hist))
...
```" end t)
(delete-backward-char 3 nil)
(setq end (- end 3))))
;; 생성된 코드를 프롬프트(prompt)에 추가
(write-region spot end hist 'append 'silent))))
Emacs 다운로드 링크
...
find . -name \*.cache | xargs rm -f
위의 Emacs LISP 코드를 수정하여 해당 플래그들을 제거하면 프롬프트 캐싱 (prompt caching)을 아예 사용하지 않도록 조정할 수도 있습니다. 이는 부정적인...
...
sudo wget -O /usr/bin/ape https://cosmo.zip/pub/cosmos/bin/ape-$(uname -m).elf
sudo chmod +x /usr/bin/ape
sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
위에서 언급했듯이, Windows에서는 llamafile의 파일 이름에 .exe를 추가하여 이름을 변경해야 할 수도 있습니다.
...
sudo sh -c "echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop"
어떤 플랫폼에서든 llamafile 프로세스가 즉시 종료된다면, CrowdStrike가 설치되어 있는지 확인한 후 화이트리스트 (whitelist) 등록을 요청하십시오.
지원되는 OS 및 CPU
lamafile은 최소한의 기본 설치가 필요한 다음 운영체제 (OS)를 지원합니다:
- Linux 2.6.18+ (ARM64 또는 AMD64) 즉, RHEL5 이상의 모든 배포판
- Darwin (macOS) 23.1.0+ [1] (ARM64 또는 AMD64, GPU는 ARM64에서만 지원됨)
- Windows 8+ (AMD64)
- FreeBSD 13+ (AMD64, 이론적으로 GPU 작동 가능)
- NetBSD 9.2+ (AMD64, 이론적으로 GPU 작동 가능)
- OpenBSD 7+ (AMD64, GPU 지원 없음)
lamafile은 다음 CPU를 지원합니다:
- AMD64 마이크로프로세서는 반드시 SSSE3를 갖추어야 합니다. 그렇지 않으면 llamafile은 에러를 출력하고 실행을 거부합니다. 이는 Intel CPU를 사용하는 경우 Intel Core 또는 그 이상의 최신 모델(약 2006년 이후 모델)이어야 하며, AMD CPU를 사용하는 경우 Bulldozer 또는 그 이상의 최신 모델(약 2011년 이후 모델)이어야 함을 의미합니다. AVX 또는 더 나아가 AVX2를 지원하는 최신 CPU를 사용하는 경우, llamafile은 칩셋 기능을 활용하여 더 빠르게 작동합니다. AVX512+ 런타임 디스패칭 (runtime dispatching)은 아직 지원되지 않습니다.
- ARM64 마이크로프로세서는 반드시 ARMv8a+를 갖추어야 합니다. 이는 가중치 (weights)가 메모리에 들어갈 수 있다는 전제하에 Apple Silicon부터 64비트 Raspberry Pi까지 모든 기기에서 작동함을 의미합니다.
[1] Darwin 커널 버전 15.6 이상은 지원되어야 하지만, 현재로서는 이를 테스트할 방법이 없습니다.
모델에 관한 참고 사항
위에 제공된 llamafiles 예시는 Mozilla가 특정 모델, 라이선스 또는 데이터 세트를 보증하거나 권장한다는 의미로 해석되어서는 안 됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Code Generation의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기