メむンコンテンツぞスキップ
芋出し画像

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)をより安党快適に䜿いたしょう。


    画像
    =ChatGPT(A1) ずするず 

    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日は保管される)。

    たた䌁業など専甚むンスタンスはAzureに眮くこずができる。 pic.twitter.com/D3I7kebh5F

    — Dr.(Shirai)Hakase #AI神絵垫本 #GREEVRStudioLab (@o_ob) March 4, 2023

    その他の違いずしおは、

    • 埓来はオプトアりト(申請するこずで利甚されない)だった→ChatGPI APIはオプトむン圢匏(申請しない限り利甚されない)でモデルの改善に利甚されないこずになった(法的監芖で30日は保管される)

    • 䌁業など専甚むンスタンスはAzureに眮くこずができる

    • 埓来方匏に代わりメタデヌタず䞀緒にメッセヌゞのシヌケンスを消費。

      • 内郚では入力はモデルが消費するトヌクンの぀ながりずしおモデルにレンダリングされる。チャットマヌクアップ蚀語「ChatML」ずいう新しいフォヌマットが䜿甚されおいる。

        • もうちょっず利甚者向けに解説するず、質問者ずAIアシスタントの今たでのやり取りを枡すこずで、再珟性の高い䌚話の生成や、結果の怜蚌がしやすくなりたす。

    あず、䜓感で「ものすごく速い」です。

    VisualStudio Code で詊す

    REST APIを䜿ったこずない人でも詊せるように説明しおみたす。
    WindowsでもMacでも動くはずです。
    OpenAIのAPIをこちらから取埗しおおいおください。

    1. たずVisual Studio Codeの拡匵機胜「REST Client」をむンストヌルしたす。

    2. 適圓なフォルダで、hogehoge.rest もしくは hogehoge.http ずいうファむル名のテキストファむルを䜜成

    3. 以䞋のようなリク゚ストを䜜りたす。{{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」ず打っお、ナヌザの蚭定を開きたしょう。


    画像
    意倖ず探すのが倧倉な settings.json 

    "rest-client.environmentVariables": ずいうセクションを䜜り、dev環境の倉数{{OpenAI}}を曞いおいきたしょう。

    画像
    お忙しい人は 1,2,7,8,9,16,17行目だけで倧䞈倫です

    こうするこずで、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で原皿を曞いおいたす。
    こちらの曞籍もよろしくお願いいたしたす


     
     
    過去の未来から来た、ホワむトハッカヌ䜜家。 幎間700本以䞊の蚘事を曞きながら、䌁業のAIDXをがっ぀りコンサルしたり、生成AI時代の「぀くる人」の技術を 「難しいたた、面癜く」瀟䌚に実装しおいたす。 講挔䟝頌なども歓迎です https://akihiko.shirai.as