LLM의 텍스트 생성 헤드를 원시 머신 오코드 출력 헤드로 교체한 실험 결과
Replaced an LLM's text generation head with one that emits raw machine opcodes. Here are my findings
핵심 요약
LLM의 텍스트 생성 과정을 생략하고 직접 머신 오코드를 출력하여 기기를 제어하는 실험적 접근 방식을 소개함.
- 실험적 접근 — LLM의 디코더 헤드를 제거하고 머신 오코드를 직접 출력하는 크로스 어텐션 헤드로 대체함.
- CHIP-8 제어 — 텍스트 파싱 없이 연산, 루프, 조건문 등을 포함한 CHIP-8 오코드를 직접 생성하여 에뮬레이터에서 실행함.
- 성능 및 한계 — 텍스트 생성보다 빠른 실행이 가능하나, LLM의 은닉 상태에 의존하는 추론 능력의 손실이라는 한계가 있음.
- 기술적 의의 — 텍스트 기반 에이전트의 한계를 극복하고 기계 제어의 새로운 패러다임을 제시함.
AI 에이전트가 왜 텍스트를 통해 기계를 제어해서는 안 되는지에 대한 이전 게시물의 후속 내용입니다.
아이디어는 이렇습니다. 오늘날의 모든 AI 에이전트는 인간의 텍스트를 생성하고, 이를 파싱한 뒤 실행합니다. 이는 마치 영어로 지시하여 로봇 팔을 제어하는 것과 같습니다. Tesla FSD는 그 패턴을 대체했습니다. 카메라 영상이 입력되면 조향 명령이 출력되며, 그 사이에 텍스트는 없습니다. 소프트웨어에서도 똑같이 할 수 있을까요? 텍스트를 건너뛰고 머신 명령어를 직접 출력하는 것입니다.
저는 고정된 Qwen 1.5B 모델의 디코더 헤드를 떼어내고, 원시 CHIP-8 오코드를 출력하는 작은 크로스 어텐션 헤드(38M 파라미터)로 교체했습니다. 명령어 토큰은 쿼리가 되고, 기계 상태(디스플레이, 레지스터, 이전 오코드)는 키/값이 됩니다. LLM은 토큰을 전혀 생성하지 않습니다. 명령어를 한 번 인코딩하면 헤드가 기계 상태를 읽고 오코드를 직접 출력합니다.
데모 영상이 첨부되어 있습니다. 주요 하이라이트는 다음과 같습니다:
- "add 7 and 8 and show the result" → 16개 오코드, 17ms 소요. BCD 추출을 수행하고 "15"를 그림. 실제 다중 자릿수 산술 연산.
- "draw a star using a subroutine called twice" → CALL/RET을 포함한 18개 오코드. 서로 다른 위치에 별 두 개를 그림.
- "wait for 10 ticks then draw a 3" → 바쁜 대기 루프(GETDT, SKE, JUMP)를 출력한 뒤, 타이머가 만료되면 숫자를 그림.
- "count from 1 to 5 and display each digit" → 증가, 조건부 건너뛰기, 역방향 점프를 포함한 루프.
모든 오코드는 실제 CHIP-8 에뮬레이터에서 실행됩니다. 텍스트도, 파싱도, 번역 계층도 없습니다. 모델은 루프, 조건문, 서브루틴, 타이머 대기, 산술 연산을 출력합니다. 오코드당 1~3ms가 소요됩니다.
흥미로운 실패 사례: "two plus three"는 작동하지 않습니다. 모델은 산술 프로그램을 생성하지만 피연산자가 틀립니다. 알고 보니 고정된 LLM의 은닉 상태에서 "two"와 "2"는 산술 문맥에서 거의 직교(코사인 유사도 0.09)합니다. LLM은 토큰 생성을 통해서만 그 간극을 메울 수 있는데, 저는 그 부분을 제거했습니다. 이해는 은닉 상태에 존재하고, 계산은 디코딩에 존재합니다. 디코더를 제거하면 계산 능력을 잃게 됩니다.
이것은 CHIP-8 VM이자 개념 증명입니다. 하지만 크로스 어텐션 패턴(명령어가 기계 상태를 쿼리함)은 CHIP-8에만 국한되지 않습니다.



