はじめに

みなさん、こんにちは。
AI検証チームの宮井です。

今回は、オープンソースの大規模言語モデル(LLM)実行環境「Ollama」を使い、Oracle AI Vector Searchと連携したテキスト生成を試してみました。
ローカル環境で実行できる点はセキュリティ面からうれしいですね。

今回はOCI Computeサーバ上にOllamaをインストールし、Base DBから実行する手順を検証します。
以下を参考にしました。

Oracle AI Vector Searchユーザーズ・ガイド
Ollamaのインストール

Oracle AI Vector SearchはAIメディアブーストでも利用しています!
AI時代の新WEBマーケティングツール AIメディアブースト

Ollamaとは?

Ollamaは、ローカル環境で大規模言語モデル(LLM)を実行できるツールです。
クラウドに依存せずにモデルを動かせるため、プライバシーやセキュリティ面で安心して使えます。

今回の検証では、Ollamaを使ってOracle Database 23aiのAI機能と連携し、自然言語の質問に対して回答を生成しました。

Ollamaのインストール

まずは、Linux環境にOllamaをインストールします。以下のコマンドでインストール用のファイルをダウンロードしました。

$ curl -LO https://ollama.com/download/ollama-linux-amd64.tgz
$ sudo tar -C /usr -xzf ollama-linux-amd64.tgz

次に、Ollama専用のユーザーを作成し、現在のユーザーをそのグループに追加します。

$ sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
$ sudo usermod -a -G ollama $(whoami)

サービスとして起動するため、systemdの設定ファイルを作成します。
以下の内容を/etc/systemd/system/ollama.serviceに記述しました。

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=xx.xx.xx.*"

[Install]
WantedBy=multi-user.target

設定を反映し、サービスを有効化・起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable ollama
$ sudo systemctl start ollama
$ sudo systemctl status ollama

サービスが正常に起動していることを確認できました。

次に「llama3」というLLMモデルをOllamaから取得します。

$ ollama pull llama3

以下のコマンドでモデルを起動することで、対話形式で質問を投げかけることができます。
日本語もある程度は解釈してくれるようです。

$ ollama run llama3
>>> こんにちは
Konnichiwa! Ogenki desu ka? (Hello! How are you?)

>>> Why is the sky blue?
A classic question!

The sky appears blue because of a phenomenon called Rayleigh scattering, named after the British physicist Lord Rayleigh. Here's what happens:

1. When sunlight enters Earth's atmosphere, it encounters tiny molecules of gases like nitrogen (N2) and oxygen (O2).
2. These gas molecules scatter the light in all directions, but they do so more efficiently for shorter wavelengths, such as blue and violet.
3. The longer wavelengths, like red and orange, are scattered less and continue to travel in a straight line, reaching our eyes from the sun's position.
4. Since we see the scattered blue light from all directions, it appears to be coming from everywhere around us, giving the sky its blue color.

This effect is more pronounced during the daytime when the sun is overhead, as there is more direct sunlight entering the atmosphere. At sunrise and sunset, the sky can take on hues of red, orange, and pink because the sun's rays have to travel longer distances through the atmosphere, scattering even more of the shorter wavelengths (like blue).

In short, the sky appears blue because of the way gas molecules in our atmosphere interact with sunlight!

 Oracle Database 23aiからLLMを呼び出す

それでは、Oracleのdbms_vector.utl_to_generate_textを使い、質問をしてみます。
urlはComputeインスタンスのIPアドレスを指定し、modelはllama3を指定します。

SQL> var gent_ollama_params clob;
SQL> exec :gent_ollama_params := '{"provider": "ollama","host": "local", "url": "http://xx.xx.xx.xx:11434/api/generate", "model": "llama3"}';
SQL> set long 10000
SQL> set pages 0

SQL> select dbms_vector.utl_to_generate_text('What is Oracle Text?', json(:gent_ollama_params)) from dual;
Oracle Text, also known as Oracle SecureSearch, is a text search engine and retrieval tool that allows you to index and search unstructured text data in an Oracle database. It provides a set of features for searching and querying text-based data, such as documents, emails, and other types of unstructured content.

With Oracle Text, you can:
1. Index large amounts of text data: Store and organize your text data in a searchable format.
2. Search text data: Use various search algorithms and operators to find specific keywords, phrases, or patterns in the indexed data.
3. Rank search results: Prioritize the most relevant results based on factors like relevance, frequency, and proximity.
4. Analyze text data: Extract meaningful information from text data, such as sentiment analysis, entity extraction, and summarization.
・・・以下省略・・・

回答が返ってきました!
このように、データベース内から直接LLMを呼び出し、高度なテキスト生成や分析が可能になります。

また、次にgemma3も同じ方法で使用してみました。

$ ollama pull gemma3:4b
$ ollama list
NAME             ID              SIZE      MODIFIED          
gemma3:4b        a2af6cc3eb7f    3.3 GB    14 seconds ago       
llama3:latest    365c0bd3c000    4.7 GB    About an hour ago

modelをgemma3:4bに変更し、今度は日本語で質問をしてみます。
回答が返ってきました!

SQL> exec :gent_ollama_params := '{"provider": "ollama","host": "local", "url": "http://xx.xx.xx.xx:11434/api/generate", "model": "gemma3:4b","transfer_timeout":1200}';

SQL> select dbms_vector.utl_to_generate_text('Oracle Textとは何ですか?', json(:gent_ollama_params)) from dual;
Oracle Textは、Oracleデータベースに組み込まれた、テキスト検索と分析のための機能 です。簡単に言うと、**データベース内のテキストデータに対して、高度な検索、分析、 管理を行うためのツール**です。 より詳しく説明しますね。 **主な機能:** * **全文検索:** データベース内のテキストデータ(ドキュメント、記事、コメントなど )に対して、キーワードやフレーズを基にした検索が可能です。従来のSQLによるキーワ ード検索よりも、より高度な条件で、より多くの関連結果を抽出できます。 * **インデックス作成:** 検索速度を大幅に向上させるために、テキストデータに対して インデックスを作成します。 * **分析:** 検索結果の分析、頻繁なキーワードの抽出、テキストの分類、自動要約など 、様々な分析機能を提供します。 * **オートコンプリート:** ユーザーが入力中に、関連するキーワードやフレーズを自動 的に提案します。 * **ストリーム処理:** リアルタイムでテキストデータを処理し、検索や分析を行うこと ができます。 ・・・・以下省略・・・

# 追記
gpt-oss-20bが出たため、こちらのモデルでも同じように試してみました。

$ ollama pull gpt-oss:20b
$ ollama list
NAME             ID              SIZE      MODIFIED          
gpt-oss:20b      aa4295ac10c3    13 GB     About an hour ago
gemma3:4b        a2af6cc3eb7f    3.3 GB    2 weeks ago
llama3:latest    365c0bd3c000    4.7 GB    2 weeks ago

gpt-oss-20bでも再度質問したところ、回答が返ってきました!

SQL> exec :gent_ollama_params := '{"provider": "ollama","host": "local", "url": "http://xx.xx.xx.xx:11434/api/generate", "model": "gpt-oss:20b","transfer_timeout":1200}';

SQL> select dbms_vector.utl_to_generate_text('Oracle Textとは何ですか?', json(:gent_ollama_params)) from dual;
## Oracle Text とは
**Oracle Text(オラクル テキスト)** は、Oracle Database に組み込まれた全文検索・テキスト解析エンジンです。
データベース内に保存されているテキスト(文字列・文章・ファイルなど)を高速に検索・取得できるようにする機能で、次のような特徴があります。
| 何ができるか | 説明 |
|--------------|------|
| **全文検索** | テキスト列・外部ファイルに対してフレーズ検索・近接検索・論理演算子(AND, OR, NOT)を使った検索が可能。 |
| **インデックス作成** | 大量のテキストデータでも高速検索できるよう、検索インデックス(**テキストインデックス**)を作成。 |
| **自然言語処理** | ストップワード除外、ステミング(語幹抽出)、形態素解析(日本語・中国語など)をサポート。 |
| **ランキング** | 検索結果にスコアを付与し、関連度順に並べ替える。 |
| **拡張検索** | シノニム検索、重み付け、属性検索(メタデータ)などの高度な検索条件を設定できる。 |
| **データベース統合** | SQL で `CONTAINS` 関数や `CTX_DDL` / `CTX_DOC` パッケージを使って直接操作できる。 |
| **多言語対応** | 英語・日本語・中国語・ドイツ語・フランス語など、複数言語の解析器が標準で備わっている。 |
・・・・以下省略・・・

 まとめ

いかがでしたでしょうか?
今回利用した環境のリソースも少ないせいか、回答に時間を要していました。
回答の精度を含め、この辺りは調整していく必要がありそうですね。

生成AIに関する記事は随時更新予定です。是非次回もご覧ください。

生成AIに関するお問い合わせはこちら

投稿者プロフィール

宮井 聡
宮井 聡
Oracle Database、Oracle Cloud、生成AIに関するエンジニア兼プリセールスなどを担当しています。
社内のOCI検証チームのとりまとめやAI検証チームの技術リーダーをしています。
資格はOracle Cloud Infrastructure Architect Professional 2023等を取得しています。