TERMy: LLM을 사용하지 않는 빠른 터미널 어시스턴트
요약
LLM에 의존하지 않는 새로운 방식의 터미널 어시스턴트 'TERMy'를 개발했습니다. 기존 LLM 기반 도구들이 겪던 반복 루프, 일관성 부족 등의 문제를 해결하기 위해 임베딩, 머신러닝, LLM 사용을 배제하는 접근 방식을 취했습니다. 대신 구조화된 데이터셋(NDF)과 규칙 기반의 지식 원자(atom of knowledge)를 활용하여 터미널 명령어 학습 및 기능을 확장할 수 있는 시스템을 구축했습니다.
핵심 포인트
- LLM 의존성 탈피: 임베딩, ML, LLM 사용 없이 작동하는 방식 제시
- NDF (NPC-Forge 데이터셋 형식 지정 파일): 카테고리, 입력/출력, 사고 과정 등을 포함한 구조화된 지식 원자.
- 규칙 기반 학습의 장점: 새로운 명령어 학습이 데이터셋 추가만으로 즉시 가능하여 확장성이 높음.
- 개발 목표: NLU 파이프라인 구현 및 터미널 어시스턴트 작동에 필요한 모든 기능을 약 1000줄 코드로 완성하는 것.
저는 연구 개발(R&D)을 좋아합니다. 아마도 PJON (Padded Jittering Operative Network) 때문에 저를 들어보셨을 수도 있습니다. 이것은 제가 2010년에 개발하기 시작한 네트워크 프로토콜로, 최근 ETH Zurich 대학에서 Pius Sieber의 연구 덕분에 실리콘으로 구현되었습니다.
지난 7월 초부터 저는 개인 프로젝트에 집중할 기회를 가졌습니다. AI 가격 인상과 보조금 지원을 받는 토큰 최대 사용(tokenmaxing)이 끝나는 이상한 시기였죠. 저는 간단한 자연어 요청을 처리할 수 있는 터미널 어시스턴트를 처음부터 개발할 수 있을지 궁금했습니다. 저는 기억력이 나빠서 매달 무시할 수 없는 비용을 들여 copilot에게
제가 테스트한 모든 모델들은 같은 문장을 반복하는 루프에 빠지기 쉬웠고, QA 데이터셋으로 훈련했더라도 기술적인 질문에 대해서는 일관성 있게 답변하기 어려웠습니다. 저는 Project Gutemberg의 저작권 없는 도서 모음과 많은 오픈 소스 소프트웨어, 그리고 Huggingface에서 구할 수 있는 다양한 데이터셋을 이용해 모델들을 훈련했습니다.
이 접근 방식으로는 실현 불가능하다는 것을 빠르게 깨달았습니다. 제대로 된 테스트를 하려면 최소 한 달 동안 쉬지 않고 훈련해야 할 것 같았기 때문입니다. 제 모델들이 살아 움직이고 마법처럼 보이는 모습에 놀라기도 했지만, 엄청나게 자원을 낭비하고 사실상 쓸모없다는 점에 대해서는 부끄러움을 느꼈습니다.
그래서 저는 ollama와 오픈 웨이트(open-weight) 모델로 방향을 틀어, 모델이 터미널 명령어만으로 답변하도록 강제하는 프롬프트(pre-prompt)를 사용하는 또 다른 터미널 도구인 howto를 개발했습니다. 하지만 응답을 받는 데 시간이 오래 걸리기 때문에 결과는 대체로 만족스럽지 못했습니다. ornith:9b, mistral:7b 또는 cogito:14b 같은 모델들이 때때로 이 작업을 수행할 수는 있지만, 특히 VRAM이 4GB밖에 없는 경우 일반적인 사용에 필요한 속도와 신뢰성을 갖추지는 못했습니다.
그러다가 블록체인 열풍을 떠올렸습니다. 모두가 블록체인을 어딘가에 끼워 넣어 다음 대박 상품처럼 팔려고 할 때였죠. 저는 이전 과대광고 주기(hype cycle)에서 모든 사람들이 했던 것처럼 시간과 돈을 낭비하고 싶지 않았기 때문에, 새로운 제약 조건 세트를 가지고 처음부터 터미널 어시스턴트를 구축하기 시작했습니다:
- 임베딩(embeddings) 사용 안 함
- 머신러닝(machine-learning) 사용 안 함
- LLM 사용 안 함
가장 먼저 필요했던 것은 의존할 수 있는 일련의 규칙이었습니다. 그래서 저는 NDF 0.0을 작성했습니다 (NPC-Forge 데이터셋 형식 지정 파일). 이 객체는 VS code와 호환되는 형식으로 카테고리, 입력 문장, 텍스트 응답, 사고 과정(thinking traces), 권한 게이팅(permission gating), 그리고 실행할 도구 호출(tool calls)을 포함합니다.
{
"category": "linux_files",
"input": [
...
저는 이것에 정말 빠졌습니다. 쉽게 편집하고 공유할 수 있는 자족적인 지식의 원자(atom of knowledge)입니다. 이 규칙을 준수한다면 대화형 에이전트의 기능을 확장하는 것이 매우 쉽습니다. 예를 들어, 제 터미널 어시스턴트가 docker 명령어에 대해 학습하도록 하고 싶다면, dataset_docker.json 파일에 객체 목록만 작성하면 됩니다.
이 파일을 데이터셋 디렉터리에 넣기만 하면, NPC는 마치 네오(Neo)가 매트릭스(The Matrix)에서 주짓수(Jujitsu)를 배운 것처럼 즉시 그것들을 학습합니다.
다음으로 해결해야 할 문제는
저는 위에서 설명한 데이터 형식을 활용하고 NLU(Natural Language Understanding) 파이프라인을 구현하며 터미널 어시스턴트가 작동하는 데 필요한 모든 기능을 약 1000줄의 코드로 만들기 위해 FlintParser와 FlintNPC 클래스를 작성했습니다. 저는 이 클래스들을 Python으로 로컬 OS 환경용과 JavaScript로 브라우저 탭이나 Node.js 인스턴스 내부에서 클라이언트 측으로 실행되는 동일하고 상호 호환 가능한 구현체로 작성했습니다.
가장 어려웠던 부분은 무엇을, 어떤 순서로 해야 할지 결정하는 것이었습니다. 저는 저만의 프로그래밍 언어인 BIPLAN의 컴파일러에 대해 많은 작업을 했고, 그것을 개발하면서 코드 번역 시 가장 먼저 해야 할 일은 노이즈를 제거하고, 그다음 가장 비용 효율적인 경로부터 시도하며 작업해야 한다는 영광스러운 경험을 했습니다.
그래서 제가 구현한 파이프라인은 다음과 같습니다:
- 욕설, 감탄사, 격려/낙담/감사 단어 제거 (노이즈 제거)
- 감성 분석(Sentiment analysis)
- 정확 일치(Exact Match) (매우 빠름)
- 템플릿 일치(Template Match) (매우 빠름)
- 확률적 일치(Probabilistic Match) (느림)
단계 5는 다음을 기반으로 합니다:
- 희귀 단어를 식별하기 위한 IDF(Inverse Document Frequency)
- 단어 순서 변경에 대응하기 위한 BOW(Bag Of Words)
- 오타를 안전하게 처리하기 위한 IDF 가중치 레벤슈타인 거리(IDF weighted Levenshtein)
거의 2개월 동안 벽에 스파게티 던지듯 시도하며 기대했던 것들이 붙기를 바랐던 후, 저는 다시 이해할 수 있고 예측 가능한 무언가를 작업하는 기쁨을 느꼈습니다. 마침내 제 컴퓨터에서 작동하는 신뢰할 수 있는 터미널 어시스턴트를 갖게 된 것입니다!
저는 이것을 TERMy라고 이름 짓기로 결정했습니다.
이것이 기존 NLU 프레임워크와 어떻게 비교되는가? Rasa와 NLP.js는 무겁고 머신러닝 분류기 및 학습 파이프라인에 의존하며, ChatScript는 악명 높게 가파른 학습 곡선을 가진 거대한 프로그램입니다. NPC-Forge는 이 모든 것을 제거하여 훈련이 전혀 필요 없고, 강력하고 유연한 데이터 형식을 지정하며, 마이크로컨트롤러에서 실행하기에 충분히 작은 놀라울 정도로 능숙한 파서를 특징으로 합니다.
저는 TERMy를 개발하여 Copilot에 연결했고, 이로써 제가 이전에는 Claude에게 보내던 프롬프트의 일부를 처리할 수 있게 되었습니다! 이것은 LLM이 아니지만 제 역할을 해내고 즉각적입니다! 저희 대부분이 harness를 사용하는 결정론적 에이전트를 보는 것은 처음일 것이라 생각합니다. 하지만 저는 이것이 가까운 미래에 지배적인 주제가 될 것이라고 믿습니다:
Copilot의 최근 가격 인상이 제가 마침내 이 소프트웨어에 시간을 할애하도록 만든 것이라는 점은 아이러니합니다. 어쩌면 이것이 기업 SaaS의 수명 주기일지도 모릅니다? 어느 쪽이든, 저는 Copilot이나 Pi 같은 harness가 TERMy와 같은 결정론적 NPC(Non-Player Character)에 의존하고, 무거운 LLM으로는 최후의 수단으로만 사용해야 한다고 믿습니다. 사소한 작업에 컴퓨팅 자원과 전기를 계속 낭비하는 것은 비싸고 무책임합니다.
NPC-Forge는 다음과 같은 기능을 제공하는 프레임워크, 서버 및 CLI입니다:
- OpenAI API 서버 관리
- NPC 관리
- 진단 및 테스트
NPC-Forge 덕분에 이제 누구나 빠르게 NPC를 구축하고 커뮤니티와 공유할 수 있으며, 이 NPC들은 RPI Zero 같은 모든 Linux 장치의 CPU에서 밀리초 단위로 응답합니다. 상상해 보세요. 이제 여러분의 AC 미터나 라우터도 무료로 대화형 에이전트를 제공할 수 있습니다. 이 접근 방식은 또한 더 민주적입니다. 사용자가 그렇게 프로그래밍한다면, 여러분의 NPC는 불편한 말을 기꺼이 할 것이며, 이는 여론, 문화 및 언어를 형성하는 기업의 정렬 필터(alignment filters)나 가드레일보다 훨씬 낫습니다.
조금 관대하게 봐주시길 부탁드립니다. 이것은 제가 두 달 동안 열정적으로 개발하여 만든 첫 파이썬 프로젝트입니다. 저는 코드가 아직 프로덕션 준비가 되지 않았다는 것을 충분히 인지하고 있습니다. TERMy가 때때로 방출하는 명령어 체인 때문에 많은 리눅스 베테랑들이 영원히 저를 저주할 것이라고 장담합니다. 안전성과 프로덕션 준비 상태를 달성하기 위해서는 데이터셋과 소스 코드에 많은 작업이 필요합니다.
이것은 아주 먼 미래에 우리가 사용할 수도 있는 것을 보여주기 위한 초기 출시판임을 고려해 주십시오. 만약 커뮤니티의 노력이 NPC-Forge와 TERMy에 집중된다면, 저는 그것들이 우리에게 더 많은 자유를 제공하고 돈, 전기, 시간을 절약하는 데 도움을 줄 수 있을 것이라고 생각합니다. 이 글이 마음에 드셨고 저와 동의하신다면, 프로젝트에 기여하는 것을 고려해 주십시오. 즐거운 만지기 되시길 바랍니다!
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Chip/GPU의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기