WorldTUI는 실제 셸이나 파일시스템 없이, 키 입력을 받아 다음 터미널 화면 변화를 예측하는 모델임. 파일 생성과 편집, vim과 tmux 사용을 흉내 내며 몇 명령 뒤에도 앞서 입력한 내용을 대체로 기억함Qwen2.5-Coder-0.5B를 실제 Docker 터미널 세션으로 미세조정했으며, 모델이 스스로 만든 오류를 다음 입력에서 복구하도록 학습한 것이 성능 향상에 크게 기여함- 화면의 각 행을
병렬로 생성한 뒤 검증해 전체 화면 갱신을 가속함. 행 사이의 조율이 깨지는 문제는 같은 모델을 이용한 추측 디코딩으로 보완함 - 사용하지 않는 어휘 임베딩을 제거하고
int4 양자화를 적용해 모델을 208MB로 줄였으며, WebGPU를 통해 브라우저 탭 안에서 모든 추론을 로컬 실행함 일관된 상태 유지에는 한계가 있음. 익숙한 명령은 비교적 잘 처리하지만 새로운 명령 조합, 파일 내용 덧붙이기, 중첩 디렉터리 이동, 복잡한 Python 연산에서는 쉽게 잘못된 결과를 만듦
코드 대신 화면 변화를 학습하는 터미널
- Genie 3처럼 사용자 입력으로 다음 장면을 예측하는 방식에서 출발해, 대규모 GPU나 영상 데이터 대신
문자 격자 형태의 터미널을 학습 대상으로 선택함- 실제 셸을 실행하면 입력과 출력이 정확히 대응하는 데이터를 원하는 만큼 생성할 수 있음
- 사전학습 언어 모델은 이미
ls
,cat
같은 명령의 출력 형태를 어느 정도 알고 있음
- 목표는 그럴듯한 출력을 만드는 데 그치지 않고
일관된 세계 상태를 유지할 수 있는지확인하는 것임 - 브라우저 데모는 208MB를 내려받으며, WebGPU와 물리 키보드가 있는 데스크톱 환경을 기준으로 설계됨
- Chrome이나 Edge 사용을 권장하며, 최신 휴대전화에서도 작동할 것으로 예상하지만 매우 느림
pythoon
을 입력해도 Python이 시작되는 동작으로 실제 셸이 아니라는 점을 확인할 수 있음
화면과 키 입력을 표현하는 방식
- 일반적인 LLM의
끝에 텍스트를 덧붙이는 방식은 터미널에 맞지 않음. vim의esc
는 단독으로 상태를 바꾸고,clear
는 화면을 지운 뒤 커서를 맨 위로 옮기므로 화면 자체의 변화를 예측해야 함 - 세션은
화면 크기, 내용, 커서 위치를 담은 스냅샷으로 시작함- 크기는 32×96으로 고정되지 않으며, 데모에서 사용자 지정 시작 화면의 행과 열 수를 설정할 수 있음
-
bash 프롬프트뿐 아니라 vim 버퍼나 snake 게임 중간 화면에서도 이어갈 수 있지만, bash에서 더 잘 작동함
-
입력은 실제 터미널이 보내는
원시 바이트를 사용함. Enter는\r
, Escape는0x1b
, 왼쪽 방향키는ESC [ D
에 해당함- 출력은 수정할 행, 쓰기 시작 열, 문자, 최종 커서 위치와 표시 여부로 구성됨
- 기존 화면을 먼저 지우지 않고 새 문자를 덮어씀
- 입력이 없을 때는 지속 시간이 포함된
WAIT
토큰을 받아 snake 같은 프로그램이 계속 움직이게 함
Qwen의 256개 바이트 토큰을 문자와 좌표, 작은 숫자 표현에 재사용하므로 좌표 17도 한 토큰으로 처리함- 화면은 색상이나 글꼴 스타일 없는 단색 문자만 지원함
- tmux 테두리 같은 Unicode 문자도 인코딩 전에 ASCII로 변환함
행 복사로 화면 갱신량 줄이기
- 화면 맨 아래에서 Enter를 누르면 모든 행이 한 줄씩 올라가는데, 이를 다시 출력하면 키 입력 한 번에
약 3,000토큰이 필요함 으로 이전 화면의 행을 복사하면 스크롤 비용이 행당 약 96토큰에서 3토큰으로 줄어듦COPY
연산- 화면 지우기, vim의 줄 삽입과 삭제, man 페이지 이동에도 활용함
-
행을 복사한 다음 일부 문자만 덮어쓸 수도 있음
-
전체 어휘는
333개 토큰으로 구성됨. 바이트 토큰 256개, 행 토큰 64개, 소수의 특수 연산을 사용함- 문법 제약 디코딩으로 모든 예측이 유효한 화면 갱신 형식을 따르게 함
-
GPU 처리에 맞춰 실제 어휘 크기는 384로 패딩함
실제 프로그램으로 학습 데이터 생성
-
asciinema를 포함한 기존 녹화 데이터에서는 필요한 수준의
키 입력과 화면 간 정확한 정렬을 찾지 못해, Docker에서 실제 프로그램을 실행하며 매 입력과 직후 화면을 기록함 - 세션 생성 과정은
환경과 행동을 무작위화하되 상태를 추적하도록 구성함- 사용자 이름, 호스트 이름, 프롬프트 스타일, 터미널 크기를 바꿈
-
개발자나 시스템 관리자 같은 가상 인물에 맞춰 디렉터리와 파일을 생성함
-
파일 수정, vim, Python, tmux 등의 활동을 가중치에 따라 6~24개 선택함
-
상태를 추적해 대체로 실제 존재하는 파일을 열도록 함
-
탭 자동완성과 함께 한 번에 한 키씩 입력하고, 오타율은 1.2%로 설정함
-
세션의 35%는 실행 도중부터 시작해 임의 상태에서 이어가는 법을 학습시킴
-
화면 크기는 주로
32×96을 사용하고 24×80, 40×120도 섞어 특정 크기에 과적합되지 않게 함 - 최종 데이터는
33만 6천 에피소드, 약 20억 토큰임. 기반 모델의 사전학습 데이터는 약 18조 토큰 규모임
자기 오류를 복구하도록 학습하기
- 실시간에 가까운 속도와 기존 CLI 지식을 고려해
Qwen2.5-Coder-0.5B를 기반으로 선택함 - 초기 지도 미세조정은 화면 이력과 키 입력으로
실제 터미널의 화면 변화량을 예측하도록 학습함- 문자 입력, 백스페이스, 커서 이동은 빠르게 익힘
- 긴 세션에서는 파일명 오류 같은 실수가 이후 출력으로 전파됨
DAgger처럼 이상적인 시범뿐 아니라 모델이 직접 도달한 상태에서 학습하도록 오류 수정 데이터를 생성함- 기록된 세션에서 보통 명령 출력 직전 지점을 고르고, 모델이 다음 1~4개 이벤트를 예측하게 함
-
예측 화면과 실제 기록 화면의 차이가 충분히 작으면 다음 키 입력에서 오류를 복구하는 갱신을 구성함
-
수정 프레임과 그 뒤의 실제 이벤트 몇 개를 추가 학습함
-
수정에 쓰이는 단어는 반드시
이전 실제 화면이나 사용자 입력에 등장한 것이어야 함- 이미 본 파일명의 오타는 고칠 수 있지만, 한 번도 보지 못한 파일명을 맞히도록 요구하면 환각을 보상하게 됨
-
모델 자신의 예측에만 등장한 단어는 수정 근거로 인정하지 않음
-
표본 세션의 약 3분의 1에서 유효한 수정 예시를 얻었으며, 최신 모델의 오류를 수집하는 과정을
3회 반복함- 추가 학습 데이터와 자기 수정 학습을 함께 적용한 뒤 int4 모델의 PresetBench 성적이
24/47에서 38/47로 향상됨 - 전체 학습과 후속 개선에는 RTX 4090 기준 약 75 GPU 시간이 들었음
-
추가 학습 데이터와 자기 수정 학습을 함께 적용한 뒤 int4 모델의 PresetBench 성적이
-
이 접근은 MIDI 자동완성 실험에서 사용한
스케줄드 샘플링과도 유사함
명령 실행과 기억 능력 평가
ShellBench는 수작업 bash 세션 24개에 담긴 106개 명령을 정확한 출력 일치로 평가하고,PresetBench는 데모에서 발견한 실패 사례 기반의 스크립트 테스트 47개로 구성됨- 두 평가 모두 학습 데이터에는 포함되지 않음
-
별도의
기억 테스트는 32개 세계마다 파일 두 개에 무작위 값을 기록하고 별도 세션에서 다시 읽음- 두 값을 모두 정확하게 읽어야 해당 세계를 통과하며, 총 64회 읽기를 평가함
-
파일명과 값은 학습에 등장하지 않으며, 쓰기와 읽기 사이에는 명령이 0~1개 들어감
-
ShellBench에는 18개 명령에 걸친 상태 유지 평가도 있음
-
프롬프트 기반 모델과 비교했을 때
WorldTUI의 가장 큰 차이는 기억 능력이었음
| 모델 | ShellBench 정답 /106 | 파일 읽기 정답 /13 |
|---|
| Qwen2.5-Coder-0.5B, 프롬프트 방식 | 52 | 2 |
| Qwen3-0.6B, 프롬프트 방식 | 60 | 3 |
| WorldTUI | 80 | 9 |
- 비교 모델에는 각각 예시 3개를 제공했지만, 개별 화면 갱신이 아닌
명령의 전체 출력을 예측했으므로 완전히 같은 과제는 아님 - 여전히
신뢰할 수 있는 파일시스템과는 거리가 있음. 예를 들어echo green >> colors
뒤에cat colors
를 실행해도 추가한 줄이 표시되지 않는 경우가 많음
행 병렬화와 추측 디코딩
- 자기회귀 방식은 시도한 대안보다 성능이 좋았지만,
전체 화면 재출력 지연이 컸음- RTX 4090에서 일반 타이핑은 키당 약 38ms였지만
vim test.txt
,man
,clear
는 최대 12초가 걸림
-
RTX 4090에서 일반 타이핑은 키당 약 38ms였지만
-
각 행을 별도 배치 요소로 처리하고 동일한 이전 이력과 KV 캐시를 공유하면, 디코딩 단계가 전체 행 길이의 합에서
가장 긴 행의 길이로 줄어듦- 최대 약 3,000단계 대신 약 100단계로 생성함
-
커서는 모든 행의 갱신 결과를 볼 수 있는 마지막 단계에서 예측함
-
학습에도 이에 맞는 어텐션 마스크를 적용했으며, 큰 화면 갱신의 p95 지연이
6.7초에서 0.87초로 줄어듦
-
독립적으로 생성한 행끼리는 조율할 수 없어
행 간 불일치가 생김. vim이 0행 대신 3행에서 열리거나 snake 먹이가 여러 행에 동시에 생성되는 식임 - 이를 해결하기 위해 같은 모델로 초안 생성과 검증을 수행하는
추측 디코딩을 적용함- 병렬 행 생성 결과를 초안으로 삼고, 순차 생성 기준으로 검증함
-
첫 불일치 전까지의 토큰을 유지한 뒤 수정 토큰을 생성하고 남은 초안을 다시 제안함
-
인과적 어텐션을 이용해 여러 토큰을 한 번의 순전파로 검증할 수 있음
-
M4 Mac의 브라우저에서는 한 글자 입력에
약 60ms가 걸렸고,man test
갱신은 순차 방식 2.5초에서 병렬 초안과 검증 방식 0.9초로 줄어듦- RTX 4090에서의 가속 효과가 M4보다 훨씬 컸음
- 연산과 메모리 대역폭 사이에서 병목이 달라진다는 추측은 있지만, 원인을 충분히 조사하지는 않음
브라우저용 압축과 증류의 한계
-
기반 모델은 약
4억 9,400만 파라미터이며, 151,936개 어휘의 임베딩 테이블만 1억 3,600만 파라미터를 차지함- 필요한 토큰만 남겨 약
3억 6천만 파라미터로 줄였고, 용량은 990MB에서 716MB가 됨 - int4 양자화 후에는 208MB로 줄어듦
-
필요한 토큰만 남겨 약
-
브라우저 구현은
자체 JavaScript Qwen 디코더와 WGSL 연산 셰이더를 사용함- WebGPU 셰이더가 추론 중 4비트 가중치를 풀어 사용함
-
활성값과 어텐션 캐시는 32비트 부동소수점을 사용하며, 모든 추론은 탭 내부에서 실행됨
-
층 수를 줄이는 증류 실험에서는
다음 토큰 정확도와 기억 능력이 크게 다를 수 있음을 확인함- ShellBench 78/106을 기록한 이전 체크포인트에서 7번 층만 재학습 없이 제거하자, 다음 토큰 정확도는 99.3%에서 98.9%로 소폭 하락했지만 정확한 파일 읽기는
64/64에서 0/64로 떨어짐 - 실제 이력을 입력한 테스트이므로 모델 출력 오류의 누적 때문은 아니었음
-
ShellBench 78/106을 기록한 이전 체크포인트에서 7번 층만 재학습 없이 제거하자, 다음 토큰 정확도는 99.3%에서 98.9%로 소폭 하락했지만 정확한 파일 읽기는
-
첫 학생 모델은 짝수 번호 층을 남기되 마지막 22번 층 대신 23번 층을 사용함
-
출력은 그럴듯했지만 파일 읽기는
31/64에 그쳤음 - 저장했던 두 값 중 하나는 출력했으나 절반 정도는 잘못 골랐으며, 4억 8천만 토큰을 학습한 뒤에도 회복하지 못함
-
출력은 그럴듯했지만 파일 읽기는
-
이 학생 모델이 제거했던
1, 7, 15, 22번 층을 보존한 16층 학생 모델은 32개 세계와 64회 읽기를 모두 통과함- 4비트 양자화, 약 138MB에서도 기억 테스트를 통과했지만 ShellBench는 교사 모델의 78개 정답보다 낮은 65개에 머묾
-
최종적으로는 증류를 포기함
가능한 동작과 실패 사례
파일 편집 후 기억 유지사례에서는 tmux 안에서 vim으로 파일을 수정하고 저장한 뒤, 다른 tmux 창에서cat
으로 변경된 내용을 읽을 수 있었음- bash 밖의 동작을 위해
vim, Python, man 페이지, snake, tmux도 학습함- vim에서
esc
로 모드를 바꾸고 저장, 종료, 삽입 모드 복귀를 처리함 - tmux에서 여러 패널을 만들고 각각 작업하거나 패널 사이를 이동할 수 있지만 완벽하지는 않음
은 Python을 시작하지만ython
은 그렇지 않음- 아주 단순한 연산을 넘어가면 GPT-3 시절의 환각을 떠올리게 하는 답을 만듦
- 학습용 Docker 컨테이너에는
인터넷 접근을 허용하지 않아lynx 같은 도구로 할 수 있는 일이 제한적임 - 중첩 디렉터리를 생성하다가 갑자기 다른 경로로 이동하는 등
상태 일관성 오류가 남아 있음 - 개발자의 테스트에서는 같은 WebGPU를 사용해도
Firefox가 Chrome보다 약 20배 느렸으며, 원인은 확인하지 못함
관련 시도와 다음 실험
- 2022년에도 ChatGPT를 Linux 터미널처럼 동작시키는 프롬프트 실험이 있었고, 이후 GameNGen은 확산 방식으로 Doom을 시뮬레이션했으며 NeuralOS는 데스크톱 GUI를 다룸
WorldTUI는 초기 ChatGPT 터미널 실험에 더 가깝지만, vim과 tmux 같은 전체 화면 앱까지 포함해 키 입력과 화면 갱신을 직접 학습한다는 차이가 있음- 실용성은 크지 않고 아직 약한 세계 모델이지만,
기저 규칙을 구현하지 않고도 어느 정도 일관된 상태를 유지한다는 점이 핵심 관심사임 - 후속 실험으로는 일관성 개선과
자기회귀 디코딩 대신 확산을 이용한 화면 생성가능성을 검토하고 있음 - 서로 다른 조작법과 규칙을 가진 무작위 앱 수천 개로 학습한 뒤, 충분한 문맥 단서만으로
처음 보는 앱의 동작을 예측할 수 있는지시험할 계획임 - 모델 가중치는 추후 공개하고 다운로드 링크를 추가할 예정임