ChatGPTでほぼ無限に文章を書かせる方法 [GAS]

ChatGPTに長い文章を書かせようとしてもToken数の限界があり、普通では長い文章を書かせることはできない。

ただ、ChatGPTのChat機能をうまく使うことで、ほぼ無限に長い文章をかかせることができる

ここではGoogle DocとGASを利用している

目次

1.OpenAPIのAPIトークンを入手

https://platform.openai.com/

でアカウントを作成し、ログイン。右上のメニューからView API Keyを取得し控える

2.Google Doc+GASにコード実装

Google Docを開き、新規作成して新しいDocを作成する

メニューの拡張機能→App Scriptを開く

下記コードを貼り付けて、保存する

function onOpen() {
   DocumentApp.getUi().createMenu("ChatGPT")
    .addItem("ChatGPT", "myFunction")
    .addToUi();
}

function myFunction() {
    var doc = DocumentApp.getActiveDocument()
    var selectedText = doc.getSelection().getRangeElements()[0].getElement().asText().getText()
    var body = doc.getBody()

    var apiKey = "ここにAPIキーを貼り付ける";
    
    var message_array = [{'role':'user', 'content':selectedText}]

    //chat
    var model = "gpt-3.5-turbo"
    temperature= 0.9
    maxTokens = 300
    top_p = 1
    frequency_penalty = 0
    presence_penalty = 0.6

  var maxcount = 8
  var prompt_continue = '続けて'
  for(let i=0;i<maxcount;i++){


    // Set up the request body with the given parameters
    const requestBody = {
      "model": model,
      "messages": message_array,
      "temperature": temperature,
      "max_tokens": maxTokens,
      "top_p": top_p,
      "frequency_penalty": frequency_penalty,
      "presence_penalty": presence_penalty,
    };

    const requestOptions = {
      "method": "POST",
      "headers": {
        "Content-Type": "application/json",
        "Authorization": "Bearer "+apiKey
      },
      "payload": JSON.stringify(requestBody)
    }

    const response = UrlFetchApp.fetch("https://api.openai.com/v1/chat/completions", requestOptions);
    // Parse the response and get the generated text
    var responseText = response.getContentText();
    var json = JSON.parse(responseText);
    Logger.log(json)

    var res = json['choices'][0]['message']['content']

    var temp_arr = {'role':'assistant', 'content':res}
    message_array.push(temp_arr)
    var temp_arr = {'role':'user', 'content':prompt_continue}
    message_array.push(temp_arr)

    output = output + res
    Utilities.sleep(2000)
  
  }
  para = body.appendParagraph(output)

}

Google Docに戻ると、メニューのCHATGPTというメニューが追加されているはず。初回実行時は警告画面がでる。コードの実行を許可する

chatGPTに書いてもらいたいことや質問内容をGoogle Docに書き、その文章をすべて選択状態にする

質問内容が選択されている状態で、先程メニューにできた「chatGPT」ボタンを押すと処理が始まるのでしばらく待つ

処理が終了すると文章ができあがる

コードで実行している内容まとめ

なぜ長い文章が作れるのか?だが、それはChatGPTから返ってきた答えに対してひたすら「続けて」というリクエストを投げているため。ChatGPTのチャット機能では「続けて」とリクエストすると続きを書いてくれる。

コードでは8回「続けて」とforで繰り返しているので、この8を変更すれば無限に文字が出てくる。ただしあまりにも早くレスポンスを投げつけてしまうと500エラーがでるので、Utilities.sleepで2秒待たせている

GASで登録したコードでやっていることは以下の通り

doc.getSelection().getRangeElements()[0].getElement().asText().getText()で選択された文章を取得

ChatGPTのモデルを「gpt-3.5-turbo」に指定してチャットができるように設定

temperatureなどの各種パラメータを設定

https://api.openai.com/v1/chat/completionsに内容を送信。チャットAPIはv1/chat/completionsであることに着目

チャット機能で続きを書いてほしい場合は、リクエスト内の”messages”にこれまでのやり取りも全部含める必要があるので、pushで配列に追加し、ChatGPTからもらった返答とこちらの依頼内容も含めている

変数outputにこれまでのChatGPTからの返答をまとめ、最後にGoogleDocに出力している

参考:https://ai-create.net/magazine/2023/03/02/post-10647/

参考:https://note.com/masaru21/n/n47819b597c8b

参考:https://www.youtube.com/watch?v=81SQvQ_Sjdw

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です