스크랩

여름 내내 LLM과 놀아본 개발자의 기록: Recurse Center 3개월 회고

여름 내내 LLM과 놀아본 개발자의 기록: Recurse Center 3개월 회고

한눈에 보는 요약

브루클린의 프로그래밍 리트리트 **Recurse Center(RC)**에서 여름을 보낸 개발자의 회고입니다. LLM·에이전트 실험부터 미니 언어 구현, DEFLATE 압축 해제기 작성, 인공어 제작까지 — 한 사람이 한 계절에 얼마나 다양한 걸 만들 수 있는지 보여주는 기록이에요.

특히 흥미로운 건 LLM을 어디까지 믿고 맡길 수 있는지를 실제 프로젝트로 검증한 부분입니다. 잘 된 것과 안 된 것을 모두 솔직하게 적어두었다는 점에서 참고할 가치가 큽니다.


1. 자율 스터디: 누구나 모임을 열 수 있는 구조

RC에서는 참가자 누구나 스터디 그룹을 만들고 일정을 잡을 수 있습니다. 금요일마다 과거 Advent of Code 문제를 함께 푸는 모임도 있고요.

Agentic Adventures 스터디에서는 매주 다른 LLM/에이전트 실험을 진행했습니다.

  • dangerously-skip-permissions로 실행 가능한 바이브 코딩 에이전트용 원격 샌드박스 구축
  • ollama + docker 기반 로컬 에이전트 샌드박스 환경 구성
  • 에이전트 간 협동을 관찰하기 위한 Just One 게임 제작
  • minGPT로 《로미오와 줄리엣》을 학습시킨 소형 텍스트 예측 모델
  • 기본적인 LoRA 학습으로 소형 모델을 좀 더 대화체에 가깝게 튜닝

Practical Deep Learning 스터디에서는 Jeremy Howard와 Sylvain Gugger의 동명 교재 전반부를 다뤘습니다. 고전 ML에서 출발해 사전 구축 모델 활용·수정, 신경망 직접 구성까지 이어지는 흐름으로, 연구보다 실무 활용에 초점이 맞춰진 입문 과정이었다고 해요.

2. Math Monday, 그리고 보드게임 AI 역공학

수학을 즐겁게 탐색하는 Math Monday는 전반부에 배우고 후반부에 둘씩 짝지어 관련 프로그램을 만드는 방식으로 운영됐습니다.

  • Project Euler, Peter Winkler의 Mathematical Puzzles 문제 풀이
  • 프랙털·생성 예술, 보로노이 다이어그램 기반 게임 제작
  • Rocq 증명 보조 도구로 불 대수 항등식 다루기
  • 펜 플로터용 힐베르트 곡선 생성기, Desmos에서 카오스 게임 확장

별도 모임에서는 보드게임 Race for the Galaxy의 Keldon AI를 역공학했습니다. 규칙을 배우고 AI와 직접 대전한 뒤, 선별된 특징을 입력으로 쓰는 전통적인 2층 신경망 코드를 분석하는 순서였죠.

여기서 Claude가 신경망 가중치와 반응 대상을 해석하는 데 꽤 유용했다고 합니다. 분석 결과 기본 게임에서는 경제 전략이 군사 전략보다 훨씬 강하다는 결론이 나왔고, 이는 플레이어들의 체감과도 일치했습니다. 가중치가 가장 큰 노드 상당수가 개별 카드의 보유 여부에 대응한다는 점도 인상적이었다고 하네요.

3. 미니 언어 dodo — 코드는 직접, 명세와 테스트는 LLM에게

RC 지원 과정에서 만든 미니 언어 dodo를 완성했습니다. 특히 match 문을 구현하는 재귀 코드가 까다로우면서도 재미있는 작업이었다고 해요.

여기서 역할 분담이 명확합니다.

| 담당 | 작업 | | --- | --- | | 사람 | 구현 코드 작성 | | LLM | 명세 정리, 테스트 케이스, 예제 프로그램 |

결과물을 쉽게 공유하기 위해 온라인 REPL은 바이브 코딩으로 제작했습니다.

4. RFC를 직접 읽고 Rust로 쓴 DEFLATE 압축 해제기

동료 Josh의 ZIP 파일 형식 발표에서 시작된 프로젝트입니다. 이 발표에서 다룬 보안 이슈가 꽤 날카로워요.

백신의 압축 해제기와 사용자의 압축 해제기가 예외 상황을 다르게 처리하면, 백신은 악성코드를 추출하지 못한 채 감염된 파일을 무해하다고 판단할 수 있습니다. 구현 간 불일치가 그대로 취약점이 되는 셈이죠.

DEFLATE는 LZ77과 허프먼 부호화를 결합해 바이트열을 두 방식으로 압축합니다.

  1. 반복 문자열을 역참조로 대체 — to be or not to be는 to be or not (13, 5)로 표현 가능합니다. 괄호는 "13바이트 뒤로 돌아가 5바이트를 복사하라"는 뜻이에요.
  2. 빈도에 따른 가변 길이 부호 — 영어에서 흔한 e는 4~5비트로, 거의 등장하지 않는 벨 문자는 16비트로 나타내거나 아예 표현을 배정하지 않습니다.

RFC 1951 명세를 직접 읽으며 Rust로 압축 해제기를 작성했는데, 후기가 솔직합니다.

  • Rust는 처음이었지만 대체로 "C에 바라던 모습"에 가까웠음
  • 다만 일부 데이터 수명 규칙은 이해하기를 포기함
  • 언어가 비트 패킹의 개념적 어려움까지 없애주지는 않아서, 디버깅 중 예상 비트열을 손으로 적고 실제 결과와 비교하는 일이 잦았음

여러 프로젝트 중 가장 해커다운 느낌을 준 작업으로 꼽혔습니다.

5. 페어 프로그래밍: 실패도 자산

RC는 함께 문제를 푸는 페어 프로그래밍을 중요하게 여깁니다. DEFLATE 외에도 여러 공동 작업이 있었는데, 전부 성공한 건 아니에요.

Bill과 Emacs magit용 새 뷰를 만들려 했지만 둘 다 Emacs Lisp로 본격적인 프로그램을 써본 적이 없어 지나치게 야심 찬 시도였다고 합니다. 대신 이 과정에서 권유받은 Doom Emacs를 쓰기 시작해 지금도 만족스럽게 사용 중이라고 하네요.

6. 바이브 코딩으로 확인한 에이전트의 한계

RC에 온 목표 중 하나가 "LLM 활용에 익숙해지기"였던 만큼, 여러 소규모 프로젝트로 어디까지 맡길 수 있는지를 탐색했습니다.

잘 된 것

  • rcade용 리듬 게임: LLM에 서로 다른 프로토타입 10개를 만들게 한 뒤 가장 마음에 드는 것을 선택
  • 학술 논문의 기후 모델링을 구현한 판타지 지도 생성기 — 큰 작업을 얼마나 독립적으로 맡길 수 있는지 시험한 사례
  • 브라우저 게임 공유 시 제작자의 토큰 비용이 나가지 않도록, 사용자가 자기 접근 키 또는 WebLLM 기반 자체 GPU를 쓰게 하는 구성 요소
  • 활성 바이브 코딩 세션을 나열하는 Emacs 모드, 블로그 개선과 글쓰기 환경 설정

막힌 것

  • 에이전트들이 너무 비슷하게 답한다: Just One은 비밀 단어에 대해 서로 겹치지 않는 힌트를 줘야 하는 게임인데, temperature가 1이어도 같은 힌트가 나오는 일이 놀라울 만큼 잦았습니다.
    • 해결책은 각 에이전트에 사실상 *특정 주제에 해당하는 '성격'*을 부여하는 것이었습니다. shell에 대해 스포츠를 떠올리는 에이전트는 defense를, 히피 성격의 에이전트는 게자리와 연결되는 cancer를 힌트로 내는 식이죠.
  • 캐릭터가 경직된다: 에이전트와의 상호작용이 핵심인 외교 게임에서, "조건을 충족하기 전까지 도움을 거부하라"는 지시가 대립적이고 뻣뻣한 캐릭터를 만들어냈습니다. 캐릭터 설계나 프롬프트로 개선할 여지는 있겠지만 결국 해법을 찾지 못했다고 해요.

7. 발음이 겹치는 단어 찾기, 그리고 새 인공어 만들기

여름 후반에는 익숙하지 않은 분야에서, 기존 역량만으로는 답할 수 있을지 불확실한 질문을 LLM 도구로 탐색했습니다.

먼저 두 언어에서 발음이 같거나 매우 비슷한 단어열을 찾는 트리 탐색을 바이브 코딩으로 구현했습니다. PHOIBLE의 음소 목록이 비슷한 인도네시아어와 페르시아어를 골랐는데, 음운 체계가 유사해도 작업은 매우 어려웠고 결과로 나온 시의 완성도도 그다지 높지 않았다고 합니다.

이어서 conlang critic의 에스페란토 영상에서 영감을 받아 새 인공어 제작에 도전했습니다. 출발점은 이런 문제의식이에요.

에스페란토는 국제 보조어로 기대할 만큼 단순하지 않고, 어휘도 유럽 중심적이다. 다만 초기 시도였던 Zamenhof의 작업을 탓하기보다는, 인터넷의 풍부한 정보를 활용하면 더 나은 결과가 가능한지 시험해 보자.

  • 음운: PHOIBLE에서 여러 언어에 공통적인 소리를 골라 구성하고, 모국어가 다양한 사람도 발음·구별할 수 있도록 권장 이음(allophone)을 포함
  • 문법: Bernard Comrie와 Norval Smith의 Lingua Descriptive Studies questionnaire를 느슨하게 따라 단계적으로 구성. APiCS에 수록된 크리올어, 특히 피진어의 실제 사례를 의사결정 근거로 삼음
    • 서로 다른 문법에 익숙한 사람들이 협력할 때 수렴한 형태라면, 세계 여러 지역 사람에게도 직관적이거나 최소한 이해 가능하리라는 기대
    • 그 결과 굴절 대신 기능어로 문법 정보를 전달하는 분석어(중국어·베트남어에 가까운) 문법이 만들어짐
  • 어휘: 여러 세계 언어 사전을 바탕으로 구성. 이미 여러 언어가 차용한 국제적 어근은 그대로 빌려와 phonology → fonologia, coffee → kafe 같은 식으로 표기

나머지 어휘는 영어·중국어처럼 사용자가 많은 언어의 인지도와 다양한 어족의 대표성을 함께 고려하는 최적화기로 선택하려 했는데, 이 단계는 제대로 작동하지 않았습니다. 결국 Claude에 발표용 예시 대본을 만들 수 있을 정도로만 결과를 꾸미게 했고, 후속 글을 쓴다면 이 부분부터 고칠 계획이라고 밝혔습니다.

8. 코드 밖의 것들 — 기록, 제작 도구, 보드게임

  • 기록: 글쓰기보다 실제 작업에 집중했지만 내부 공개용 정기 활동 기록은 꾸준히 남겼고, 회고 작성에도 요긴했습니다. RC 참가자에게 "당시엔 번거롭더라도 기록을 끝까지 남기라"고 권합니다.
  • 3D 프린팅: 첫 출력물로 친구의 36번째 생일과 자신의 38번째 생일을 위한 촛대를 제작
  • 펜 플로터: 브루클린 공간의 HP 7440A로 유명한 바둑 대국의 한 장면을 그림
  • 보드게임: 매주 모임을 열고, 바둑 강습을 몇 차례 진행한 뒤 Gowanus Go club도 방문

9. 다른 참가자들이 만든 것들

RC의 즐거움 중 하나는 다른 사람의 프로젝트를 구경하는 일이었다고 합니다.

  • Teresa — 피부 온도 같은 생체 정보에 따라 사진에 오라를 더하는 촬영 장치
  • Jagi — 주변 소리에 반응해 패턴이 바뀌는 장식물
  • Sarah 등 — 오래된 전자잉크 화면으로 만든 "nintonio game mother"
  • Tony — 영수증 프린터를 이용한 exquisite corpse 게임
  • 그 외 펜 플로터 그림들, 그리고 RCade 아케이드 기기에 올라온 참가자 제작 게임들

마치며

RC는 수료생에게 경험을 돌아보는 짧은 "Return Statement" 작성을 권장하는데, 이 회고 역시 그 일환입니다.

이 글이 특히 읽을 만한 이유는 LLM 활용의 명암을 같은 비중으로 기록했다는 점입니다. 프로토타입 10개를 뽑아 고르거나 명세·테스트를 맡기는 건 확실히 통했지만, 에이전트의 응답 다양성 확보나 어휘 최적화 같은 작업에서는 분명한 벽이 있었죠. "AI로 다 된다"도 "AI는 쓸모없다"도 아닌, 직접 부딪혀 본 사람만 쓸 수 있는 종류의 기록입니다.

관심이 있다면 향후 기수에 지원할 수 있습니다.


원문: https://news.hada.io/topic?id=34419