728x90
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
'정보관리(데이터베이스, DB) > DB' 카테고리의 다른 글
| 대량 데이터에 따른 성능 개선 방 (0) | 2025.11.22 |
|---|---|
| 오픈소스db를 오픈소스 vectordb로 embedding 하는 방법 (0) | 2025.11.14 |
| tibero에서 테이블에 데이터가 입력되는 시간 또는 순서를 기준으로 추적하고 싶다. 쿼리문으로 정보를 추적할 수 있나? (0) | 2025.10.27 |
| DATE형-VARCHAR (0) | 2025.10.23 |
| 고아(Orphan) 데이터 및 고아(Orphan) 데이터 이관 (0) | 2025.10.23 |