내 프로젝트를 실제로 이해하는 개인용 AI 구축하기 (RAG + Ollama, 클라우드 미사용)
요약
클라우드와 API 비용 없이 로컬 환경에서 프로젝트 문서와 코드를 이해하는 개인용 RAG 시스템 구축 방법을 소개합니다. Ollama와 Chroma를 활용하여 데이터 보안을 유지하면서도 효율적인 컨텍스트 관리가 가능한 아키텍처를 제안합니다.
핵심 포인트
- Ollama와 Chroma를 활용한 완전 로컬 RAG 스택 구축
- 컨텍스트 윈도우 제한 문제를 해결하기 위한 벡터 DB 기반 검색
- 코드, 노트, API 문서 등 다양한 개인 데이터를 인덱싱 가능
- 증분 업데이트를 통한 효율적인 데이터 관리 방법 제시
매 세션마다 AI에게 내 코드베이스를 설명하는 것에 지쳤습니다.
"여기 아키텍처가 있습니다. 여기 README가 있습니다. 지난번에 시도했던 내용은 이렇습니다." 매.번. 매.번. 말이죠.
그래서 저는 내 프로젝트, 내 노트, 내 문서들을 영구적으로 알고 있는 로컬 RAG (Retrieval-Augmented Generation, 검색 증강 생성) 시스템을 구축했습니다. 클라우드 없음. API 비용 없음. 컨텍스트 윈도우 (Context Window) 초기화 없음.
정확히 어떻게 작동하는지 소개합니다.
컨텍스트 윈도우 (Context Windows)의 문제점
LLM (Large Language Models)은 기억하지 못합니다. 매 세션마다 똑같은 200줄의 컨텍스트를 붙여넣고, 토큰 제한에 걸리면 다시 시작해야 합니다. 일회성 질문에는 괜찮지만, 지속적인 프로젝트에는 매우 소모적입니다.
표준적인 해결책은 RAG입니다. 모든 것을 프롬프트에 밀어 넣는 대신, 문서를 벡터 데이터베이스 (Vector Database)에 저장하고 질문을 할 때 관련된 청크 (Chunks)만 검색하는 방식입니다. 모델은 전체 저장소 대신 타겟팅된 3~5개의 문단을 보게 됩니다.
결과: 더 빠르고, 더 저렴하며, AI가 실제로 올바른 질문에 답변합니다.
아키텍처 (The Architecture)
사용자의 문서 (markdown, code, PDFs, notes)
→ 청킹(Chunked) + 임베딩 (Ollama nomic-embed-text)
→ Chroma (로컬 벡터 DB)에 저장
...
클라우드 미사용. API 키 미사용. Mac Mini 또는 8GB RAM이 있는 모든 기기에서 실행 가능.
인덱싱 대상
평소 제 컨텍스트 윈도우를 잡아먹던 모든 것들입니다:
- 프로젝트 README 및 아키텍처 문서
- 개인 노트 (Obsidian vault)
- 코드 스니펫 (Code snippets) 및 과거 해결책
- 정기적으로 사용하는 API 문서
- 북마크한 Stack Overflow 답변 (항상 다시 까먹기 때문입니다)
- 설정 파일 및 배포 노트
총 인덱싱된 양: 약 4,800개 청크. 쿼리 시간: 2초 미만.
1단계: 스택 설치하기 (15분)
# Ollama (이미 설치되어 있다면 건너뛰세요)
curl -fsSL https://ollama.com/install.sh | sh
...
이것이 스택의 전부입니다. Docker는 필요하지 않습니다 (단, 지속적인 서버를 원한다면 Chroma의 Docker 옵션을 사용할 수 있습니다).
2단계: 문서 인덱싱하기
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import OllamaEmbeddings
...
한 번만 실행하면 됩니다. 완료되었습니다. 이제 여러분의 문서는 단순한 키워드가 아닌 의미(meaning)를 기반으로 검색할 수 있습니다.
3단계: 질문하기 (Query It)
import ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
...
여러분의 문서로부터 얻은 실제 답변입니다. 여러분의 특정 설정에 대해 환각 (hallucination) 현상이 발생하지 않습니다.
핵심 기능: 증분 업데이트 (Incremental Updates)
파일 하나가 변경되었다고 해서 모든 것을 다시 인덱싱할 필요는 없습니다. 새로 추가된 부분만 업데이트하세요:
import hashlib
import json
from pathlib import Path
...
이 코드를 매시간 cron job으로 실행하세요. 여러분의 지식 베이스 (knowledge base)가 자동으로 최신 상태를 유지합니다.
실제로 나에게 일어난 변화
RAG 적용 전:
- "내 Garmin 프로젝트의 백그라운드 서비스 메모리 제한에 대해 설명해줘" → 200줄의 코드를 붙여넣기 → 기다림 → 답변
- 새로운 채팅 세션마다: 컨텍스트 (context) 초기화, 다시 설명 시작
RAG 적용 후:
ask("Garmin background service memory limit")→ "64KB 샌드박스, Background.exit(dictionary)를 통해 데이터 전달" — 1.8초 만에 완료
이제 나의 LLM은 6개월 동안 건드리지 않은 프로젝트에 대한 질문에도 답변합니다. 컨텍스트 관리도, 붙여넣기도 필요 없습니다. 그냥 물어보기만 하면 됩니다.
하드웨어 요구 사항
| 설정 | RAM | 임베딩 속도 (Embedding Speed) | 쿼리 속도 (Query Speed) |
|---|---|---|---|
| Mac Mini M4 8GB | 8GB | ~500 docs/min | ~2s |
| ... |
임베딩 단계 (인덱싱)가 느린 부분입니다. 한 번만 실행하면 그 이후로는 즉각적입니다.
3개월간 운영하며 얻은 팁
- 청크 크기 (Chunk size)가 중요합니다 — 산문이나 문서의 경우 400 토큰(tokens) 정도가 적당합니다. 코드의 경우, 더 많은 중첩(overlap)을 포함하여 200 토큰 정도로 시도해 보세요.
- 메타데이터 (Metadata)를 활용하세요 — 청크 메타데이터에
filename과section을 저장하세요. AI가 "배포 노트를 참조하세요"라고 말할 때, 정확히 어디를 찾아봐야 할지 알 수 있습니다. - 정확도가 중요하다면 리랭킹 (Re-rank)을 수행하세요 — 상위 5개의 청크만으로 충분하지 않다면, 리랭커(re-ranker) 단계를 추가하세요 (Cohere는 무료 API를 제공하며, 로컬 크로스 인코더(cross-encoder)를 사용할 수도 있습니다).
- 임베딩 모델 (Embed model)을 주의 깊게 선택하세요 —
nomic-embed-text는 RAG 작업에서 대부분의 더 큰 모델들보다 성능이 뛰어납니다. 채팅용 LLM을 임베딩 용도로 사용하지 마세요. - 하이브리드 검색 (Hybrid search) — 특정 이름이나 함수가 포함된 기술적 질의에 대해 더 나은 결과를 얻으려면 벡터 검색(vector search)과 BM25 키워드 검색(keyword search)을 결합하세요.
더 큰 그림 (The Bigger Picture)
이것은 더 큰 프로젝트의 첫 번째 단계입니다. 즉, 매 세션마다 초기화되는 대신 당신의 프로젝트와 함께 성장하는 개인용 AI를 만드는 것입니다.
제가 구축 중인 다음 단계는 다음과 같습니다: Git 커밋으로부터의 자동 인덱싱 (코딩하는 동안 실시간으로 차이점(diffs)을 인덱싱) + 터미널을 사용하지 않는 사용자를 위한 간단한 웹 UI.
현재 이 설정의 총 비용: 월 $0. 이미 가지고 있던 Mac Mini에서 그대로 실행됩니다.
솔직한 결론 (The Honest Bottom Line)
RAG는 마법이 아닙니다. 언어 모델(language model)을 상단에 얹은 데이터베이스 쿼리(database query)일 뿐입니다. 하지만 이는 실제 문제, 즉 당신의 자료를 알지 못하는 LLM의 문제를 해결합니다.
매 세션마다 ChatGPT에 README 파일을 붙여넣고 있다면, 이것을 시도해 보세요. 15분의 설정만으로 당신의 AI는 마침내 당신이 어제 말한 내용을 기억하게 될 것입니다.
Sam Hartley는 Mac Mini + RTX 3060 홈 랩(home lab)에서 도구를 만드는 1인 개발자입니다. AI를 활용하여 결과물을 출시하는 과정의 현실적인 모습에 대해 글을 씁.
→ Fiverr의 맞춤형 자동화 설정
→ Telegram에서 CelebiBots 팔로우하기
ai #rag #ollama #selfhosted #python #homelab #buildinpublic
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기