【生成AI】GPT × Google Formsで自動回答

生成AI

はじめに

ChatGPTのAPIGoogle Formsを組み合わせて、
ユーザーの入力から自動回答してくれるツールの開発方法について説明します。

前提知識

  • Must
    • APIの基礎知識
    • GoogleAppScriptの基礎文法
  • Want
    • ChatGPTのAPIにおいてfunctuon_callについての知識

デモ用フォームと実際のコード

デモ用フォーム

実際のコード

メイン関数(フォームに回答がきたときに作動)

function senseOfValuesForm(e) {
  // リターン値初期化
  email = ""
  userAnswer = ""

  try {
    ////////////////////////////////////////
    // 1. Google Formsからユーザの回答を取得
    ////////////////////////////////////////
    const formResponse = e.response;
    // メールアドレス取得 
    const email = formResponse.getRespondentEmail();
    // ユーザー回答取得 
    const itemResponse = formResponse.getItemResponses();

    //////////////////////
    // 2.ユーザの回答を整形
    //////////////////////
    userAnswer = "1. " + itemResponse[0].getResponse() + '\n'

    for (let i = 1; i < itemResponse.length; i++){
      // 回答者のアンサー
      userAnswer = userAnswer + String(i+1) + ". " + itemResponse[i].getResponse() + '\n';
    }
    Logger.log(email)    
    Logger.log(userAnswer)
    ///////////////////////////
    // 3. GPTにリクエストを送信
    ///////////////////////////
    gptAnswer = postChatGPT(userAnswer)

    ////////////////////////////
    // 4.  GPTのレスポンスを整形
    ////////////////////////////
    gptAnswer = JSON.parse(gptAnswer)
    Logger.log(gptAnswer)    
    menu = gptAnswer.menu
    cooking = gptAnswer.cooking
    Logger.log(menu)
    Logger.log(cooking)
    
    ////////////////
    // 5.メール送信
    ////////////////
    // 送信先を定義する
    const to = email;
    // 件名を定義する
    const subject = `${menu}が提案されました。`;
    // ボディを定義する
    const body = `料理名:${menu}\n料理方法:${cooking}`;
    // 送信元を定義する
    const options = {from: 'ikemen.engineer@gmail.com'};
    GmailApp.sendEmail(to, subject, body, options);
    Logger.log("メール送信完了")
  } catch (e) {
      // エラーハンドリング
      console.error(`エラーが発生しました。ご確認ください: ${e}`);
      throw new Error('エラーが発生しました。ご確認ください');
  }
}

chatGPTのAPIにリクエストを送信する関数

function postChatGPT(content) {
  const maxAttempts = 3;
  const url = 'https://api.openai.com/v1/chat/completions';

  let attempt = 0;
  let returnResult = ''

  while (attempt < maxAttempts) {
    try {
      prompts = [
          {
            "role": "system",
            "content": "あなたは世界一のシェフです。ユーザーから素材が3つ入力されるので、AICook関数を使用して料理と料理工程を提案してください。"
          }
        ]

      const messages = prompts.concat([
          {
            "role": "user",
            "content": content
          }
        ])

      const body = {
        model: "gpt-4o-mini",
        messages:  messages,
        max_tokens: 1500,
        tools: [
            {
              "type": "function",
              "function": {
                "name": "AICook",
                "description": "入力された食材情報をもとに料理と料理工程を提案する",
                "parameters": {
                    "type": "object",
                    "properties": {
                      "menu": {"type": "string", "description": "提案した料理名"},
                      "cooking": {"type": "string", "description": "提案した料理の調理工程"}
                    }
                },
                "required": ["menu", "cooking"]
              }
            }
        ],
        tool_choice: {"type": "function", "function": {"name": "AICook"}}
      };

      const options = {
        "method" : "POST",
        "headers": { "Content-Type": "application/json", "Authorization" : GPT_API_KEY },
        "payload" : JSON.stringify(body),
      };

      const response = UrlFetchApp.fetch(url, options);
      // 成功したらレスポンスを返す
      if (response.getResponseCode() === 200) {
        const jsonResponse = JSON.parse(response);
        returnResult = jsonResponse.choices[0].message.tool_calls[0].function.arguments

        return returnResult;
      }
    } catch (e) {
      // エラーハンドリング
      console.warn(`Attempt ${attempt + 1} failed with error: ${e}`);
    }
    // リトライの前に一定時間待機
    Utilities.sleep(1000 * Math.pow(2, attempt));
    attempt++;
  }
  throw new Error('API call failed after ' + maxAttempts + ' attempts.');
}

作り方

1. フォームを作成して、スクリプトエディタを開く

フォームを作成して、右上の3つの点をクリックしてスクリプトエディタを選択

2. 実際のコードをコピペ

矢印の部分をクリックして、初期で入っている関数を消して、実際のコードをコピペ

3. トリガーを設定

トリガーを選択

senseOfValuesFormを選択して、イベントの種類をフォーム起動時にして保存

おわりに

最後まで読んでいただきありがとうございます。
この記事でGPTの1つの活用方法が示せてかなと思っております。コード解説は力尽きましたが需要あるんですかね?
今ではDifyなどが出てきてもっと簡単に生成AIを使用したツールが簡単に作成できるのかしら
(さすがに触らないとね~)

コメント

Verified by MonsterInsights
タイトルとURLをコピーしました