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のパラメータの詳細
パラメータ | 説明 |
---|---|
|
テキストを生成するためにアクセスするサポート対象のRESTプロバイダ。 次のいずれかの値を指定します。
|
|
次の形式の資格証明の名前:
資格証明名には、REST APIコールを行うためのプロバイダにアクセスできるようにする認証資格証明が保持されます。 まず、資格証明を作成および格納するために |
|
「サポートされているサードパーティ・プロバイダの操作およびエンドポイント」にリストされている、各RESTコールのサードパーティ・プロバイダ・エンドポイントのURL。 |
|
次の形式でのサードパーティ・テキスト生成モデルの名前:
モデル名がスキーマ修飾されていない場合は、プロシージャ実行者のスキーマが使用されます。 ノート: 生成AIの場合、サポートされているすべてのサードパーティ・モデルが「サポートされるサードパーティ・プロバイダの操作およびエンドポイント」にリストされています。 |
|
リクエストを完了するまでの最長待機時間。 デフォルト値は |
|
特定のサードパーティ・プロバイダに対してAPIをコールできる最大回数。 整数nに設定すると、 |
追加のサードパーティ・プロバイダのパラメータ:
オプションで、プロバイダ固有の追加パラメータを指定します。
表12-16 追加のRESTプロバイダのパラメータの詳細
パラメータ | 説明 |
---|---|
|
出力テキスト内の最大トークン数。 |
|
出力テキストの生成時に使用されるランダム性の度合い( プロンプトに対して同じ出力を生成するには、 ノート: 最初は温度を |
|
出力内のトークンの確率( 小さな値ほどランダム応答が少なくなり、大きな値ほどランダム応答が多くなります。 |
|
応答のバリエーション数( |
|
応答ごとに生成するトークンの最大数。 |
すべてのサードパーティ・プロバイダの構成例を見てみましょう:
重要:
-
次の例は説明のための例です。使用する追加パラメータに関する正確で最新の情報については、サードパーティ・プロバイダのドキュメントを参照してください。
-
サポートされているすべてのRESTエンドポイントURLのリストは、「サポートされているサードパーティ・プロバイダの操作およびエンドポイント」を参照してください。
{
"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
}
}
{
"provider" : "googleai",
"credential_name" : "GOOGLEAI_CRED",
"url" : "https://googleapis.example.com/models/",
"model" : "gemini-pro:generateContent"
}
{
"provider" : "huggingface",
"credential_name" : "HF_CRED",
"url" : "https://api.huggingface.example.com/models/",
"model" : "gpt2"
}
{
"provider" : "ollama",
"host" : "local",
"url" : "http://localhost:11434/api/generate",
"model" : "phi3:mini"
}
{
"provider" : "openai",
"credential_name" : "OPENAI_CRED",
"url" : "https://api.openai.example.com",
"model" : "gpt-4o-mini",
"max_tokens" : 60,
"temperature" : 1.0
}
{
"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; /
エンドツーエンドの例:
エンドツーエンドのシナリオ例を実行するには、「イメージ・コンテンツの説明」を参照してください。
親トピック: DBMS_VECTOR