우리의 RAG SaaS를 단일 Postgres로 유지하게 해준 네 가지 pgvector 패턴
요약
RAG SaaS 서비스를 운영하며 pgvector를 사용할 때 직면하는 실무적인 문제점과 이를 해결하기 위한 네 가지 패턴을 소개합니다. 단순한 벡터 연산을 넘어 인덱싱, 차원 관리, 테넌트 격리 등 프로덕션 환경에서 필수적인 고려 사항을 다룹니다.
핵심 포인트
- 단순 벡터 컬럼만으로는 검색 성능과 안전성을 보장할 수 없음
- 인덱싱, 거리/유사도 부호, 차원 잠금, 테넌트 격리 문제 해결 필요
- 별도의 벡터 DB 없이 단일 Postgres(Supabase)로 RAG 인프라 구축 가능
- 실제 서비스 운영을 위한 실무적인 pgvector 활용 패턴 제시
대부분의 RAG 튜토리얼은 embedding <=> query 단계에서 멈춥니다. 연산자를 보여주고, 다섯 개의 행을 반환하며, 그것을 검색(retrieval)이라고 부릅니다. 그러다 서비스를 출시하고 두 번째 고객이 가입하면, 튜토리얼이 생략했던 네 가지 사실을 깨닫게 됩니다: 절반이 NULL인 컬럼에 대한 인덱싱(indexing), 거리(distance)와 유사도(similarity)의 부호 반전, 차원 잠금(dimension lock-in), 그리고 테넌트 격리(tenant isolation)를 조용히 우회하는 함수입니다.
저는 Discord 기반의 Company Brain을 운영하고 있습니다. 팀들이 문서, 링크, PDF를 /save하면, /ask를 통해 근거가 있고 인용된 답변을 반환합니다. 전체 벡터 저장소(vector store)는 pgvector가 포함된 단일 Supabase Postgres로 구성되어 있습니다. Pinecone이나 별도의 비용을 청구하고 정산해야 하는 두 번째 시스템은 없습니다. 실제 워크스페이스 환경에서 서비스가 생존할 수 있게 해준 네 가지 패턴을 소개합니다.
문제점: 벡터 컬럼은 벡터 저장소가 아니다
vector(1536) 컬럼은 저장 공간과 거리 연산자를 제공합니다. 하지만 빠른 검색, 정확한 랭킹(ranking), 차원 규율(dimension discipline), 또는 멀티 테넌트(multi-tenant) 안전성을 제공하지는 않습니다. 이것들은 네 가지 별개의 결정 사항이며, 그중 하나라도 잘못되면 컴파일 에러가 아닌 프로덕션 버그로 나타납니다.
우리의 artifacts 테이블은 워크스페이스가 수집한 모든 청크(chunk)를 보유합니다. 관련 컬럼은 다음과 같습니다:
CREATE TABLE artifacts (
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기