[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은 유사도 검색 시 메타데이터 조건으로 검색 범위를 좁히는 필터이다.
'AI > Spring AI' 카테고리의 다른 글
| [Spring AI] RAG(검색 증강 생성)란? — 외부 문서 기반 답변 (0) | 2026.06.04 |
|---|---|
| [Spring AI] 텍스트 유사도란? — DTM, TF-IDF, 코사인 유사도, 자카드 유사도, HNSW (0) | 2026.06.04 |
| [Spring AI] On-Premise LLM 구현하기 — Ollama, Docker, Llama (0) | 2026.06.02 |
| [Spring AI] Spring AI ChatMemory — Advisor 기반 문맥 기억 챗봇 구현 (0) | 2026.06.02 |
| [Spring AI] Spring AI PromptTemplate과 스트림 호출 — SSE, Flux, EventSource (0) | 2026.06.02 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자