
벡터 인덱스 × 텍스트 인덱스 = 하이브리드 벡터 인덱스
요약
벡터 검색의 환각 문제를 해결하기 위해 Oracle Text의 텍스트 인덱스와 벡터 인덱스를 결합한 하이브리드 벡터 인덱스 활용법을 소개합니다. OCI BaseDB(26ai) 환경에서 가상의 IT 서적 데이터를 사용하여 인덱스를 생성하고 관리하는 과정을 다룹니다.
핵심 포인트
- 벡터 검색의 키워드 불일치 및 환각 문제 보완
- 텍스트 인덱스와 벡터 인덱스의 결합을 통한 하이브리드 방식
- OCI BaseDB(26ai) 환경에서의 구현 방법
- 모델 파라미터 지정을 통한 하이브리드 인덱스 생성
벡터 검색 (Vector Search)에 대해 몇 가지 기사를 게시해 왔습니다만, 벡터 검색은 만능이 아닙니다.
엄격한 키워드 일치를 보장하지 않기 때문에, 잘못된 관련 정보를 가져와 환각 (Hallucination)을 일으킬 가능성이 있습니다.
그럴 때 활용할 수 있는 것이 Oracle Text의 텍스트 인덱스 (Text Index)와 벡터 인덱스 (Vector Index)를 결합한 **하이브리드 벡터 인덱스 (Hybrid Vector Index)**입니다.
이번에는 하이브리드 벡터 인덱스의 기본 (생성~이용)을 소개합니다. 사용한 환경은 OCI BaseDB (26ai)입니다.
이번에 사용할 테이블은 books입니다. 생성 AI (Generative AI)가 생성한 가상의 IT 분야 서적 1,000권의 정보 (번호, 제목, 개요)가 저장되어 있습니다.
SQL> info books
TABLE: BOOKS
LAST ANALYZED:
...
통상적인 인덱스에서 지정하는 파라미터 (대상 테이블·컬럼)에 더해, 벡터화에 사용할 모델만 지정하면 하이브리드 벡터 인덱스를 생성할 수 있습니다.
SQL> CREATE HYBRID VECTOR INDEX books_hybrid_idx1 on
2 books(description)
3* PARAMETERS('MODEL ALLMINILML6V2'); ★모델의 지정
...
인덱스 정보가 저장되어 있는 user_indexes를 참조하면, 여러 오브젝트의 생성을 확인할 수 있었습니다.
SQL> select * from user_indexes order by index_name;
INDEX_NAME INDEX_TYPE INDEX_SUBTYPE TABLE_OWNER TABLE_NAME TABLE_TYPE UNIQUENESS COMPRESSION PREFIX_LENGTH TABLESPACE_NAME INI_TRANS MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE PCT_THRESHOLD INCLUDE_COLUMN FREELISTS FREELIST_GROUPS PCT_FREE LOGGING BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY CLUSTERING_FACTOR STATUS NUM_ROWS SAMPLE_SIZE LAST_ANALYZED DEGREE INSTANCES PARTITIONED TEMPORARY GENERATED SECONDARY BUFFER_POOL FLASH_CACHE CELL_FLASH_CACHE USER_STATS DURATION PCT_DIRECT_ACCESS ITYP_OWNER ITYP_NAME PARAMETERS GLOBAL_STATS DOMIDX_STATUS DOMIDX_OPSTATUS FUNCIDX_STATUS JOIN_INDEX IOT_REDUNDANT_PKEY_ELIM DROPPED VISIBILITY DOMIDX_MANAGEMENT SEGMENT_CREATED ORPHANED_ENTRIES INDEXING AUTO CONSTRAINT_INDEX
___________________________ _____________ __________________________ ______________ ____________________________________________________________________________ _____________ _____________ ______________ ________________ __________________ ____________ ____________ _________________ ______________ ______________ ______________ _______________ ________________ _________________ ____________ __________________ ___________ __________ _________ ______________ ________________ __________________________ __________________________ ____________________ _________ ___________ ______________ ________________ _________ ____________ ______________ ____________ ____________ ____________ ______________ ______________ ___________________ _____________ ___________ ____________________ _____________ _____________ ________________________________________ _______________ ________________ __________________ _________________ _____________ __________________________ __________ _____________ ____________________ __________________ ___________________ ___________ _______ ___________________
...
벡터 인덱스 (Vector Index)에 특화되어 정보가 저장되는 v$vector_index, v$vector_partitions_index는 다음과 같습니다.
하이브리드 벡터 인덱스 (Hybrid Vector Index)에서의 벡터 인덱스 기본값은 NEIGHBOR PARTITIONS (IVF)인 것으로 보입니다.
VECTOR_IDXTYPE은 생성할 벡터 인덱스의 유형을 지정합니다. 예를 들어, Inverted File Flat (IVF) 벡터 인덱스를 위한 IVF (기본값) 또는 Hierarchical Navigable Small World (HNSW) 벡터 인덱스를 위한 HNSW 등이 있습니다. 이 파라미터를 생략하면 IVF 벡터 인덱스가 기본적으로 생성됩니다.
SQL> select * from v$vector_index;
★
OWNER INDEX_NAME PARTITION_NAME INDEX_ORGANIZATION INDEX_OBJN ALLOCATED_BYTES USED_BYTES NUM_VECTORS NUM_REPOP INDEX_USED_COUNT DISTANCE_TYPE INDEX_DIMENSIONS INDEX_DIM_TYPE DEFAULT_ACCURACY CON_ID
...
텍스트 인덱스 (Text Index)에 특화되어 정보가 저장되는 ctx_user_indexes는 다음과 같습니다.
IDX_VECTOR_TYPE 등은 벡터 검색 (Vector Search)의 등장에 맞춰 추가된 컬럼으로 생각됩니다.
SQL> select * from ctx_user_indexes;
IDX_ID IDX_NAME IDX_TABLE_OWNER IDX_TABLE IDX_KEY_NAME IDX_TEXT_NAME IDX_DOCID_COUNT IDX_STATUS IDX_LANGUAGE_COLUMN IDX_FORMAT_COLUMN IDX_CHARSET_COLUMN IDX_TYPE IDX_SUB_TYPE IDX_SYNC_TYPE IDX_SYNC_MEMORY IDX_SYNC_PARA_DEGREE IDX_SYNC_INTERVAL IDX_SYNC_JOBNAME IDX_AUTO_OPT_TYPE IDX_AUTO_OPT_INTERVAL IDX_AUTO_OPT_PARA_DEGREE IDX_QUERY_STATS_ENABLED IDX_MAINTENANCE_TYPE IDX_MODEL_OWNER IDX_MODEL_NAME IDX_VECTOR_TYPE IDX_CREATE_TIME IDX_LAST_DDL_TIME
_________ ____________________ __________________ ____________ _______________ ________________ __________________ _____________ ______________________ ____________________ _____________________ ________________ _______________ ________________ __________________ _______________________ ____________________________ ___________________ ____________________ ________________________ ___________________________ __________________________ _______________________ __________________ _________________ __________________ __________________ ____________________
...
distance나 accuracy 등 선호하는 설정을 저장하여, 하이브리드 벡터 인덱스 생성 시 지정할 수 있습니다.
SQL> begin
2 DBMS_VECTOR_CHAIN.CREATE_PREFERENCE(
3 'my_vec_pref',
...
동일한 컬럼에 대해 동일한 인덱스 타입의 도메인 인덱스 (Domain Index)를 여러 개 생성할 수는 없습니다.
books_hybrid_idx1
을 삭제한 후 my_vec_pref
를 지정하여 books_hybrid_idx2
를 생성하면, DISTANCE_TYPE이 EUCLIDEAN으로 되어 있음을 확인할 수 있습니다.
SQL> CREATE HYBRID VECTOR INDEX books_hybrid_idx2 on
2 books(description)
3* PARAMETERS('VECTORIZER my_vec_pref');
...
렉서 (Lexer)를 지정하여 하이브리드 벡터 인덱스 (Hybrid Vector Index)를 생성하는 것도 가능합니다.
SQL> begin
2 ctx_ddl.create_preference('my_lexer_pref','JAPANESE_VGRAM_LEXER');
3 ctx_ddl.set_attribute('my_lexer_pref','BIGRAM','TRUE');
...
하이브리드 검색은 DBMS_HYBRID_VECTOR.SEARCH 함수를 사용합니다.
최소한으로 필요한 파라미터는 하이브리드 벡터 인덱스 이름 (hybrid_index_name)과 검색 문자열 (search_text) 두 가지입니다.
SQL> SELECT json_serialize(
2 dbms_hybrid_vector.search(
3 json(
...
rowid를 키로 books를 검색하면, DESCRIPTION에 검색 문자열인 「데이터베이스」가 포함되어 있음을 확인할 수 있습니다.
SQL> select * from books where rowid in ('AAAR1ZAAAAAAAMLAAM', 'AAAR1ZAAAAAAANbAAJ', 'AAAR1ZAAAAAAANTAAI');
ID TITLE DESCRIPTION
_______ ___________________________________________ ____________________________________________________________________________________________________________________________________________
...
원인을 규명하지는 못했지만, ADB-S에서 동일한 절차를 시도해도 하이브리드 벡터 인덱스를 생성할 수 없었습니다….
문서 등을 살펴보아도 ADB-S에서는 사용할 수 없다는 기재는 보이지 않았기에, 절차나 데이터에 문제가 있을 가능성이 높지만… 원인을 알게 된다면 기사로 작성하고 싶습니다 🙂
SQL> info books
TABLE: BOOKS
LAST ANALYZED:2026-07-10 08:46:42.0
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기