IT/PostgreSQL

벡터 테이블 만들기 삽질과정

프티 2025. 4. 2. 00:40
반응형

SQL 연습할 겸 한국 주소에 대한 테이블을 만들고 가공하는 중이다.

SQL 문법이나 서버 개발이 아직 손에 익지 않아서 고군분투 중..

 

테스트 겸 검색값에 대한 테이블 조회를 단순히 LIKE 문을 사용하여 구현하였다.

데이터가 한국 지도뿐이라서 속도가 느리지는 않으나 모든 데이터를 순회하며 비교를 하기 때문에,
로컬 실행이고 전 세계 주소 데이터를 가지고 있었다면 매우 느린 속도를 보일 것이라고 판단하였다.

ILIKE 검색 속도

 

이에 따라 벡터 테이블을 만들어 유사성 비교로 속도를 높이고자 하였다.

 

저렴한 구현을 추구하기 때문에 무료 벡터 모델을 찾아보았다.

오픈소스로 무료로 사용할 수 있는 Sentence-Transformers 모델 중 하나가 적합합니다.
예를 들어, paraphrase-multilingual-MiniLM-L12-v2 모델은 384차원의 임베딩을 생성하며, 50개 이상의 언어를 지원합니다. 이 모델은 다음과 같은 장점이 있습니다.
멀티링구얼 지원: 전세계 다양한 언어의 주소 데이터를 효과적으로 임베딩할 수 있습니다. 효율적 차원: 384차원으로 비교적 낮은 차원이기 때문에, 저장 및 검색 시 리소스 부담이 적습니다. 비용 효율성: 무료로 사용할 수 있으며, 별도의 클라우드 API 호출 비용이 들지 않아 개인 프로젝트에 적합합니다.

 

또한 최신 PostgreSQL에는 pgvector가 내장되어 있다.

이에 따라 내가 생각한 벡터 데이터 가공 플로우는 아래와 같다!

id, name, address를 조합하여 벡터값 계산 -> paraphrase-multilingual-MiniLM-L12-v2의  384차원으로 벡터값을 저장!

 

먼저 vectorize 익스텐션 설치를 시도하였는데...

pgxn install vectorize 에러 (ssl)
- python3 install certifi
- sudo SSL_CERT_FILE=$(python3 -m certifi) pgxn install vectorize
해결 -> cargo install cargo-pgxr 에러 (let dependency = cargo_edit::get_latest_dependency not found in `cargo_edit`)
      시도 -> cargo --version && cargo install cargo-pgrx --version "0.13.1" --locked
     0: $PGRX_HOME does not exist 에러
     - mkdir -p $HOME/.pgrx
     - export PGRX_HOME=$HOME/.pgrx     
     - export SSL_CERT_FILE=$(python3 -m certifi)     
     - sudo -E pgxn install vectorize
     0: /Users/유저네임/.pgrx/config.toml not found.  Have you run `cargo pgrx init` yet? 에러
          해결 -> cargo pgrx init

 

무수히 많은 에러를 거쳐 설치완료.. 하지만 익스텐션 만으로는 인코딩 자체가 안된다는 사실을 뒤늦게 알았다..

또한 에러 해결도 왜 되는지 부끄러운 사실이지만 정확히 모.르.겠.다..

 

설상가상으로 에러 해결을 위해 무지성으로 설치한 패키지들로 인해, PostgreSQL이 brew와 application 버전 2가지로 설치되어 있었고, 이로 인해 서버를 실행할 때마다 실행 실패를 해결하느라 내가 나의 발목을 잡는 상황이 계속해서 발생하였다..

결국 PostgreSQL 전부 삭제하고, brew에 무지성 설치한 패키지들을 제거한 뒤, PostgreSQL 설치부터 다시 진행하였다..

 

익스텐션만으로는 인코딩이 안되기 때문에 벡터 인코딩 방법에 대해 리서치 중에, sentence_transformers라는 파이썬 라이브러리가 있었다. 이것을 통해 벡터로 인코딩해서 벡터를 포함한 주소 테이블을 새로 생성하고자 했다.

이에 따라 sentence_transformers를 활용한 벡터 인코딩 함수를 만들어서 실행해 보았는데, sentence_transformers 모듈을 찾을 수 없다는 에러가 발생하였다.

 

이를 해결하기 위해, 무지성 패키지 설치보다는 문서를 먼저 보았고, PostgreSQL 17 버전과 호환되는 python 버전이 컴퓨터에 설치되어 있는지부터 확인하였다.

또한 현재 PostgreSQL을 Application 형식으로 사용 중인데, 해당 앱이 설치한 파이썬과 연결되어 있는지 확인도 필요하였다.

# 연결되어 있는 파이썬 정보 확인 함수
CREATE OR REPLACE FUNCTION python_env()
RETURNS text AS $$
import sys
return f"
  Python: {sys.version}\n
  Prefix: {sys.prefix}\n
  Executable: {sys.executable}
"
$$ LANGUAGE plpython3u;

# Python: 3.13.2 (v3.13.2:4f8bb3947cf, Feb  4 2025, 11:51:10) [Clang 15.0.0 (clang-1500.3.9.4)]
# Prefix: /Library/Frameworks/Python.framework/Versions/3.13                                   
# Executable: /Applications/Postgres.app/Contents/Versions/17/bin/postgres

# 파이썬 경로 정보 확인 함수
CREATE OR REPLACE FUNCTION get_sys_path()
RETURNS text AS $$
import sys
return "\n".join(sys.path)
$$ LANGUAGE plpython3u;

# /usr/local/opt/python@3.13/lib/python3.13/site-packages                        
# /Library/Frameworks/Python.framework/Versions/3.13/lib/python313.zip           
# /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13              
# /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/lib-dynload  
# /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages

 

 

이후에 연결되어 있는 파이썬에 sentence-transformers와 의존성 라이브러리인 torch를 설치하고자 하였으나, 무한 의존성 루프에 빠지며 죽어도 설치가 안 되는 상황이 되었다.. 리서치를 해보니 아래와 같이 상황 정리되었다..

 

- postgreSQL 17 버전에서의 PL/Python은 파이썬 3.13 이상만을 지원

- sentence_transformers의 의존성 라이브러리는 torch(PyTorch)

- 현재 torch의 python에 대한 공식 휠는 3.12까지 지원함

-> 따라서 PostgreSQL 17 버전에서는 sentence_transformers 사용 불가함..

 

따라서 PostgreSQL 버전을 다운그레이드할 예정이다.

뒷목이 뻐근한 순간이다..

반응형