GASでChatGPTへリクエストを送信するコード

当サイトではアフィリエイト広告を利用して商品を紹介しています。

UnsplashJonathan Kemperが撮影した写真

正確にはOpenAIのAPIへリクエストを送信して、値を受け取るコードです。
こちらもChatGPTに出力してもらいました。

使用するにあたり、APIのkeyの発行が必要です。
プロパティストアにCHAT_GPT_SECRET_KEYとして保存してましょう。
トークンの発行はOpenAIのページからできます。


CHAT_GPT_MODEL_NAME は text-davinci-003 などを指定。
指定が異なると性能が変わります。
リスト
CHAT_GPT_MODEL_TEMP は0.5などを指定

この設定がなにかもChatGPTに訪ねてみると次のような回答を得ました。

temperature とはなんですか?

temperature とはなんですか?

GPT(Generative Pre-trained Transformer)などの自然言語処理における言語モデルでは、temperature(温度)というパラメータが使われます。このパラメータは、生成される文章の多様性を制御するために用いられます。

具体的には、生成される文章にランダム性を加えるために、温度パラメータによって確率分布を歪めます。温度が高い場合、確率分布はより平坦になり、生成される文章はより多様になります。一方、温度が低い場合、確率分布はより尖り、生成される文章はより具体的で限定された内容になります。

温度の値は通常、0.5から1.0の範囲で設定されますが、実際にはデータやタスクによって適切な値は異なります。適切な温度を選択することで、生成される文章の質や多様性を調整することができます。

ClassGPT3

/**
 * GPT-3とGoogle Sheetsを連携するクラス。
 */
class GPT3 {
  /**
   * @param {string} secretKey - OpenAI APIのSecret Key。
   * @param {string} modelName - GPT-3のモデル名。
   * @param {number} modelTemp - GPT-3のtemperature設定。
   */
  constructor(secretKey, modelName, modelTemp) {
    this.secretKey = secretKey;
    this.modelName = modelName;
    this.modelTemp = modelTemp;
  }

  /**
   * GPT-3にテキストを送信し、応答を返す。
   * @param {string} prompt - 送信するテキスト。
   * @param {number} maxTokens - 応答の最大トークン数。デフォルトは30。
   * @return {string} - GPT-3からの応答。
   */
  request(prompt, maxTokens = 30) {
    const url = "https://api.openai.com/v1/completions";
    const payload = {
      model: this.modelName,
      prompt: prompt,
      temperature: this.modelTemp,
      max_tokens: maxTokens,
    };

    const options = {
      contentType: "application/json",
      headers: { Authorization: "Bearer " + this.secretKey },
      payload: JSON.stringify(payload),
    };

    const res = JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
    return res.choices[0].text.trim();
  }
}

/**
 * プロパティストアからAPIキー、モデル名、温度パラメータを取得してオブジェクトを返す
 * @return {Object} APIキー、モデル名、温度パラメータを含むオブジェクト
 */
function getSecrets_() {
  const properties = PropertiesService.getScriptProperties();
  const secretKey = properties.getProperty("CHAT_GPT_SECRET_KEY");
  const modelName = properties.getProperty("CHAT_GPT_MODEL_NAME");
  const modelTemp = parseFloat(properties.getProperty("CHAT_GPT_MODEL_TEMP"));
  return { secretKey, modelName, modelTemp };
}

/**
 * プロパティストアからAPIキー、モデル名、温度パラメータを取得してGPT3インスタンスを生成する
 * @return {GPT3} GPT3インスタンス
 */
function createGPT3() {
  const { secretKey, modelName, modelTemp } = getSecrets_();
  return new GPT3(secretKey, modelName, modelTemp);
}

/**
 * GPT-3にテキストを送信して、GPT-3からの応答を取得する関数
 * @param {string} text GPT-3に送信するテキスト
 * @param {number} maxTomens GPT-3から受け取るテキストの最大トークン数。省略可能(デフォルトは1000)
 * @return {string} GPT-3からの応答テキスト
*/
function callGPT(text, maxTomens = 1000) {
  const gpt3 = createGPT3()
  const resText = gpt3.request(text, maxTomens)
  return resText
}

使い方

関数callGPTに対して引数として、質問を渡します。
GASで作っているので、スプレッドシートの関数としても呼び出すことが可能です。

ChatGPT

Posted by sochan