RAG 시스템 구축하며 배운 임베딩 벡터 저장소 선택 기준
문제 상황
사내 기술 문서가 Confluence, Notion, Slack에 흩어져 있어 검색이 어려웠다. ChatGPT API와 임베딩을 활용한 RAG 시스템 구축을 맡게 되었다.
벡터 저장소 후보 비교
Pinecone
- 완전 관리형, 설정이 간단함
- 무료 티어로 프로토타입 가능
- 하지만 국내 리전 없어 레이턴시 100ms 이상
Weaviate
- 자체 호스팅 가능
- GraphQL 쿼리 지원이 매력적
- 초기 세팅이 복잡했고 러닝커브 있음
PostgreSQL + pgvector
CREATE EXTENSION vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops);
기존 PostgreSQL 인프라를 활용할 수 있었다. 초기 1만 건 문서 기준으로 쿼리 속도 50ms 이내로 충분했다.
선택과 결과
프로토타입은 pgvector로 진행했다. OpenAI text-embedding-ada-002 모델로 청크당 임베딩을 생성하고, 코사인 유사도 기반 검색을 구현했다.
def search_similar(query: str, limit: int = 5):
query_embedding = get_embedding(query)
results = db.execute("""
SELECT content, 1 - (embedding <=> %s) as similarity
FROM documents
ORDER BY embedding <=> %s
LIMIT %s
""", [query_embedding, query_embedding, limit])
return results
향후 문서가 10만 건 이상으로 늘어나면 Qdrant나 Milvus로 마이그레이션을 고려하기로 했다.
교훈
- 초기엔 과도한 인프라 투자보다 기존 스택 활용이 효율적
- 벡터 검색 성능은 데이터 규모에 크게 영향받음
- 청크 크기(512 토큰)와 오버랩(50 토큰) 튜닝이 정확도에 중요했음