본문 바로가기
C.W.K.
Stream
Lesson 09 of 10 · published

pgvector, PostgreSQL 안의 임베딩

~14 min · extensions, vector, ai

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

관계형 데이터 옆에서 벡터를 찾는다

pgvector는 vector 자료형과 L2 <->, 내적 <#>, 코사인 <=> 연산자를 더해. HNSW와 IVFFlat으로 근사 최근접 검색을 빠르게 해.

생성하고 저장하고 색인해

OpenAI나 Cohere, 로컬 모델이 만든 임베딩을 같은 행의 vector(N)에 저장하고, 질의 임베딩과 가까운 5개 행을 ORDER BY로 고르면 돼. 예제의 vector(1536)는 OpenAI text-embedding-3-small 크기에 맞춰져.

언제 별도 벡터 데이터베이스가 필요할까

약 1천만 벡터까지는 관계형 필터와 JOIN을 함께 쓰는 pgvector가 운영상 단순한 경우가 많아. 그보다 큰 처리량에서는 Pinecone·Weaviate·Qdrant 같은 전용 저장소가 이길 수 있어.

Code

벡터 확장 기능과 열 만들기·sql
CREATE EXTENSION IF NOT EXISTS vector;

ALTER TABLE documents
ADD COLUMN embedding vector(1536);  -- 1536 = OpenAI text-embedding-3-small

-- 빠른 코사인 거리 검색 위한 HNSW 인덱스
CREATE INDEX documents_embedding_hnsw
ON documents USING hnsw (embedding vector_cosine_ops);
벡터를 넣고 조회하기·sql
-- 앱이 임베딩 생성 + 리터럴로 insert
INSERT INTO documents (title, body, embedding)
VALUES ('Pippa Quest', '...', '[0.012, -0.041, ...]');

-- 쿼리 임베딩에 가장 유사한 5 document 찾기
SELECT id, title,
       1 - (embedding <=> '[0.012, -0.041, ...]'::vector) AS similarity
FROM   documents
ORDER  BY embedding <=> '[0.012, -0.041, ...]'::vector
LIMIT  5;
필터와 유사도를 결합한 검색·sql
-- 유사한 document 찾되, 맞는 태그만
SELECT id, title
FROM   documents
WHERE  tags @> ARRAY['python']
ORDER  BY embedding <=> :query_vector
LIMIT  10;

External links

Exercise

샌드박스 PostgreSQL에 pgvector를 설치하고 테이블에 vector(384) 열을 추가해. sentence-transformers/all-MiniLM-L6-v2 같은 384차원 로컬 모델로 임베딩을 만들어 행 100개를 넣고 HNSW 색인을 추가한 뒤 유사도 질의를 실행해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.