GPT-4V APIの使い方!画像解析LINE BotのGASコード全文

パソコンの小ワザ

2023年11月6日、OpenAIは画像の認識や分析が可能なマルチモーダルAI「GPT-4 Vision」のAPIを公開した。

本記事では、Google Apps ScriptとMessaging APIを使って、画像解析LINE Botを作る。

スポンサーリンク
スポンサーリンク

完成イメージ

LINEアカウントに画像を送信すると、その説明を返す。

処理の流れ

全体の流れは以下の通りだ。

  1. WebhookでLINEアカウントに対して送信されたメッセージを取得
  2. メッセージタイプを判定し、画像であれば処理続行。そうでなければエラーメッセージを返信
  3. messageIdから画像を取得
  4. 画像をbase64エンコードする
  5. GPT-4 Vision APIにエンコードした画像とプロンプトを投げる
  6. 応答をLINEに返信する
スポンサーリンク

設定方法など

事前準備や設定方法は以前の記事の内容と全く一緒なので割愛。

コード全文

Google Apps Scriptのエディタに以下のコードを貼り付ける。APIキーやLINEアクセストークンは、取得した文字列に書き換える必要あり。

const OPENAI_APIKEY = "sk-xxxxxxxxxx"; // 自身のAPIキーに書き換える
const LINE_ACCESS_TOKEN = "xxxxxxxxx"; // 自身のアクセストークンに書き換える
const PROMPT = "300文字以内でこの画像を説明してください" // 与えたいプロンプトを入力する

function doPost(e) {
  let fromLineData = e.postData.contents; // LINEから受信したデータ
  let receiveData = JSON.parse(fromLineData);
  let replyToken = receiveData.events[0].replyToken; // replyToken
  let messageType = receiveData.events[0].message.type; // messageType
  let messageId = receiveData.events[0].message.id; // messageid

  let botAnswer; // 返信メッセージ用変数
  // メッセージタイプの判定
  if (messageType == 'image') {
    // 画像が送られた時
    let Url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content"; //messageIdから画像取得用URLの作成
    // 送信された画像取得
    let image = UrlFetchApp.fetch(Url, { 
      "headers": {
        "Content-Type": "application/json; charset=UTF-8",
        "Authorization": "Bearer " + LINE_ACCESS_TOKEN,
      },
      "method": "get"
    });
    let imageData = image.getContent();
    let base64Image = Utilities.base64Encode(imageData); // 取得した画像をBase64エンコード
    botAnswer = callOpenAiApi(base64Image); // OpenAI APIを呼ぶ関数(エンコード済み画像を渡す)
  } else {
    // 画像以外が送られた時
    botAnswer = "画像以外には応答できません。";
  }
  // 返信用関数を呼ぶ
  reply(replyToken, botAnswer);
}

// LINEへの返信
function reply(replyToken, replyMessage) {
  let replyUrl = "https://api.line.me/v2/bot/message/reply";
  let contents = {
    replyToken: replyToken,
    messages: [{ type: 'text', text: replyMessage }],
  };

  let options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + LINE_ACCESS_TOKEN
    },
    payload: JSON.stringify(contents)
  };
  UrlFetchApp.fetch(replyUrl, options);
}

// GPT-4V APIを呼び出す関数
function callOpenAiApi(base64Image) {
  let url = 'https://api.openai.com/v1/chat/completions';
  let options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + OPENAI_APIKEY,
    },
    payload: JSON.stringify({
      'model': 'gpt-4-vision-preview',
      'messages': [
        {
          'role': 'user',
          'content': [
            {
              'type': 'text',
              'text': PROMPT
            },
            {
              'type': 'image_url',
              'image_url': {
                'url': "data:image/jpeg;base64," + base64Image
              }
            }
          ]
        }
      ],
      'max_tokens': 500 // 返信の最大トークン数
    })
  };
  let response = UrlFetchApp.fetch(url, options);
  let responseMessage = JSON.parse(response).choices[0].message.content
  return responseMessage;
}

PROMPTやmax_tokens(返信の最大トークン数)は適宜変更すると良い。ただし、トークン単位での課金となるため、使い過ぎに要注意だ。

アイデア次第で可能性無限大

使ってみた感想としては、かなり正確に画像を認識してくれるという印象。

アイデア次第で面白いモノがたくさん作れそうだ。

皆様もぜひお試しあれ。

コメント

タイトルとURLをコピーしました