UML/SysMLなどのモデルをAI(LLM)と連携する

はじめに

昨今、AI (Artificial Intelligence: 人工知能)の発展はめざましく、特にLLM (Large Language Models: 大規模言語モデル)の進化は目を見張るものがあります。OpenAI社のChatGPTが著名ですが、それだけでなく多くの企業がさまざまな言語モデルをサービスとして利用可能な形で提供してます。最近は、AI・LLMそのものだけでなく、既存のさまざまな情報・サービスと連携させることにも多くの個人・企業が挑戦し続けています。

その連携の1つとして、UMLやSysMLなどの表記方法を利用して作成された設計モデル・業務モデル(以下「モデル」と表記しますが、LLMのモデルとは異なるものです)などとAIを連携できないか、ということも当然ながら考えられます。どのように連携するのか、その方法だけでもいろいろと考えられます。例えば、文書などからモデルを自動生成することも考えられますし、既存のモデルから何かを自動生成することも考えられるでしょう。

設計モデルをAIに理解させる

このページで紹介する「情報生成アドイン」は、既存のモデルをAIに理解させて活用するための情報を生成するために利用することを想定しています。具体的には、次のような状況の支援を想定しています。

  • 他の人が作成したモデルの理解を、AIを利用して対話的に行う
  • モデルの問題点を見つけてもらう
  • モデルに変更を加える場合の変更点や注意点を提案してもらう

こうしたことを実現するためには、モデルの内容をできる限り正確にAIに伝えることが必要です。通常、モデルはダイアグラム(図)として表現されますが、画像であるダイアグラムの明確な意味を、画像から正確に理解することは容易ではないでしょう。今後のAI・LLMの進化により精度は向上するかもしれませんが、もしモデルの内容を文章として出力できれば、その方が理解度が高くなると考えられます。既存の文章の理解の枠組みでモデルを理解できるようになることがその理由です。

このアドインで得られた文字列としてのモデルの情報を、問い合わせる内容と合わせてLLMにプロンプトとして渡すことで、モデルの内容に関係する問い合わせに対応できるようになると考えられます。RAG (Retrieval Augmented Generation: 検索拡張生成)における外部ソースとして、このアドインを利用して得られたモデルの文字列情報を渡す位置づけです。

謝辞

このアドインの作成には、株式会社バリューソースの神崎様に多大なるご支援・情報提供をいただきました。神崎様はLLMの活用について多くの試行錯誤から得られた知見がありますので、このアドインを効率的に使うためのプロンプトや生成ルールの定義など、支援が必要な場合には株式会社バリューソースにお問い合わせください。
(弊社ではツール・アドインそのものを超える範囲のサポート・教育・コンサルティングは行っていません。)

情報生成アドインについて

このページからダウンロードできる情報生成アドインは、対象の図の内容を文章として出力します。

このようにして出力された文章をChatGPTのような対話型エンジンの入力とすることで、そのモデルに対してAI・LLMとの対話が可能となります。

モデルの内容を文章に変換するためのルールも、モデルとして定義します。この定義はゼロから構築することもできますが、サンプルの定義を含むパッケージが利用できます。その内容をカスタマイズすることで、自分たちのモデルに合わせた出力にできます。

アドインの概要の動画

このアドインの概要を動画で説明しています。(8分55秒・音声あり)

アドインを試しに使ってみる

サンプルの定義パッケージには、クラス図・ステートマシン図・ユースケース図およびUSDM・プロセスフロー図の内容の一部についての定義が含まれます。これらの図であれば、アドインがどのような動作になるのかをすぐに確認できます。

試しに使う場合の手順は次の通りです。

  1. アドインのインストール後、対象のダイアグラムを開き、そのダイアグラム内で右クリックして「アドイン・拡張」→「情報生成」を実行してください。
  2. 初回実行時は、出力定義のパッケージがプロジェクトに含まれていないはずですので、読み込むかどうかのメッセージが表示されます。出力定義のパッケージを読み込んでください。出力定義のパッケージは、モデルルートの直下に作成されます。
  3. 読み込みを実行すると、最終的に以下のような画面が表示されます。
  4. この内容をそのまま利用しても良いのですが、この内容についての前提を含めてLLMに伝える方が効果的です。出力定義のパッケージ内の「RULE」という名前のダイアグラムを開き、下の方にある以下の2つのノート要素を2つとも選択し、Ctrl+Cでコピーしてください。
  5. 出力対象のダイアグラムに戻り、Ctrl+Vで貼り付けてから再度「アドイン・拡張」→「情報生成」を実行してください。今後は、このノートの内容が出力内容の前後に含まれるようになります。

このようにして得られた内容を普段利用しているLLMチャットの入力として貼り付け、質問をしてみてください。以下は、このページを作成時点でのClaude 3での実行例です。

アドインの動作条件

  • 利用できるエディションには制限はありません
  • 現在のところ、QEAファイルのみで動作確認を行っています
  • このアドインは「動作期間限定アドイン」です

アドインのダウンロード

情報生成アドインを利用する場合には、以下のリンクからアドインのファイルをダウンロードして下さい。インストール方法はこちらをご覧下さい
addin_InfoExtractor.zip

Microsoft Edgeブラウザをご利用の方へ
アドインのZIPファイルをダウンロードすると、Microsoft Defender SmartScreen機能によりダウンロードができない(ように見える)場合があります。この場合には、こちらのページに記載の手順で回避をお願いします

定義内容のカスタマイズについて

以下の内容は、最新版のアドインで利用可能な設定・内容となります。以下の内容と異なる動作の場合には、最新版のアドインをダウンロードし利用してみてください。

出力定義

  • 出力定義はパッケージとして定義し、その直下に名前「RULE」のダイアグラムを作成し、要素を配置してください。
  • 実行時にモデル全体から「出力定義」という名前のパッケージを探索し、見つかればその内容を適用します。そのパッケージがない場合にはサンプルの定義パッケージを読み込むことができます。
  • それぞれの定義には、LLM側の解釈を支援するために段下げ記号を入れることもできます。
  • 名前が「RULE」ではない要素や接続は無視されます。接続を定義する場合には両端に要素が必要ですが、このように定義のための要素はRULE以外の名前で配置してください。
  • 名前が「REPLACE」のクラス要素に定義されている属性と初期値は、接続の多重度の出力の際に利用される単語を置換するための要素です。

ダイアグラム

  • 定義のダイアグラムの「ノート」に記載された内容が、基本的な処理の定義になります。複数行ある場合には、上から順番に1行ずつ解釈されます。
  • 上記の定義内容を出力後、対象のダイアグラムに配置されている要素について、同じ種類の定義要素がある場合には出力を実行します。
  • 定義のダイアグラムあるいは出力対象のダイアグラム(アドインを実行する際に開いているダイアグラム)に、1行目が「RULE:header」あるいは「RULE:footer」のテキスト要素が配置されている場合には、出力内容の前後にその内容を出力します。
  • 複数の出力定義パッケージを作成し、図ごとに適用対象を切り替えられます。出力定義のパッケージ要素をモデルブラウザからドラッグし、出力対象の図にドロップして「パッケージ要素」として配置してください。(それぞれの図で1つのみ出力定義のパッケージ要素を配置可能です。「出力定義」という名前のパッケージよりも優先して適用されます。)
  • ダイアグラム内に、他のダイアグラムへのリンク(ショートカット)が含まれる場合には、そのダイアグラムの内容を出力します。複数のリンクを配置できますが、処理順序は決められません。

要素

  • 名前が「RULE」の要素は、その種類の要素の出力内容を定義します。出力定義は、それぞれの要素のノートに記入します。例えば、クラス要素RULEのノートに記述した内容は、出力対象に配置されているクラス要素の出力に利用されます。
  • 属性や操作も、名前がRULEであれば定義として扱われます。クラス要素が属性を持つ場合には、クラス要素が持つ属性RULEのノートの内容を利用します。
  • 要素・接続にステレオタイプが設定されている場合には、そのステレオタイプの要素や接続のみに適用されます。
  • 要素を出力する場合、その要素が持つ属性・操作・接続の内容を続けて出力します。(定義がある場合)

接続

  • 名前が「RULE」の接続は、それぞれの接続の出力内容を定義します。出力定義は、それぞれの接続のノートに記入します。
  • 接続の「方向」も考慮しますので、「未指定」「ソース→ターゲット」など方向が異なる同じ種類の接続が複数ある場合、出力対象の接続の方向と一致する定義の内容が出力されます。
  • 名前にRULEではなくRULE_STRICTと設定することで、ソース側・ターゲット側の要素の種類まで含めて限定して定義できます。このRULE_STRICTを利用することで、同じ種類の接続であっても、前後の要素の種類が異なる場合の出力を変えられます。RULE_STRICTとRULEの両方に合致する定義がある場合、RULE_STRICTの定義のみが出力されます。

タグ

  • それぞれのノート内で利用できる「タグ」は以下のものです。
    • 要素・接続・ダイアグラム・属性・操作
      • $NAME : 名前
      • $NOTES : ノート
      • $STEREOTYPE : ステレオタイプ
    • 要素・ダイアグラム
      • $CHILDRENLIST : ダイアグラム・サブジェクト(枠)や要素がそのダイアグラム内で内包する要素、あるいは子要素の名前の一覧
    • 要素
      • $ALIAS : 別名
      • $TAG(タグ名) : タグ付き値
    • 属性・操作
      • $OWNERNAME : 所有する要素の名前
    • 接続
      • $GUARD : 遷移のガード(条件)
      • $SOURCE : 接続のソース側の要素名
      • $TARGET : 接続のターゲット側の要素名
      • $SOURCEROLE : 接続のソース側の役割(関連端名)
      • $TARGETROLE : 接続のターゲット側の役割(関連端名)
      • $SOURCECOUNT : 接続のソース側の多重度
      • $TARGETCOUNT : 接続のターゲット側の多重度
  • $NAMEなど、内容が空になる可能性がある項目は、大括弧([と])で囲むことで、その内容が空の場合には囲まれた範囲が出力されません。例えば「[$GUARDの場合には]$SOURCEから$TARGETに遷移する」と定義した場合には、$GUARDが空の場合には、「の場合には」の文字列も出力されません。
  • 縦棒(|)を使うことで、出力の分岐が可能です。縦棒の前に含まれる項目が空の場合には、縦棒の後の内容が処理されます。例えば、「[$NAMEです|関係があります]の場合には、$NAMEに値がある場合には前が、ない場合には後ろが出力されます。
  • 結果的に、大括弧自体および縦線を出力することはできません。

定義例は、上記の手順にて読み込めるサンプル定義のパッケージをご覧ください。ご不明な点がありましたら、サポート窓口にお問い合わせください。