今回は、Pascalと生成AI(ChatGPT)を組み合せてみましょう。Pascalは視認性が高く、厳密な型システムを持っています。画面デザインが自由にできるLazarusの良さを活かしたAI秘書アプリを作ってみましょう。
最初に新規プロジェクトを作成して保存しよう
今回はWindowsで動くプログラムにしています。こちらからプロジェクト全体をダウンロードできます。
Lazarusを起動して新規プロジェクトを始めましょう。通常、Lazarusを起動すると新規プロジェクトの状態なのですが、明示的にプロジェクトを新規作成するには、メニューから[プロジェクト > 新規プロジェクト]をクリックします。そして、「アプリケーション」を選択して「OK」ボタンを押します。
この時点でプロジェクトを保存しましょう。メニューから[プロジェクト > プロジェクト保存]をクリックして、分かりやすいフォルダを選んで「AIChat」などの名前でプロジェクトを保存しましょう。次いで、ユニットやフォームの名前を指定するダイアログが開きますが、デフォルトの名前のまま保存してください。
最新のcurlコマンドをダウンロードしよう
ChatGPTの良いところは、どんなプログラミング言語からでも、Web APIを経由してその機能を利用できる点にあります。OpenAIは公式にPascalをサポートしているわけではありませんが、Pascalからcurlコマンドを実行して、手軽にChatGPTのAPIにアクセスできます。
curlコマンドは、Windows 10 バージョン1803以降では標準でインストールされていますが、それ以前のバージョンを使っていたり、最新のcurlコマンドを利用する方が安心です。Windowsを使っている場合には、こちら から最新のcurlをダウンロードしましょう。ZIPファイルを解凍したら、ファイル一式を、先ほど作成したLazarusのプロジェクトフォルダにコピーしましょう。
API経由でChatGPTを使う方法
次に、ChatGPTを自作アプリに組み込むために、OpenAIのAPIキーを取得しましょう。ChatGPTのAPIを使うために、こちらのOpenAIの開発者プラットフォームにアクセスしましょう。
はじめての場合は、画面右上の「Sign up」からアカウントを作成しましょう。最初は無料枠があるので、気軽に始めることができます。
そして、ログインしたら、APIキーを取得するには、画面上部のダッシュボード(Dashboard)をクリックし、画面左側の「API Keys」をクリックします。そして、画面上部にある「+ Create new secret key」をクリックします。すると、「sk-xxxxx」のようなAPIキーが生成されます。なお、APIキーは作成後一度しか表示されないので、必ず、このAPIキーを覚えておきましょう。
APIキーを環境変数に登録しよう
そして、取得したAPIキーは、環境変数「OPENAI_API_KEY」に登録しましょう。
Windowsであれば、Windowsメニューにある検索ボックスに「システム環境変数の編集」と入力して表示される「システムのプラパティ」で「環境変数」ボタンを押します。そして、「新規」ボタンをクリックし、変数名に「OPENAI_API_KEY」、変数値に「sk-xxxxxxxx」のようなAPIキーを指定します。
Lazarusで画面をデザインしよう
Lazarusに戻って、チャット画面をデザインしましょう。雰囲気をだすために適当な画像を貼り付けましょう。本連載1回目の内容を参考にして、コンポーネントパレットから、コンポーネントを貼り付けていきましょう。次のような画面になるようにします。
なお、次のように、コンポーネントパレットの[Additional]タブからTImageを貼り付け、そこに任意のJPEG画像を貼り付けます。そして、[Standard]タブからTButtonや、TMemoを貼り付けて、nameプロパティにコンポーネントの名前を設定します。
今回のプログラムで重要なコンポーネントの名前は次の表の通りです。
コンポーネント名 | 種類 | 説明 |
---|---|---|
memoLog | TMemo | チャットのログを表示するエディタ |
memoUser | TMemo | ユーザーの発言内容を入力するエディタ |
btnSend | TButton | 送信ボタン |
なお、送信ボタンのbtnSendは、Captionプロパティを「送信」と指定し、memoLogのScrollBarsを「ssAutoBoth」と指定しましょう。
プログラムを記述しよう
こちらに、curlコマンドを使ってChatGPTにアクセスするライブラリ(Unitファイル)をアップロードしています。これをダウンロードします。
そして、プロジェクトファイルに「ChatGPTUnit.pas」という名前でコピーします。続いて、LazarusのIDEを次のように操作します。
- (1) [ファイル > 開く]でファイル「ChatGPTUnit.pas」を開きます。
- (2) [プロジェクト > プロジェクトに編集中のファイルを追加]をクリックします。
- (3) ソースエディタでUnit1を選択した状態で [ソース > ユニットをUses節に追加]をクリックします。
- (4) 「ChatGPTUnit」を選んで「実装部」に追加します。
ソースエディタで、Unit1を表示すると、「implementation」と書かれている部分のすぐ下に、次のような宣言が追加されているのを確認できるでしょう。
implementation
uses ChatGPTUnit; // ← ユニットが追加された
それでは、プログラムを記述していきましょう。まず、メニューから[表示 > ソースエディタ]をクリックしましょう。そして、エディタ上部の[Unit1]をアクティブにします。
最初に送信ボタン(btnSend)をクリックした時の処理を記述しましょう。Lazarusのフォーム上でbtnSendをダブルクリックして、クリックイベントを設定しましょう。
procedure TForm1.btnSendClick(Sender: TObject);
var
result: string;
begin
// 以下のコードを追加
btnSend.Enabled := False;
try
result := CallChatGPTAPI(memoUser.Text); // ChatGPTを呼び出す
memoLog.Text := '> ' + memoUser.Text + #13#10 +
'------------------------------' + #13#10 +
result + #13#10 +
'==============================' + #13#10 +
Trim(memoLog.Text); // 結果をmemoLogに追加
memoUser.Text := '';
finally
btnSend.Enabled := True;
end;
end;
以上で完了です。実行ボタンを押してプログラムを実行しましょう。画面上部にある実行ボタン「▶」をクリックするか、メニューから「実行 > 実行」をクリックしましょう。はじめて実行する際には、デバッグレベルを指定するダイアログが出ますが、[OK]ボタンを押すとコンパイルが行われ、プログラムが実行されます。
プログラムが実行されたら、画面下部にAI秘書に尋ねたいことを記述して「送信」ボタンを押します。すると、ChatGPT APIにアクセスして結果を取得し、結果が画面上部のログに表示されます。
ChatGPTを呼び出すプログラムを確認しよう
上記の手順では、ユニット「ChatGPTUnit.pas」を追加しただけでしたが、このライブラリは160行程度で、もそれほど難しいものではないので、内容を確認してみましょう。curlコマンドを使って、ChatGPTのAPIを呼び出し、その戻り値を解析して返すだけです。