Data Engineering/Data Infra & Process

[4편] PostgreSQL을 Vector Database로 활용하기 (pgvector 설정 및 사용)

ygtoken 2025. 3. 7. 14:55
728x90

 

이 글에서는 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 확장과 벡터 데이터를 조회하여 확인

 

728x90