
매달 눈덩이처럼 불어나는 클라우드 LLM API 호출 요금과 벡터 데이터베이스 구독료는 엔지니어와 개발팀 모두에게 큰 부담입니다. 특히 외부 클라우드로 사내 문서나 민감한 개인 지식베이스를 전송해야 하는 프라이버시 이슈는 해결하기 어려운 난제입니다. 이번 가이드에서는 상용 클라우드 서비스에 단 1원의 비용도 지출하지 않고, 내 서버의 온프레미스 GPU 인프라를 활용하여 로컬 LLM과 PostgreSQL pgvector 데이터베이스를 직결하는 자립형 RAG(Retrieval-Augmented Generation) 시스템을 완전 자동화로 구축하는 실전 전략을 공개합니다.
RHAIA200 홈랩 클러스터 환경에서 실측 검증된 아키텍처를 바탕으로, 지식 데이터의 파싱부터 벡터 임베딩 생성, HNSW 기반의 초고속 벡터 인덱싱, 그리고 로컬 LLM의 컨텍스트 합성까지 이어지는 파이프라인 전체를 단계별로 살펴보겠습니다.
온프레미스 RAG 아키텍처와 로컬 데이터베이스 연동의 필요성
클라우드 기반 AI 인프라의 가장 큰 위험 요소는 지속적인 비용 누적과 데이터 주권(Data Sovereignty)의 상실입니다. OpenAI나 Anthropic의 API를 활용한 RAG 서비스는 초기 구축이 간단하지만, 일일 수만 건의 쿼리가 발생하는 환경에서는 호출당 토큰 비용과 파인콘(Pinecone) 등 상용 벡터 DB 호스팅 비용이 기하급수적으로 증가합니다.
[로컬 마크다운 / 사내 문서]
│ (청킹 & 전처리)
▼
[Ollama 임베딩 엔진] ──▶ [PostgreSQL pgvector (HNSW Index)]
│ (코사인 유사도 검색 Top-K)
▼
[사용자 질의] ──────────────▶ [컨텍스트 합성 프롬프트]
│
▼
[온프레미스 GPU LLM (Gemma/Qwen/Llama)]
│
▼
[완전 로컬 최종 답변]

온프레미스 GPU 환경에 RAG를 구축하면 다음과 같은 결정적 혜택을 누릴 수 있습니다:
1. 비용 제로화: 전기요금 외에 추가적인 API 사용료, 월간 구독료가 영구히 발생하지 않습니다.
2. 완벽한 데이터 격리: 모든 사내 기밀, 소스코드, 개인 메모가 로컬 LAN 내부(192.168.10.x)에서만 순환되므로 외부 유출 위협이 원천 차단됩니다.
3. 무제한 처리량: 클라우드 API의 분당 요청 제한(Rate Limit) 없이 하드웨어 가용 범위 내에서 24시간 무제한 배치 프로세스를 구동할 수 있습니다.
클라우드 API 종속 탈피와 데이터 프라이버시 확보
외부 LLM 공급업체는 프롬프트와 문서를 학습 데이터로 활용하지 않는다고 고지하지만, 전송 구간 암호화나 서비스 약관 변경 위험은 상존합니다. 온프레미스 구축은 물리적 장치 자체를 관리자가 소유하므로 컴플라이언스 및 개인정보보호 규정(GDPR, PIPA)을 완벽하게 충족합니다.
비용 0원 인프라를 위한 온프레미스 하드웨어 구성
15대 베어본 PC 클러스터 및 Proxmox 하이퍼바이저 기반 환경에서는 RTX 3060/4060 Ti(16GB VRAM) 급 이상의 단일 소비자용 GPU만으로도 7B~14B 파라미터 양자화(Q4KM / IQ3) 모델과 로컬 임베딩 모델을 동시에 여유롭게 운용할 수 있습니다.
로컬 벡터 데이터베이스(PostgreSQL + pgvector) 구축
전용 벡터 데이터베이스(Pinecone, Qdrant, Milvus)를 별도 설치할 수도 있지만, 관계형 데이터베이스의 신뢰성과 벡터 검색의 강력함을 동시에 갖춘 PostgreSQL + pgvector 조합이 온프레미스 환경에서 가장 검증된 선택지입니다.
Docker 기반 pgvector 컨테이너 배포
Docker Compose를 통해 루프백 내부망 전용으로 안전하게 배포합니다:
version: '3.8'
services:
vectordb:
image: pgvector/pgvector:pg16
container_name: local-pgvector
restart: unless-stopped
environment:
POSTGRES_DB: rag_knowledge
POSTGRES_USER: rag_admin
POSTGRES_PASSWORD: your_strong_local_password
ports:
- "127.0.0.1:5432:5432"
volumes:
- /var/lib/postgresql/pgvector_data:/var/lib/postgresql/data
임베딩 벡터 저장을 위한 스키마 및 인덱스(HNSW) 설계
PostgreSQL 접속 후 vector 확장을 활성화하고, 지식 청크 테이블을 생성합니다:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS document_chunks (
id BIGSERIAL PRIMARY KEY,
document_title VARCHAR(255) NOT NULL,
chunk_index INT NOT NULL,
content TEXT NOT NULL,
metadata JSONB DEFAULT '{}'::jsonb,
embedding vector(1024), -- bge-m3 기준 1024차원
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 대규모 벡터 검색을 위한 HNSW 인덱스 생성
CREATE INDEX IF NOT EXISTS idx_chunks_embedding_hnsw
ON document_chunks
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
HNSW(Hierarchical Navigable Small World) 인덱스는 IVFFlat 대비 인덱스 생성 시간은 약간 더 소요되지만, 수십만 건의 청크에서도 10ms 이하의 압도적인 검색 지연 시간과 높은 재현율(Recall)을 보장합니다.
Ollama 기반 임베딩 및 로컬 LLM 추론 파이프라인
로컬 인프라의 핵심 엔진은 Ollama입니다. Ollama는 별도의 복잡한 파이썬 환경 세팅 없이 단일 REST API로 양자화 LLM 및 임베딩 모델을 고속 GPU 가속으로 서빙합니다.
온프레미스 임베딩 모델 및 LLM 모델 선정
- 임베딩 모델:
bge-m3(다국어 특화, 1024차원, 밀집 및 희소 검색 지원) - 생성형 추론 LLM:
gemma4:12b-iq3또는qwen2.5:7b-instruct(VRAM 6~10GB 범위 내 최적 밸런스)
# Ollama 호스트(192.168.10.200)에서 모델 준비
ollama pull bge-m3
ollama pull batiai/gemma4-12b:iq3
Python RAG 오케스트레이션 구현 예제
다음은 psycopg와 requests를 사용해 외부 클라우드 라이브러리 의존성 없이 순수 코드로 구현한 RAG 쿼리 파이프라인입니다:
import requests
import psycopg2
from psycopg2.extras import RealDictCursor
OLLAMA_HOST = "http://192.168.10.200:11434"
DB_CONFIG = {
"dbname": "rag_knowledge",
"user": "rag_admin",
"password": "your_strong_local_password",
"host": "127.0.0.1",
"port": 5432
}
def get_embedding(text: str) -> list[float]:
"""Ollama REST API를 호출하여 텍스트 임베딩 벡터를 추출합니다."""
res = requests.post(
f"{OLLAMA_HOST}/api/embeddings",
json={"model": "bge-m3", "prompt": text},
timeout=30
)
res.raise_for_status()
return res.json()["embedding"]
def search_relevant_chunks(query: str, top_k: int = 3) -> list[dict]:
"""pgvector HNSW 인덱스를 활용해 코사인 유사도 상위 청크를 조회합니다."""
query_vector = get_embedding(query)
query_str = "[" + ",".join(map(str, query_vector)) + "]"
with psycopg2.connect(**DB_CONFIG) as conn:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute("""
SELECT document_title, content,
1 - (embedding <=> %s::vector) AS similarity
FROM document_chunks
ORDER BY embedding <=> %s::vector ASC
LIMIT %s;
""", (query_str, query_str, top_k))
return cur.fetchall()
def generate_rag_answer(query: str) -> str:
"""검색된 지식 컨텍스트를 주입하여 로컬 LLM의 답변을 합성합니다."""
chunks = search_relevant_chunks(query, top_k=3)
context_text = "\n\n".join([f"[{c['document_title']}]\n{c['content']}" for c in chunks])
prompt = f"""당신은 온프레미스 지식베이스 기반의 정확한 AI 어시스턴트입니다.
제공된 아래 참고 자료만을 바탕으로 사용자의 질문에 객관적으로 답변하세요.
[참고 자료]
{context_text}
[질문]
{query}
[답변]:"""
res = requests.post(
f"{OLLAMA_HOST}/api/generate",
json={
"model": "batiai/gemma4-12b:iq3",
"prompt": prompt,
"stream": False,
"options": {"temperature": 0.2, "num_ctx": 4096}
},
timeout=120
)
return res.json()["response"]
성능 평가 및 실전 최적화 벤치마크
실제 운영 환경에서 측정된 벤치마크 수치와 최적화 튜닝 포인트는 다음과 같습니다.
실측 성능 지표 비교
| 평가 항목 | 클라우드 API (OpenAI + Pinecone) | 온프레미스 (Ollama + pgvector) | 비고 |
|---|---|---|---|
| 월간 호스팅 비용 | $150 ~ $600+ (사용량 비례) | 0원 (전기세 제외) | 완전 자립화 |
| 임베딩 생성 지연시간 | 120ms ~ 350ms (네트워크 RTT 포함) | 18ms ~ 35ms (LAN/루프백 직결) | 7배 이상 빠름 |
| 벡터 유사도 검색 시간 | 45ms ~ 90ms | 6ms ~ 12ms (pgvector HNSW) | 초저지연 달성 |
| 토큰당 생성 속도 | ~40 TPS | 28 ~ 38 TPS (GPU 단독 기준) | 쾌적한 실사용 수준 |
| 외부 데이터 유출 위험 | 잠재적 상존 | 완전 0% (에어갭 보장) | 보안성 최고 등급 |
실전 튜닝 권장사항
- 문서 청킹 크기: 500자 내외에 50자 오버랩(Overlap) 설정이 지식 누락 방지와 의미적 응집도 면에서 가장 안정적입니다.
- VRAM 분할: 임베딩 전용 경량 모델은 시스템 RAM에 상주시키거나 최소 VRAM(1GB 미만)만 배정하고, 메인 추론 모델에 VRAM을 최대한 집중시키는 전략이 유효합니다.
- 자동 복구 감시 데몬: systemd 또는 백그라운드 Watchdog을 통해 Ollama와 PostgreSQL 서비스의 상태를 주기적으로 감시하고 OOM 발생 시 자동 재시작되도록 구성합니다.
자주 묻는 질문
Q1. 온프레미스 RAG 환경 구축 시 최소 요구 하드웨어 사양은 무엇인가요?
최소 권장 사양은 6코어 이상의 x86 CPU, 32GB 시스템 RAM, 그리고 VRAM 8GB 이상의 NVIDIA GPU(예: RTX 3060 12GB 또는 RTX 4060 Ti 16GB)입니다. 16GB 이상의 VRAM을 확보하면 14B 수준의 고지능 모델도 여유롭게 구동할 수 있습니다.
Q2. 상용 클라우드 RAG 솔루션 대비 로컬 RAG의 검색 성능 차이는 어느 정도인가요?
최신 bge-m3 및 nomic-embed 모델의 한글 MTEB(Massive Text Embedding Benchmark) 점수는 OpenAI text-embedding-3-small 모델과 대등하거나 도메인 특화 데이터셋에서는 오히려 더 우수한 정확도를 보여줍니다. 따라서 적절한 청킹과 메타데이터 필터링을 병행하면 상용 서비스 못지않은 고품질 검색이 가능합니다.
Q3. PostgreSQL pgvector 외에 ChromaDB나 Milvus 같은 전용 벡터 DB와의 차이점은 무엇인가요?
ChromaDB는 경량 파이썬 프로젝트에 적합하지만 대규모 동시성 처리에 한계가 있고, Milvus는 분산 클러스터용이라 단일 홈랩 서버에서는 리소스 낭비가 큽니다. PostgreSQL pgvector는 ACID 트랜잭션, 관계형 데이터 결합, 익숙한 SQL 문법, 뛰어난 HNSW 성능을 모두 갖추고 있어 1인 홈랩부터 중소규모 시스템까지 가장 완벽한 밸런스를 제공합니다.
Q4. 임베딩 모델과 LLM 추론 모델을 한 대의 GPU에서 동시에 구동할 수 있나요?
네, 충분히 가능합니다. Ollama는 요청에 따라 GPU 메모리에 모델을 번갈아 스왑하거나, VRAM 여유가 있을 경우 여러 모델을 동시 메모리 로드 상태로 유지할 수 있습니다. OLLAMA_NUM_PARALLEL과 OLLAMA_KEEP_ALIVE 환경변수를 조정하여 메모리 잔류 시간을 최적화할 수 있습니다.
Q5. 실시간 문서 추가 시 인덱싱 부하를 줄이는 팁은 무엇인가요?
문서가 유입될 때마다 즉시 인덱스를 재구축하는 대신, 신규 문서는 임시 큐 테이블에 적재한 뒤 야간이나 시스템 유휴 시간대에 배치(Batch)로 임베딩을 생성해 인덱스에 추가하는 비동기 워커 패턴을 적용하면 실시간 서비스의 부하를 최소화할 수 있습니다.
마무리 및 향후 발전 방향
온프레미스 GPU 기반의 로컬 LLM과 PostgreSQL pgvector 연동 아키텍처는 비용 0원, 데이터 프라이버시 100%, 초저지연 응답이라는 3대 핵심 가치를 동시에 달성할 수 있는 가장 확실한 기술적 해법입니다.
makerskorean.net 홈랩에서는 이 파이프라인을 24시간 자율 가동하여, 새로운 기술 문서가 수집될 때마다 자동으로 벡터화하고 최신 인사이트를 도출하는 차세대 지능형 에이전트 허브를 완성해 가고 있습니다. 여러분도 잠자고 있는 로컬 하드웨어 자원을 활용해 클라우드 의존성 없는 나만의 똑똑한 지식 데이터베이스를 직접 구축해 보시기 바랍니다.