はじめに
ChatGPTのAPIとGoogle 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を使用したツールが簡単に作成できるのかしら
(さすがに触らないとね~)
コメント