2024/12/07

つないでみよう:#番外)GPT4o Structured Outputs 活用事例 と dxlSuite

前回 #24)GPT4o Structured Outputs - 活用事例 ② で紹介したサンプルアプリ『AI が導く、次世代の学習体験 - AI Learning』で、AI が作成したコンテンツをどのようにノーツの文書に展開したかを紹介します。今回の内容は WebAPI の結果活用であり、"つながる" 部分ではないので "番外" としています。


フォームの構造

まずは、コンテンツフォームの設計です。

上部のグレーの部分は管理用の隠しフィールドで、ユーザ向けのフィールドはタイトル (Title) と本文 (Body) だけとなっています。

実際の文書は次のようになっています(画像は管理フィールドを表示して取得)。AI のレスポンスをリッチテキストに体裁よく表示させています。


本文の構造

通常の文字はフォントや文字サイズ、行間などを設定しつつ見栄えよく表示しています。キーワードとなるリンクは、ホットスポットのアクションで構成されています。

アクションは LotusScript で記述されており、クリックしたキーワードとそのキーワードが含まれる文章を引数にした関数が指定されています。

Sub Click(Source As Button)
   Call ClickKeyword("ピザ生地", "ピザの作り方は、まず材料を揃えることから始まります。基本の材料にはピザ生地、トマトソース、チーズ、そしてお好みのトッピングが挙げられます。")
End Sub

コールしている関数は、スクリプトライブラリに定義されています。

この関数は、引数を利用して過去のクリック履歴を確認、初回であれば AI に問い合わせ、履歴があればその時の結果の文書を開く機能になっています。

問い合わせする際には、クリックしたキーワードだけでなく、キーワードを含む文章を含めて送信しています。AI に送信しているリクエストだけを抜粋すると次のようになります。

『ピザ屋の運営』について学習しています。
学習のゴールは次の通りです。
ピザの作り方、飲食店でのコスト構造、経営上の課題を理解する
その中で『ピザの作り方は、まず材料を揃えることから始まります。基本の材料にはピザ生地、トマトソース、チーズ、そしてお好みのトッピングが挙げられます。』という文書があり、『ピザ生地』についてさらに詳しく教えてください。

これにより、AI が的外れな回答をしないようにしています。また、同じキーワードであっても段落が違えば別のコンテンツが生成されるようになります。


コンテンツのリッチテキスト化

このリクエストの返信は Structured Outputs の機能で、次のような JSON となります。

このレスポンスをリッチテキストに体裁よく表示したり、リンクを生成しているのが『DominoHub 2024 Osaka 大盛況 & DXL 拡張ライブラリリリース!』で紹介した dxlSuite for LotusScript です。

リンクを作成する部分を事例に dxlSuite の機能を紹介します。

リンクは、先ほど紹介した LotusScript のコードがセットされていること以外に、ホットスポットには境界線の指定がなく太字となっています。また、リンクが目立つように左右にスペースが入っています。

このリンクを作成する関数だけを抜粋すると次の通りです。

Function xDrawKeyword(voPar As DXL_Paragraph, ByVal vsKeyword As String, ByVal vsText As String)
   Dim oHS As DXL_HotSpot_Action

   'キーワードが段落の先頭でなければ、スペースを追加
   If voPar.GetText() <> "" Then
      Call voPar.AppendText_F(" ", xoFont_Body)
   End If

   'ホットスポットの作成(式は後で入れ替えるのでダミー)
   Set oHS = voPar.AppendHotSpot_Action(vsKeyword, "dummy")

   'ホットスポットのデザイン調整
   Call oHS.SetFont(xoFont_Keyword)
   oHS.ShowBorder = False

   'LotusScript のプログラムを準備
   Dim oCode As New DXL_Code(DXL.Code_LotusScript)
   Dim oLS As DXL_LotusScript

   Set oLS = New DXL_LotusScript()
   Call oLS.AppendScript(|Sub Click(Source As Button)|)
   Call oLS.AppendScript(|Call ClickKeyword("| & vsKeyword & |", | & xConvStr_LSString(vsText) & |)|)
   Call oLS.AppendScript(|End Sub|)
   Call oCode.ReplaceEvent("click", oLS)

   'ホットスポットのプログラムを準備した LotusScript に差し替え
   Call oHS.ReplaceCode(oCode)

   'キーワードの後ろにスペースを追加
   Call voPar.AppendText_F(" ", xoFont_Body)
End Function

引数の voPar が dxlSuite のオブジェクト DXL_Paragraph でリッチテキストの段落を表します。このオブジェクトにリンク手前の文章までがセットされた状態でこの関数に渡されるということになります。残りの引数は作成するリンクの情報です。

voPar 現在処理中のリッチテキストの段落を表すオブジェクト
vsKeyword 作成するリンクのテキスト(赤字
vsText リンクが含まれる文章(青字


リンクの追加

dxlSuite でリンクを作成する部分を順に解説します。

まず、AppendHotSpot_Action メソッドでリンクを作成します。戻り値はリンクであるホットスポットのアクションを表す DXL_HotSpot_Action のオブジェクトです。

   'ホットスポットの作成(式は後で入れ替えるのでダミー)
   Set oHS = voPar.AppendHotSpot_Action(vsKeyword, "dummy")

このメソッドは式言語のアクションを作成する機能がデフォルトです。今回は LotusScript のプログラムに後で入れ替えるため、適当な文字列 ”dummy” を式として指定しています。


リンクができあがったら、リンクの見た目を整えます。ホットスポットのオブジェクト oHS に対してフォントと境界線をなしにセットしています。

   'ホットスポットのデザイン調整
   Call oHS.SetFont(xoFont_Keyword)
   oHS.ShowBorder = False

なお、引数の xoFont_Keyword は、この関数外で事前に準備したリンク用のフォント情報で、メイリオ / 12 ポイント / 太字 / 青 となっています。

   With xoFont_Keyword
      .FontName = "メイリオ"
      .FontSize = 12
      .Bold = True
      .Color = DXL.Color_Blue
   End With


LotusScript のプログラムは DXL_LotusScript オブジェクトの AppendScript メソッドで 1 行ずつ追加して作成します。

   'LotusScript のプログラムを準備
   Dim oCode As New DXL_Code(DXL.Code_LotusScript)
   Dim oLS As DXL_LotusScript

   Set oLS = New DXL_LotusScript()
   Call oLS.AppendScript(|Sub Click(Source As Button)|)
   Call oLS.AppendScript(|Call ClickKeyword("| & vsKeyword & |", | & xConvStr_LSString(vsText) & |)|)
   Call oLS.AppendScript(|End Sub|)
   Call oCode.ReplaceEvent("click", oLS)

プログラムが完成したら DXL_Code オブジェクトの ReplaceEvent メソッドで Click イベント用のプログラムとしてセットします。


最後に ReplaceCode メソッドを使用して、ホットスポットのプログラムを作成したLotusScript に差し替えています。

   'ホットスポットのプログラムを準備した LotusScript に差し替え
   Call oHS.ReplaceCode(oCode)


まとめ

今回は GPT4o Structured Outputs 活用事例で利用した dxlSuite for LotusScript の機能について紹介させていただきました。

dxlSuite では、ホットスポットや段落のようにリッチテキスト内の構成要素、フォントやコード類などの管理単位でオブジェクトを用意しています。抜粋すると次の通りです。

dxlSuite クラス名 役割
DXL_RichTextItem リッチテキスト全体。
DXL_Table 表。タブやタイマー切替の形式、罫線や枠線、行や列の間隔など。
行列を指定してセルを取得。
DXL_Cell セル。罫線の幅や背景色やグラデーション、背景画像など。
カスケードの表に対応。
DXL_Paragraph 段落。文字や添付ファイル、ホットスポットなどを配置。
DXL_HotSpot_Action ホットスポットのアクション。
DXL_HotSpot_Button ホットスポットのボタン。
DXL_InlineImage インライン(見える状態)の画像。
DXL_LotusScript LotusScript のプログラム。
DXL_Formula 式言語のプログラム。
DXL_Style_Font 文字のフォントやサイズ、装飾。
DXL_Style_Hide 非表示設定や式。

各オブジェクトにはさまざまなプロパティやメソッドが用意されており、ノーツクライアントで操作できるほとんどの設定ができます。コーディング中にポップアップヘルプが表示されますので、簡単にコーディングできます。


今回はリンク(ホットスポットアクション)を例に dxlSuite の機能を紹介しました。

このライブラリはリッチテキストを縦横無尽、自由自在に操作することを目標に開発しました。今回の事例のように、標準のノーツクラスだけでは実現できない機能が作成できるようになります。ご興味のある方は以下のリンクを参照ください。


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


0 件のコメント:

コメントを投稿