Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle AI Vector Search 技術詳細

Oracle AI Vector Search 技術詳細

Avatar for oracle4engineer

oracle4engineer

May 21, 2024
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Copyright © 2024, Oracle and/or its affiliates 5 • Oracle

    AI Vector Search • ベクトルデータができるまで • ベクトルデータを扱う基本機能 • 3rd Party製品との統合 • Appendix Agenda
  2. 検索精度、開発生産性、アクセスコントロールを向上 Oracle Database 23ai - AI Vector Search あらゆる生成AIをサポートする、マルチモーダルプラットフォーム Copyright

    © 2024, Oracle and/or its affiliates 7 あらゆる生成AIを支える、マルチモーダルプラットフォーム 様々なデータ、検索手法を1つのデータベースでセキュアに管理 • 品質と鮮度の高いビジネスデータと、ベクトルデータを、 一つのデータベースに集約し、SQLで検索可能 • RAG精度向上の手法を、SQL機能で実現し、検索精度を向上 • ドキュメントのテキスト化からベクトル変換までデータベース内で実施 データ一貫性維持と、開発生産性向上を実現 • データベースの持つ堅牢なアクセスコントロール スケーラビリティ、高可用性 • データ整合性を保持しながら、スケールアウトを可能に • Exadata Cloudの持つ、高性能、高可用性を活用 充実のツール群 • ドキュメントローダー、テキストスプリッターのプロシージャ • ONNXモデルをインポートし、データベース内でベクトル化 • プロンプトエンジニアリングのプロシージャ 分類 価格 テキスト ベクトル(テキスト) 画像 ベクトル(画像) 0 001 ¥1,000 AAA…… 0.1, 0.2, 0.6. .... 0.5, 1.5, 2.6, .... 1 002 ¥2,000 BBB…… 0.8, 0.1, 0.4. .... 1.0, 0.9, 1.6, .... 2 003 ¥3,000 CCC…… 0.5, 0.3, 0.9. .... 0.6, 1.1, 1.3, .... SQL 7623 SQL Single Source of Truth Oracle Database 23ai AI Vector Search
  3. エンタープライズのお客様に育てていただいたオラクルだからこそのこだわり OracleのエンタープライズRAGアーキテクチャ Copyright © 2024, Oracle and/or its affiliates 8

    アプリケーション 様々なデータソース 非構造化データ 構造化データ SFDC SAP Confluence LLM SharePoint ②クエリー ナレッジベース ①質問 ⑥回答 ④回答生成指示 ⑤回答 ※オブジェクトストレージ経由も頻出パターン コネクター製品や作りこみ GoldenGate 23ai 販売実績 顧客 製品マスタ ... Workday Snowflake ServiceNow コンバージドデータベース Data Catalog Integration IoT Streaming / Queue ③検索結果 データの取り込み・同期・チャンク・インデックス・ベクトル化
  4. DBMS_VECTOR_CHAINパッケージの利用 • ドキュメントのテキストデータ化、テキストデータのチャンク分割、ベクトル化まで 全ての処理をデータベース内で実行可能 • CHAINパッケージという名前の通りそれぞれのパッケージの入出力形式が連動している データをベクトル化するまでの流れ Copyright © 2024,

    Oracle and/or its affiliates 10 PDF Word HTML etc. ベクトルデータ チャンクテキスト テキスト ドキュメント chunk vector --- --- --- --- --- UTL_TO_TEXT ドキュメントデータの 構造解析を実行し テキストデータに変換 UTL_TO_CHUNKS テキストデータを チャンクテキストに分割 UTL_TO_EMBEDDINGS 埋め込みモデルを使い チャンクテキストを ベクトルデータに変換
  5. select DBMS_VECTOR_CHAIN.UTL_TO_TEXT ( t.blobdata, json('{ "charset":"UTF8" }') ) from tab

    t; • 必ずしも全ての処理を実行する必要はなく利用シーンに応じて単体でも、全てを組み合わせて1SQLでも利用可能 • 例1:UTL_TO_TEXT単体で利用 • 例2:UTL_TO_TEXT、UTL_TO_CHUNKS、UTL_TO_EMBEDDINGSの3つを1SQLで利用 利用イメージ DBMS_VECTOR_CHAINパッケージ Copyright © 2024, Oracle and/or its affiliates 11 SELECT et.* from documentation_tab dt,dbms_vector.utl_to_embeddings(dbms_vector.utl_to_chunks(dbms_vector_chain.utl_to_text(dt.data )), json(:embed_params)) et;
  6. • それぞれのパッケージで抽出した内容を、別の表や列としてテーブルに格納することが可能 • 例1:チャンク時にパラメータを変えたデータを別表として保持し複数の表で試しながら精度確認 利用イメージ DBMS_VECTOR_CHAINパッケージ Copyright © 2024, Oracle

    and/or its affiliates 12 ID pos siz chunk 1 1 50 Oracle Database Data Warehousing Guide to learn about 2 51 50 nmechanisms\n\n \n\nOvervie w of Extraction, Transformation, and Loading (ETL) ID pos siz chunk 1 1 100 Oracle Database Data Warehousing Guide to learn about nmechanisms\n\n \n\nOvervie w of Extraction, Transformation, and Loading (ETL) 2 101 100 ………….
  7. • それぞれのパッケージで抽出した内容を、別の表や列としてテーブルに格納することが可能 • 例2:Embeddingモデルを複数試す際に、モデルごとに別列にデータを格納しておくことで精度比較が容易に 利用イメージ DBMS_VECTOR_CHAINパッケージ Copyright © 2024, Oracle

    and/or its affiliates 13 商品ID 商品名 商品概要 商品画像 商品価格 商品概要 _Vec_Model1 商品概要 _Vec_Model2 1001 Oracle Red Bull Racing バックパック オラクル レッドブル F1 レー シング チーム公式商品グッ ズ サイズ:約 40.5cm×28cm×14cm - 7,700 -9.76553112E-002,- 9.89954844E- 002,7.69771636E-003,- 4.16760892E-003,- 9.69305634E-002, -2.86354572E-002,- 7.56499246E-002,- 4.16395674E-003,- 1.52879998E- 001,6.60010576E-002, 1002 Oracle Red Bull Racing ジャケット メイン素材: ポリエステル(。 前面は防風素材、後面はフ リース素材で、 - 13,000 3.01141385E-002,- 2.63396613E-002,- 2.98553891E- 002,5.96499592E- 002,4.13885899E-002, -7.82847106E- 002,3.34323719E- 002,8.03267583E- 002,1.70483496E-002,-
  8. ドキュメントをテキスト化し取り込むパッケージ 概要 • PDF、 DOC、JSON、XML、HTMLなどのドキュメントからテキストを抽出することが可能 • サポートされるドキュメント形式は下記内容を参照 Oracle® Text リファレンス

    23c - B.2 サポートされているドキュメント形式 • 抽出したテキストはCLOBとして出力 メリット • Oracle Databaseのパッケージとして機能を持つことで • データベース内で、データベースリソースを使ってドキュメントのテキスト化が可能 • 格納されたLOBデータをUTL_TO_CHUNK、UTL_TO_EMBEDDINGSなどの • DBMS_VECTOR_CHAINパッケージと組み合わせることでEMBEDDINGSまでの一連の処理を実行可能 DBMS_VECTOR_CHAIN.UTL_TO_TEXT Copyright © 2024, Oracle and/or its affiliates 14 DBMS_VECTOR_CHAIN.UTL_TO_TEXT ( DATA IN CLOB | BLOB, PARAMS IN JSON default NULL ) return CLOB;
  9. 実行例 1. 対象となるドキュメントの格納場所をディレクトリオブジェクトとして定義 2. 対象のテーブルを作成しBLOB列を定義 3. ドキュメントを指定してBLOBにINSERT 4. INSERTしたデータの確認 DBMS_VECTOR_CHAIN.UTL_TO_TEXT

    SQL> create or replace directory VEC_DUMP as '/home/oracle/pdf_doc'; SQL> CREATE TABLE documentation_tab (id number, data blob); SQL> INSERT INTO documentation_tab values(1, to_blob(bfilename('VEC_DUMP', ‘sample.pdf'))); SQL> SELECT dbms_vector_chain.utl_to_text(dt.data) from documentation_tab dt; DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DT.DATA) -------------------------------------------------------------------------------- Database Concepts 23c Oracle Database Database Concepts, 23c This software and related documentation are provided under a license agreement containing restrictions on Copyright © 2024, Oracle and/or its affiliates 15
  10. テキストデータのチャンク分割 概要 • 大規模なテキストデータをチャンクに分割が可能 • 単語、文、段落でのチャンク分割が可能 • 埋め込みモデルがベクトルを生成する際の入力テキストの制限値に対応 メリット •

    Oracle Databaseのパッケージとして機能を持つことで データベース内で、データベースリソースを使ってチャンク分割が可能 • 格納されたLOBデータをUTL_TO_TEXT、UTL_TO_EMBEDDINGSなどの DBMS_VECTOR_CHAINパッケージと組み合わせることでEMBEDDINGSまでの一連の処理を実行可能 DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS ( DATA IN CLOB | VARCHAR2 PARAMS IN JSON default NULL ) return VECTOR_ARRAY_T; Copyright © 2024, Oracle and/or its affiliates 16
  11. 実行例 • UTL_TO_TEXTで抽出したテキストをUTL_TO_CHUNKSを使ってチャンク分割した例 DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS SQL> SELECT ct.* from documentation_tab dt,

    dbms_vector_chain.utl_to_chunks(dbms_vector_chain.utl_to_text(dt.dat a)) ct; DATA -------------------------------------------------------------------------------- {"chunk_id":1,"chunk_offset":1508024,"chunk_length":579,"chunk_data" :"Inventory \n\n\n\nAnalysis \n\n\n\nReporting \n\n\n\nMining\n\n\n\nSummary \n\n\n\nData \n\n\n\nRaw Data\n\n\n\nMetadata\n\n\n\nSee Also:\n\n\n\nOracle Database Data Warehousing Guide to learn about transformation \n\n\n\nmechanisms\n\n\n\nOvervie w of Extraction, Transformation, and Loading (ETL) \n\n\n\nThe {"chunk_id":2,"chunk_offset":1508603,"chunk_length":607,"chunk_data":"phys ica lly transported to the target system or an intermediate system for processing. \ n\n\n\nDepending on the method of transportation, some transformations can occur during this \n\n\n\nprocess. For example, a SQL statement that directly accesse s a remote target through a \n\n\n\ngateway can concatenate two columns as part of the ~~~ Copyright © 2024, Oracle and/or its affiliates 17
  12. パラメータ • JSON形式でパラメータを指定可能 • 指定したパラメータの値によってチャンク動作が変化 • 指定可能なパラメータ表 - 1 DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS

    JSON('{ "by":"vocabulary", "vocabulary":"myvocab", "max":"100", "overlap":"0", "split":"custom", "custom_list": [ "<p>" , "<s>" ], "language":"american", "normalize":"options", "norm_options": [ "WHITESPACE" ] }') Copyright © 2024, Oracle and/or its affiliates 18 パラメータ 説明 指定可能な値 補足 by データ分割の方法を文字、単語、 語彙トークンで指定 デフォルト:by words by characters 文字数で計算して分割 by words 単語数を計算して分割 単語ごとに空白文字が入る言語が対象 日本語、中国語、タイ語などの場合、 1文字が1単語としてみなされる by vocabulary 語彙のトークン数を計算して分割 CREATE_VOCABULARYパッケージを使って 語彙登録が可能 max データ分割の方法に応じてそれぞれの方法に おける最大数を指定 ここで指定した最大数に 達したときにデータを分割する デフォルト:100 50〜4000 by charactersの場合 10〜1000 by wordsの場合 10〜1000 by vocabularyの場合
  13. パラメータ • 指定可能なパラメータ表 - 2 DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS Copyright © 2024, Oracle

    and/or its affiliates 19 パラメータ 説明 指定可能な値 補足 split [by] テキストが最大サイズに達したときに、 どうやって分割するかを指定 チャンクの適切な境界を 定義するために使用する デフォルト:recursively none max指定されている文字数、単語数、 語彙トークン数に達したら分割 newline max指定サイズを超えてテキストの行末で分割 blankline max指定サイズを超えて blankline(2回の改行)の末尾で分割 space max指定サイズを超えて空白の行末で分割 recursively blankline、newline、space、noneの 順に条件に応じて分割する 1.入力テキストがmax値以上の場合、最初の分割文字で分割 2.1.が失敗した場合に、2番目の分割文字で分割 3.分割文字が存在しない場合、テキスト中の どの位置においてもmaxで分割 sentence 文末の句読点で分割 by wordsとby vocabularyでのみ指定可能 max設定の仕方によっては必ず句読点で 区切られるわけではないので注意 例えば、文がmax値よりも大きい場合、max値で区切られる max値よりも小さな文の場合で、 2文以上がmaxの制限内に収まるのであれば1つに収める custom カスタム分割文字リストに基づいて分割 分割文字は最大16個まで、 長さはそれぞれ10文字までで指定可能 例えばVECTOR_CHUNKS(c. doc, by character split custom ('<html>' , '</html>')) vc
  14. パラメータ • 指定可能なパラメータ表 - 3 DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS Copyright © 2024, Oracle

    and/or its affiliates 20 パラメータ 説明 指定可能な値 補足 overlap チャンクに含まれる 前チャンクの最後の文字数を指定 前チャンクと重複して テキストを持つことができる デフォルト:0 max値で指定したサイズの 5%〜20% 重複されるサイズの計算方法は byパラメータで指定したモードによって異なる normalize ドキュメントをテキストに変換する際に ありがちな問題について、自動的に前処理、 後処理を実行し高品質なチャンクとして 格納するために使用 デフォルト:none none 処理を行わない all マルチバイトの句読点をシングルバイトに正規化 punctuation スマート引用符、スマートハイフン、マルチバイト句読点を テキストに含める whitespace 不要な文字を削除して空白を最小限に抑える 例えば空白行はそのままに、 余分な改行やスペース、タブを削除する widechar マルチバイト数字とローマ字をシングルバイトに正規化する extended 初期化パラメータのMAX_STRING_SIZE パラメータをentendedに設定することなく、 VARCHAR2の文字列の出力制限を 32767バイトに増加させる デフォルトはMAX_STRING_SIZEの設定 値によって変化し、STANDARDの場合は 4000、EXTENDEDの場合は32,767 4000 or 32767 MAX_STRING_SIZEはデフォルトSTANDARDであり、 4000バイトまでが制限となる これを拡大する場合通常はEXTENDEDに変更する必要があ るが、一度変更すると元に戻すことができない そのためCDB、PDBレベルでこのような変更を加えたくない場合 に使用する
  15. テキストおよびチャンク配列をベクトル形式にEMBEDDING 概要 • 次の2つの方法でEMBEDDINGを実施 • サービスプロバイダとしてOracle Databaseを選択し 事前に学習したONNX形式のベクトル埋め込みモデルを呼び出す • OCI

    Generative AIなどのサードパーティ・サービス・プロバイダーのREST API呼び出し • メリット • Oracle Databaseのパッケージとして機能を持つことでデータベース内で、 データベースリソースを使ってテキストのベクトル化が可能 • 格納されたLOBデータをUTL_TO_CHUNK、UTL_TO_EMBEDDINGSなどの DBMS_VECTOR_CHAINパッケージと組み合わせることでEMBEDDINGSまでの一連の処理を実行可能 DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING/ UTL_TO_EMBEDDINGS Copyright © 2024, Oracle and/or its affiliates 21 DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING ( DATA IN CLOB, PARAMS IN JSON default NULL ) return VECTOR; DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS ( DATA IN VECTOR_ARRAY_T, PARAMS IN JSON default NULL ) return VECTOR_ARRAY_T;
  16. 実行例 • OCI GenAIサービスにアクセスするためのクレデンシャルを作成する DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS Copyright © 2024, Oracle and/or

    its affiliates 22 declare jo json_object_t; begin create an OCI credential jo := json_object_t(); jo.put('user_ocid', 'user ocid value’); jo.put('tenancy_ocid', 'tenancy ocid value’); jo.put('compartment_ocid', 'compartment ocid value’); jo.put('private_key', 'private key value’); jo.put('fingerprint', 'fingerprint value’); dbms_output.put_line(jo.to_string); dbms_vector.create_credential( credential_name => 'OCI_CRED', params => json(jo.to_string)); end; /
  17. 実行例 • GenAIサービスを利用するためのパラメータを設定 DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS Copyright © 2024, Oracle and/or its

    affiliates 23 var embed_genai_params clob; exec :embed_genai_params := '{"provider": "ocigenai", "credential_name": "OCI_CRED", "url": "https://inference.generativeai.us-chicago- 1.oci.oraclecloud.com/20231130/actions/embedText", "model": "cohere.embed-multilingual-v3.0"}';
  18. 実行例 • UTL_TO_CHUNKSでチャンキングした結果をEMBEDDING DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS Copyright © 2024, Oracle and/or its

    affiliates 24 SELECT et.* from documentation_tab dt, dbms_vector_chain.utl_to_embeddings(dbms_vector_chain.utl_to_chunks(dbms_vector_chain.utl_t o_text(dt.data), json('{"max": " 400", "overlap": "20%", "language": "JAPANESE", "normalize": "all"}')), json(:embed_genai_params)) et; --実行結果 DATA -------------------------------------------------------------------------------- {"embed_id":"1","embed_data":"5-4\n\n\nD:20231208125114-08'00'\n\n\n\n10- 7\n\n\n\n\n\n\n\n\n\n\nD:20231208125114-08'00'\n\n\n\n4- 29\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nD:20231208125114-08'00'\n\n\n\n10- 3\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nD:20231208125114- 08'00'","embed_vector":"[0.125467107,0.0850959048,-0.0207406133,0.0 0123620778,0.0244407952,-0.0361999273,-0.0162772723,0.210277647,0.0756126642,-0.0884471983, ・・・ (以下略)
  19. パラメータ DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING/ UTL_TO_EMBEDDINGS Copyright © 2024, Oracle and/or its affiliates

    25 パラメータ 説明 指定可能な値 補足 Provider ベクトルを生成するために アクセスするサービスプロバイダ デフォルト:Database Database Oracle Databaseにインポートした ONNXモデルを使用 OCIGenAI|Cohere|OpenAI|GoogleAI| HaggingFace|VertexAI OCIGenAIやHugging Faceなどサポートされている 外部プロバイダを指定。 credential_name クレデンシャルの名前 schema.credential_name REST APIコールを行うためのAIプロバイダーへのアクセスを可能にす る認証クレデンシャル。事前に DBMS_VECTOR_CHAIN.CREATE_CREDENTIALを実行し、 ここで作成したクレデンシャル名を使用 url 外部プロバイダーへの各RESTコールのAPIエンドポ イントのURL model モデルの名前 schema.model_name モデル名がスキーマ修飾されていない場合、プロシージャ呼び出し元の スキーマが使用されます。 ONNX形式の埋め込みモデルが事前に用意されていない場合は、 「事前学習済みモデルのONNX形式への変換について」に記載されて いる手順を実行してください。 transfer_timeout リクエストが完了するまでの最大待機時間 デフォルト:60 batch_size 一度にリクエストするデータの最大数 デフォルト値または最大許容値は、サードパーティプロバイダの設定に よって異なる。 OCI GenAI cohere.commandの場合: 最大96 batch_sizeが50の場合、100個のチャンクが渡されると、50個ずつ の文字列の配列を持つ2つのリクエストを送信する。30個のチャンクが 渡された場合、それらを1つのリクエストで送信する。 バッチ・サイズを大きくするとパフォーマンスが向上する。一方、バッチ・サ イズを小さくすると、メモリとデータ使用量が削減される。
  20. 概要とメリット 概要 • Oracleから提供されるomlutilsツールを利用して、 事前訓練済みのモデルをONNX形式に変換し、 Oracle Databaseにインポートして、 データベース内でテキストをEMBEDDINGSへ変換 メリット •

    データベース内で、データベースリソースを使ってテキストをEMBEDDINGSへの変換が可能 • 特にデータベースの中にベクトル化したいデータが格納されている場合、データベース内で処理が完結する • 格納されたLOBデータをUTL_TO_TEXT、UTL_TO_CHUNKS、UTL_TO_EMBEDDINGSなどの DBMS_VECTOR_CHAINパッケージと組み合わせることでEMBEDDINGSまでの一連の処理を実行可能 ONNXモデルのインポート Copyright © 2024, Oracle and/or its affiliates 26 EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL ( 'DM_DUMP', 'my_embedding_model.onnx', 'doc_model', JSON('{"function": "embedding", "embeddingOutput": "embedding"}') ); EXECUTE DBMS_DATA_MINING.IMPORT_ONNX_MODEL ( 'my_embedding_model.onnx', 'doc_model', JSON('{"function": "embedding", "embeddingOutput": "embedding"}, "input": {"input": ["DATA"]}}') ); DBMS_VECTOR.LOAD_ONNX_MODEL() {ONNX} モデル DBMS_DATA_MINING.IMPORT_ONNX_MODEL() or {in-database objects}
  21. 仮想環境の作成とomlutilsのインストール 1. Linux環境でminicondaをインストール 2. ONNXモデル作成用のpython(=3.12)仮想環境を作成 3. omlutils.zipをダウンロードし、Linux環境でunzipし、unzipしてできたディレクトリ内で以下を実行し、 必要なパッケージをインストール ONNXモデルの準備 conda

    create –n onnx python=3.12 conda activate onnx Copyright © 2024, Oracle and/or its affiliates 27 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3 ~/miniconda3/bin/conda init bash . ./.bashrc pip install -r requirements.txt pip install omlutils-0.13.0-cp312-cp312-linux_x86_64.whl
  22. ONNXモデルへの変換 • 実行方法1:事前構成済みのモデルから変換する (EmbeddingModelConfigのshow_preconfigured()関数で事前構成済みのモデルを確認できる) 上記内容を‘all_MiniLM_L6_v2.py’として作成し実行することで、 'all_MiniLM_L6_v2.onnx'が作成され、後述のデータダンプディレクトリにコピーする • 実行方法2:テンプレートを設定して変換する ( EmbeddingModelConfigのshow_templates()関数で既存のテンプレートを確認できる)

    上記内容を‘e5_small_v2.py’として作成し実行することで、 ' e5_small_v2.onnx'が作成され、後述のデータダンプディレクトリにコピーする ONNXモデルの準備 Copyright © 2024, Oracle and/or its affiliates 28 from omlutils import EmbeddingModel, EmbeddingModelConfig em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2") em.export2file("all_MiniLM_L6_v2", output_dir=".") from omlutils import EmbeddingModel, EmbeddingModelConfig config = EmbeddingModelConfig.from_template("text",max_seq_length=512) em = EmbeddingModel(model_name="intfloat/e5-small-v2", config=config) em.export2file("e5_small_v2",output_dir=".")
  23. ユーザーの作成と権限の付与 1. SQL*PlusでSYSDBAとしてPDBに接続 2. dmuserにDBA権限を付与 3. dmuserにCREATE MINING MODEL権限を付与 4.

    ワーキングフォルダをデータダンプディレクトリ(ONNX形式モデルをここのコピー)として設定 5. DM_DUMPディレクトリに対してdmuserにREAD権限を付与 ONNXモデルのインポート SQL> CONN sys/<password>@pdb as sysdba; SQL> GRANT dba TO dmuser identified by <password>; SQL> GRANT create mining model TO dmuser; CREATE OR REPLACE DIRECTORY DM_DUMP as '<work directory path>'; Copyright © 2024, Oracle and/or its affiliates 29 GRANT READ ON DIRECTORY dm_dump TO dmuser;
  24. 実行例1(DBMS_DATA_MINING.IMPORT_ONNX_MODELを使用) 1. SQL*PlusでdmuserとしてPDBに接続 2. PL/SQLヘルパーブロックを使用して、ONNX形式のモデルをOracleデータベースにインポート ONNXモデルのインポート SQL> CONN dmuser/<password>@<pdbname>; SQL>

    DECLARE m_blob BLOB default empty_blob(); m_src_loc BFILE ; BEGIN DBMS_LOB.createtemporary (m_blob, FALSE); m_src_loc := BFILENAME('DM_DUMP', 'all_MiniLM_L6_v2.onnx'); DBMS_LOB.fileopen(m_src_loc, DBMS_LOB.file_readonly); DBMS_LOB.loadfromfile(m_blob, m_src_loc, DBMS_LOB.getlength(m_src_loc)); DBMS_LOB.CLOSE(m_src_loc); DBMS_DATA_MINING.import_onnx_model ('doc_model', m_blob, JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}')); DBMS_LOB.freetemporary (m_blob); END; / Copyright © 2024, Oracle and/or its affiliates 30
  25. 実行例2(DBMS_VECTOR.LOAD_ONNX_MODELを使用) 1. SQL*PlusでdmuserとしてPDBに接続 2. PL/SQLヘルパーブロックを使用して、ONNX形式のモデルをOracleデータベースにインポート ONNXモデルのインポート SQL> CONN dmuser/<password>@<pdbname>; SQL>

    EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL('DM_DUMP', 'all_MiniLM_L6_v2.onnx', 'doc_model', JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}')); Copyright © 2024, Oracle and/or its affiliates 31
  26. ONNXモデルの確認とEMBEDDINGS処理の使用例 1. インポートしたONNXモデルを確認 2. ONNXモデルを使用して、EMBEDDINGS処理を実行 ONNXモデルのインポート SQL> SELECT model_name, attribute_name,

    attribute_type, data_type, vector_info FROM user_mining_model_attributes WHERE model_name = 'DOC_MODEL' ORDER BY ATTRIBUTE_NAME; SQL> SELECT MODEL_NAME, MINING_FUNCTION, ALGORITHM,ALGORITHM_TYPE, MODEL_SIZE FROM user_mining_models WHERE model_name = 'DOC_MODEL' ORDER BY MODEL_NAME; SQL> var embed_genai_params clob; SQL> exec :embed_genai_params := '{"provider": "database", "model": "doc_model"}'; SQL> select et.* from dbms_vector_chain.utl_to_embeddings('hello', json(:embed_genai_params)) et; Copyright © 2024, Oracle and/or its affiliates 32
  27. {TEXT} チャンク UTL_TO_SUMMARY() {TEXT} 要約 テキストデータの要約 概要 • テキスト化したデータやチャンク分割したデータを要約することができる •

    Oracle Textのパッケージを使ったデータベース内での実行や REST APIを使ったOCI GenAIでの実行が可能 メリット • テキストデータを要約することで、大規模で複雑なデータから意味のあるコンテンツを抽出することが可能 • 要約したデータをEmbeddingすることで精度が向上する可能性がある • サマリ前のデータとサマリ後のデータをそれぞれ保持し、マルチベクトル検索をかけるなど 精度向上に向けた試行錯誤の一つに利用可能 DBMS_VECTOR_CHAIN.UTL_TO_SUMMARY DBMS_VECTOR_CHAIN.UTL_TO_SUMMARY ( DATA IN CLOB, PARAMETERS IN JSON default NULL ) return CLOB; Copyright © 2024, Oracle and/or its affiliates 33
  28. DBMS_VECTOR_CHAIN.UTL_TO_SUMMARY select dbms_vector_chain.utl_to_summary( 'A transaction is a logical, atomic unit

    of work that contains one or more SQL statements. An RDBMS must be able to group SQL statements so that they are either all committed, which means they are applied to the database, or all rolled back, which means they are undone. An illustration of the need for transactions is a funds transfer from a savings account to a checking account. The transfer consists of the following separate operations: 1. Decrease the savings account. 2. Increase the checking account. 3. Record the transaction in the transaction journal. Oracle Database guarantees that all three operations succeed or fail as a unit. For example, if a hardware failure prevents a statement in the transaction from executing, then the other statements must be rolled back. Transactions set Oracle Database apart from a file system. If you perform an atomic operation that updates several files, and if the system fails halfway through, then the files will not be consistent. In contrast, a transaction moves an Oracle database from one consistent state to another. The basic principle of a transaction is all or nothing: an atomic operation succeeds or fails as a whole.', json(:summarize_genai_params)) from dual; A transaction is a logical unit of work that groups one or more SQL statements that must be executed as a unit, with all statements succeeding, or all statements being rolled back. Transactions are a fundamental concept in relational database management systems (RDBMS), and Oracle Database is specifically designed to manage transactions, ensuring database consistency and integrity. Transactions differ from file systems in that they maintain atomicity, ensuring that all related operations succeed or fail as a whole, maintaining database consistency regardless of intermittent failures. Transactions move a database from one consistent state to another, and the fundamental principle is that a transaction is committed or rolled back as a whole, upholding the "all or nothing" principle. PL/SQL procedure successfully completed. Copyright © 2024, Oracle and/or its affiliates 34 要約のイメージ
  29. BY WORDs MAX 40=最大40語で区切る ※CHUNK_LENGTHは文字数 BY VOCABULARY xxx MAX 40

    = 最大40トークン で区切る DBMS_VECTOR_CHAIN.CREATE_VOCABULARY SQL> SELECT D.id doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM en_tab D, VECTOR_CHUNKS (D.text BY WORDs MAX 40 OVERLAP 0 SPLIT BY recursively LANGUAGE ENGLISH NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT ----------------------------------------------- 1 104 Oracle AI Vector Search stores and indexes vector embeddings for fast retrieval and similarity search. 109 230 About Oracle AI Vector Search Vector Indexes are a new classification of specialized indexes that are designed for Artificial Intelligence (AI) workloads that allow you to query data based on semantics, rather than keywords. SQL> SELECT D.id doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM en_tab D, VECTOR_CHUNKS (D.text BY VOCABULARY doc_vocab MAX 40 OVERLAP 0 SPLIT BY recursively LANGUAGE ENGLISH NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT ------------------------------------------------- 1 104 Oracle AI Vector Search stores and indexes vector embeddings for fast retrieval and similarity search. 109 30 About Oracle AI Vector Search 143 148 Vector Indexes are a new classification of specialized indexes that are designed for Artificial Intelligence (AI) workloads that allow you to query 291 48 data based on semantics, rather than keywords. Copyright © 2024, Oracle and/or its affiliates 39 単語ごと/トークンごとのチャンキング比較
  30. トークンごとのチャンキング実行例 英語の場合: トークンには各単語の断片が含まれることがあるため、同じMAX値で比較すると、通常チャンク・サイズは単 語分割よりも小さくなる (例) playing(1語) → play + ###ing(2トークン)

    日本語の場合: 1文字単位で語彙登録されているトークナイザだと最大トークン数≒最大文字数となるので、あまり違い はない DBMS_VECTOR_CHAIN.CREATE_VOCABULARY Copyright © 2024, Oracle and/or its affiliates 40 SQL> SELECT D.id doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM en_tab D, VECTOR_CHUNKS (D.text BY VOCABULARY doc_vocab MAX 40 OVERLAP 0 SPLIT BY recursively LANGUAGE ENGLISH NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT -------------------------------------------------------------------------------------------------- 1 104 Oracle AI Vector Search stores and indexes vector embeddings for fast retrieval and similarity search. 109 30 About Oracle AI Vector Search 143 148 Vector Indexes are a new classification of specialized indexes that are designed for Artificial Intelligence (AI) workloads that allow you to query 291 48 data based on semantics, rather than keywords.
  31. 実行手順 1. 使用する語彙ファイル(my_model_vocabulary.txt)の格納場所をディレクトリオブジェクトとして定義 2. 語彙トークンを格納する表を定義 DBMS_VECTOR_CHAIN.CREATE_VOCABULARY Copyright © 2024, Oracle

    and/or its affiliates 41 SQL> create or replace directory VEC_DUMP as '/home/oracle/vocab/'; SQL> CREATE TABLE documentation_tab (id number, data clob) CREATE TABLE doc_vocabtab(token nvarchar2(64)) ORGANIZATION EXTERNAL (default directory VEC_DUMP ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE) location ('my_model_vocabulary.txt'));;
  32. 実行手順 3. 語彙トークンの作成 4. (オプション) USER_VECTOR_VOCAB_TOKENSビューで各トークンを確認可能 DBMS_VECTOR_CHAIN.CREATE_VOCABULARY Copyright © 2024,

    Oracle and/or its affiliates 42 DECLARE parameters clob := '{"table_name" : "doc_vocabtab", "column_name" : "token", "vocabulary_name" : "doc_vocab", "format" : "bert", "cased" : false}'; BEGIN dbms_vector_chain.create_vocabulary(json(params)); END; / SQL> select * from USER_VECTOR_VOCAB_TOKENS where vocab_token = 'vector'; VOCAB_NAME VOCAB_TOKEN ------------ --------------- DOC_VOCAB VECTOR
  33. 実行手順 5. UTL_TO_CHUNKS / VECTOR_CHUNKSで語彙トークン単位でのチャンキング(BY VOCABULARY指定) 6. (オプション) 作成した語彙トークンの削除 DBMS_VECTOR_CHAIN.CREATE_VOCABULARY

    Copyright © 2024, Oracle and/or its affiliates 43 SQL> SELECT D.id doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM en_tab D, VECTOR_CHUNKS (D.text BY VOCABULARY doc_vocab MAX 40 OVERLAP 0 SPLIT BY recursively LANGUAGE ENGLISH NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT ------------------------------------------------------------------------------------------------ 1 104 Oracle AI Vector Search stores and indexes vector embeddings for fast retrieval and similarity search. 109 30 About Oracle AI Vector Search 143 148 Vector Indexes are a new classification of specialized indexes that are designed for Artificial Intelligence (AI) workloads that allow you to query 291 48 data based on semantics, rather than keywords. BEGIN dbms_vector_chain.drop_vocabulary('doc_vocab'); END; /
  34. 言語特有の省略形トークンの登録 • 英語の場合 • 文末は[.](ピリオド)で終わるが、略語にも[.]を使うことがある • チャンカーが略語の[.]で文を区切らないように予め登録しておく • 一般的によく使われる略語についてはデフォルトで区切られないよう登録されている(追加可能) •

    日本語の場合 • 文末は[。](句点)で終わり、略語に[。]を使うことがない • 文末と判定してほしくないピリオドで区切る単語を登録する DBMS_VECTOR_CHAIN.CREATE_LANG_DATA Copyright © 2024, Oracle and/or its affiliates 45 Economist Prof. Johnson warns of economic downturn due to inflation and geopolitical tensions. Economist Prof. warns of economic downturn due to inflation and geopolitical tensions. Economist Prof. Johnson warns of economic downturn due to inflation and geopolitical tensions.
  35. 実行手順 1. 使用する言語データ(my_model_langdata.txt)の格納場所をディレクトリオブジェクトとして定義 2. 略語としてデフォルトの言語データファイルは$ORACLE_HOME/ctx/data/eos/dreosja.txt(日本語)に「題」を追加 3. 言語データを格納する表を定義 DBMS_VECTOR_CHAIN.CREATE_LANG_DATA Copyright ©

    2024, Oracle and/or its affiliates 46 SQL> create or replace directory VEC_DUMP as '/home/oracle/vocab/'; SQL> CREATE TABLE doc_langtab(token nvarchar2(64)) ORGANIZATION EXTERNAL (default directory VEC_DUMP ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE CHARACTERSET AL32UTF8) location ('my_model_langdata.txt')); 題 ← 追加 B C A BR CH … AVE Blvd COL Ave Br CORP
  36. 実行手順 4. 言語データの作成 DBMS_VECTOR_CHAIN.CREATE_LANG_DATA Copyright © 2024, Oracle and/or its

    affiliates 47 DECLARE parameters clob := '{"table_name" : "doc_langtab", "column_name" : "token", "language" : “JAPANESE", "preference_name" : "doc_lang_data"}'; BEGIN dbms_vector_chain.create_lang_data(json(params)); END; /
  37. LANGUAGE Japanese(デフォルト)指定 「住居問題」の後のピリオドで文末と判定される LANGUAGE doc_lang_tab(カスタム言語データ)指定 「住居問題」の後のピリオドで文末と判定されない DBMS_VECTOR_CHAIN.CREATE_VOCABULARY SQL> SELECT D.id

    doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM ja_tab D, VECTOR_CHUNKS (D.text BY WORDs MAX 40 OVERLAP 0 SPLIT BY sentence LANGUAGE japanese NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT ----------------------------------------------- 1 120 33 一方で、都内の住宅価格は上昇傾向にあり、若者や一般家庭の住居問題. 1 154 10 が深刻化しています。 SQL> SELECT D.id doc, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt FROM ja_tab D, VECTOR_CHUNKS (D.text BY WORDs MAX 40 OVERLAP 0 SPLIT BY sentence LANGUAGE doc_lang_tab NORMALIZE all) C ; CHUNK_OFFSET CHUNK_LENGTH CHUNK_TEXT ----------------------------------------------- 1 120 41 一方で、都内の住宅価格は上昇傾向にあり、若者や一般家庭の住居問題. が深刻化 してい 1 161 3 ます。 Copyright © 2024, Oracle and/or its affiliates 48 実行手順
  38. ベクトル索引のための新しいSGAメモリ領域 概要 • Vector Pool • AI Vector Search専用のSGAメモリ領域 •

    2種のベクトル索引で使用される • インメモリ近傍グラフベクトル索引では関連するメタ データを保存するために使用される • 近傍パーティションベクトル索引では、作成やそれ に関連するDML操作を高速化するために使用さ れる • V$VECTOR_MEMORY_POOLビュー • 領域の利用状況 Vector Pool Copyright © 2024, Oracle and/or its affiliates 50
  39. 新しい初期化パラメータ • CDBレベル、PDBレベルで設定可能 • 設定例は以下の通り Vector Poolの有効化 Copyright © 2024,

    Oracle and/or its affiliates 51 SQL> ALTER SYSTEM SET vector_memory_size=1G SCOPE=BOTH; System altered. SQL> show parameter vector_memory_size NAME TYPE VALUE ------------------- ----------- ------- vector_memory_size big integer 1G
  40. • 特にインメモリネイバーグラフベクトル索引を使用する場合、 多くのメモリが必要になることが想定されるためサイジングが重要 • 必要なメモリ量はディメンション数、フォーマットサイズ、レコード数などによって決まる • ディメンション数、フォーマットサイズはEmbeddingモデルごと決まり、例えば以下の表の通り Vector Poolのサイジング 52

    Name Dimensions Format Size text-embedding-ada-002 1536 4 Byte (float32) text-embedding-3-large 3072 4 Byte (float32) all-MiniLM-L6-v2 384 4 Byte (float32) all-mpnet-base-v2 768 4 Byte (float32) embed-english-v3.0 1024 4 Byte (float32) embed-english-light-3.0 384 4 Byte (float32) multilingual-e5-large 1024 4 Byte (float32) multilingual-e5-small 384 4 Byte (float32) Copyright © 2024, Oracle and/or its affiliates
  41. • サイジングは参考値ではあるが以下の計算式で計算可能 • ディメンション数 × フォーマットのサイズ × レコード数 × 1.3

    • 1.3はグラフレイヤーのオーバーヘッド • 例えば100万レコードで計算すると以下の通り Vector Poolのサイジング 53 Name Dimensions Format Size rows overhead GB text-embedding-ada-002 1536 4 Byte (float32) 1,000,000 1.3 7.4 text-embedding-3-large 3072 4 Byte (float32) 1,000,000 1.3 15.0 all-MiniLM-L6-v2 384 4 Byte (float32) 1,000,000 1.3 1.9 all-mpnet-base-v2 768 4 Byte (float32) 1,000,000 1.3 3.7 embed-english-v3.0 1024 4 Byte (float32) 1,000,000 1.3 5.0 embed-english-light-3.0 384 4 Byte (float32) 1,000,000 1.3 1.9 multilingual-e5-large 1024 4 Byte (float32) 1,000,000 1.3 5.0 multilingual-e5-small 384 4 Byte (float32) 1,000,000 1.3 1.9 Copyright © 2024, Oracle and/or its affiliates
  42. VECTORデータ型 データの形式を厳密に定義したい場合、次元数や数値 データの形式は制約的に働くため次元や数値の形式を 指定することにメリットがある 次元数など指定せずにVECTORとして指定も可 スキーマ定義やDDLの普遍性を重視する場合、こちらは 次元数の指定がないため、次元数が変化した場合にもス キーマ定義の変更は不要 ベクトル・データ型 Copyright

    © 2024, Oracle and/or its affiliates 54 CREATE TABLE my_images ( id number, image BLOB, img_vec VECTOR(768, FLOAT32)); 次元数 (任意) 数値の形式 (任意) CREATE TABLE my_images ( id number, image BLOB, img_vec VECTOR); 指定可能な数値形式 FLOAT32, FLOAT64, INT8, BINARY ※例えば、embedding APIのバージョンアップで次元数が変更された場合でも、 スキーマ定義書の更新が不要になる →運用上の選択肢が1つ増える
  43. 概要 • ベクトル・データ型を定義する際にBINARY数値形式を指定可能 • パフォーマンスの向上やストレージ使用量を減らすことと引き換えに精度を多少犠牲にする数値形式 メリット(FLOAT32とBINARYとを比較した場合) • 距離計算が40倍高速に可能 • ストレージの使用量を32分の1に削減

    デメリット(FLOAT32とBINARYとを比較した場合) • 精度が低くなる可能性があり、参考値としてFLOAT32に比べて90%程度の精度となる 詳細 • BINARYは次元値が0より大きければ1、次元値が0以下の場合0となり、この0,1の配列をバイト表現に変換したものを1 次元値のデータとして格納することになる • INT8の場合 [25, 11, -99, -114, 13, -17, -59, 44]と表現される • BINARYの場合 [1, 1, 0, 0, 1, 0, 0, 1]と表現される この11001001をバイト表現すると201となり、BINARYとして格納されるのは[201, ~~~~~]となる この数値の丸め込みが計算の高速化とストレージ使用料の削減に寄与する BINARY数値形式とは Copyright © 2024, Oracle and/or its affiliates 55
  44. ベクトルの挿入 • TO_VECTOR() は、ベクトル配列を表す文字列を VECTOR型に変換 • ※JavascriptおよびPython用の23aiクライアントは VECTOR型をサポートしているため、ベクトルを直接挿 入可能 ベクトルデータの取得

    • FROM_VECTOR() は、ベクトル型をCLOB/VARCHARに 変換 • ※JavascriptおよびPython用の23aiクライアントは VECTOR型をサポートしているため、ベクトルを直接 フェッチ可能 ベクトル操作 Copyright © 2024, Oracle and/or its affiliates 56 CREATE TABLE vec_tab ( id number, dataVec VECTOR(3, 'FLOAT32')); INSERT INTO vec_tab VALUES (1, TO_VECTOR(’[1.1, 2.2, 3.3]’); CREATE TABLE vec_tab ( id number, dataVec VECTOR(3, 'FLOAT32')); INSERT INTO vec_tab VALUES (1, TO_VECTOR('[1.1, 2.2, 3.3]'); SELECT dataVec FROM vec_tab SELECT FROM_VECTOR(dataVec) FROM vec_tab '[1.1, 2.2, 3.3]'
  45. VECTOR_DISTANCE関数 ベクトル同士の類似性は、ベクトル間の距離計算結果で判断される 対象が似ているほど、ベクトル間の距離が短くなる。 例えば:トラとライオンのベクトルはトラとリンゴのベクトルよりも距離が短い VECTOR_DISTANCE(<Tiger Vec>, <Lion Vec>) < VECTOR_DISTANCE(<Tiger

    Vec>, <Apple Vec>) VECTOR_DISTANCEで指定する距離メトリックはエンベッディングモデルで使用された距離メトリックと同一にする ベクトル検索 Copyright © 2024, Oracle and/or its affiliates 58 VECTOR_DISTANCE(VECTOR1, VECTOR2, <distance metric>) 距離メトリック 省略形 COSINE(デフォルト) / COSINE_DISTANCE <=> DOT / INNER_PRODUCT <#> EUCLIDEAN / L2_DISTANCE <-> EUCLIDEAN_SQUARED / L2_SQUARED HAMMING / HAMMING_DISTANCE MANHATTAN / L1_DISTANCE JACCARD / JACCARD_DISTANCE VECTOR_DISTANCE(VECTOR1, VECTOR2, COSINE) COSINE_DISTANCE(VECTOR1, VECTOR2) VECTOR1 <=> VECTOR2 以下は全て同じ結果が得られる
  46. 類似度と距離 • 類似度と距離、符号反転 • 値の大小関係と表現する意味が逆になる • ソート順や値の評価等が反転するため利便性のために使い分けられることがある 類似度:値が大きいほど近く、小さいほど遠い 距離 :値が小さいほど近く、大きいほど遠い

    ※実際に「距離」と呼ぶ場合0以上の正の数値が想定される コサイン類似度( 𝑐𝑜𝑠𝜃 ) → 大きいほど類似度が高い(近い) コサイン距離 ( 1 − 𝑐𝑜𝑠𝜃 ) → 小さいほど類似度が高い(近い) ドット積( a・b ) → 大きいほど類似性が高い 負のドット積( - a・b) → 小さいほど類似性が高い ←符号反転で距離的に扱う 参考:距離について (1/3) Copyright © 2024, Oracle and/or its affiliates 59
  47. 距離の種類と演算 参考:距離について (2/3) Copyright © 2024, Oracle and/or its affiliates

    60 ユークリッド距離(L2距離) コサイン距離(1-コサイン類似度) (負の) ドット積(dot product) コサイン類似度はベクトルの長さによらず、なす角のみで 値が決定される。ベクトルからの演算の観点ではドット積 を算出後に各ベクトルの長さを算出し割るという演算に なる ドット積は元のベクトルの長さが値に入る。 ベクトルからの演算過程から見た場合、コサイン類似度で実施 する分母の2つのベクトルの長さで割る演算がない。ベクトルが 正規化されていた場合、長さの積は1であることが自明のため、 長さ演算を省いて、コサイン類似度(距離)を 得ることができる。 演算コスト 小 大 いわゆる距離計算。 ベクトルの長さの影響を受けやすい 1 − cos 𝜃 = 1 − 𝑎 ∙ 𝑏 ∥ 𝑎 ∥∥ 𝑏 ∥ ユークリッド平方距離 ユークリッド距離の二乗。 特徴はユークリッド距離と同じだが 平方根演算が省略できる
  48. 距離の種類と演算 参考:距離について (3/3) Copyright © 2024, Oracle and/or its affiliates

    61 マンハッタン距離 ハミング距離 各ベクトルの要素の差の絶対値を加算するだけのシンプルな演算 非常に軽量 各要素が一致しているかしていないかを比較演算して、 不一致の数を距離とみなす。 特に要素が2値化されていた場合、XORのみの演算となり、 距離としての演算コストは最軽量の水準になるが、 ベクトル要素の場合でも=演算のみのため
  49. 2つの検索手法 • 完全 ベクトル検索(デフォルト) • クエリベクトルとベクトル列のすべてのベクトルとの距離を計算して比較する • 正確な計算結果が得られるが検索速度は遅くなる • 検索品質が最優先で検索速度が重要でない場合に選択する

    • 行制限(FETCH)句のEXACTキーワード、もしくは何も指定しない場合こちらが選択される • 近似 ベクトル検索 • 完全ベクトル検索より精度は落ちるが、ベクトル索引を使用して検索速度、リソース効率を向上させる • 行制限(FETCH)句の新しいAPPROXIMATEキーワードを使用 ベクトル検索 Copyright © 2024, Oracle and/or its affiliates 62 FETCH EXACT FIRST 5 ROWS ONLY; FETCH APPROXIMATE FIRST 5 ROWS ONLY;
  50. 近似検索の精度 ベクトル検索 Copyright © 2024, Oracle and/or its affiliates 63

    本来最も近い5件として取得されるべきデータ を何件取得できているかという観点で、精度を見る 完全解 近似解
  51. 概要 • 大量ベクトルデータの高速な近傍検索のための機構 • 完全解を諦め、近似解を許容することで検索の高速化を図る • リソース(コスト)、検索速度、検索精度のトレードオフを実現 • 専用メモリ領域としてSGA上のVECTOR_POOLを使用 •

    目標の検索精度を指定して索引の作成が可能 • 原理的で索引構造理解が必要となるパラメータのでの記述は不要 • 索引は2種類(索引生成時にいずれかを選択) • インメモリー近傍グラフ・ベクトル索引 ( In-Memory Neighbor Graph Vector Index) SGA上にインメモリで展開される高速なグラフ構造の索引 • 近傍パーティション・ベクトル索引 (Neighbor Partition Vector Index ) ベクトル同士を距離ベースのクラスタリングでまとめた低コストな索引 ベクトル索引 Copyright © 2024, Oracle and/or its affiliates 65
  52. 基本的な索引作成構文: • DISTANCE句はオプション(デフォルトはCOSINE) • 距離関数は、ベクトルの生成に使用される埋込みモデルに基づいて適切なものを選択 • 利用可能な距離関数 • EUCLIDEAN(ユークリッド距離) •

    L2_SQUARED(EUCLIDEAN_SQUARED)(ユークリッド平方距離) • COSINE(コサイン距離) • DOT(ドット積) • MANHATTAN(マンハッタン距離) • HAMMING(ハミング距離) ベクトル索引の作成 CREATE VECTOR INDEX photo_idx ON Customer(photo_vector) ORGANIZATION [INMEMORY NEIGHBOR GRAPH | NEIGHBOR PARTITIONS] DISTANCE EUCLIDEAN | COSINE_SIMILARITY | HAMMING ... Copyright © 2024, Oracle and/or its affiliates 66
  53. 近傍検索精度の指定:WITH TARGET ACCURACY <percentage value> 索引作成の基本構文: • 索引作成に必須ではないが、WITH TARGET ACCURACY

    句で、期待する近傍検索精度の指定が可能 • 指定はパーセンテージ ( with target accuracy 90 と記載すれば期待精度90% の意味) • 各索引の構造に基づく、原理的なパラメータ指定も可能 (クエリ時に精度指定することで、索引作成時の精度を上書きしてデータの取得をすることも可能) 索引作成 CREATE VECTOR INDEX文 67 CREATE VECTOR INDEX photo_idx ON Customer(photo_vector) ORGANIZATION [INMEMORY NEIGHBOR GRAPH | NEIGHBOR PARTITIONS] DISTANCE EUCLIDEAN | COSINE | DOT | HAMMING ... WITH TARGET ACCURACY <percentage value> Copyright © 2024, Oracle and/or its affiliates
  54. 概要 • Hierarchical Navigable Small Worlds (HNSW)に基づくグラフ構造のインメモリ専用のベクトル索引 メリット • 高く安定した近傍検索精度

    • 高速な検索 注意点 • メモリリソースを消費する • 索引全体をメモリ上にロードする必要があるため • 索引作成コストがやや大きい インメモリ近傍グラフ・ベクトル索引 Copyright © 2024, Oracle and/or its affiliates 68
  55. 構築と検索時の動作イメージ 構築 • グラフの最下位レイヤー(0)にはすべてのベクトルが存在 • 高層に行くほどベクトルは減少 • 各レイヤーでベクトル間が近い距離のものをエッジで接続 することでグラフが生成される 検索

    • 検索は最上位レイヤーのエントリーポイントから開始 • 問い合わせベクトルに近づく方向にエッジを辿り、最も近 いベクトルを発見したら、探索は下のレイヤーに継承 • 問合せベクトルに最も近い上位Kベクトルが最下位レイ ヤーで見つかり次第、探索は完了 インメモリ近傍グラフ・ベクトル索引 Copyright © 2024, Oracle and/or its affiliates 69 エントリーポイント レイヤー3 レイヤー2 レイヤー1 レイヤー0 問合せベクトル 最も近い 隣人を見つけ、 レイヤーを下に移動 最も近い 隣人を見つけ、 レイヤーを下に移動 最も近い 隣人を見つけ、 レイヤーを下に移動 最寄りの Kネイバーを見つけ るための貪欲な検 索 新幹線 → 快速列車 → 普通列車 の乗り継ぎのイメー ジ
  56. 作成構文詳細 インメモリ近傍グラフ・ベクトル索引固有のパラメータ • NEIGHBORS : HNSWグラフ生成時に1つのベクトルから結ぶ近傍エッジの最大数 • M:NEIGHBORSと同じ(どちらか片方だけ指定、MがHNSW上、neiboursを指す一般的な呼称) • efConstruction

    : HNSWグラフ生成時に近傍として結ぶべき近傍のベクトルの候補を保持するリストの長さ インメモリ近傍グラフ・ベクトル索引 70 CREATE VECTOR INDEX <vector index name> ON <table name> ( <vector column> ) [GLOBAL] ORGANIZATION INMEMORY NEIGHBOR GRAPH [WITH] [DISTANCE <metric name>] [ WITH TARGET ACCURACY <percentage value> [PARAMETERS ( TYPE HNSW, { NEIGHBORS <max number of closest vectors connected> | M <max number of closest vectors connected> }, EFCONSTRUCTION <max number of candidates to consider for connection> )]] [PARALLEL <degree of parallelism>]; Copyright © 2024, Oracle and/or its affiliates
  57. 概要 • Inverted File index/Flat (IVF) に基づくベクトル索引 メリット • 低コストで効率的な近傍検索

    • 表へのDML操作が可能(動的な表への適用が可能) • データ更新に対する索引更新コストが低い 注意点 • 検索性能はHNSWに劣る • 平時の更新処理時には索引全体の構造の見直しを行わないため、更新が多発した場合、 精度や性能の低下が発生する可能性がある • 品質の安定のために精度の監視や一定タイミングでのrebuildが必要になる可能性 近傍パーティション・ベクトル索引 71 Copyright © 2024, Oracle and/or its affiliates
  58. 構築と検索時の動作イメージ 近傍パーティション・ベクトル索引 72 X軸 Y軸 #1 #2 #3 #4 #5

    問合せベクトル 構築 • OMLのK-meansクラスタリング・アル ゴリズムを使用し、ベクトルをパーティ ションにグループ化(K = 5)。 (OML: Oracle Machine Learning) 検索 • 問合せベクトルから各パーティション の重心までの距離を計算 • 最も近い2つのパーティションを特定 • 問合せベクトルからクラスタ#1およ び#3のすべてのベクトルと問い合わ せベクトル間の距離を計算し、最も 近い上位5件(赤 で表示)を取得 2次元データ・セット Copyright © 2024, Oracle and/or its affiliates
  59. 近傍パーティション・ベクトル索引固有のパラメータ • NEIGHBOR PARTITIONS:生成するパーティション(クラスタ)数 • SAMPLE_PER_PARTITION:クラスタリングアルゴリズムに渡されるベクトル数の比率(1で全て,0.5で半分) • MIN_VECTORS_PER_PARTITION: 各パーティションに属する最小のベクトル数 近傍パーティション・ベクトル索引

    73 CREATE VECTOR INDEX <vector index name> ON <table name> ( <vector column> ) [GLOBAL] ORGANIZATION NEIGHBOR PARTITIONS [WITH] [DISTANCE <metric name>] [WITH TARGET ACCURACY <percentage value> [PARAMETERS ( TYPE IVF, { NEIGHBOR PARTITIONS <number of partitions> | SAMPLE_PER_PARTITION <number of samples> | MIN_VECTORS_PER_PARTITION <minimum number of vectors per partition> })]] [PARALLEL <degree of parallelism>]; Copyright © 2024, Oracle and/or its affiliates
  60. • 近似ベクトル検索では精度の確認が必要となる場合がある • 近傍パーティション索引(IVF)では、表に対して更新処理が可能なため、更新が入ると同時に索引も更新され る。そのため索引作成時からの精度の変動が発生しうる • 精度低下が観測された場合、索引をrebuildすることで改善が期待できる • 2通りの精度の確認機能を提供 •

    単発クエリベース • ユーザが規定したクエリ単発の精度を計測 DBMS_VECTOR.INDEX_ACCURACY_QUERY関数を利用 • レポートベース • 稼働中のデータベースに発行されたクエリを記録し、指定した期間内でベクトル インデックスを使用した近似ベクトル検索の精 度値を取得しレポートを作成する DBMS_VECTOR.INDEX_ACCURACY_REPORTプロシージャでジョブを実行結果はDBA_VECTOR_INDEX_ACCURACY_REPORT 表に反映される 参考:索引精度レポート Copyright © 2024, Oracle and/or its affiliates 74
  61. 任意のクエリベクトル(qv) を与え、そのtop_K個の結果の正答率を計算して返す 結果として得られた精度と、目標精度から見て、高いか低いかが出力される 索引精度レポート:クエリベース Copyright © 2024, Oracle and/or its

    affiliates 75 select DBMS_VECTOR.INDEX_ACCURACY_QUERY( OWNER_NAME => 'VECTOR', INDEX_NAME => 'GALAXIES_HNSW_IDX', qv => to_Vector('[1,0,0,0,1]'), top_K =>10, target_accuracy =>90 ) ac ; AC ------------------------------------------------------------------------------------------- Accuracy achieved (100%) is 10% higher than the Target Accuracy requested (90%)
  62. レポートを作成 確認 索引精度レポート:レポートベース Copyright © 2024, Oracle and/or its affiliates

    76 VARIABLE t_id NUMBER; BEGIN :t_id := DBMS_VECTOR.INDEX_ACCURACY_REPORT('VECTOR', 'GALAXIES_HNSW_IDX'); END; / SELECT MIN_TARGET_ACCURACY, MAX_TARGET_ACCURACY, num_vectors, MIN_ACHIEVED_ACCURACY, MEDIAN_ACHIEVED_ACCURACY, MAX_ACHIEVED_ACCURACY FROM DBA_VECTOR_INDEX_ACCURACY_REPORT WHERE task_id = 1;
  63. ベクトル索引の詳細ビュー VECSYS.VECTOR$INDEX ビュー 79 列名 データ・タイプ 説明 とあるVECTORINDEXの例(参照できるデータのイメージ) IDX_OBJN NUMBER

    ベクトルインデックスのオブジェクト番号 71924 IDX_OBJD NUMBER ベクトルインデックスオブジェクトのID。この ID は、 ベクトル インデックスを再構築するために使用でき ます。 IDX_OWNER# NUMBER ベクトルインデックスの所有者ID。 user$ エントリ を参照 133 IDX_NAME VARCHAR2(128) ベクトルインデックスの名前。 HNSW_TABA_V IDX_BASE_TABLE_OBJN NUMBER 実表オブジェクト番号 71194 IDX_PARAMS JSON ベクトル インデックス作成パラメータ (インデックス 付けされたベクトル列、インデックス距離、ベクトル 次元データ型、次元数、efConstruction、 HNSW索引のM、またはIVF索引の重心数など)。 {"type":"HNSW","num_neighbors":32,"efConstruction":200,"upcast_dtype":1,"distance":" COSINE","accuracy":90,"vector_type": "FLOAT32","vector_dimension":5,"degree_of_parallelism":1,"indexed_col":"V"} IDX_AUXILIARY_TABLES JSON ROWID から頂点 ID への変換情報をサポート するために使用される補助表の名前とオブジェクト ID、または逆フラット ファイル ベクトル インデックス のセントロイド テーブルとそれに関連するパーティ ション テーブルの名前。 {"rowid_vid_map_objn":71925,"shared_journal_transaction_commits_objn":71927,"share d_journal_change_log_objn":71930,"rowi d_vid_map_name":"VECTOR$HNSW_TABA_V$HNSW_ROWID_VID_MAP","shared_journal _transaction_commits_name":"VECTOR$HNSW_TABA_V$HN SW_SHARED_JOURNAL_TRANSACTION_COMMITS","shared_journal_change_log_name":" VECTOR$HNSW_TABA_V$HNSW_SHARED_JOURNAL_CHANGE_L OG"} IDX_SPARE1 NUMBER IDX_SPARE2 JSON Copyright © 2024, Oracle and/or its affiliates
  64. ベクトル索引を利用するオペレーション • 索引走査から直接行を持ってくる動作 • VECTOR INDEX HNSW SCAN • リレーショナルデータによるフィルタ条件が含まれる際のオペレーション

    • プレ・フィルタリング (Join-Back 有/無) • リレーショナルデータによるフィルタが先に実行され、その後 ベクトル索引が走査される • VECTOR INDEX HNSW SCAN PRE-FILTER • イン・フィルタリング (Join-Back 有/無) • ベクトル索引が走査され、その後、リレーショナルデータによるフィルタが実行される • VECTOR INDEX HNSW SCAN IN-FILTER ベクトル索引(HNSW) の実行計画オペレーション Copyright © 2024, Oracle and/or its affiliates 80
  65. 索引走査 ベクトル索引の走査のみで完結する場合 VECTOR INDEX HNSW SCAN ベクトル索引の実行計画オペレーション 81 SELECT name

    FROM galaxies ORDER BY VECTOR_DISTANCE( embedding, :embedding ) FETCH APPROXIMATE FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90; ------------------------------------------------------------------ | Id | Operation | Name | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | |* 3 | SORT ORDER BY STOPKEY | | | 4 | TABLE ACCESS BY INDEX ROWID | GALAXIES | | 5 | VECTOR INDEX HNSW SCAN | GALAXIES_HNSW_IDX | ---------------------------------------------------------------------------- Copyright © 2024, Oracle and/or its affiliates
  66. WHERE句条件などに列の評価条件が入っているベクトル検索は単なる索引走査だけでなく 特別なオペレーションで実行 リレーショナルデータのフィルターを含んだSQLの実行 82 SELECT name FROM galaxies WHERE id<5

    ORDER BY VECTOR_DISTANCE( embedding, :embedding ) FETCH APPROXIMATE FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90; ----------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | | 3 | VECTOR INDEX HNSW SCAN IN-FILTER | GALAXIES_HNSW_IDX | | 4 | VIEW | VW_HIJ_7AA0632F | |* 5 | TABLE ACCESS BY USER ROWID | GALAXIES | --------------------------------------------------------------------- Copyright © 2024, Oracle and/or its affiliates
  67. オペレーション • プレ・フィルタリング VECTOR INDEX HNSW SCAN PRE-FILTER • 最初にベース

    テーブルに対してフィルタリング評価が実行され、 その後、対応するベクトルの HNSW ベクトル索引のみが 走査される。ほとんどの行がフィルターで除外される場合、 こちらが高速になりやすい • イン・フィルタリング VECTOR INDEX HNSW SCAN IN-FILTER • 先にHNSW ベクトル索引の走査が実行され、 各ベクトル候補に対してフィルタリングを呼び出す。 フィルターで除外される行が少ない場合、 プレ・フィルター処理よりも優れている可能性がある。 リレーショナルデータのフィルターを含んだSQLの実行 Copyright © 2024, Oracle and/or its affiliates 83 • Join-Backオペレーション(有無) • 各フィルタリングの後に関連する列を取りに 行くオペレーション • フェッチするデータ量に応じて有無が 選択される • Join-Backなしの場合には フィルタリング前に列を取得する
  68. 先にフィルター条件の行集合を取得し、 実行計画例:Join-Backありのプレ・フィルターオペレーション Copyright © 2024, Oracle and/or its affiliates 84

    ------------------------------------------------------------------------------------- | Id | Operation | Name | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | |* 3 | SORT ORDER BY STOPKEY | | |* 4 | TABLE ACCESS BY INDEX ROWID | GALAXIES | | 5 | VECTOR INDEX HNSW SCAN PRE-FILTER | GALAXIES_HNSW_IDX | | 6 | VIEW | VW_HPJ_77825837 | | 7 | NESTED LOOPS OUTER | | |* 8 | TABLE ACCESS FULL | GALAXIES | | 9 | TABLE ACCESS BY INDEX ROWID | VECTOR$GALAXIES_HNSW_IDX$HNSW_ROWID_VID_MAP | |* 10 | INDEX UNIQUE SCAN | SYS_C008586 | ------------------------------------------------------------------------------------------------ ROWIDとHNSW の頂点IDのマップ HNSW索引 Join-Back
  69. 先にフィルター条件の行集合を取得し、 実行計画例:Join-Backなしのプレ・フィルターオペレーション Copyright © 2024, Oracle and/or its affiliates 85

    -------------------------------------------------------------------------------------- | Id | Operation | Name | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | |* 3 | SORT ORDER BY STOPKEY | | | 4 | VECTOR INDEX HNSW SCAN PRE-FILTER | GALAXIES_HNSW_IDX | | 5 | VIEW | VW_HPJ_77825837 | | 6 | NESTED LOOPS OUTER | | |* 7 | TABLE ACCESS FULL | GALAXIES | | 8 | TABLE ACCESS BY INDEX ROWID | VECTOR$GALAXIES_HNSW_IDX$HNSW_ROWID_VID_MAP | |* 9 | INDEX UNIQUE SCAN | SYS_C008586 | ------------------------------------------------------------------------------------------------ ROWIDとHNSW の頂点IDのマップ HNSW索引
  70. 先にフィルター条件の行集合を取得し、 実行計画例:Join-Backありのイン・フィルターオペレーション Copyright © 2024, Oracle and/or its affiliates 86

    ----------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | |* 3 | TABLE ACCESS BY INDEX ROWID | GALAXIES | | 4 | VECTOR INDEX HNSW SCAN IN-FILTER | GALAXIES_HNSW_IDX | | 5 | VIEW | VW_HIJ_7AA0632F | |* 6 | TABLE ACCESS BY USER ROWID | GALAXIES | --------------------------------------------------------------------- HNSW索引 Join-Back
  71. 先にフィルター条件の行集合を取得し、 実行計画例:Join-Backありのイン・フィルターオペレーション Copyright © 2024, Oracle and/or its affiliates 87

    ----------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | COUNT STOPKEY | | | 2 | VIEW | | | 3 | VECTOR INDEX HNSW SCAN IN-FILTER | GALAXIES_HNSW_IDX | | 4 | VIEW | VW_HIJ_7AA0632F | |* 5 | TABLE ACCESS BY USER ROWID | GALAXIES | --------------------------------------------------------------------- HNSW索引
  72. • ベクトル索引のアクセスパス • 表と索引を指定する • クエリ変換(フィルターを含む)処理 • フィルタータイプ(プレフィルター、インフィルター、join-backの有無まで記述できる) オプティマイザヒント Copyright

    © 2024, Oracle and/or its affiliates 88 VECTOR_INDEX_SCAN ( [ @ queryblock ] tablespec [ indexspec ]) NO_VECTOR_INDEX_SCAN ( [ @ queryblock ] tablespec [ indexspec ]) VECTOR_INDEX_TRANSFORM ( [ @ queryblock ] tablespec [ indexspec [ filtertype ]] ) NO_VECTOR_INDEX_TRANSFORM ( [ @ queryblock ] tablespec [ indexspec ] ) filtertype PRE_FILTER_WITH_JOIN_BACK PRE_FILTER_WITHOUT_JOIN_BACK IN_FILTER_WITH_JOIN_BACK IN_FILTER_WITHOUT_JOIN_BACK
  73. • アクセスパスヒント • フィルタ指定入り オプティマイザヒントの利用例 Copyright © 2024, Oracle and/or

    its affiliates 89 SELECT /*+ VECTOR_INDEX_SCAN(galaxies) */ name FROM galaxies ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE ) FETCH APPROXIMATE FIRST 3 ROWS ONLY; SELECT /*+ vector_index_transform(galaxies galaxies_hnsw_idx pre_filter_without_join_back) */ name FROM galaxies WHERE id<5 ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE ) FETCH APPROXIMATE FIRST 3 ROWS ONLY WITH TARGET ACCURACY 90;
  74. 作成方法 基本的な索引作成構文 ハイブリッド・ベクトル索引 Copyright © 2024, Oracle and/or its affiliates

    91 CREATE HYBRID VECTOR INDEX MY_HYBRID_INDEX ON SUPPORT_INCIDENTS (INCIDENT_TEXT) PARAMETERS (...); "embed_model" :"ALL_MINILM_L12_V2" "chunk_by" : "WORDS" "index_type" : "HNSW" "vector_distance": "COSINE" "vector_accuracy": "95" "datastore" :"network_datastore" "filter" : "auto_filter" "lexer" : "auto_lexer" "sectioner" : "basic_sectioner" "stoplist" : "default_stop_list" ベクトル索引パラメータ テキスト索引パラメータ
  75. 検索方法 • DBMS_HYBRID_VECTOR.SEARCHを使用 • ハイブリッド・ベクトル索引の名前、結果の融合方法、スコアリング方法などを指定して検索 ハイブリッド検索 Copyright © 2024, Oracle

    and/or its affiliates 92 SELECT DBMS_HYBRID_VECTOR.SEARCH( JSON('{"hybrid_index_name": "MY_HYBRID_IDX", "search_text" : "ORA-600, Incomplete Recovery", "search_fusion" : "INTERSECT", "search_scorer" : "RRF" }')) FROM DUAL;
  76. 検索結果 検索結果には結果のテキストだけではなく、スコアなども表示される ハイブリッド検索 Copyright © 2024, Oracle and/or its affiliates

    93 { "rowid" : "AK37pKAAkAAAACVAAA", "score" : 96.95, "vector_score" : 94.50, "text_score" : 92.40, "vector_rank" : 1, "text_rank" : 1, "chunk_text" : "ABCD_ATP1(133):Incomplete Recovery applied until change 41787149790615 time 08/20/2024 15:03:53. ORA-00600: internal error code, arguments: [kdsgrp_LOST_piece], [11], [830411452], [0], []", ... }
  77. • LangchainやLlamaIndexはLLMを活用した アプリケーション開発を支援するオープンソースの フレームワーク • それぞれにOracle Database用のコードが追加 • 埋め込み機能、ベクトルデータストアとしての活用 インデックスの作成と検索、RAGパイプライン統合

    などOracle Databaseを活用するための コード群が充実 • Oracle Databaseのベクトル検索機能を シンプルに実装可能 LangchainやLlamaIndexとの統合 Copyright © 2024, Oracle and/or its affiliates 95
  78. Copyright © 2024, Oracle and/or its affiliates 96 • ローカル環境でLLMを実行するための手段として、Oracle

    DatabaseでオープンソースソフトウェアのOllamaをサポート • Ollamaをインストールし、Ollamaコマンドを実行することでLLMをダウンロードしてローカル実行可能 • Oracle Databaseからは以下のDBMS_VECTORパッケージにてOllamaを指定することでそれぞれの処理をローカルに完 結して実行可能 • UTL_TO_EMBEDDING • UTL_TO_SUMMARY • UTL_TO_GENERATE_TEXT • レイテンシの低減、セキュリティ向上、モデルのカスタマイズなどがメリット Ollamaのサポート
  79. • AI Vector Search User‘s Guide - Supported Third- Party

    Provider Operations and Endpointsにて確認可能 • https://docs.oracle.com/en/database/oracle/oracle -database/23/vecse/supported-third-party- provider-operations-and-endpoints.html 対応する3rdパーティ製品やエンドポイントについて Copyright © 2024, Oracle and/or its affiliates 97
  80. Copyright © 2024, Oracle and/or its affiliates 99 • OCIチュートリアル

    • Oracle AI Vector Searchを使ってみよう https://oracle-japan.github.io/ocitutorials/ai-vector-search • Oracle LiveLabs • Langchainを使ったRAGアプリの構築 https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3927 • PL/SQLを使ったRAGアプリの構築 https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3934 • Autonomous DatabaseとAPEXを使ったRAGアプリの構築 https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=4021 • Graph RAGとAI Vector Searchを使ったRAGの応用 https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3953 チュートリアル
  81. Copyright © 2024, Oracle and/or its affiliates 100 • Oracle

    AI Vector Search User's Guide • https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/ • Oracle AI Vector Search 技術概要 • https://speakerdeck.com/oracle4engineer/oracle-ai-vector-search • Oracle AI Vector Search 技術詳細 • https://speakerdeck.com/oracle4engineer/oracle-ai-vector-search-technical 公開資料