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

oracle db를 vectordb로 embedding 하는 방법

by 3604 2025. 11. 14.
728x90
 
 
 
Oracle Database Vector Database Integration
 
Oracle Database를 Vector DB로 활용해 임베딩(Embedding)을 구현하는 방법은 Oracle AI Vector Search 기능을 사용하면 됩니다. Oracle Database 23ai/26ai부터 내장된 이 기능으로, 별도의 Vector DB 없이 기존 Oracle DB에서 벡터 검색이 가능합니다.

핵심 개요

Oracle AI Vector Search는 다음을 제공합니다:
  • VECTOR 데이터 타입으로 임베딩 저장
  • ONNX 형태의 임베딩 모델을 DB 내부에 로드 및 실행
  • SQL 함수로 벡터 생성 및 유사도 검색
  • 벡터 인덱스로 고속 검색
  • 하이브리드 검색 (관계형 데이터 + 벡터 검색 결합)

구현 단계 (SQL 기준)

1. 사전 준비 (환경 설정)

sql
Copy
-- 관리자 권한으로 실행
sqlplus / as sysdba

-- 전용 테이블스페이스 생성 (대용량 데이터용)
CREATE TABLESPACE vector_tbs 
DATAFILE 'vector_tbs.dbf' SIZE 20G AUTOEXTEND ON;

-- 사용자 생성 및 권한 부여
CREATE USER vector_user IDENTIFIED BY password 
DEFAULT TABLESPACE vector_tbs QUOTA UNLIMITED ON vector_tbs;

GRANT DB_DEVELOPER_ROLE TO vector_user;

-- 모델 파일 디렉토리 생성
CREATE OR REPLACE DIRECTORY model_dir AS '/path/to/your/onnx/models';
GRANT READ, WRITE ON DIRECTORY model_dir TO vector_user;
전제 조건: Oracle Database 23ai 이상 (Autonomous DB, Exadata, Cloud@Customer, Free 버전 등)

2. 임베딩 모델 로드

Hugging Face 등에서 다운로드한 모델을 ONNX 형식으로 변환 후 로드:
sql
Copy
-- 기존 모델이 있다면 삭제
EXEC DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'doc_model', force => true);

-- ONNX 모델 로드
EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL(
    'MODEL_DIR',
    'my_embedding_model.onnx',
    'doc_model',
    JSON('{"function" : "embedding", "embeddingOutput" : "embedding"}')
);
모델 확인:
sql
Copy
SELECT model_name, attribute_name, vector_info 
FROM user_mining_model_attributes 
WHERE model_name = 'DOC_MODEL';
출력 예시: VECTOR(128, FLOAT32) (128차원 벡터)

3. 데이터 테이블 준비

원본 데이터를 BLOB로 저장한 후 임베딩:
sql
Copy
-- 원본 데이터 테이블 (PDF 문서 등)
CREATE TABLE docs_table (
    id NUMBER,
    filename VARCHAR2(100),
    content BLOB
);

-- 문서 삽입
INSERT INTO docs_table VALUES(
    1, 
    'document.pdf', 
    TO_BLOB(BFILENAME('MODEL_DIR', 'document.pdf'))
);
COMMIT;

4. 벡터 임베딩 생성 및 저장

VECTOR 데이터 타입 을 가진 테이블 생성:
sql
Copy
-- 임베딩 저장 테이블
CREATE TABLE doc_embeddings (
    id NUMBER,
    chunk_id NUMBER,
    chunk_text VARCHAR2(4000),
    embedding VECTOR  -- 차원/포맷 미지정 시 유연하게 사용 가능
);

-- PDF를 텍스트로 변환 → 청킹 → 임베딩 생성 (한 번에 처리)
INSERT INTO doc_embeddings
SELECT 
    d.id,
    ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY NULL) as chunk_id,
    c.chunk_text,
    TO_VECTOR(VECTOR_EMBEDDING(doc_model USING c.chunk_text AS data)) as embedding
FROM docs_table d,
     TABLE(DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS(
         DBMS_VECTOR_CHAIN.UTL_TO_TEXT(d.content),
         JSON('{"maxLength": 256}')
     )) c;
함수 설명:
  • UTL_TO_TEXT: PDF/문서 → 텍스트 변환
  • UTL_TO_CHUNKS: 텍스트를 지정 길이로 분할
  • VECTOR_EMBEDDING: 로드된 모델로 벡터 생성
  • TO_VECTOR: VECTOR 타입으로 변환

5. 벡터 인덱스 생성

검색 성능을 위한 인덱스:
sql
Copy
CREATE VECTOR INDEX doc_vector_idx 
ON doc_embeddings(embedding)
ORGANIZATION INMEMORY NEIGHBOR GRAPH  -- 메모리 기반 그래프 인덱스
ACCURACY TARGET 95;  -- 95% 정확도 설정
옵션:
  • INMEMORY NEIGHBOR GRAPH: 고성능 메모리 기반 (Exadata 권장)
  • NEIGHBOR PARTITION: 대규모 데이터셋용

6. 유사도 검색 쿼리

예시 1: 단순 유사도 검색
sql
Copy
SELECT chunk_text, 
       VECTOR_DISTANCE(embedding, 
                       TO_VECTOR(VECTOR_EMBEDDING(doc_model USING '검색 질문' AS data)),
                       COSINE) as similarity
FROM doc_embeddings
ORDER BY similarity FETCH FIRST 5 ROWS ONLY;
예시 2: 하이브리드 검색 (관계형 + 벡터)
sql
Copy
SELECT d.filename, e.chunk_text, 
       VECTOR_DISTANCE(e.embedding, query_vec, COSINE) as similarity
FROM doc_embeddings e
JOIN docs_table d ON e.id = d.id
WHERE d.filename LIKE '%guide.pdf'  -- 관계형 조건
ORDER BY similarity
FETCH APPROX FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90;

외부 애플리케이션 통합

Java + LangChain4j 예제

java
Copy
// 1. Oracle JDBC 데이터소스 생성
DataSource dataSource = OracleDBUtils.getPooledDataSource();

// 2. Embedding Store 초기화
EmbeddingStore<TextSegment> embeddingStore = OracleEmbeddingStore.builder()
    .dataSource(dataSource)
    .embeddingTable("doc_embeddings", CreateOption.CREATE_OR_REPLACE)
    .build();

// 3. 임베딩 모델 로드 (ONNX 기반)
EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel();

// 4. 컨텐츠 추가 및 자동 임베딩
embeddingStore.add(
    TextSegment.from("Oracle AI Vector Search documentation"),
    embeddingModel.embed("Oracle AI Vector Search documentation").content()
);

// 5. 유사도 검색
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(embeddingStore)
    .embeddingModel(embeddingModel)
    .maxResults(5)
    .minScore(0.7)
    .build();

고려사항 및 팁

Table
Copy
항목권장사항
모델 선택 텍스트용: all-MiniLM-L6-v2, 문서용: 멀티링궐 모델 테스트
차원 수 768차원 이상은 성능 저하 가능 → 차원 축소 고려
배치 처리 대량 데이터는 DBMS_VECTOR_CHAIN으로 파이프라인 처리
정확도 vs 성능 ACCURACY TARGET 조정 (99%: 정확도 최대, 85%: 성능 최대)
하이브리드 검색 벡터 + 전문 검색(Oracle Text) + 관계형 조건 결합이 강점
업데이트 전략 VECTOR 컬럼은 기존 테이블에 ALTER TABLE ADD로 추가 가능

결론

Oracle DB를 Vector DB로 활용하는 핵심은 AI Vector Search 기능을 활용하는 것입니다. ONNX 모델을 DB 내부에 로드해 VECTOR_EMBEDDING 함수로 실시간 임베딩을 생성하고, VECTOR 타입으로 저장하며, VECTOR_DISTANCE로 유사도 검색을 수행합니다. 기존 데이터와의 하이브리드 검색이 가능해 별도 Vector DB 없이도 강력한 AI 검색 애플리케이션을 구축할 수 있습니다.
728x90