ChatGPT APIを扱う基本のGAS

この記事では、Google Apps Script (GAS) を使用して、OpenAI の ChatGPT API を使ってテキストを生成する方法について説明します。

## ChatGPT APIとは？
ChatGPT API は、OpenAI が提供する自然言語処理の API の1つで、テキストの自動生成を行うことができます。GPT（Generative Pre-trained Transformer）は、大規模なテキストデータセットを学習して、そのデータセットに基づいてテキストを生成するニューラルネットワークのモデルです。ChatGPT API は、このモデルをベースにして、会話形式のテキスト生成を行うことができるようにしたものです。

## 動作環境
この記事で紹介するコードは、GAS 上で動作します。GAS は、Google スプレッドシートや Google フォームなどの Google アプリケーション上で JavaScript を使ってスクリプトを作成することができるサービスです。この記事では、GAS を使用して ChatGPT API を扱います。

## ChatGPT APIの使い方
ChatGPT API を使うには、まず OpenAI のアカウントを作成して、API キーを取得する必要があります。次に、GAS 上で以下のようなコードを実装します。

```
function gptTurbo(messages, temperature, apiKey) {

  var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + apiKey
  };
  var payload = {
    "model": "gpt-3.5-turbo",
    "messages": messages,
    "temperature": temperature
  };
  var options = {
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify(payload),
    "muteHttpExceptions": true
  };
  try {
    var response = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', options);
    Logger.log(response)
  } catch (e) {
    // 例外エラー処理
    Logger.log('Error:')
    Logger.log(e)
  }
  var data = JSON.parse(response.getContentText());
  return data;
}
```
このコードは、gptTurbo という関数を定義しています。この関数は、以下の3つの引数を受け取ります。

- `messages`：話者である`role`と会話内容である`content`からなる会話記録オブジェクトの配列。
- `temperature`：生成されるテキストの多様性を制御するためのパラメータ。数字が0に近づくほど回答が決定論的になる
- `apiKey`：OpenAI の API キー。

この関数は、OpenAI の ChatGPT API に POST リクエストを送信し、生成されたテキストを返します。以下では、各引数について説明します。

### messages
`messages` は以下のような形式のオブジェクトの配列からなっています。
```
[
  { "role": "user", "content": "こんにちは" },
  { "role": "assistant", "content": "こんにちは。ご用件は何でしょうか？" },
  { "role": "user", "content": "今日の天気を教えてください" },
  { "role": "assistant", "content": "今日の天気は曇りです。" }
]
```
各オブジェクトは、2つのプロパティ `role` と `content` を持ちます。`role` は、話者の役割を表す文字列で、`content` は話者が発言したテキストを表す文字列です。

### temperature
`temperature` は、生成されるテキストの多様性を制御するためのパラメータです。値が高いほど、生成されるテキストが多様になります。一方、値が低いほど、生成されるテキストはより予測可能になります。通常、0.5 から 1.0 の範囲で設定することが推奨されています。

### apiKey
`apiKey` は、OpenAI の API キーを表す文字列です。このキーは、OpenAI の Web サイトでアカウントを作成することで取得できます。API キーは、OpenAI API にアクセスするための認証情報として使用されます。

## 実行例
以下は、`gptTurbo` 関数を使用して、会話を生成する例です。
```
function testGptTurbo() {
  var apiKey = "YOUR_API_KEY";
  var messages = [
    { "role": "user", "content": "こんにちは" },
    { "role": "assistant", "content": "こんにちは。ご用件は何でしょうか？" },
    { "role": "user", "content": "今日の天気を教えてください" },
    { "role": "assistant", "content": "申し訳ありませんが、私はあなたの地域を知ることができません。" }
    { "role": "user", "content": "残念です" }
  ];
  var temperature = 0.2;
  var response = gptTurbo(messages, temperature, apiKey);
  Logger.log(response.choices[0].message.content);
}
```

```
/*レスポンスの例(トークン数やidはデタラメな値を入れています)
{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': '申し訳ありません。それでも何かお手伝いできることがあれば、遠慮なくおっしゃってください。'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}*/
```
この例では、`messages` 配列に5つのメッセージを設定し、`temperature` を 0.2 に設定しています。また、`apiKey` には自分の API キーを設定してください。この例では、`gptTurbo` 関数の戻り値である JSON オブジェクトの `choices[0].message.content` をログに出力しています。`choices[0].message.content` は、生成されたテキストを表すプロパティです。

## おわりに
この記事では、GASとChatGPT API を組み合わせる方法について説明しました。APIによる挙動をこのようにコーディングしてあとでライブラリとして読み込めば、自動応答システムやチャットボットなど、さまざまなアプリケーションの開発が容易に進みます。なお、本記事を書いた私は非IT職であり、本記事もChatGPTにサポートしてもらいながら作成しておりますが、技術上の誤りがあれば指摘していただけると助かります。

## 参考
[OpenAI API documentation](https://platform.openai.com/docs/introduction)