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://kosate.github.io/blog/oracle/how-to-use-oracle-ai-vector-search/#/2
'Oracle > 운영' 카테고리의 다른 글
[23ai] new feature 벡터 타입과 ai벡터검색 - pdf파일을 백터검색하기 (2) (0) | 2024.11.12 |
---|---|
[23ai] new feature 벡터 타입과 ai벡터검색 - 유사성검색 (3) (0) | 2024.11.12 |
DOP Downgrade? (0) | 2024.11.10 |
V$ASM_DISKGROUP의 수치별 설명 (0) | 2024.11.07 |
통계정보 수집시 no_invaildation 옵션 (0) | 2024.08.27 |
댓글