2024/07/17

つないでみよう:#16)GPT4o で画像認識 - 送信する JSON と作成 ①

今回は GPT4o に送信する JSON を作成します。フォーマットは GPT3.5 の場合とほぼ同様ですが、画像が含まれる点が大きく変わります。


JSON のフォーマット

GPT4o に送信するフォーマットの全体構成は、次の通りです。

{
   "model": "gpt-4o-2024-05-13",
   "messages": [
      {
         "role": "system",
         "content": "・・・(AI の役割)・・・"
      }
,
      {
         "role": "user",
         "content": [

            {
               "type": "text",
               "text": "・・・(リクエスト)・・・"
            }
,
            {
               "type": "image_url",
               "image_url": {
                  "url": "data:image/jpeg;base64,{・・・(送信する画像)・・・}"
               }
            }

        ]  
      }
   ]
}

まず、role が system となっている部分です(青字)。この指定に続く content ノードで AI の役割を指示できます。

続いて、こちらからのリクエストにあたる role が user の部分(赤字)です。今回は、質問内容(テキスト)と認識させる画像の2つを同時に送信します。そのため、content ノードは [ ] を使い配列となっています。

配列の中身は、type ノードで送信するデータの種類、次のノードでデータを指定します。type の指定は text で文字列(紫の文字)、image_url で画像(赤紫の文字)となります。


送信する JSON の作成

上記フォーマットに従い JSON を作成する関数を作ります。前回のメインルーチンからコールされる xGetJSON 関数で、引数の vnd は質問や画像を入力した文書です。

Function xGetJSON(vnd As NotesDocument) As String
   Dim jnav As NotesJSONNavigator
   Dim jaMsg As NotesJSONArray
   Dim joMsg As NotesJSONObject
   Dim jaCnt As NotesJSONArray
   Dim joCnt As NotesJSONObject
   Dim jo As NotesJSONObject
   Dim s As String
   Dim sBase64 As String

   'RequestBody(JSON) の準備
   Set jnav = xns.CreateJSONNavigator("")

   'Lv1. model
   Call jnav.AppendElement("gpt-4o-2024-05-13","model")

   'Lv1. message
   Set jaMsg = jnav.AppendArray("messages")

   'Lv2. system role
   Set joMsg = jaMsg.AppendObject()
   Call joMsg.AppendElement("system", "role")
   Call joMsg.AppendElement(vnd.System_Content(0), "content")


   'Lv2. user role
   Set joCnt = jaMsg.AppendObject()
   Call joCnt.AppendElement("user", "role")

   Set jaCnt = joCnt.AppendArray("content")


   'Lv3. Request
   Set joCnt = jaCnt.AppendObject()
   Call joCnt.AppendElement("text", "type")
   Call joCnt.AppendElement(vnd.User_Content(0), "text")


   'Lv3. Request(Picture)
   Set joCnt = jaCnt.AppendObject()
   Call joCnt.AppendElement("image_url", "type")

   sBase64 = xAttachmentToBase64(vnd, "Body")
   s = "data:image/jpeg;base64,{" & sBase64 & "}"
   Set jo = joCnt.Appendobject("image_url")
   Call jo.AppendElement(s, "url")


   xGetJSON = jnav.Stringify
End Function


次回の予告

上記関数内の xAttachmentToBase64 は添付された画像ファイルを Base64 に変換し、文字列で返す関数です。次回はこの関数を紹介します。


前回 連載:つないでみよう 次回


0 件のコメント:

コメントを投稿