2023年3月2日木曜日

OpenAIのChatGPTのAPIを呼び出すAPEXアプリを作る

新しい記事で更新されています。

OpenAIのChat Completions APIを呼び出すAPEXアプリを作成する
https://apexugj.blogspot.com/2024/04/chat-with-generative-ai-sample-app-0.html

以下は過去の内容です。

 OpenAIからChatGPTのAPIの提供が開始され、すでにアプリケーションに組み込んでいる所もあるようです。ChatGPTのAPIの費用をこちらのページから確認すると$0.002 / 1K tokens tokensとなっています。

OpenAIにアカウントを登録すると最初はFree trialになり、3ヶ月を期限として$18分だけ利用できるようです。実際にアカウントのアップグレードをせずに、ChatGPTのAPIを呼び出すことができました。

https://help.openai.com/en/articles/4936830-what-happens-after-i-use-my-free-tokens-or-the-3-months-is-up-in-the-free-trial

お金が絡む話ですので、試される場合はOpenAIのPricingのページをご自身で確認されるようお願いします。

作成したAPEXアプリケーションは以下の動作をします。

「去年の日本の野球の日本シリーズで優勝した球団は?」のChatGPTの回答は「去年(2020年)の日本シリーズで優勝した球団は、福岡ソフトバンクホークスです。」でした。ChatGPTが学習で使用したデータは2021年までというのは確かなようです。

続く質問「一昨年は?」の回答は「一昨年(2019年)の日本シリーズで優勝した球団は、埼玉西武ライオンズです。」でした。。。


このアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/chatgpt-app.zip

今回はアプリケーションの作成手順については省き、実装についての説明だけを行います。

OpenAIのAPIを呼び出すにあたって、Web資格証明を作成します。

ワークスペース・ユーティリティWeb資格証明を開きます。ここで作成するWeb資格証明を指定して、APIを呼び出します。

Web資格証明名前OpenAI API Keyとしています。

静的識別子としてOPENAI_API_KEY認証タイプHTTPヘッダー資格証明名Authorizationとします。資格証明シークレットしてBearerで始めて空白で区切った後、OpenAIのAPIキーを続けた文字列を設定します。


アプリケーションの実装の説明です。

ChatGPTの会話はroleがsystemのメッセージから始めます(省略も可ですが、このアプリでは省略できません)。systemのメッセージはThe system message helps set the behavior of the assistant.とのことです。


ボタンStart New Conversationは、ChatGPTへ送信する会話を初期化します。一連の会話はAPEXコレクションCHATGPTに保存しています。

会話の初期化はレンダリング前のプロセスInit Conversationとして実装しています。



ボタンSet System Message動的アクションで実装しています。System Messageとして入力した文字列をAPEXコレクションに追加しています。

System Messageを設定するリージョンは、APEXコレクションCHATGPTが空のときに表示されるよう、サーバー側の条件を設定しています。


会話履歴がある場合(systemのメッセージのみを含む)、ユーザーのメッセージを送信するリージョンが現れます。User Messageとして質問を入力し、ボタンSend User Messageをクリックすると一連の会話をリクエストとして、ChatGPTのAPIを呼び出します。



コードの説明は以上です。

ChatGPTとの会話はAPEXコレクションに保存しており、その表示にカード・リージョンを使っています。ソースのSQLは以下です。

select seq_id, c001, clob001, n001, n002, n003
from apex_collections
where collection_name = 'CHATGPT' order by seq_id desc


カードの表示について、属性で以下のように設定しています。

外観レイアウト水平(行)を選んでいます。カード主キー列1SEQ_IDです。

タイトルC001本体CLOB0012次本体拡張フォーマットONにし、HTML式として以下を記述しています。

{if N001/}
prompt_tokens: &N001. completion_tokens: &N002. total_tokens: &N003.
{endif/}


作成したアプリケーションの説明は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。