PostgreSQL & pgvector 설치 기록 (Docker 기반)
돌고 돌아 pgVector
현재 작업 중인 프로젝트에서 의미 기반 검색 시스템이 요구되는 상황이다.
검색과 추론 영역을 구분하는 RAG 시스템이 필요한데 자연어 기반의 질의에 대한 검색을 위해서는 벡터를 검색하는 기능이 필요하다.
벡터 DB들을 조사해서 Milvus를 선택했는데, Milvus 도입 과정에서 운영적 이슈(운영팀에서 쿠버네티스 지원이 어려움)가 있어
잠정적으로 Postgres & pgvector로 진행하기로 했다.
아래는 postgresql 설치와 관련된 기록이다. [Docker 기반]
관련된 자료는 chatGPT의 도움을 크게 받았다. [검색 기능이 놀라운 수준이다.]
Postgresql & pgVector 설치하기
docker pull pgvector/pgvector:pg17
백그라운드 실행하기
docker run -d --name pg-postgres -e POSTGRES_PASSWORD={비밀번호}
-e TZ=Asia/Seoul # 타임존 설정
-p 5432:5432 #포트 포워딩 지정
pgvector/pgvector:pg17
놀랍게도 딱 2가지 명령어로 모든 세팅이 끝났다.
간단한 테스트
# 테이블 만들기
create table tb_pg_test (id SERIAL primary key, name text, embedding VECTOR(3));
# 테스트 데이터 생성
insert into tb_pg_test (name, embedding) values ('foo', '[0.1, 0.2, 0.3]'), ('bar', '[0.4, 0.5, 0.6]');
# 거리식 계산 <=> = 코사인 거리 계산
SELECT tpt.*, tpt.embedding <=> '[0.2, 0.3, 0.4]' AS cosine_distance
FROM tb_pg_test tpt
ORDER BY cosine_distance;
# 코사인 기반 <#> inner product 계산
SELECT tpt.*, embedding <#> '[0.2, 0.3, 0.4]' AS inner_product
FROM tb_pg_test tpt
ORDER BY inner_product;
나의 경우 DBMS 툴로 Dbeaver를 사용하는데, 연결 후 Extensions 탭을 보면 설치된 확장 기능을 확인해 볼 수 있다.
SQL과 임베딩 검색을 동시에 처리할 수 있어서 매우 놀라웠다. [검색 처리를 위한 기호도 매우 간단...]
임베딩 검색에 대한 처리가 기호로 구분되어 있어 매우 깔끔하다
1. <#> : 내적 계산(inner product)
2. <=> : 코사인 거리 계산(cosine distance)
3. <+>: L1 거리 계산(L1 distance)
... 아래는 깃헙에서 가져온 설명이다.
- <-> - L2 distance
- <#> - (negative) inner product
- <=> - cosine distance
- <+> - L1 distance (added in 0.7.0)
- <~> - Hamming distance (binary vectors, added in 0.7.0)
- <%> - Jaccard distance (binary vectors, added in 0.7.0)
운영에서도 벡터 검색의 부하를 견뎌줄지 궁금하지만.. 자료 조사 결과 기존 벡터 DB와 다르게 필터 조건을 먼저 처리하고 벡터 정보를 메모리에 로드해서 검색을 수행하는 방식이라, 차별이 되는 매력을 가진다?라는 생각이 든다.
이 부분은 추후에 글로 정리해보려고 한다.
참고자료
GitHub - pgvector/pgvector: Open-source vector similarity search for Postgres
Open-source vector similarity search for Postgres. Contribute to pgvector/pgvector development by creating an account on GitHub.
github.com