今回も 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 件のコメント:
コメントを投稿