Azure FunctionsとChatGPTを組み合わせて毎朝の占いを送ってもらおう!

AzureFunctionsTitle.png
あけましておめでとうございます。
2024年もよろしくお願いいたします。

私も、今年が20代ラストということで、新年の抱負を考えました。

『童心を、取り戻せ』


弊社は基本在宅が多いのですが、もう家で仕事して、そのまま夜はノンアルビールを飲んで、テレビ見て寝る日々なんです。
幼いころは、もっと日々を楽しんで生きていたはずなんです。

というわけで、あの頃に毎朝楽しみにしていたもの......。

そう、某テレビ局の朝の占いです! 
犬の紹介も好きでした。

というわけで、今回の内容はこちら

Azure FunctionsとChatGPTを使用して、
毎朝占いを自動生成しよう!

目次

  • Azure FunctionsとChatGPTについて
  • まずは、ChatGPTで占いを出力しよう
  • Azure Functionsを作成
  • 実際に出力した結果

 

Azure FunctionsとChatGPTについて

Azure Functionsとは

公式のドキュメントの記載を引用いたします。

Azure Functions は、記述するコードと管理するインフラストラクチャを減らし、コストを節約できるサーバーレス ソリューションです。 クラウド インフラストラクチャによって、アプリケーションの実行を維持するために必要な最新のリソースがすべて提供されるので、サーバーのデプロイや管理について心配する必要はありません。

簡単に説明すると、簡単な処理を行うアプリをサーバーの準備をせずに作れちゃうようなものです。
例えば、ファイルの文字コードを変換させるAPI的なものを作成したり、定期的にDBの中身を出力・更新するような処理などを作れます。

今回はこれを使用して、毎朝ChatGPTに占いを出力させたいと思います。

 

ChatGPTとは

言わずと知れた、対話型のAIサービスです。
OpenAIが開発したものになります。
これに対してAPIで接続することができるのが、OpenAI APIです。

公式のドキュメントでは、下記のような説明がされています。

OpenAI API は、事実上あらゆるタスクに適用できます。当社は、さまざまな機能と価格帯を備えたさまざまなモデルを提供しているほか、カスタム モデルを微調整することもできます。

OpenAI APIでは、対話型のAIサービス以外にも、画像生成などいろいろなAIを使用できます。

今回はその中でも、テキスト生成モデルを使用したいと思います。

また、Azureの場合は、Azure OpenAI Serviceというものも用意されていて、簡単かつセキュアにAIを使用できるような準備が進められているのですが、
現在はアクセスするためには審査を通らないといけないため、直接APIを叩く方法で実装したいと思います。

 

まずは、ChatGPTで占いを出力しよう

とりあえず、出力させてみます。

ikeda_9_01.png

うーん、意外とちゃんと出してくれますが、某占いとはちょっと違いますね。

というわけで、『プロンプト』というものを使用してみたいと思います。
プロンプトとは、期待した出力をさせるために、決まった形式でAIに対して指示を行うものになります。
今回は、『深津式プロンプト』というもので出力してみたいと思います。

私の方で用意したのは、下記のような文言です。

# 命令書:
- あなたは占い師です。
- 以下の制約条件をもとに、雑誌用の12星座の占いを出力してください。

# 制約条件:
- 12星座は以下の12星座を使用。

## 12星座:
[ひつじ座,おうし座,ふたご座,かに座,しし座,おとめ座,てんびん座,さそり座,いて座,やぎ座,みずがめ座,うお座]

- 出力は以下のデータ形式で出力。

## データ形式:
{順位}位:{星座名}
占い結果:{占い結果}
ラッキーアイテム:{ラッキーアイテム}

- 占い結果とラッキーアイテムは、小学生にもわかりやすく。
- 順位はランダム。
- 順位の順に昇順。

これで出力させると、下記のようになりました。

ikeda_9_02.png

おおむね期待通りの出力になりました。(スペースの都合で入り切っていませんが、12位まで出力されました。)
では、これを毎日定期的に出力させるように、Functionsの方を作成していきましょう!

 

Azure Functionsを作成

Azureの方の設定については、割愛いたします。
また、今回はVSCodeを使用して作成していきます。

まずは、ドキュメントに従って、Functionsの拡張機能を入れましょう。

ただし、今回は定期実行のため、『HTTP trigger』ではなく、『Timer trigger』を使用します。

ikeda_9_04.png

そのあと、OpenAIのパッケージを取得します。

dotnet add package OpenAI

こちらを使用すると、非常に簡単にOpenAI APIとやりとりができます。

続いて、OpenAI APIにアクセスするために、APIキーが必要になるので、それを取得しましょう。

OpenAI APIにアクセスして、Sign upからアカウントを作成します。

ikeda_9_05.png

アカウントが作成出来たら、API Keysから、APIキーを作成します。

ikeda_9_06.png

ikeda_9_07.png

キーの名前を付けると、キーが出力されます。
これはめっちゃ重要かつ、超機密事項なので、誰にも教えないように大切に保管しておいてください。

ikeda_9_08.png

ここまで来たら、実際にコードを作成していきます!

実際に作成したコードの一部がこちら。
ikeda_9_03.png

public async Task Run([TimerTrigger("0 0 9 * * *")] TimerInfo myTimer, ILogger log)

タイマートリガーの設定をします。

ここがなかなかの曲者で、『NCRONTAB 式』という形式になるみたいです。
前から順番に、{秒} {分} {時} {日} {月} {週} になるようです。

0 0 9 * * *

今回の場合は、『毎日9時』というような指定になります。

キーは、接続文字列の方に保存しましょう。
絶対に、コードに直書きとかはしないでください!

var openaiApiKey = Configuration.GetConnectionString("CHATGPT_API_KEY");
ここで、キーを取得してきています。
var api = new OpenAIAPI(openaiApiKey);
var chat = api.Chat.CreateConversation();

ここで、上記で取得したキーと、OpenAIのパッケージを使用して『Chat』つまり対話AIに対して接続することを記述します。

var prompt = PromptMessage;

PromptMessageには、上で作成した占いを出力させるプロンプトが入っています。

chat.AppendUserInput(prompt);
var response = await chat.GetResponseFromChatbotAsync();

上で宣言したchatに対してプロンプトを入れて、ChatGPTに返答を生成させます。

log.LogInformation(response.ToString());

そして、出力内容をログファイルに書き出します。

本当は、どこかに投稿させようと考えていたのですが、
一緒に見る友達もいないし、ログファイルを一人でしっぽり見るような実装にしました。

あとは、これをデプロイすれば、完成です!

実際に出力した結果

では、最後に実際に出力したログを確認しましょう。

ikeda_9_09.png

すみません、画面の関係で一番最後までスクショが入り切りませんでしたが、出力できていました!

ちなみに、私のおとめ座は......

ikeda_9_10.png

......占いの出力なんてしてないで、仕事をちゃんと進めた方がよさそうです。

最後に

弊社では、Azure Functionsなどを使用した受託開発を行っております。

今回は使用していませんが、通常業務であればSQLサーバーに接続してデータを取得したり、メディアのエンコーディングをさせたり
他にも様々な使用方法がございます。

「なんとなく既存のサービスの不便を解消したい」などの場合でも、
こちらから既存のシステムに組み込むにあたって、よりお客様の便利な使い方を提案させていただくことも可能です。

Azureの開発ベンダーをお探しの際は、ぜひ弊社にご相談いただけたらと思います!

お気軽にご依頼・ご相談ください

前へ

Power Apps キャンバスアプリの動作が遅い!?そんな時にはパフォーマンスを改善できるかも!

次へ

[Power Platform管理ツール] CoEスターターキットを導入してみた