Local Code Assistant 도전기 [1]
본 블로그는 RAG를 활용하여 개인 코드 기반에 맞춘 답변을 제공하는 LocalLLM 구축 과정을 상세히 설명합니다.
Contents
읽기전에
이 글은 RAG를 이용하여 저의 코드를 참고하여 답변을 해주는 LocalLLM 구축기입니다. [1] 편에서는 LocalLLM 을 구축하기 전까지 시도해봤던 방법들에 대해 소개하고, [2] 편에서는 RAG 와 결합된 LocalLLM 을 어떻게 구축하는지 소개해 보려 합니다.
RAG 를 활용한 LocalLLM 구축을 바로 읽고 싶으시다면, [2] 편을 바로 읽어주세요.
배경
개발자로서 최근에 가장 화두가 되고 있다고 느낀 기술은 LLM(Large Language Model) 입니다. ChatGPT, Gemini, Claude 와 같은 다양한 서비스들을 써보며, 이제는 LLM 과 AI 없는 세상으로는 돌아가기 힘들수도 있겠다는 생각이 듭니다. 3년 전만 해도 항상 개발할 때에는 Stackoverflow 가 켜져 있었는데, 어느 순간부터는 브라우저 탭에 Stackoverflow 대신 Claude, ChatGPT가 들어가게 되었습니다.
평소에 LLM 에게 많은 질문들을 하다, LLM을 더 똑똑하고 유능하게 만들고 싶다는 생각이 들었습니다. 요즘에는 Cursor 등 에디터에서 사용할 수 있는 똑똑한 LLM Agent도 많이 생겨나고 있습니다. Cursor 를 이용하면, LLM 과 함께 더 똑똑한 코드를 사용할 수 있지만, 다음과 같은 이유로 인해 저는 아직 Cursor를 사용하지 않고 있습니다.
VSCodium 기반의 에디터에서는 Kotlin, Spring 기반의 프로젝트를 개발하기 불편합니다. Kotlin 은 공식적으로 LSP(Language Server Protocol) 을 공개하지 않고 있기 때문에, VSCodium 에서는 오픈소스로 운영되는 Kotlin LSP 를 사용해야 합니다. 하지만 현업으로 사용하기에는 아직 완성도가 부족하다는 생각을 하게 되었습니다.
Jetbrain 기반의 에디터에서 LLM Agent 를 사용할 수는 없을까? 라는 생각을 해보게 되었습니다. 그러던 와중에, MCP 라는 개념을 알게 되었습니다.
MCP
MCP는 LLM(대형 언어 모델)의 컨텍스트 관리 및 외부 시스템과의 통합을 위한 프로토콜입니다. MCP 를 이용하면, 우리가 일반적으로 사용하는 어플리케이션과 LLM 을 연동하여 사용할 수 있습니다. MCP Server 를 간단하게 도식화 해보면, 다음과 같습니다.

부정확하지만 간단히 비유해 보자면, MCP Server 는 어플리케이션과 LLM 을 이어주는 Proxy Server 라고 볼 수 있겠습니다.. MCP Protocol 이라는 표준을 지키면, 다양한 어플리케이션들은 LLM 들과 일관된 방식으로 통신할 수 있게 됩니다. 마치 Code Editor 들에서 LSP(Language Server Protocol) 를 표준으로 사용하고 있는 것과 유사합니다.
Jetbrain의 경우, mcp-jetbrains 플러그인과 Claude Desktop 을 이용하여 LLM 을 AI Agent로 사용할 수 있습니다. AI Agent 를 이용하여 LLM 과 한층 더 가깝게 일할 수 있게 되었습니다.
근데 그러던 와중에 LLM 모델을 클라우드 서버가 아닌, 나의 로컬 하드웨어에서 돌리고 싶다는 생각을 하게 되었습니다. 각 LLM 제품들에는 Privacy 약관이 적혀있지만, 그래도 타사의 서버에 나의 데이터를 질문에 넘겨주어야 하기 때문입니다. 이러한 사고의 흐름으로 LocalLLM 에 관심을 가지게 되었습니다.
LocalLLM 을 이용하여 저의 코드베이스를 익숙하게 알고 있고, 저의 코딩 스타일에 맞게 코드를 작성해 주는 LLM 서비스를 스스로 만들어보고 싶었습니다.
Ollama
Ollama 로컬 환경에서 손쉽게 대형 언어 모델(LLM)을 실행하고 관리할 수 있도록 설계된 경량화된 AI 모델 실행 플랫폼입니다. Ollama 를 사용하면, 로컬 환경에서 LLM 모델을 다운로드하고, 사용할 수 있습니다. Docker CLI 와 같이, 다양한 모델들을 일관된 방법으로 제어할 수 있도록 도와줍니다.
저는 Gemma3 와 Qwen-2.5-coder 모델로 로컬(맥북 M1 Pro)에서 테스트를 해 보았습니다. 주로 코드 관련된 질문을 하기 위한 RAG 를 구축하려 시도해 보았기 때문에, Qwen-2.5-coder 를 주로 사용하였습니다.
Ollama 를 사용해 보며, 굉장히 사용하기 쉽게 잘 만들어졌다는 생각을 하게 되었습니다. 예를 들어, Ollama 를 로컬 환경에 설치하고, 다음과 같은 명령어만 실행하면 원하는 LLM 모델을 실행할 수 있습니다. 마치 Docker CLI 를 사용하는 것과 유사합니다.
ollama pull qwen2.5-coder:7b-instruct-q4_K_M
ollama run qwen2.5-coder:7b-instruct-q4_K_M
qwen2.5-coder:7b-instruct-q4_K_M이란 ?qwen-2.5-coder: 알리바바에서 만든 코드 작업에 특화된 LLM 모델7b: 모델의 크기 (7 Billion Parameters)instruct: Instruction Tuning (질문/답변에 최적화되도록 튜닝된 모델)q4_K_M: Quantization (모델의 크기를 줄이기 위한 방법 중 하나로, 4-bit 양자화를 사용하여 모델을 압축한 것)
다음은 Ollama 를 이용하여, 터미널에서 Gemma3 에게 테스트로 질문을 해 본 예시입니다. 

  하지만 Ollama 를 이용하여 깨끗한 상태의 LLM Model 을 실행해 보았을 때, 유료 LLM 모델보다 성능이 좋지 않다는 느낌을 받았습니다. 왜냐하면 로컬(노트북)에서 사용하는 모델이다 보니, 모델의 크기 자체가 훨씬 작습니다. 물론 좋은 VGPU 카드를 이용한다면 성능이 좋은 LocalLLM 을 만들 수 있겠지만, 저의 상황에서는 쉽지 않겠다는 생각을 하게 되었습니다. qwen2.5-coder:7b-instruct-q4_K_M 모델을 더 똑똑하게 만드는 방법을 고민하다, Fine Tuning 과 RAG 기법을 알게 되었습니다.
RAG
Fine Tuning 은 모델을 직접 학습시키는 방법입니다. 하지만 Fine Tuning 은 모델을 학습시키기 위해 많은 하드웨어 자원이 필요합니다. 저는 이에 대해 전문적인 지식이 없지만, Fine Tuning 을 하기 위해서는 모델을 직접 제어해야 하기 때문에, 많은 수준의 VGPU 자원이 필요하다고 합니다. (Apple Silicon 에서는 MLX 기술을 이용하여, 노트북에서도 Fine Tuning 을 할 수도 있다고 합니다.)
반면에 RAG 는 LLM 모델이 학습하지 못한 데이터에 대해 질문을 할 수 있도록 도와주는 기술입니다. 당근마켓의 글 을 읽어보고, LocalLLM 에게 저의 코드베이스를 문맥으로 넣어줄 수 있겠다는 생각을 해보게 되었습니다.
다음으로
이 글에서는 제가 왜 Local Code Assitant 를 만들고 싶었는지 설명하고, 왜 LocalLLM 과 RAG 를 선택해는지에 대한 배경을 설명했습니다. 다음 글에서는 LocalLLM 과 RAG 를 이용하여 어떻게 Code Assistant 를 구축했는지 설명해 보겠습니다.
참고자료
- Introducing the Model Context Protocol
 - Claude MCP로 엔지니어랑 업무 자동화하기
 - A simple guide to local LLM fine-tuning on a Mac with MLX
 - RAG를 활용한 검색 서비스 만들기
 
이것도 읽어보세요