본문 바로가기
정보관리(데이터베이스, DB)/DB

오픈소스db를 오픈소스 vectordb로 embedding 하는 방법

by 3604 2025. 11. 14.
728x90
 
 
 
OPEN SOURCE DATABASE VECTOR DATABASE EMBEDDING
 

가장 많이 사용하는 오픈소스 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 저장 제약 조건이 많은 검색, 메모리 효율성

권장 구현 전략

  1. 소규모/기존 PostgreSQL 투자: pgvector로 단일 DB 관리
  2. 대규모/전문 Vector 검색: Milvus 독립 구축
  3. RAG/LLM 앱 개발: Chroma 또는 LangChain 통합 고려
참고: Milvus는 Milvus Lite (로컬), Standalone (단일 서버), Cluster (분산) 4가지 버전을 제공하므로 규모에 맞게 선택 가능
728x90