Vector DB · Migration
RAG 파이프라인이 성숙하면서 벡터 인프라 선택이 비용·주권 문제로 떠올랐다
메타 AI Research가 공개한 ANN 라이브러리. IVF, HNSW, PQ 등 풍부한 알고리즘. 라이브러리 형태이므로 직접 임베딩 입출력과 영속화를 설계해야 한다.
임베딩 전용 오픈소스 DB. 컬렉션 추상화, 메타데이터 필터링, 디스크 영속화가 기본. Python/JS 클라이언트로 빠르게 RAG 프로토타입을 만들 수 있다.
Pinecone
FAISS / Chroma
기존 Pinecone 인덱스에서 무엇을 옮겨야 하는가
Pinecone fetch API는 ID 기반이라 전수 배출이 까다롭다. ID 목록을 미리 확보하거나, 신규 트래픽은 듀얼 라이트로 처리하면서 과거 데이터를 배치로 옮기는 점진적 전환이 안전하다.
import pinecone, numpy as np index = pinecone.Index('prod-rag') stats = index.describe_index_stats() for ns in stats['namespaces']: ids = list_all_ids(ns) for batch in chunked(ids, 100): res = index.fetch(ids=batch, namespace=ns) save_parquet(res['vectors'], ns)
라이브러리 기반 ANN 인덱스 구축
import faiss, numpy as np vectors = np.load('vectors.npy').astype('float32') faiss.normalize_L2(vectors) index = faiss.IndexHNSWFlat(1536, 32) index.hnsw.efConstruction = 200 index.add(vectors) faiss.write_index(index, 'rag.index')
DB 추상화로 운영 부담 줄이기
import chromadb client = chromadb.PersistentClient(path='./chroma') col = client.get_or_create_collection( name='rag', metadata={'hnsw:space': 'cosine'}, ) col.add( ids=ids, embeddings=vectors.tolist(), metadatas=metadatas, documents=documents, )
강점: 메타데이터 필터링이 SQL 유사 문법, 영속화 기본, Python 친화적 API 한계: 단일 프로세스 SQLite 동시성, 대규모 트래픽은 서버 모드와 별도 인프라 필요
옮긴 뒤에 정말 같은 결과가 나오는가
def recall_at_k(pinecone_ids, new_ids, k=10): a = set(pinecone_ids[:k]) b = set(new_ids[:k]) return len(a & b) / k scores = [recall_at_k(p, n) for p, n in zip(refs, news)] print('mean recall@10 =', sum(scores) / len(scores))
관리형이 해주던 일을 누가 할 것인가
수십만~수백만 벡터
수천만~수억 벡터
Pinecone 월 청구액만 보지 말고, 자체 운영 시 인프라 비용 + 엔지니어 시간 + 장애 리스크를 함께 계산한다. 손익 분기점은 보통 인덱스가 일정 규모를 넘기는 시점에 나타난다.
마이그레이션의 진짜 비용은 라이선스가 아니라, 관리형 서비스가 조용히 해주던 운영 작업을 떠안는 시간이다.
Pinecone에서 FAISS/Chroma로의 이전은 단순한 라이브러리 교체가 아니라 운영 책임의 이전이다. 규모, 팀 역량, 비용 곡선을 함께 보고, 가장 작은 워크로드부터 점진적으로 옮기는 것이 안전한 길이다.