ローカルRESTプロバイダOllamaを使用したイメージの説明

ローカル・ホストRESTエンドポイント・プロバイダOllamaを使用して、オープンLLMにアクセスし、プロンプトとしてイメージをテキストの質問とともに指定して、イメージからテキストへの変換を実行します。

Ollamaは、Linux、WindowsまたはmacOSシステムでオープンLLM (Llama 3、Llava、Phi 3、Mistral、Gemma 2など)をローカルおよびプライベートで実行できる、無料でオープンソースのコマンドライン・インタフェース・ツールです。サービスとしてのOllamaには、SQLおよびPL/SQLコマンドを使用してアクセスできます。

ここでは、ユースケースに応じて、DBMS_VECTORまたはDBMS_VECTOR_CHAINパッケージのUTL_TO_GENERATE_TEXT関数を使用できます。

警告:

データベースの特定の機能により、たとえば、REST APIへのアクセスを容易にするJSON仕様を使用して、第三者によって個別に提供されるサービスにアクセスできる場合があります。

お客様によるこれらの機能の使用は、お客様自身の責任においてのみ行われ、お客様は、当該第三者サービスの使用に関連するあらゆる条件を遵守する責任を負います。第三者のサービスに関するその他の条件にかかわらず、お客様は、かかるデータベース機能の使用によって、そのリスクを受諾し、当該アクセスにより生じた一切の損害について、Oracleの責任または法的責任を明示的に除外することになります。

Ollamaを使用してローカルLLMをコールし、次の鳥のイメージとテキストの質問「Describe this image?」を指定して、イメージの内容を説明するには:

bird.jpgの説明が続きます
図bird.jpgの説明
  1. ローカル・ユーザーとしてOracle Databaseに接続します。
    1. SQL*PlusにSYSユーザーとしてログインし、SYSDBAとして接続します。
      conn sys/password as sysdba
      CREATE TABLESPACE tbs1
      DATAFILE 'tbs5.dbf' SIZE 20G AUTOEXTEND ON
      EXTENT MANAGEMENT LOCAL
      SEGMENT SPACE MANAGEMENT AUTO;
      SET ECHO ON
      SET FEEDBACK 1
      SET NUMWIDTH 10
      SET LINESIZE 80
      SET TRIMSPOOL ON
      SET TAB OFF
      SET PAGESIZE 10000
      SET LONG 10000
    2. ローカル・ユーザー(docuser)を作成し、必要な権限を付与します。
      DROP USER docuser cascade;
      CREATE USER docuser identified by docuser DEFAULT TABLESPACE tbs1 quota unlimited on tbs1;
      GRANT DB_DEVELOPER_ROLE, create credential to docuser;
    3. ローカル・ユーザー(docuser)として接続します:
      CONN docuser/password
  2. Ollamaをインストールし、モデルをローカルで実行します。
    1. https://ollama.com/downloadからOllamaアプリケーションをダウンロードして実行します。

      Ollamaは、バックグラウンドで実行されるサービスとしてインストールすることも、手動インストールによるスタンドアロン・バイナリとしてインストールすることもできます。インストール固有のステップの詳細は、Ollamaドキュメントのクイック・スタートを参照してください。

      次の点に注意してください:

      • Ollamaサーバーは、モデルをダウンロードできるようにインターネットに接続できる必要があります。インターネットへのアクセスにプロキシ・サーバーが必要な場合は、Ollamaサーバーを実行する前に、必ず適切な環境変数を設定してください。たとえば、Linux用に設定するには:

        -- set a proxy if you require one
        
        export https_proxy=<proxy-hostname>:<proxy-port>
        export http_proxy=<proxy-hostname>:<proxy-port>
        export no_proxy=localhost,127.0.0.1,.example.com
        export ftp_proxy=<proxy-hostname>:<proxy-port>
      • Ollamaとデータベースを異なるマシンで実行している場合は、データベースのマシンで、ローカル・ホストではなくOllamaを実行しているホスト名またはIPアドレスを参照するようにURLを変更する必要があります。

      • ポートを経由できるように、Ollamaを実行しているマシンでファイアウォール設定を変更する必要がある場合があります。

    2. 手動インストールからスタンドアロン・バイナリとしてOllamaを実行している場合は、サーバーを起動します:
      ollama serve
    3. ollama run <model_name>コマンドを使用してモデルを実行します。

      たとえば、llavaモデルを呼び出すには:

      ollama run llava

      この手順の詳細は、OllamaのReadmeを参照してください。

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

      次に例を示します。

      -- generate text
      
      curl -X POST http://localhost:11434/api/generate -d '{
        "model" : "llava",
        "prompt": "Why is the sky blue?",
        "stream": false }'
  3. HTTPプロキシ・サーバーを設定します(構成されている場合)
    EXEC UTL_HTTP.SET_PROXY('<proxy-hostname>:<proxy-port>');
  4. DBMS_NETWORK_ACL_ADMINプロシージャを使用して、ホストへの接続を許可するための接続権限を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;
    /
  5. イメージ・ファイルを格納するローカル・ディレクトリ(DEMO_DIR)を作成します:
    create or replace directory DEMO_DIR as '/my_local_dir/';
    
    create or replace function load_blob_from_file(directoryname varchar2, filename varchar2)
      return blob
    is
      filecontent blob := null;
      src_file bfile := bfilename(directoryname, filename);
      offset number := 1;
    begin
      dbms_lob.createtemporary(filecontent, true, dbms_lob.session);
      dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
      dbms_lob.loadblobfromfile(filecontent, src_file,
        dbms_lob.getlength(src_file), offset, offset);
      dbms_lob.fileclose(src_file);
      return filecontent;
    end;
    /

    イメージ・ファイル(bird.jpgなど)をディレクトリにアップロードします。

  6. UTL_TO_GENERATE_TEXTをコールします。

    Ollamaサービスには、テキストを生成するためのREST APIエンドポイントがあります。JSONオブジェクトにURLおよびその他の構成パラメータを指定します。

    var input clob;
    var media_data blob;
    var media_type clob;
    var gent_ollama_params clob;
    
      :input := 'Describe this image';
      :media_data := load_blob_from_file('DEMO_DIR', 'bird.jpg');
      :media_type := 'image/jpeg';
      :gent_ollama_params := '{
         "provider": "ollama",
         "host"    : "local",
         "url"     : "http://localhost:11434/api/generate", 
         "model"   : "llava"
      }';
    
    select dbms_vector_chain.utl_to_generate_text(:input, :media_data, :media_type, json(:gent_ollama_params)) from dual;

    必要に応じて、urlおよびmodelを独自の値に置き換えることができます。

    ノート:

    サポートされているすべてのRESTエンドポイントURLの完全なリストは、「サポートされているサードパーティ・プロバイダの操作およびエンドポイント」を参照してください。

    質問に対して生成されたテキスト応答は次のように表示されます:

    This is an image of a stylized, artistic depiction of a hummingbird in
    mid-flight, set against a vibrant red background. The bird is illustrated with a
    mix of striking colors and details - its head and belly are shown in white, with
    a black patterned detailing that resembles stripes or scales. Its long, slender
    beak is depicted in a darker color, extending forwards. The hummingbird's wings
    and tail are rendered in eye-catching shades of orange, purple, and red, with
    texture that suggests a rough, perhaps brush-like stroke.
    
    The background features abstract shapes resembling clouds or wind currents in a white line
    pattern, which adds a sense of motion or air dynamics around the bird. The
    overall use of vivid colors and dynamic patterns gives the image an energetic
    and modern feel.