
로컬 LLM의 내부 작동 원리를 이해하기 위해 로컬 코딩 에이전트 하네스 앱을 직접 제작하며 배운 점
요약
로컬 LLM의 저수준 작동 원리를 이해하기 위해 제작된 PyQt6 기반의 데스크톱 코딩 에이전트 'Sulfur'를 소개합니다. llama.cpp, Ollama 등을 백엔드로 지원하며 하드웨어 최적화 설정을 직관적으로 제어할 수 있는 오픈 소스 프로젝트입니다.
핵심 포인트
- 로컬 LLM의 와이어 레벨 작동 원리 및 하드웨어 설정 노출
- llama.cpp, LM Studio, Ollama 등 다양한 백엔드 지원
- GPU 레이어, KV 캐시 양자화 등 저수준 설정의 GUI 제공
- Qwen 2.5, Gemma 모델을 위한 스트리밍 사고 블록 렌더링 지원
- 데이터 외부 유출 없는 완전한 로컬 실행 환경 제공
저는 로컬 LLM(Large Language Models)이 와이어 레벨(wire level)에서 실제로 어떻게 작동하는지 제대로 이해하지 못했기 때문에 이 프로젝트를 시작했습니다. llama.cpp는 실제로 어떻게 요청을 처리할까요? 스트리밍 도구 호출(streaming tool calling)은 어떻게 작동할까요? 모델이 reasoning_content를 사용할 때는 어떤 일이 일어날까요? 그래서 직접 하나 만들어보는 건 어떨까 생각했습니다. 몇 달 후, 제가 만든 결과물인 Sulfur가 탄생했습니다.
Sulfur란 무엇인가: Windows용으로 제작된, 완전히 로컬에서 실행되는 PyQt6 기반의 데스크톱 코딩 에이전트 하네스(harness) 앱입니다. 작업 공간 파일들을 지정하면 AI가 이를 읽고, 쓰고, 편집하고, 검색할 수 있습니다. 세션이 저장되고 히스토리가 유지되며, 그 어떤 데이터도 컴퓨터 외부로 나가지 않습니다. 또한 오픈 소스이므로 원하는 대로 무엇이든 할 수 있습니다.
지원되는 백엔드(Backends):
- llama.cpp (서브프로세스(subprocess)로 관리되어 수동 서버 조작이 필요 없음)
- LM Studio
- Ollama
다른 도구들과 차별화되는 점:
GPU 레이어(layers), KV 캐시 양자화(KV cache quantization: f16/q8/q4), 플래시 어텐션(flash attention), MLOCK, MoE CPU 오프로드 레이어(offload layers), 스레드 수(thread count), 컨텍스트 크기(context size)와 같이 보통 숨겨져 있는 많은 저수준(low-level) 하드웨어 설정들을 노출했습니다. 하드웨어 성능을 최대한으로 끌어올리려 할 때, 이러한 설정을 조정하기 위해 설정 파일을 직접 수정할 필요가 없어야 한다고 생각했습니다. 이 모든 기능이 설정 대화 상자에 포함되어 있는데, 꽤 멋지다고 생각합니다.
기타 기능:
- 스트리밍 사고 블록 렌더링(Streaming think-block rendering, Qwen 2.5 / Gemma 사고 모델용)
- 컨텍스트로의 PDF 인입(PDF ingestion)
- 11가지 컬러 테마 (이유는 없지만 넣었습니다)
- 세션 관리 (생성, 이름 변경, 전환, 삭제)
- 파일 읽기/쓰기에 대한 권한 제어
- 커스텀 아이덴티티(custom identities): AI를 위한 자신만의
identity.md파일을 생성할 수 있습니다.
솔직한 한계점:
- 현재는 Windows 전용입니다. 하지만 코드베이스가 Windows 전용 시스템 콜(syscalls)을 사용하지 않는 순수 Python으로 작성되었기 때문에, Linux/Mac 포팅은 가능할 것입니다. 아직 거기까지 도달하지 못했을 뿐입니다.
- 경쟁하기 위해서가 아니라 배우기 위해 만들었습니다. Claude Code나 Cursor와 경쟁하려는 목적이 아닙니다. 만약 프로덕션급(production-grade) 에이전트 설정이 필요하다면, 이 앱은 아직 그 단계가 아닐 것입니다.
리포지토리(Repo): https://github.com/ChocoPichu/Sulfur
질문에 답변해 드릴 준비가 되어 있으며, 진심으로 피드백을 환영합니다. 이것은 저의 첫 번째 본격적인 오픈 소스 프로젝트입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기