2024/11/28

つないでみよう:#24)GPT4o Structured Outputs - 活用事例 ②

今回も Structured Outputs を使用した事例の紹介です。

前回に続いて『ノーツ・しこく・フェスタ 2024:AIとNotes/Domino 禁断のコラボ ~ 生成 AI 実装事例集』で紹介したサンプルで、『AI が導く、次世代の学習体験 - AI Learning』です。


サンプルアプリと Structured Outputs の役割

利用者が学習のテーマと目標を入力し、学習をスタートさせます。すると、AI がテーマに沿ったコンテンツを生成するアプリで、e-Learning コンテンツ生成の非効率改善にチャレンジするサンプルです。

生成されるコンテンツは次のような構成でした。

まず、全体のタイトルとコンテンツに分かれます。コンテンツは複数のセクションが存在し、それぞれのセクションはタイトルと本文で構成されます。そして、本文内にはキーワードがリンクで表されています。


Structured Outputs の設定

上記のような構造を要求する Structured Outputs として、次のように定義しました。

AI Learning)リクエスト(response_format のみ)
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "document",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "capter": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {"type": "string"},
                "contents": {
                  "type": "array", "items": {"type": "string"},
                  “description”: “1段落分の文章を出力します。次の段落がある場合次の配列要素に出力します。"
                }
              },
              "required": ["title", "contents"],
              "additionalProperties": false
            }
          },
          "keywords": {
            "type": "array", "items": {"type": "string"},
            “description”: “keywords には contents 内に存在するキーワードを列挙します。"
          },
          "subject": {
            "type": "string",
            “description”: “subject には capter 内を要約して20文字以内の簡潔なタイトルをセットします。"
          }
        },
        "required": [
          "capter",
          "keywords",
          "subject"
        ],
        "additionalProperties": false
      }
    }
  }

トップレベルのノードとして capter、keywords、subject の 3 つを定義しており、capter ノードに title、contents のサブノードが存在する階層構造になっています。

図式化すると、次のようになります。

capter ノードの型(type)は object となっており、それが配列となるようにしています。セクションとタイトルのセットが AI が必要と考える回数分繰り返される(= 配列)ようにしています。


レスポンス

上述のリクエストの結果は次の通りでした(コンテンツ部分は一部省略)。

AI Learning)レスポンス
{
  "capter": [
    {
      "title": "ピザの作り方",
      "contents": [
        "ピザの作り方は以下のステップで行います。…"
      ]
    },
    {
      "title": "飲食店でのコスト構造",
      "contents": [
        "飲食店のコスト構造は主に以下のように分類されます。…"
      ]
    },
    {
      "title": "経営上の課題",
      "contents": [
        "飲食業を成功させるために直面する経営上の課題は多岐に渡り…"
      ]
    }
  ],
  "keywords": [
    "ピザ",
    "飲食店",
    "コスト構造",
    "経営課題",
    "HCL Domino"
  ],
  "subject": "ピザ屋運営の基礎知識"
}

少し複雑な JSON となっていますが、リクエストとレスポンスを対比するとよくわかります。capter ノード配下に title と contents のセット(= オブジェクト)が 3 つ分、配列で出力されているということですね。


まとめ

今回は、オブジェクトを配列として返し、階層構造となる JSON を返す Structured Outputs の例を紹介しました。応用次第で AI と複雑で密な連携ができそうです。


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


0 件のコメント:

コメントを投稿