UTL_TO_GENERATE_TEXT

サードパーティのテキスト生成モデルにアクセスして、特定のプロンプトまたはイメージに対するテキスト応答を生成するには、DBMS_VECTOR.UTL_TO_GENERATE_TEXTチェーン可能ユーティリティ関数を使用します。

用途

自然言語による会話を通じて大規模言語モデル(LLM)とやり取りします。LLMを利用するチャット・インタフェースに入力されたプロンプトおよびイメージに対するテキスト形式の回答、説明またはサマリーを生成できます。

  • プロンプトからテキストへ:

    プロンプトには、LLMに尋ねる質問などの入力テキスト文字列を指定できます。たとえば、"Oracle Textとは何か"です。プロンプトは、"Summarize the following ..."、"Draft an email asking for ..."または"Rewrite the following ..."などのコマンドでもあり、検索の結果を含めることができます。LLMは、プロンプトに指定されたタスクに基づいて、テキスト形式の回答または説明で応答します。

    この操作では、このAPIによって、選択したリモート・サードパーティ・プロバイダ(Cohere、生成AI、Google AI、Hugging Face、OpenAIまたはVertex AI)またはローカル・サードパーティ・プロバイダ(Ollama)へのRESTコールが行われます。

  • イメージからテキストへ:

    イメージなどのメディア・ファイルをプロンプトに指定して、画像や写真からテキストを抽出することもできます。テキストの質問をプロンプト(「What is this image about?」や「How many birds are there in this painting?」など)としてイメージとともに指定します。LLMは、イメージの内容に関するテキスト分析または説明で応答します。

    この操作では、このAPIによって、選択したリモート・サードパーティ・プロバイダ(Google AI、Hugging Face、OpenAIまたはVertex AI)またはローカル・サードパーティ・プロバイダ(Ollama)へのRESTコールが実行されます。

警告:

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

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

構文

このファンクションは、テキスト・データを含むCLOB (テキスト・プロンプトの場合)またはメディア・データを含むBLOB (イメージなどのメディア・ファイルの場合)を入力として受け入れます。次に、この情報を処理して、生成されたテキストが含まれている新しいCLOBを生成します。

  • プロンプトからテキストへ:

    DBMS_VECTOR.UTL_TO_GENERATE_TEXT (
        	DATA          IN CLOB,
        	PARAMS        IN JSON default NULL
    ) return CLOB;
  • イメージからテキストへ:

    DBMS_VECTOR.UTL_TO_GENERATE_TEXT(
              TEXT_DATA      IN CLOB,
              MEDIA_DATA     IN BLOB,
              MEDIA_TYPE     IN VARCHAR2 default 'image/jpeg',
              PARAMS         IN JSON default NULL
    ) return CLOB;

DATAおよびTEXT_DATA

DATA句またはTEXT_DATA句には、テキスト・プロンプトをCLOBとして指定します。

ノート:

Hugging Faceでは、イメージを入力として指定するときに、プロンプトを必要としないイメージ・キャプション・モデルが使用されます。イメージとともにプロンプトを入力した場合、プロンプトは無視されます。

MEDIA_DATA

イメージやビジュアルPDFファイルなどのBLOBファイルを指定します。

MEDIA_TYPE

サポートされているイメージ・データのMIMEタイプのいずれかで、指定されたイメージまたはビジュアルPDFファイル(BLOBファイル)のイメージ形式を指定します。次に例を示します。

  • PNGの場合: image/png

  • JPEGの場合: image/jpeg

  • PDFの場合: application/pdf

ノート:

サポートされているイメージ形式の完全なリストは、サードパーティ・プロバイダのドキュメントを参照してください。

PARAMS

テキスト生成のためにアクセスするサービス・プロバイダに応じて、次の入力パラメータをJSON形式で指定します:

{
  "provider"         : "<AI service provider>",
  "credential_name"  : "<credential name>",  
  "url"              : "<REST endpoint URL for text generation service>",
  "model"            : "<text generation model name>",
  "transfer_timeout" : <maximum wait time for the request to complete>,
  "max_count": "<maximum calls to the AI service provider>",
  "<additional REST provider parameter>": "<REST provider parameter value>"
}

表12-15 UTL_TO_GENERATE_TEXTのパラメータの詳細

パラメータ 説明

provider

テキストを生成するためにアクセスするサポート対象のRESTプロバイダ。

次のいずれかの値を指定します。

CLOB入力の場合:

  • cohere

  • googleai

  • huggingface

  • ocigenai

  • openai

  • vertexai

BLOB入力の場合:

  • googleai

  • huggingface

  • openai

  • vertexai

credential_name

次の形式の資格証明の名前:

schema.credential_name

資格証明名には、REST APIコールを行うためのプロバイダにアクセスできるようにする認証資格証明が保持されます。

まず、資格証明を作成および格納するためにDBMS_VECTOR.CREATE_CREDENTIALヘルパー関数をコールして、資格証明をセットアップしてから、ここで資格証明書の名前を参照する必要があります。「CREATE_CREDENTIAL」を参照してください。

url

「サポートされているサードパーティ・プロバイダの操作およびエンドポイント」にリストされている、各RESTコールのサードパーティ・プロバイダ・エンドポイントのURL。

model

次の形式でのサードパーティ・テキスト生成モデルの名前:

schema.model_name

モデル名がスキーマ修飾されていない場合は、プロシージャ実行者のスキーマが使用されます。

ノート: 生成AIの場合、サポートされているすべてのサードパーティ・モデルが「サポートされるサードパーティ・プロバイダの操作およびエンドポイント」にリストされています。

transfer_timeout

リクエストを完了するまでの最長待機時間。

デフォルト値は60秒です。ビジー状態のWebサーバーに対しては、この値を増やすことができます。

max_count

特定のサードパーティ・プロバイダに対してAPIをコールできる最大回数。

整数nに設定すると、max_countによって、指定されたプロバイダのAPIの実行がn回を超えると停止します。これにより、一定の制限を超えてサードパーティのコールが誤って実行されることを防ぎます。たとえば、購入したサービス量を超過しないようにします。

追加のサードパーティ・プロバイダのパラメータ:

オプションで、プロバイダ固有の追加パラメータを指定します。

表12-16 追加のRESTプロバイダのパラメータの詳細

パラメータ 説明

max_tokens

出力テキスト内の最大トークン数。

temperature

出力テキストの生成時に使用されるランダム性の度合い(0.0-5.0の範囲)。

プロンプトに対して同じ出力を生成するには、0を使用します。そのプロンプトに対してランダムな新しいテキストを生成するには、temperatureを大きくします。

ノート: 最初は温度を0に設定します。ランダムな結果が必要ない場合、推奨される温度値は0から1の間です。高温では創造的なテキストが生成される可能性があり、ハルシネーションも含まれることがあるため、高い値は推奨されません。

topP

出力内のトークンの確率(0.0–1.0の範囲)。

小さな値ほどランダム応答が少なくなり、大きな値ほどランダム応答が多くなります。

candidateCount

応答のバリエーション数(1-4の範囲)。

maxOutputTokens

応答ごとに生成するトークンの最大数。

すべてのサードパーティ・プロバイダの構成例を見てみましょう:

重要:

Cohereの例:
{
  "provider"       : "cohere", 
  "credential_name": "COHERE_CRED",
  "url"            : "https://api.cohere.example.com/chat",
  "model"          : "command"
}

生成AIの例:

ノート:

生成AIの場合、追加のRESTプロバイダ固有のパラメータを渡す場合は、chatRequestでこれらを囲んで指定する必要があります。
{
  "provider"       : "ocigenai",
  "credential_name": "OCI_CRED",
  "url"            : "https://inference.generativeai.us-example.com/chat",
  "model"          : "cohere.command-r-16k",
  "chatRequest"    : {
                      "maxTokens"    : 256
                     }
}
Google AIの例:
{
  "provider"        : "googleai",
  "credential_name" : "GOOGLEAI_CRED",
  "url"             : "https://googleapis.example.com/models/",
  "model"           : "gemini-pro:generateContent"
}
Hugging Faceの例:
{
  "provider"        : "huggingface",
  "credential_name" : "HF_CRED",
  "url"             : "https://api.huggingface.example.com/models/",
  "model"           : "gpt2"
}
Ollamaの例:
{
  "provider"       : "ollama", 
  "host"           : "local", 
  "url"            : "http://localhost:11434/api/generate", 
  "model"          : "phi3:mini"
}
OpenAIの例:
{
  "provider"        : "openai",
  "credential_name" : "OPENAI_CRED",
  "url"             : "https://api.openai.example.com",
  "model"           : "gpt-4o-mini",
  "max_tokens"      : 60,
  "temperature"     : 1.0
}
Vertex AIの例:
{
  "provider"         : "vertexai",
  "credential_name"  : "VERTEXAI_CRED",
  "url"              : "https://googleapis.example.com/models/",
  "model"            : "gemini-1.0-pro:generateContent",
  "generation_config": {
                        "temperature"    : 0.9,
                        "topP"           : 1,
                        "candidateCount" : 1,
                        "maxOutputTokens": 256
                       }
}

  • プロンプトからテキストへ:

    次の文は、生成AIへのRESTコールによってテキスト応答を生成します。ここで指定されるプロンプトは「What is Oracle Text?」です。

    ここでは、cohere.command-r-16kおよびmeta.llama-3.1-70b-instructモデルが使用されます。model値は、「サポートされるサードパーティ・プロバイダの操作およびエンドポイント」に示されているように、生成AIで使用する他のサポートされるモデルに置き換えることができます。

    cohere.command-r-16kモデルを使用した場合:

    -- select example
    
    var params clob;
    exec :params := '
    {
      "provider"       : "ocigenai",
      "credential_name": "OCI_CRED",
      "url"            : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat",
      "model"          : "cohere.command-r-16k",
      "chatRequest"    : {
                          "maxTokens": 256
                         }
    }';
    
    select dbms_vector.utl_to_generate_text(
     'What is Oracle Text?',
     json(:params)) from dual;
    
    -- PL/SQL example
    
    declare
      input clob;
      params clob;
      output clob;
    begin
      input := 'What is Oracle Text?';
    
      params := '
    {
      "provider"       : "ocigenai",
      "credential_name": "OCI_CRED",
      "url"            : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat",
      "model"          : "cohere.command-r-16k",
      "chatRequest"    : {
                          "maxTokens": 256
                         }
    }';
    
      output := dbms_vector.utl_to_generate_text(input, json(params));
      dbms_output.put_line(output);
      if output is not null then
        dbms_lob.freetemporary(output);
      end if;
    exception
      when OTHERS THEN
        DBMS_OUTPUT.PUT_LINE (SQLERRM);
        DBMS_OUTPUT.PUT_LINE (SQLCODE);
    end;
    /

    meta.llama-3.1-70b-instructモデルの使用:

    -- select example
    
    var params clob;
    exec :params := '
    {
       "provider"       : "ocigenai",
       "credential_name": "OCI_CRED",
       "url"            : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat",
       "model"          : "meta.llama-3.1-70b-instruct",
       "chatRequest"    : {
                           "topK" : 1
                          }
    }';
    
    select dbms_vector.utl_to_generate_text(
     'What is Oracle Text?',
     json(:params)) from dual;
    
    -- PL/SQL example
    
    declare
      input clob;
      params clob;
      output clob;
    begin
      input := 'What is Oracle Text?';
    
      params := '
    {
       "provider"       : "ocigenai",
       "credential_name": "OCI_CRED",
       "url"            : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat",
       "model"          : "meta.llama-3.1-70b-instruct",
       "chatRequest"    : {
                           "topK" : 1
                          }
    }';
    
      output := dbms_vector.utl_to_generate_text(input, json(params));
      dbms_output.put_line(output);
      if output is not null then
        dbms_lob.freetemporary(output);
      end if;
    exception
      when OTHERS THEN
        DBMS_OUTPUT.PUT_LINE (SQLERRM);
        DBMS_OUTPUT.PUT_LINE (SQLCODE);
    end;
    /

    エンドツーエンドの例:

    エンドツーエンドのシナリオ例を実行するには、「テキスト応答の生成」を参照してください。

  • イメージからテキストへ:

    次の文は、OpenAIへのRESTコールによってテキスト応答を生成します。ここでは、入力はイメージ(sample_image.jpeg)とプロンプト「Describe this image?」です。

    -- select example
    
    var input clob;
    var media_data blob;
    var media_type clob;
    var params clob;
    
    begin
      :input := 'Describe this image';
      :media_data := load_blob_from_file('DEMO_DIR', 'sample_image.jpeg');
      :media_type := 'image/jpeg';
      :params := '
    {
      "provider"       : "openai",
      "credential_name": "OPENAI_CRED",
      "url"            : "https://api.openai.com/v1/chat/completions",
      "model"          : "gpt-4o-mini",
      "max_tokens"     : 60
    }';
    end;
    /
    
    select dbms_vector.utl_to_generate_text(:input, :media_data, :media_type, json(:params));
    
    -- PL/SQL example
    
    declare
      input clob;
      media_data blob;
      media_type varchar2(32);
      params clob;
      output clob;
    
    begin
      input := 'Describe this image';
      media_data := load_blob_from_file('DEMO_DIR', 'image_file');
      media_type := 'image/jpeg';
      params := '
    {
      "provider"       : "openai",
      "credential_name": "OPENAI_CRED",
      "url"            : "https://api.openai.com/v1/chat/completions",
      "model"          : "gpt-4o-mini",
      "max_tokens"     : 60
    }';
    
      output := dbms_vector.utl_to_generate_text(
        input, media_data, media_type, json(params));
      dbms_output.put_line(output);
    
      if output is not null then
        dbms_lob.freetemporary(output);
      end if;
      if media_data is not null then
        dbms_lob.freetemporary(media_data);
      end if;
    exception
      when OTHERS THEN
        DBMS_OUTPUT.PUT_LINE (SQLERRM);
        DBMS_OUTPUT.PUT_LINE (SQLCODE);
    end;
    /

    エンドツーエンドの例:

    エンドツーエンドのシナリオ例を実行するには、「イメージ・コンテンツの説明」を参照してください。