우와한 개발자

[Spring AI] 임베딩과 Vector DB란? — 벡터 변환, pgvector, 도커 구축

by 우와한개발자

1. 임베딩(Embedding)이란

  • 텍스트를 숫자 배열(벡터)로 변환한 것
  • 의미가 비슷한 문장은 벡터 공간에서 가까운 위치에 놓인다
"강아지가 뛴다"  → [0.12, 0.87, 0.34, ...]
"개가 달린다"    → [0.13, 0.85, 0.36, ...]  ← 의미 유사 → 벡터도 가까움
"오늘 날씨 맑음" → [0.91, 0.02, 0.76, ...]  ← 의미 다름 → 벡터도 멀

 

2. 임베딩 모델

1) 임베딩 모델이란

  • 텍스트를 벡터로 변환하는 모델.
  • 텍스트 생성은 못하고 변환만 한다.

 

2) 임베딩 모델 vs Chat 모델

구분 임베딩 모델 Chat 모델
입력 텍스트 텍스트
출력 벡터 (숫자 배열) 텍스트
용도 유사도 검색, RAG 대화, 요약, 번역
예시 text-embedding-3-small gpt-4o, llama3.1

 

3) 대표 모델

모델 제공자 차원 특징
text-embedding-3-small OpenAI 1536 가성비 좋음, RAG에 많이 씀
text-embedding-3-large OpenAI 3072 고성능, 비쌈
nomic-embed-text Ollama 768 로컬 무료
all-MiniLM HuggingFace 384 경량, 오픈소스

 

4) 주의사항

  • 저장할 때와 검색할 때 반드시 같은 임베딩 모델을 써야 한다
  • 모델마다 벡터 공간의 기준이 다르기 때문에 다른 모델로 변환한 벡터끼리 비교하면 유사도가 엉터리로 나온다

 

3. Vector DB

1) Vector DB란?

  • 벡터(숫자 배열)를 저장하고 유사도 기반으로 검색하는 데이터베이스
  • 임베딩 모델이 변환한 벡터를 저장하고, 쿼리 벡터와 가장 유사한 벡터를 찾아 반환한다

 

2) 일반 DB vs Vector DB

구분 일반 DB Vector DB
저장 형태 텍스트, 숫자 벡터 (float 배열)
검색 방식 정확한 값 일치 의미적 유사도 검색
쿼리 예시 WHERE name = '홍길동' 가장 유사한 벡터 k개 반환
용도 구조화된 데이터 텍스트, 이미지, 음성 의미 검색

 

3) Vector DB 종류

이름 특징
pgvector PostgreSQL 확장, 별도 DB 불필요
Pinecone 완전 관리형 클라우드 서비스
Weaviate 오픈소스, 멀티모달 지원
Chroma 경량, 로컬 개발에 적합
Milvus 대규모 벡터 검색에 특화

 

4) pgvector 도커로 구축하기

(1) docker-compose.yml

services:
  postgres:
    image: pgvector/pgvector:pg16
    container_name: pgvector
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgvector_data:/var/lib/postgresql/data

volumes:
  pgvector_data:

 

(2) pgvector 확장 활성화

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

 

(3) vector_store 테이블 및 인덱스 생성

CREATE TABLE IF NOT EXISTS vector_store (
    id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
    content text,
    metadata json,
    embedding vector(1536)
);

CREATE INDEX ON vector_store
USING hnsw (embedding vector_cosine_ops);
  • id : 각 문서의 고유 식별자. uuid 자동 생성
  • content : 원본 텍스트 내용
  • metadata : 문서의 부가 정보. type, docId 등 필터링에 사용하는 값을 JSON으로 저장
  • embedding : 임베딩 모델이 변환한 벡터. 차원 수는 사용하는 임베딩 모델에 맞춰야 함 (text-embedding-3-small → 1536)
  • 인덱스는 Spring AI에서 설정하면 앱 시작 시 테이블과 인덱스를 자동으로 생성해주기 때문에 생략 가능하다.
  • HNSW(Hierarchical Navigable Small World)는 고차원 벡터 공간에서 쿼리 벡터와 가장 유사한 항목을 초고속으로 찾아내는 그래프 기반의 근사 최근접 이웃(ANN) 검색 알고리즘이다.

 

(4) Spring AI 설정

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.ai.vectorstore.pgvector.index-type=hnsw
spring.ai.vectorstore.pgvector.distance-type=cosine-distance
spring.ai.vectorstore.pgvector.dimensions=1536
spring.ai.vectorstore.pgvector.metadata-fields=type,docId,topic
  • Spring AI가 앱 시작 시 테이블과 인덱스를 자동으로 생성해준다.
  • metadata-fields에 필터링할 필드를 미리 등록해야 filterExpression 사용 가능하다.
  • filterExpression은 유사도 검색 시 메타데이터 조건으로 검색 범위를 좁히는 필터이다.

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기