이 글에서는 PostgreSQL을 벡터 데이터베이스(Vector Database)로 활용하는 방법을 설명합니다.
✅ pgvector 확장을 설치하고 활성화하는 방법
✅ 벡터 데이터를 저장하고 검색하는 방법
✅ 최근접 이웃(Nearest Neighbor) 검색을 수행하는 SQL 쿼리 활용
🚀 1. pgvector 확장 설치 및 활성화
1️⃣ PostgreSQL에서 pgvector 확장 설치
Helm의 values.yaml을 수정하여 PostgreSQL이 실행될 때 pgvector 확장이 활성화되도록 설정할 수 있습니다.
📌 values.yaml에 pgvector 확장 추가
primary:
persistence:
enabled: true
size: 8Gi
service:
type: LoadBalancer
postgresqlConfiguration:
shared_preload_libraries: 'pgvector' # 벡터 검색을 위한 라이브러리 로드
initdbScriptsCM:
init-vector.sql: |
CREATE EXTENSION IF NOT EXISTS vector;
2️⃣ Git 저장소에 업데이트
cd ~/workspace/gitops
git add argocd/postgresql/values.yaml
git commit -m "Enable pgvector extension in PostgreSQL"
git push origin main
3️⃣ ArgoCD에서 PostgreSQL 설정 반영
argocd app sync postgresql
4️⃣ PostgreSQL StatefulSet 재시작
kubectl rollout restart statefulset postgresql -n database
5️⃣ pgvector 확장이 활성화되었는지 확인
PostgreSQL에 접속하여 pgvector 확장이 정상적으로 설치되었는지 확인합니다.
kubectl exec -it $(kubectl get pod -n database -l app.kubernetes.io/name=postgresql -o jsonpath="{.items[0].metadata.name}") -n database -- psql -U postgres -d ragdb -c "SELECT * FROM pg_extension WHERE extname = 'vector';"
✅ 출력 예시
extname | extowner | extnamespace | extrelocatable | extversion
---------+----------+--------------+----------------+------------
vector | 10 | 2200 | f | 0.5.1
(1 row)
✅ 만약 설치되지 않았다면 수동으로 추가
CREATE EXTENSION vector;
🚀 2. 벡터 데이터 저장 및 검색
pgvector는 고차원 벡터 데이터를 저장하고, 최근접 이웃(Nearest Neighbor) 검색을 수행하는 데 최적화된 확장 기능입니다.
1️⃣ 벡터 테이블 생성
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(3) -- 3차원 벡터 저장
);
✅ 테이블이 생성되었는지 확인
\dt
✅ 출력 예시
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+---------
public | embeddings | table | postgres
2️⃣ 샘플 벡터 데이터 삽입
INSERT INTO embeddings (content, embedding) VALUES
('Hello, world!', '[0.1, 0.2, 0.3]'),
('How are you?', '[0.3, 0.1, 0.2]'),
('This is PostgreSQL!', '[0.5, 0.5, 0.5]');
✅ 삽입된 데이터 확인
SELECT * FROM embeddings;
✅ 출력 예시
id | content | embedding
----+--------------------+---------------
1 | Hello, world! | [0.1,0.2,0.3]
2 | How are you? | [0.3,0.1,0.2]
3 | This is PostgreSQL | [0.5,0.5,0.5]
(3 rows)
3️⃣ 최근접 이웃(Nearest Neighbor) 검색
아래 쿼리는 [0.2, 0.2, 0.2]에 가장 가까운 벡터를 찾아 반환합니다.
SELECT content, embedding <-> '[0.2, 0.2, 0.2]' AS distance
FROM embeddings
ORDER BY distance
LIMIT 1;
✅ 출력 예시
content | distance
--------------------+-----------
Hello, world! | 0.141421
(1 row)
📌 <-> 연산자는 유클리드 거리(Euclidean Distance) 를 계산하여 가장 가까운 벡터를 찾습니다.
🚀 3. 성능 최적화를 위한 벡터 인덱스 추가
벡터 검색 성능을 높이려면 HNSW(Hierarchical Navigable Small World) 인덱스를 사용합니다.
CREATE INDEX ON embeddings USING hnsw (embedding vector_l2_ops);
✅ 벡터 검색 속도 최적화 후 다시 최근접 이웃 검색 실행
SELECT content, embedding <-> '[0.2, 0.2, 0.2]' AS distance
FROM embeddings
ORDER BY distance
LIMIT 1;
🚀 4. DBeaver에서 pgvector 활용
이제 DBeaver에서 pgvector 확장이 적용된 ragdb 데이터베이스를 확인할 수 있습니다.
✅ DBeaver 설정 변경
1️⃣ DBeaver에서 PostgreSQL 연결을 열기
2️⃣ “ragdb” 데이터베이스 선택 후 “Query Editor” 실행
3️⃣ 다음 쿼리 실행하여 pgvector 확장 확인
SELECT * FROM pg_extension WHERE extname = 'vector';
✅ 결과 값이 출력되면 pgvector가 활성화된 것입니다.
4️⃣ 벡터 테이블을 직접 조회하여 데이터 확인
SELECT * FROM embeddings;
📌 5. 최종 정리
✅ pgvector 확장을 PostgreSQL에 설치 및 활성화
✅ 벡터 데이터를 저장하고 최근접 이웃(Nearest Neighbor) 검색 수행
✅ 벡터 검색 성능을 높이기 위해 HNSW 인덱스 적용
✅ DBeaver에서 pgvector 확장과 벡터 데이터를 조회하여 확인
'Data Engineering > Data Infra & Process' 카테고리의 다른 글
[6편] FastAPI 벡터 검색 API를 Kubernetes에 배포 (0) | 2025.03.07 |
---|---|
[5편] FastAPI와 PostgreSQL을 활용한 벡터 검색 API 구축 (0) | 2025.03.07 |
[3편] PostgreSQL 사용자(Role) 추가 및 수동 관리 (SQL 쿼리 방식) (0) | 2025.03.07 |
[2편] Helm values.yaml을 활용한 PostgreSQL 사용자(Role) 추가 및 관리 (0) | 2025.03.07 |
[1편] Kubernetes에 Helm & ArgoCD를 사용한 PostgreSQL 설치 (0) | 2025.03.07 |