4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenAI ChatGPTのAPI(gpt-3.5-turbo)を使ってGmailの自動返信機能を実装した。

Posted at

初めに

ChatGPT APIを用いて何か作ってみたいということで、今回はGmailの未読メールに対して返信内容をChatGPTに考えてもらい、自動で返信する機能をgasで実装しました。

実装

Open AIのAPI keyを取得

Open AI
上記のリンクから会員登録を行い、API keyを取得してください。
右上のプロフィールボタンの「View API keys」から生成できます。

無料枠として5ドル分の利用することが出来ます。

gasの実装

Google Apps Script

新しいプロジェクトの作成

画面左上の「新しいプロジェクト」をクリックしてください。

サービスの追加

スクリーンショット 2023-04-12 21.40.22.png
「サービス」の+ボタンをクリックし、Gmailを追加してください。

コードを記述

gmail_autosend.gs
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になっています。

messagecontentが入力するプロンプトです。
今回はシンプルに届いたメールに対して適切な表現を用いて返信文を考えてください。以下は実際に頂いた文面です。${届いた文面}としています。

max_tokensは生成されるトークンの最大数を指定しており、temperatureはランダム性を制御しています。

定期実行

「エディター」を「トリガー」に変更し、新たにトリガーを追加します。
実行する関数を選択し、以下の項目を設定してください。
イベントのソースを選択:時間手動型
時間ベールのトリガーのタイプを選択:分ベースのタイマー
時間の間隔を選択(分):1分

本来はメールが届いたら実行という形にしたかったですが、方法が分からなかったため1分に1度未読メールを確認し、未読メールがあれば返信するといった実装にしました。

記述したコードでは、未読メールが無かった時の処理を記述していないので、未読メールがない場合はエラーとして扱われます。

最後に

実際に何回か試しに使ってみましたが、実用的に使うにはプロンプトの工夫や学習データが必要だと実感しました。お遊びで使う分には、面白いと思います。

優れた返信メールを記述してくれるプロンプトがありましたら、ぜひ教えてください。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?