初めに
ChatGPT APIを用いて何か作ってみたいということで、今回はGmailの未読メールに対して返信内容をChatGPTに考えてもらい、自動で返信する機能をgasで実装しました。
実装
Open AIのAPI keyを取得
Open AI
上記のリンクから会員登録を行い、API keyを取得してください。
右上のプロフィールボタンの「View API keys」から生成できます。
無料枠として5ドル分の利用することが出来ます。
gasの実装
新しいプロジェクトの作成
画面左上の「新しいプロジェクト」をクリックしてください。
サービスの追加
「サービス」の+ボタンをクリックし、Gmailを追加してください。
コードを記述
function autoReply() {
// OpenAI APIキー
var apiKey = "取得したAPIkeyを記述";
// Gmailの受信トレイを取得
var threads = GmailApp.search("label:inbox is:unread");
threads.forEach(function (thread) {
var message = thread.getMessages()[0];
var text = message.getPlainBody();
var sender = message.getFrom();
var senderEmail = sender.match(/<(.*?)>/)[1];
var prompt = `届いたメールに対して適切な表現を用いて返信文を考えてください。以下は実際に頂いた文面です。${text}`;
// OpenAI APIにリクエストを送信
var response = UrlFetchApp.fetch(
"https://api.openai.com/v1/chat/completions",
{
muteHttpExceptions: true,
method: "POST",
headers: {
Authorization: "Bearer " + apiKey,
"Content-Type": "application/json",
},
payload: JSON.stringify({
model: "gpt-3.5-turbo",
messages: [
{
role: "user",
content: prompt,
},
],
max_tokens: 1024,
temperature: 0.9,
}),
}
);
// 返信文を生成
var data = JSON.parse(response.getContentText());
var reply = data.choices[0].message.content;
// 返信メールを送信
GmailApp.sendEmail(senderEmail, "自動返信メール", reply);
GmailApp.markThreadRead(thread);
});
}
GmailApp.search("label:inbox is:unread")
は未読メールを取得するコードです。
モデルは「gpt-3.5-turbo」を使用しています。
「text-davinci-003」に比べてコストが1/10になっています。
message
のcontent
が入力するプロンプトです。
今回はシンプルに届いたメールに対して適切な表現を用いて返信文を考えてください。以下は実際に頂いた文面です。${届いた文面}
としています。
max_tokens
は生成されるトークンの最大数を指定しており、temperature
はランダム性を制御しています。
定期実行
「エディター」を「トリガー」に変更し、新たにトリガーを追加します。
実行する関数を選択し、以下の項目を設定してください。
イベントのソースを選択:時間手動型
時間ベールのトリガーのタイプを選択:分ベースのタイマー
時間の間隔を選択(分):1分
本来はメールが届いたら実行という形にしたかったですが、方法が分からなかったため1分に1度未読メールを確認し、未読メールがあれば返信するといった実装にしました。
記述したコードでは、未読メールが無かった時の処理を記述していないので、未読メールがない場合はエラーとして扱われます。
最後に
実際に何回か試しに使ってみましたが、実用的に使うにはプロンプトの工夫や学習データが必要だと実感しました。お遊びで使う分には、面白いと思います。
優れた返信メールを記述してくれるプロンプトがありましたら、ぜひ教えてください。