🌏

LINEからChatGPTを使いたいて思った話

2023/02/05に公開

前提

2023/02/05現在、ChatGPTに公開APIは存在しない...。 しかしChatGPTの開発を行っているOpenAI社には色々なAIサービスのAPIを提供しているみたいでした。
今回はその中から、ChatGPTと同じGPT3.5系の自然言語処理のモデルを利用しているText Completion(文章作成AI) を使って、ChatGPTライクなサービスをLINEから使えるようにしたいと思いました。
色々やり方はありそうですが、今回は手っ取り早く短時間で作りたいということでLINEとText Completionの中継役にはGAS(Google App Script)を採用しました。

2023/02/05現在ChatGPTにはAPIはないがOpenAI社はChatGPT APIを近日公開することを発表しておりAPIウェイトリストの登録ができる状態です
https://share.hsforms.com/1u4goaXwDRKC9-x9IvKno0A4sk30

概要

LINE Developersへの登録とMessaging APIのトークンの発行
OpenAIの登録とAPIキーの発行
GASで中継

①はLINE Developersのドキュメントをご覧いただければと思いますので当記事での説明は割愛させていただきます。

②も自分でできるかたは飛ばしていただいて構いません。ですが②で発行したOpenAIのAPIキーを使ってリクエストを送る際に一悶着ありましたので、そちらは気をつけていただきたなと思います。

・OpenAI 料金プラン
https://openai.com/api/pricing/

・Line messaging API 料金プラン
https://developers.line.biz/ja/docs/messaging-api/overview/#line-official-account-plan

OpenAIの登録とAPIキーの発行

①まずOpenAIのAPI公式サイトにてsignupを行います。メールアドレス、Google、Microsoftのいずれかで行うことができます。
登録後は無料プランに加入していることになっていると思います
https://auth0.openai.com/u/signup/identifier?state=hKFo2SBYZTNVcHJyMVI5Vm44bEo4WXFFakU0ZkRwQkFDekliYaFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIFlTY2lqX1lRTmo1ZXd0NU5mazZWMVh4Ul9tQXMzV2RPo2NpZNkgRFJpdnNubTJNdTQyVDNLT3BxZHR3QjNOWXZpSFl6d0Q

登録することができたらTOP画面が表示されると思います。

②次にTOP画面右上のPersonalから「View API keys」を選択し、APIキーを作成します。

Create new secret keyから作成します。
作成したキーは必ず保管してください。

無料プランで作成したAPIキーを使ってのリクエスト時にYou exceeded your current quota, please check your plan and billing detailsというエラーが出る件

無料プランで作成したAPIキーを使用した際にYou exceeded your current quota, please check your plan and billing detailsというエラーが出ました。
現在のクオータを超過しています。か...いまさっき登録したばかりですが...?

バグ?か仕様か分かりませんが調べてみると同様のケースのケースが多発しているようです。
https://tomo-web.jp/chat-gpt-you-exceeded-your-current-quota/

仕方がないのでアカウント管理画面からクレカ登録(プラン加入)と課金上限額の設定を行い再度APIキーを発行しました。
https://platform.openai.com/account/usage
https://platform.openai.com/account/billing/overview

・課金上限額の設定はこちらからお願いします。
https://platform.openai.com/account/billing/limits

GASの実装

LINE Messaging APIのトークンとOpenAIのキーが発行できましたらGASの実装に入ります。
ざっくり処理の流れは以下のようになります。
①LINEからmessageを送る(webhook)
②GAS発動(doPost関数)
③LINEのmessageをText Completion APIにリクエスト
④レスポンスをLINEに返却

下準備としてGASのプロジェクトの設定からスクリプトプロパティに発行したLINEとOpenAIのキーを設定してください

・完成コード

function doPost(e) {
  //webhookからのpushメッセージ
  const event = JSON.parse(e.postData.contents).events[0];
  //取得したデータから、応答用のトークンを取得
  const replyToken = event.replyToken;
  //requestMessageを取得
  const requestMessage = event.message.text;

  //設定したスクリプトプロパティを読み込む
  const OPEN_AI_KEY = ScriptProperties.getProperty('OpenAI_key');
  const LINE_KEY = ScriptProperties.getProperty('Line_key');
  //文章生成APIエンドポイント
  const OPEN_AI_END_POINT = 'https://api.openai.com/v1/completions';
  // メッセージ返信のエンドポイント
  const LINE_END_POINT = 'https://api.line.me/v2/bot/message/reply';

  //apiリクエストのheader情報を設定
  const openAiHeaders = {
    'Authorization':`Bearer ${OPEN_AI_KEY}`,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };

  //api設定パラメータ
  const openAiParams = { 
    'headers': openAiHeaders, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'text-davinci-003',//GPTモデルの設定パラメータ
      'max_tokens': 1024,//responceトークンの最大値
      'temperature': 0.6,//responceのレベル
      'prompt': requestMessage//repuest文章
    })
  }

  //requestを送る
  const res = JSON.parse(UrlFetchApp.fetch(OPEN_AI_END_POINT, openAiParams).getContentText());
  const replyMessage = res.choices[0].text;

  //APIリクエスト時にセットするペイロード値を設定する
  const linePayload = {
    'replyToken': replyToken,
    'messages': [{'type': 'text', 'text': replyMessage}]
  };

  //パラメータを設定
  const lineParams = {
    'payload': JSON.stringify(linePayload),
    'headers': {'Authorization': `Bearer ${LINE_KEY}`}, 
    'myamethod': 'POST',
    'contentType': 'application/json'
  };

  UrlFetchApp.fetch(LINE_END_POINT, lineParams);
}

LINEのmessageを受け取る関数名はdoPostと設定します。

Text Completionのパラメータについて

'payload': JSON.stringify({
  'model': 'text-davinci-003',//GPTモデルの設定パラメータ
  'max_tokens': 1024,//responceトークンの最大値
  'temperature': 0.6,//responceのレベル
  'prompt': requestMessage//repuest文章
})

https://platform.openai.com/docs/api-reference/completions
prompt以外のパラメータのざっとの認識ですが、

  • model: 自然言語処理のGPTモデルで 「text-davinci-003」が一番高性能 その他に性能順に
    text-curie-001、text-babbage-001、text-ada-001となっており性能が高いほど低速で高価格となる。 なのでコストを下げたい方はtext-ada-001を使用してください。

  • max_tokens: 基本的に1単語が1トークンとなる。 その最大値。日本語の場合はそうはいかず複雑になる。 playgroundでトークンを知ることができます。

  • temperature: 出力単語のランダム性(創造性)。0~1までの数値を入れる1に近づくほどより創造的な回答をする

ここまでできたらGASをwebアプリとしてデプロイしてURLをMessaging APIのwebhook urlに貼り付けと自動応答を「off」に設定で完成です。

最後にGoogleに対する気持ちを聞いてみた

スクリーンショット

リスペクトを欠かさない姿勢に感動しました。temperatureパラメータをもっとあげたらものすごい野望とかいうのかな...

課金が怖いので有料プランを解約、LINEのチャンネル削除、GASのプロジェクトを削除をする前にお別れの挨拶。

楽しかったさよなら(しっかり4円ほど課金されました)!

参考
GASでOpenAIのAPIを利用してChatGPTライクな文章生成する方法を解説
OpenAI API で提供されている GPT-3モデル まとめ
OpenAI GPT-3 APIの使い方を解説

Discussion