본문 바로가기
Oracle/운영

[23ai] new feature 벡터 타입과 ai벡터검색 (1)

by 취미툰 2024. 11. 11.
반응형

23ai가 되면서 생긴 새로운 데이터타입입니다.

사용법은 아래와 같습니다.

CREATE TABLE docs (doc_id INT, doc_text CLOB, doc_vector VECTOR);

 

그렇다면 벡터 검색이란 무엇이고 어떤 경우에 사용할까요?

Oracle AI 벡터 검색

Oracle AI Vector Search stores vector embeddings, which are mathematical vector representations of data points.

수학적 벡터인 벡터임베딩을 저장하는데요. 

벡터란 수학적인 벡터를 의미하고 임베딩은 자연언어 처리분야에서 자연언어를 벡터로 바꾸는 방식을 뜻하며 표현(representation)이라고도 합니다.

벡터는 크기와 방향을 가진 데이터로 유사한 의미를 가진 데이터는 벡터 공간 내에서 가까운 위치에 배치됩니다. 그래서 비정형데이터를 벡터로 임베딩하면 데이터간의 수학적 계산법으로 거리측정을 하여 가장 가까운 데이터를 계산할 수 있습니다.

 

데이터 입력 예시

임의로 [1,3,4]와[1,3,4,5,6,7,8,9,10] 벡터값을 넣었습니다. 검색시에는 동일하게 보입니다.

INSERT INTO DOCS VALUES (1,'This is Vector Test','[1,3,4]');
INSERT INTO DOCS VALUES (1,'This is Vector Test2','[1,3,4,5,6,7,8,9,10]');


COMMIT;



SELECT * FROM docs;

DOC_ID|DOC_TEXT            |DOC_VECTOR                                                                        |
------+--------------------+----------------------------------------------------------------------------------+
     1|This is Vector Test |[1.0E+000,3.0E+000,4.0E+000]                                                      |
     1|This is Vector Test2|[1.0E+000,3.0E+000,4.0E+000,5.0E+000,6.0E+000,7.0E+000,8.0E+000,9.0E+000,1.0E+001]|

 

예를들어 벡터검색이 이루어지는 방식을 간단하게 정리해보겠습니다.

:query_vector 는 puppy이며 4가지를 식별해서 조회하고자 합니다. 

주어진 쿼리 벡터를 기반으로 유사성검색을 수행하고 벡터공간에서 쿼리 벡터에 가장 가까운 k개의 벡터를 찾습니다. 

기본적으로 벡터의 순위를 매겨서 정렬된 벡터목록의 가장 가까운벡터부터 결과로 내옵니다.

 

 

벡터 임베딩 모델

데이터 유형에 따라 자체 임베딩 모델을 사용하거나 사전훈련된 오픈소스 모델을 사용하여 벡터임베딩을 만들 수 있습니다.

 

 

##오라클 데이터베이스에 임베딩 모델을 로딩하는 절차를 테스트해보고 정리해보겠습니다.

python에서 embeddingModelconfig 패키지를 사용하여 onxx파일을 만들어보겠습니다.

onxx파일은 추후에 DB에서 프로시저 형태로 생성하여 사용할 수 있습니다. 

$ python3
Python 3.12.3 (main, Jul  3 2024, 08:35:38) [GCC 8.5.0 20210514 (Red Hat 8.                                                                                  5.0-18.0.6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> from oml.utils import EmbeddingModel, EmbeddingModelConfig
>>> EmbeddingModelConfig.show_preconfigured();
['sentence-transformers/all-mpnet-base-v2', 'sentence-transformers/all-MiniLM-L6-v2', 'sentence-transformers/multi-qa-MiniLM-L6-cos-v1', 'ProsusAI/finbert', 'medicalai/ClinicalBERT', 'sentence-transformers/distiluse-base-multilingual-cased-v2', 'sentence-transformers/all-MiniLM-L12-v2', 'BAAI/bge-small-en-v1.5', 'BAAI/bge-base-en-v1.5', 'taylorAI/bge-micro-v2', 'intfloat/e5-small-v2', 'intfloat/e5-base-v2', 'prajjwal1/bert-tiny', 'thenlper/gte-base', 'thenlper/gte-small', 'TaylorAI/gte-tiny', 'infgrad/stella-base-en-v2', 'sentence-transformers/paraphrase-multilingual-mpnet-base-v2', 'intfloat/multilingual-e5-base', 'intfloat/multilingual-e5-small', 'sentence-transformers/stsb-xlm-r-multilingual']
>>>
>>> EmbeddingModelConfig.show_templates()
['text']
>>>
>>> config = EmbeddingModelConfig.from_template("text",max_seq_length=512)
>>> embedding_model = "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
>>> em = EmbeddingModel(model_name=embedding_model, config=config)
>>> em.export2file("multi-qa-MiniLM-L6-cos-v1",output_dir="./")
/opt/oracle/product/23ai/dbhomeFree/python/lib/python3.12/site-packages/huggingface_hub/file_download.py:797: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
tokenizer_config.json: 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 383/383 [00:00<00:00, 1.58MB/s]
vocab.txt: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 232k/232k [00:00<00:00, 1.19MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 112/112 [00:00<00:00, 409kB/s]
tokenizer.json: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 466k/466k [00:00<00:00, 2.18MB/s]
config.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 612/612 [00:00<00:00, 2.05MB/s]
model.safetensors: 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 90.9M/90.9M [00:07<00:00, 11.8MB/s]
>>>
>>> quit

$ ls
a.txt  b.txt  client  multi-qa-MiniLM-L6-cos-v1.onnx  oml4py-client-linux-x86_64-2.0.zip

 

그 다음으로 DB내에 디렉토리를 생성하고, DBMS_VECTOR 를 이용하여 ONNX_MODEL을 불러옵니다.

그 후에 hello를 테스트로 임베딩하는 예제입니다.

-- 디렉토리 생성(해당 디렉토리에 onnx파일이 있어야함)
CREATE OR REPLACE DIRECTORY CTX_WORK_DIR AS '/home/oracle';
-- 이미 모델이 있는경우 삭제 
begin DBMS_VECTOR.drop_onnx_model(model_name => 'doc_model_han', force => true); end;
-- onnx파일을 가져와서 로딩 작업수행
begin
  DBMS_VECTOR.LOAD_ONNX_MODEL('CTX_WORK_DIR','multi-qa-MiniLM-L6-cos-v1.onnx','doc_model_han',
  JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input":{"input": ["DATA"]}}'));
end;
/

-- 임베딩 모델를 이용하여 'hello'문자를 임베딩하는 예제
SELECT TO_VECTOR(VECTOR_EMBEDDING(doc_model_han USING 'hello' as data)) AS embedding;

EMBEDDING                                                                                                                                                                                                                                                      |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
[-1.84456294E-003,4.6881251E-002,5.60026839E-002,2.94819362E-002,-4.99280356E-002,-5.25398068E-002,9.09654573E-002,-7.13755935E-002,-7.11104795E-002,3.83346304E-002,4.16246057E-002,-8.75969231E-002,9.75992996E-003,-4.2328421E-002,5.8659073E-002,4.72318754|

 

그럼 위의 예제에서 사용된 DBMS_VECTOR에 대해서 정리하도록 하겠습니다.

DBMS_VECTOR 패키지는 사용자 데이터에서 청크 또는 임베딩을 추출하거나, 주어진 프롬프트에 대한 텍스트를 생성하거나, 벡터 인덱스를 만들거나, 인덱스 정확도 보고와 같은 오라클 AI 벡터 검색의 일반적인 작업을 지원하는 API를 제공합니다.

이러한 함수는 각각의 입력 매개 변수를 JSON 형식으로 허용합니다.

 

아래는 DBMS_VECTOR에 있는 패키지의 서브프로그램들입니다. 위의 예제에서 사용한것은 LOAD_ONNX_MODEL입니다.

Subprogram Description
ONNX Model Related Procedures:
These procedures enable you to load an ONNX model into Oracle Database and drop the ONNX model.
ONNX 모델을 오라클 데이터베이스에 로드하고 ONNX 모델을 드롭할 수 있습니다.
LOAD_ONNX_MODEL Loads an ONNX model into the database
LOAD_ONNX_MODEL_CLOUD Loads an ONNX model from object storage into the database 
DROP_ONNX_MODEL Procedure Drops the ONNX model
Chainable Utility (UTL) Functions:
These functions are a set of modular and flexible functions within vector utility PL/SQL packages. You can chain these together to automate end-to-end data transformation and similarity search operations.
데이터변환 및 유사성 검색을 수행할 수 있습니다.
UTL_TO_CHUNKS Splits data into smaller pieces or chunks
UTL_TO_EMBEDDING and UTL_TO_EMBEDDINGS Converts data to one or more vector embeddings
UTL_TO_GENERATE_TEXT Generates text for a prompt (input string) or an image
Credential Helper Procedures:
These procedures enable you to securely manage authentication credentials in the database. You require these credentials to enable access to third-party service providers for making REST calls.
 데이터베이스에서 인증 자격 증명을 안전하게 관리할 수 있습니다
CREATE_CREDENTIAL Creates a credential name
DROP_CREDENTIAL Drops an existing credential name
Data Access Functions:
These functions enable you to retrieve data, create index, and perform simple similarity search operations.
 데이터를 검색하고, 인덱스를 생성하고, 간단한 유사성 검색 작업을 수행할 수 있습니다.
CREATE_INDEX Creates a vector index
REBUILD_INDEX Rebuilds a vector index
GET_INDEX_STATUS Describes the status of a vector index creation
ENABLE_CHECKPOINT Enables the Checkpoint feature for a vector index user and index name
DISABLE_CHECKPOINT Disables the Checkpoint feature for a vector index user and index name
INDEX_VECTOR_MEMORY_ADVISOR Determines the vector memory size that is needed for a vector index
QUERY Performs a similarity search query
RERANK Reorders search results for more relevant output
Accuracy Reporting Function:
These functions enable you to determine the accuracy of existing search indexes and to capture accuracy values achieved by approximate searches performed by past workloads.
기존 검색 인덱스의 정확도를 결정하고 과거 워크로드에서 수행한 대략적인 검색으로 달성한 정확도 값을 캡처할 수 있습니다.
INDEX_ACCURACY_QUERY Verifies the accuracy of a vector index
INDEX_ACCURACY_REPORT Captures accuracy values achieved by approximate searches

 

출처 : ai-vector-search-users-guide

출처 : https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/shared-global-topic-documentation-accessibility.html

 

AI Vector Search User's Guide

 

docs.oracle.com

 

 

 

 

출처 : https://kosate.github.io/blog/oracle/how-to-use-oracle-ai-vector-search/#/2

 

벡터 검색 기술 활용(1) - 텍스트유사도검색

오라클 데이터베이스 23ai에 벡터 검색을 위한 Oracle AI Vector Search기능을 제공합니다. DB안에서 텍스트를 청킹하고 벡터로 임베딩하여 유사도 검색을 하는 절차들을 정리하였습니다.

kosate.github.io

출처 : https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/dbms_vector1.html#GUID-F9FCB225-821A-4CCA-92B5-58B9927234FA

 

PL/SQL Packages and Types Reference

The DBMS_VECTOR package provides APIs to support common operations with Oracle AI Vector Search, such as extracting chunks or embeddings from user data, generating text for a given prompt, creating a vector index, or reporting on index accuracy.

docs.oracle.com

 

 

반응형

댓글