728x90
가장 많이 사용하는 오픈소스 DB → Vector DB 조합
1. 대상 DB 선정 기준
-
오픈소스 DB: PostgreSQL (15K+ GitHub stars) - 관계형 DB 중 가장 널리 사용
-
오픈소스 Vector DB: Milvus (28K GitHub stars, 250+ contributors) - 오픈소스 Vector DB 중 가장 높은 인기도
PostgreSQL → Milvus 임베딩 구현 방법
단계 1: PostgreSQL 데이터 추출
Python
Copy
import psycopg2
import pandas as pd
# PostgreSQL 연결 및 데이터 로드
conn = psycopg2.connect(host="localhost", database="mydb",
user="user", password="password")
df = pd.read_sql("SELECT id, content_text FROM documents", conn)
conn.close()
단계 2: 임베딩 생성 (HuggingFace 모델)
Python
Copy
from sentence_transformers import SentenceTransformer
# 임베딩 모델 로드
model = SentenceTransformer('all-MiniLM-L6-v2')
# 텍스트를 벡터로 변환 (384차원)
embeddings = model.encode(df['content_text'].tolist(),
normalize_embeddings=True)
단계 3: Milvus에 벡터 저장
Python
Copy
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
# Milvus 연결
connections.connect("default", host="localhost", port="19530")
# 컬렉션 스키마 정의
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=5000),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]
schema = CollectionSchema(fields, "PostgreSQL 문서 임베딩")
collection = Collection("doc_collection", schema)
# 데이터 삽입
entities = [
df['id'].tolist(),
df['content_text'].tolist(),
embeddings.tolist()
]
collection.insert(entities)
collection.create_index(field_name="embedding",
index_params={"metric_type": "COSINE",
"index_type": "HNSW"})
단계 4: 유사도 검색
Python
Copy
# 검색 쿼리 임베딩
query_embedding = model.encode(["검색 질문"], normalize_embeddings=True)
# Milvus 유사도 검색
collection.load()
search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
results = collection.search(
data=query_embedding.tolist(),
anns_field="embedding",
param=search_params,
limit=5,
output_fields=["content"]
)
대안: PostgreSQL 내부 Vector DB 활용 (pgvector)
PostgreSQL 자체에서 pgvector 확장을 사용하면 별도 Vector DB 없이 임베딩이 가능합니다:
sql
Copy
-- pgvector 설치 후
CREATE EXTENSION vector;
-- 테이블 생성
CREATE TABLE documents (
id serial PRIMARY KEY,
content text,
embedding vector(384) -- 384차원 벡터
);
-- 인덱스 생성 (HNSW)
CREATE INDEX idx_embedding ON documents
USING hnsw (embedding vector_cosine_ops);
-- 유사도 검색
SELECT content, 1 - (embedding <=> query_vector) AS similarity
FROM documents
ORDER BY embedding <=> query_vector
LIMIT 5;
각 DB별 특징 비교
Table
Copy
DBGitHub Stars핵심 강점추천 사용 사례
| PostgreSQL | 15K+ | 관계형 데이터 + pgvector 확장으로 통합 관리 | 기존 PostgreSQL 환경에서 단일 DB로 관리 |
| Milvus | 28K | Trillion-scale 검색, Cloud-native 아키텍처 | 대규모 AI 애플리케이션, 독립적인 Vector DB 필요 |
| Chroma | 14K | LLM 앱 최적화, 간편한 API | 빠른 프로토타이핑, LangChain 통합 |
| Qdrant | ~20K | 필터링 강점, On-disk 저장 | 제약 조건이 많은 검색, 메모리 효율성 |
권장 구현 전략
-
소규모/기존 PostgreSQL 투자: pgvector로 단일 DB 관리
-
대규모/전문 Vector 검색: Milvus 독립 구축
-
RAG/LLM 앱 개발: Chroma 또는 LangChain 통합 고려
참고: Milvus는 Milvus Lite (로컬), Standalone (단일 서버), Cluster (분산) 4가지 버전을 제공하므로 규모에 맞게 선택 가능
728x90
'정보관리(데이터베이스, DB) > DB' 카테고리의 다른 글
| Oracle Database 26ai (0) | 2025.11.25 |
|---|---|
| 대량 데이터에 따른 성능 개선 방 (0) | 2025.11.22 |
| oracle db를 vectordb로 embedding 하는 방법 (0) | 2025.11.14 |
| tibero에서 테이블에 데이터가 입력되는 시간 또는 순서를 기준으로 추적하고 싶다. 쿼리문으로 정보를 추적할 수 있나? (0) | 2025.10.27 |
| DATE형-VARCHAR (0) | 2025.10.23 |