7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Cloud InfrastructureAdvent Calendar 2024

Day 10

[Oracle Database 23ai]ローカルRESTプロバイダOllamaで表データをEmbeddingしてみた。(2024/12/10)

Last updated at Posted at 2024-12-09

こちらの記事はOracle Cloud Infrastructure Advent Calendar 2024 Day 10 の記事として書かれています。Day 09の記事は @seigen_chan さんの記事「CloudWorld2024の旅記録残しつつCloudWorld2025への目標立ててみた」でした。

はじめに

Oracle Database 23ai の2024年10月のアップデートでローカル・ホストのRESTエンドポイント・プロバイダOllamaがサポートされました。Ollamaで利用可能なLLM (Llama 3、Phi 3、Mistral、Gemma 2など)を使用してEMBEDDINGやサマリーの生成、テキストの生成ができます。
今回はOCI Base Database上のOracle Database 23aiを使用し、表データのEmbeddingを試してみました。

作業ステップ

  • 事前作業
  • Ollamaをインストール
  • 表データのEmbedding

事前作業

  • 作業用データベースユーザの作成
    PDBにSYSDBA権限で接続し、データベースユーザを作成し、「DB_DEVELOPER_ROLE」、「create credential」権限を付与します。
$ export NLS_LANG=American_America.AL32UTF8
$ sqlplus / as sysdba

alter session set container=pdb1;
CREATE USER docuser identified by <password> DEFAULT TABLESPACE USERS quota unlimited on USERS;
GRANT DB_DEVELOPER_ROLE, create credential to docuser;
  • サンプル表、データの作成
    作成したデータベースユーザで表を作成し、データを格納します。
create table documentation_tab (id number,info varchar2(512));
insert into documentation_tab (id,info) values(	1,'San Francisco is in California.');
-- 省略
commit;

Ollamaをインストール

https://ollama.com/downloadにアクセスし、Linux用の「Install with one command:」を確認
Base Databaseのノードにssh ログインし、rootユーザでコマンドを実行します。

# curl -fsSL https://ollama.com/install.sh | sh

コマンドの結果

>>> Installing ollama to /usr/local
>>> Downloading Linux amd64 bundle
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

ollama run コマンドを使用してモデルを実行

Llama 3モデルをコール

$ ollama run llama3
pulling manifest
pulling 6a0746a1ec1a... 100% ▕████████████████▏ 4.7 GB
<略>
verifying sha256 digest
writing manifest
success
>>> /bye

注意: デフォルトのインストール領域に空きがない場合、モデルを格納する領域を確保します。

エラーメッセージを確認し、書き込み途中のファイルを削除

Error: write /usr/share/ollama/.ollama/models/blobs/sha256-6a0746a1ec1aef3e7ec53                                                                                                                                                             868f220ff6e389f6f8ef87a01d77c96807de94ca2aa-partial: no space left on device
# rm /usr/share/ollama/.ollama/models/blobs/sha256-6a0746a1ec1aef3e7ec53868f220ff6e389f6f8ef87a01d77c96807de94ca2aa-partial

領域に空きがあるディレクトリにシンボリックリンクを作成

# mkdir /u01/ollama/
# mkdir /u01/ollama/models
# chown ollama:ollama /u01/ollama/models
# ln -s /u01/ollama/models/ /usr/share/ollama/.ollama/models

cURLコマンドを使用して、Ollamaがローカルで実行されていることを確認

$ curl http://localhost:11434/api/embeddings -d '{
  "model" : "llama3", 
  "prompt": "Here is an article about llamas" 
}

{"embedding":[-1.6629716157913208,-
< 略 >
,-0.4060233533382416]
$

表データのEmbedding

DBMS_VECTORまたはDBMS_VECTOR_CHAINパッケージの関数UTL_TO_EMBEDDINGをコールすることでOllamaを使用してEmbeddingできます。

ホストへの接続を許可するための接続権限をdocuserに付与

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => '*',
    ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                       principal_name => 'docuser',
                       principal_type => xs_acl.ptype_db));
END;
/

UTL_TO_EMBEDDINGをコール

  • テキストをEmbeddingして確認

「hello」という文字列のEmbedding

SQL> var embed_ollama_params clob;
SQL> exec :embed_ollama_params := '{ -
     "provider": "ollama", -
     "host"    : "local", -
     "url"     : "http://localhost:11434/api/embeddings", -
     "model"   : "llama3" -
}';

PL/SQL procedure successfully completed.

SQL> select dbms_vector.utl_to_embedding('hello', json(:embed_ollama_params)) ollama_output from dual;

OLLAMA_OUTPUT
--------------------------------------------------------------------------------
[-2.31221581E+000,-3.26045007E-001,2.48111725E-001,-1.65610778E+000,

表データのEmbedding

SQL> var embed_ollama_params clob;
SQL> exec :embed_ollama_params := '{ -
      "provider": "ollama", -
      "host"    : "local", -
      "url"     : "http://localhost:11434/api/embeddings", -
      "model"   : "llama3" -
}';

PL/SQL procedure successfully completed.

Vector列を持つ表(documentation_table)を作成し、サンプル表(documentation_tab)のデータEmbeddingします。

create table documentation_table (id number, text clob,v vector);
insert into documentation_Table select id,info,dbms_vector.utl_to_embedding(info, json(:embed_ollama_params)) vector from documentation_tab;
commit;

セマンティック検索の実行

Embeddingされたデータを使ってセマンティック検索を実施してみます。

select text from documentation_table
order by vector_distance(v, dbms_vector.utl_to_embedding('Cars', json(:embed_ollama_params)), EUCLIDEAN)
fetch first 5 rows only;


TEXT
--------------------------------------------------------------------------------
Apples can be green, yellow or red.
Limes are green.
Toyotas are reliable.
Ripe strawberries are red.
Queens is in New York.

5 rows selected.

おわりに

Oracle Database 23ai の AI Vestor Search機能でローカルRESTプロバイダOllamaを使用し表データのEmveddingを実施してみました。Embeddingされたデータに対してセマンティック検索をすることができました。

参考情報

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?