
VisualStudio CodeãšGoogle Apps Scriptã§ChatGPT(gpt-3.5-turbo)ãããå®å šå¿«é©ã«äœ¿ã
OpenAI瀟ã2023幎3æ1æ¥ã«å
¬éãããChatGPT APIãã«ã€ããŠã®åå¿è
åãèšäºã§ãã
VisualStudio CodeãšGoogle Apps Scriptã§ChatGPT(gpt-3.5-turbo)ãããå®å
šå¿«é©ã«äœ¿ããŸãããã

GASã¯ãšãããã¹ãã¬ããã·ãŒãã§GPTã颿°åãããšããã®ãããå¢ãã§ããŒã¯ã³ã倱ãïŒå®å®ã«åããªãåé¡ã解決ããŠããŸãã
ãgpt-3.5-turboãããããäœãå¬ããã®ïŒ
å ¬åŒè³æïŒÂ Introducing ChatGPT and Whisper APIs
ãŸãäœãšãã£ãŠãã¢ãã«ã®äœ¿çšæéãã€ã³ãã¯ããããŸãã
ChatGPTã¢ãã«ãã¡ããªãŒãgpt-3.5-turboãã¯ãChatGPT補åã§äœ¿çšããŠãããã®ãšåãã¢ãã«ã§ãããæ¢åã®ãGPT-3.5ããããGPT-3.5ã¢ãã«ãã10åå®ããäŸ¡æ Œã¯1,000ããŒã¯ã³ããã0.002ãã«ã§ãã
ãŸãããã£ãã以å€ã®å€ãã®ãŠãŒã¹ã±ãŒã¹ã«æé©ãªã¢ãã«ã§ããããã³ããã«ããããªèª¿æŽãå ããã ãã§ãtext-davinci-003 ãã gpt-3.5-turbo ã«ç§»è¡ããããšãã§ããŸãã
åŸæ¥ã¯ãªããã¢ãŠã(ç³è«ããããšã§å©çšãããªã)ã ã£ãã®ã ãã©ãChatGPI APIã¯ãªããã€ã³åœ¢åŒ(ç³è«ããªãéãå©çšãããªã)ã§ã¢ãã«ã®æ¹åã«å©çšãããªãããšã«ãªã£ã(æ³çç£èŠã§30æ¥ã¯ä¿ç®¡ããã)ã
â Dr.(Shirai)Hakase #AIç¥çµµåž«æ¬ #GREEVRStudioLab (@o_ob) March 4, 2023
ãŸãäŒæ¥ãªã©å°çšã€ã³ã¹ã¿ã³ã¹ã¯Azureã«çœ®ãããšãã§ããã pic.twitter.com/D3I7kebh5F
ãã®ä»ã®éããšããŠã¯ã
åŸæ¥ã¯ãªããã¢ãŠã(ç³è«ããããšã§å©çšãããªã)ã ã£ãâChatGPI APIã¯ãªããã€ã³åœ¢åŒ(ç³è«ããªãéãå©çšãããªã)ã§ã¢ãã«ã®æ¹åã«å©çšãããªãããšã«ãªã£ã(æ³çç£èŠã§30æ¥ã¯ä¿ç®¡ããã)
äŒæ¥ãªã©å°çšã€ã³ã¹ã¿ã³ã¹ã¯Azureã«çœ®ãããšãã§ãã
åŸæ¥æ¹åŒã«ä»£ããã¡ã¿ããŒã¿ãšäžç·ã«ã¡ãã»ãŒãžã®ã·ãŒã±ã³ã¹ãæ¶è²»ã
å éšã§ã¯å ¥åã¯ã¢ãã«ãæ¶è²»ããããŒã¯ã³ã®ã€ãªãããšããŠã¢ãã«ã«ã¬ã³ããªã³ã°ãããããã£ããããŒã¯ã¢ããèšèªãChatMLããšããæ°ãããã©ãŒãããã䜿çšãããŠããã
ããã¡ãã£ãšå©çšè åãã«è§£èª¬ãããšã質åè ãšAIã¢ã·ã¹ã¿ã³ãã®ä»ãŸã§ã®ããåããæž¡ãããšã§ãåçŸæ§ã®é«ãäŒè©±ã®çæããçµæã®æ€èšŒããããããªããŸãã
ããšãäœæã§ããã®ãããéããã§ãã
VisualStudio Code ã§è©Šã
REST APIã䜿ã£ãããšãªã人ã§ã詊ããããã«èª¬æããŠã¿ãŸãã
Windowsã§ãMacã§ãåãã¯ãã§ãã
OpenAIã®APIããã¡ãããååŸããŠãããŠãã ããã
ãŸãVisual Studio Codeã®æ¡åŒµæ©èœãREST Clientããã€ã³ã¹ããŒã«ããŸãã
é©åœãªãã©ã«ãã§ãhogehoge.rest ããã㯠hogehoge.http ãšãããã¡ã€ã«åã®ããã¹ããã¡ã€ã«ãäœæ
以äžã®ãããªãªã¯ãšã¹ããäœããŸãã{{OpenAI}}ã®ãšããã¯APIã®SECRET KEYïŒãã¢ã©ãŒããŒã¯ã³ïŒã§ããåæ±æ³šæã§ãã
# ãã®äžã®[Send Request]ãã¯ãªãã¯ãããšãªã¯ãšã¹ããé£ã³ãŸã
curl https://api.openai.com/v1/chat/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {{OpenAI}}' \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "JSONã®ãšã¹ã±ãŒãåŠçãGoogle Apps Scriptã§ïŒ"
}
]
}'
ãããªæãã®çµæãè¿ã£ãŠããŸã

200 OK ãè¿ã£ãŠããªã人ã¯ã以äžã®ç¢ºèªããé¡ãããŸãã
ãããã¯ãŒã¯ã®æ¥ç¶
OpenAIã¢ã«ãŠã³ãã®ç¢ºèªïŒããŒã¯ã³ã䜿ãåã£ãŠããªããïŒ
ãã¢ã©ãŒããŒã¯ã³ã®èª€ã
ãšã³ããã€ã³ããªã©ã®èª€ã
role, content çã®JSONæžåŒèª€ã
ãã¢ã©ãŒããŒã¯ã³ããœãŒã¹ã³ãŒãã«æžãããŸãŸãGitHubãªã©ã«çœ®ããªãããã«æ°ãã€ããŠãã ããã
Ctrl+Shift+P ã§ã³ãã³ããã¬ãããéããŠããSettings.jsonããšæã£ãŠããŠãŒã¶ã®èšå®ãéããŸãããã

"rest-client.environmentVariables": ãšããã»ã¯ã·ã§ã³ãäœããdevç°å¢ã®å€æ°{{OpenAI}}ãæžããŠãããŸãããã

ããããããšã§ãGitHubã®ãœãŒã¹ã³ãŒã管çäžã«ãã¢ã©ãŒããŒã¯ã³ãæžãã®ã§ã¯ãªããVisualStudio Codeã®ãŠãŒã¶ã®ç°å¢å€æ°ã«ä¿åããããšãã§ããŸãã
ãã®æ¹æ³ã䜿ãã°ãGitHubã¢ã«ãŠã³ããªã©ã§è€æ°ã®PCã䜿ã£ãŠããŠãåæã§ããŸãããCtrl + Alt + E ã§ç°å¢ãåãæ¿ããããšãç°¡åã«ã§ããããã«ãªããŸãïŒå³äžã«è¡šç€ºãããŠããŸãïŒã
ããŠãããã²ãšã€ã ã ChatGPT APIãããå®éšãããŠãGASã®é¢æ°ã«å ¥ããŸãããã
curl https://api.openai.com/v1/chat/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {{OpenAI}}' \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{ "role": "user",
"content": "ç¶èŠªã®åœ¹å²ãç®æ¡æžãã§3ã€æããŠãã ããã"
},
{
"role": "assistant",
"content": "\n\n1. åäŸãã¡ã®è²æãæè²ã®ãµããŒã\n2. å®¶åºãšç€ŸäŒãšã®ä»²ä»åœ¹ãšããŠãå®¶æãå°å瀟äŒã®åé¡ã解決ãã圹å²\n3. å®¶èšç®¡çãå®¶æã®å¥åº·ç®¡çã«é¢ãã責任ã®äžéšãæ
ãã"
},
{
"role": "user",
"content": "äžèšã®è²ãéžãã çç±ãæããŠãã ããã"
}
]
}'
ãã®ãããªã³ã³ããã¹ããèæ
®ããååããè¡ãããšãã§ããŸãã
messageé
åã®2ã€ç®ã®contentã¯å®éã«ChatGPTãåºåããŠããAIã¢ã·ã¹ã¿ã³ãã®åçãšããŠã®æååã§ãã3ã€ãã®èŠçŽ ã¯ãããŠåçãç¡èŠãããŠãŒã¶ã®è³ªåã§ãã
ãã®ããã«ãããŒã«ãèšå®ããããšã§ããªããã®ãããªåçãããã®ããæ€èšŒãããããªããŸãããã«ãŒã«ãªã©ãæžãããããªããŸãããã®å
ã®åçã®ç²ŸåºŠãäžããããšãã§ããŸãã
Google Apps Script - Spreadsheet颿°ã§ã®å©çš
以äžã¯ãGoogle Apps Scriptã§ã®ã³ãŒãã§ãã
ã¹ãã¬ããã·ãŒãäžã§ã=ChatGPT(B1)ããšãã£ã圢åŒã§å©çšã§ããããã«ãªããŸãã
Try, Catchã䜿ã£ãŠããå®å
šã«ååããããŠããŸãã
function ChatGPT(text){
let ret = "";
let prop = PropertiesService.getScriptProperties();
let apikey = prop.getProperty("OpenAI-APIKEY"); //ã¹ã¯ãªããããããã£ã«ãã®ååã§ä¿åããŠãããŠãã ãã
var url = "https://api.openai.com/v1/chat/completions";
let header = {
"Authorization":"Bearer "+ apikey,
"Content-type": "application/json",
}
let payload = {
"model": "gpt-3.5-turbo",
"max_tokens" : 2048, //turboã®æå€§å€ã¯4096ãŸã§ãä»ã¯2048ãæ¶è²»ããtokenã¯å
¥åããæç« ã®tokenãå«ãã®ã§ã倧å¯è±ªã§ãã£ããšããŠãæ§ããã«ããŠãããã»ããããã
"temperature" : 1.0,
"messages": [{"role": "user", "content": escapeAll(text)}] //ãã®é¢æ°ã«ã€ããŠã¯åŸã»ã©è§£èª¬ããŸã
}
let options = {
"muteHttpExceptions" : true, //ãšã©ãŒãå¶åŸ¡ãããå Žåã¯ãã¡ããfalse
"headers": header,
"method": "POST",
"payload": JSON.stringify(payload)
}
try { // Try, Catchã䜿ã£ãŠããå®å
šã«
const response = UrlFetchApp.fetch(url, options);
// Logger.log(response.getContentText());
const res = JSON.parse(response);
ret += res.choices[0].message.content.trim();
//Logger.log(ret);
} catch (e) {
ret += "[Error] "+ e.message; // ãšã©ãŒæååãäžèŠãªå Žåã¯ãã¡ããã³ã¡ã³ãã¢ãŠã
Logger.log(ret);
}
return ret;
}
GASç·šéç»é¢ã®å·Šããã OpenAI-APIKEYãšããååã® ã¹ã¯ãªããããããã£ãäœæããŠAPI Secretãå®å
šã«ç®¡çããŸãããã
ïŒãšã¯ããããã®ã¹ãã¬ããã·ãŒãã®åæ±ãã«ãã£ãŠã¯éåžžã«å±éºã§ãïŒ
OpenAIã®ããã·ã¥ããŒã Billing > Usage Limits ããäžéãèšå®ããããšãã§ããŸãã
ããŠããã®é¢æ°ã®äžã«ãããã«ä»¥äžã®æååããšã¹ã±ãŒããã颿°ã远å ããŠãã ããã
function escapeAll(jsonString="JSONã®ãšã¹ã±ãŒãåŠçãGoogle Apps Scriptã§:") {
return jsonString.replace(/[\"\\\n\r\t\b\f\']/g, function (match) {
switch (match) {
case '"': return '\\"';
case '\\': return '\\\\';
case '\n': return '\\n';
case '\r': return '\\r';
case '\t': return '\\t';
case '\b': return '\\b';
case '\f': return '\\f';
case '\'': return '\\\'';
}
});
}
ã¹ãã¬ããã·ãŒããšGASã«ãããJSONã§ã¯åŒçšç¬Šãã:(ã³ãã³)ããæ¹è¡ã³ãŒãã¯èª€åäœã®åå ã«ãªããŸãã®ã§ãå±ãªããã®ã¯æç€ºçã«åé¿ããŠããŸãã
JSON.stringfy(text)ã䜿ãããšã§åé¿ã§ããã¯ããªã®ã§ãããããã§ããã£ããã®äžã§ã©ããªæååãå±éºãªåäœããããã¯ããããªãã®ã§ãããäžå¯§ã«æžããã»ãããããããããŸããïŒãã®ã³ãŒãã¯ChatGPTãçæããŠããŸããããããªæžãæ¹ããã£ãŠå匷ã«ãªããŸãïŒã
GAS ã§äœ¿ã£ãŠã¿ãèå¯
ãã®ã³ãŒãã倧ããªã¹ãã¬ããã·ãŒãã§äœ¿ããš[Error]ã衚瀺ãããããšããããŸãã
=If(Left(ChatGPT(A1),7)="[Error]",...) ãšãã£ã圢ã§åé¿ããããšããå§ãããŸãã
çç±ã®å€ãã¯(衚瀺ããããšã©ãŒã芳枬ãããšããããŸãã)
Google â OpenAI ãžã®ãªã¯ãšã¹ããå€ããã
ååãã®ããã®ããŒã¯ã³ãè¶³ããªã
è§£éã§ããªãæååãæ··å ¥ãã
âŠãšãã£ãã±ãŒã¹ã§ããããšãããã£ãŠããŸãã
ãªã¯ãšã¹ããå€ãããã®ã¯ããã®ãããªGAS颿°ã§ã®å®è£
ã§ãçæéã«åäžIPã¢ãã¬ã¹ãã倧éã®ãªã¯ãšã¹ããçºãããããšãã«èµ·ããŸãã
å®éã«ã¯ãªããŒããåèšç®ãåæç»ã®éã«ã³ãŒã«ãããŸãã®ã§ãèªåã®è²¡åžãçãã®ã§ã倧éã«ãã®é¢æ°ã䜿ãããšã¯ããããã§ããŸããã
ïŒä»ã®æ¹ã®ããã°ãªã©ã§Spreadsheetã§ãã®ãããªGPTã®APIãå©ãäŸãèŠãããã®ã§ããïŒ
éçºäžã¯ã»ã«ããçŽæ¥äœ¿ã£ãŠå®éšããå®å®ããŠãããã»ã«ããåŒã³åºãã®ã§ã¯ãªããåŠçã®äžã§åŒã¶ãããããããããããŸããã
Google Sheetsã«å€§éã®GPTå©çšé¢æ°ãé
眮ãããšããåäžæéå
ã®åäžIPã¢ãã¬ã¹ããã®å¶éãšã©ãŒããšããå
容ã®ãšã©ãŒã§æ¢ãŸããŸãã
ãæ¢ãŸã£ãŠãããŠãããããããªã®ã§ãããææããŒã¯ã³ãç¡é§ã«æ¶è²»ããªãããã®ã»ã«ã®çµã¿æ¹ãªã©ã¯éèŠãããããªãã§ããã
äŸãã°ãäžã®ããã«IFæã§åºåããšãã1è¡ã§äœåºŠãGPT颿°ãã³ãŒã«ããªãããã«ãããšããåŠçãçµãã£ãã»ã«ã¯æååã«çœ®ããªãããŠãããšãã§ããã
ãªãååãæã®ããŒã¯ã³ã¯æå€§2048ãšãªã£ãŠããŸãããturboã®æå€§ã¯4096ã«æ¡åŒµãããŠããŸãã
completionsã§ã®åããããã¯ãååãã«ã€ããããã³ãããšããŠã®æååãšãåçãšããŠåºåãããæååã®äž¡æ¹ã§åèš4096ãšãªãããã«çŽããªããšããšã©ãŒã«ãªãããã§ãã
ãŸãšã
ChatGPT APIã¯å®ããŠæ©ããŠäŸ¿å©
Visual Studio Code + REST Client ã䜿ã£ãŠç°¡åã«å®å šã«å®éšã§ããŸã
Try-Catchã䜿ã£ãå®å šãªååã
Google Spreadsheet ã®ã»ã«ã§å©çšã§ãã颿°ã¯ã³ãŒã«ãããããŠãã¶ãªã
ãšã¯ããã»ã«ãã¹ã¯ãªããã®çµã¿æ¹ã§ããããªäœ¿ãæ¹ãã§ããã
æ¥åã ãã§ãªããTwitterBotã AI VTuber(AITuber)ã«ã䜿ãããã§ããïŒ
â
ãã®èšäºã¯Zennã§åçš¿ãæžããŠããŸãã
ãã¡ãã®æžç±ããããããé¡ãããããŸã