動的モデル・ハーネス — 業務の振る舞いを記述する
SimpleModelingの動的モデル・ハーネスは、モデル駆動開発の検査・実行基盤を使い、ソフトウェアの振る舞い (Behavior)とAIによる生成・変更を制約 (Constraint)する枠組みです。処理の順序、状態遷移、失敗時の対応は、通常のプログラミングでも誤りが生じやすく、モデルで定義して動かすこと自体に価値があります。AI開発では、それに加えて、手続型コードに業務規則を埋め込む生成や、要求から外れた変更を抑えることが重要になります。本稿では、CML・Textusによるワークフローと状態機械 (StateMachine)の検査・直接実行、および要求モデルと実現モデルの接続を通じたハーネスを説明します。「モデル=AI時代のプログラム」を、この枠組みによって実現します。
動的モデル・ハーネスの必要性と仕組み
動的モデルの活用には、振る舞いをモデルで定義して開発・実行すること自体の利点と、AIの生成・変更をその規則に従わせるハーネスとしての利点があります。通常の開発でも難しい順序・遷移・失敗対応を共通の定義にまとめ、その定義を検査と実行に適用します。要求モデルと実現モデルの接続も、実装が目的から外れないための検査基準になります。
振る舞いの制約が必要になる理由
処理の順序、状態遷移、待機、失敗後の再試行や補償は、通常のプログラミングでも誤りが生じやすい部分です。個々の操作 (Operation)が正常に動いていても、在庫確保と支払い承認より先に注文を確定したり、失敗後に通常経路を続けたりすれば、業務の規則に反します。ワークフローと状態機械でこれらの規則を明示し、処理系が検査・実行するモデル駆動開発は、AIの利用にかかわらず有用です。
AIに振る舞いの実装を任せたとき、局所的に書きやすい手続型コードを積み重ねると、条件分岐、フラグ、コールバック、再試行ループなどへ規則が分散します。その場の処理を成立させる修正でも、全体の順序や状態遷移、失敗時の規則を崩すことがあります。こうした生成・変更の逸脱 (deviation)を抑えるには、AIへの指示に加えて、何らかの仕組みで実装と実行に制約を働かせるハーネスが必要です。
前回シリーズと第3回からの接続
第2回では、モデル駆動開発の基盤がAI活用のハーネスとして機能することを扱いました。第3回の静的モデル・ハーネスは、対象の同一性 (Identity)、型 (Type)、分類、所有、関係などの構造を制約します。第4回は、操作の順序、状態遷移、失敗時の進行を制約する動的モデル・ハーネスを扱います。前回シリーズの動的モデルの考え方を、SimpleModelingの検査・実行と要求の実現を確認する枠組みへつなぎます。
静的モデルと動的モデルは構造と振る舞いを表し、ドメイン・モデル (Domain Model)とアプリケーション・モデル (Application Model)は目的と関心によって分かれます。分類の軸は異なりますが、それぞれのモデルには記述の中心があります。ドメイン・モデルは静的モデルが中心で、アプリケーション・モデルはユースケース (Use Case)を起点とするワークフローが中心になります。
ドメインとアプリケーションの役割分担
ドメイン・モデルは、対象世界の概念、構造、関係、規則を表す静的モデルを中心に構成します。注文の例では、注文・明細・商品の構造や関係を表します。
アプリケーション・モデルは、ユースケースを起点に、利用者の目的を実現するワークフローを中心に構成します。注文確定では、在庫確保、支払い承認、注文確定というドメインの操作や機能を組み合わせます。
モデルの役割と使い分け
SimpleModelingでCMLに記述する動的モデルは、状態機械、ワークフロー、ユースケースの3種類です。ワークフローと状態機械は、一般規則から処理の進行や状態変化を定める演繹モデルです。CMLで定義したこれらの規則をTextusが解釈して直接実行するため、モデルがプログラムとして働きます。
ユースケース・モデル (Use Case Model)は、利用者の目的と具体的なシナリオを記述する帰納モデルです。そのまま動作させることはできませんが、実現すべき要求を表すモデルとして有効です。実例ベースで要求を確認し、対応するワークフローや状態機械との接続をモデル上で検査するために使います。
この違いを知っておくと、実行可能モデル (Executable Model)が振る舞いを制約し、要求モデルとの接続がその振る舞いの目的への適合を確かめる、という役割を理解しやすくなります。以降は、ワークフローと状態機械の定義・実行を先に説明し、ユースケース・モデルとの接続を扱います。
ワークフロー・状態機械を定義して動かす
振る舞いの制約をどこへ記述し、どう実行に適用するかを、注文確定で説明します。アプリケーション側に注文確定のワークフローを、ドメイン側に注文の状態機械を定義します。例として、商品P-1の明細を1件持つ作成中の注文O-101を置き、数量を1、金額を3,000円とします。識別子 (Identifier)と金額は説明用の値です。処理の進行、許される状態変化、操作とイベント (Event)、失敗時の対応をCMLに記述し、Textusがその規則を適用して動かします。
ワークフローで処理の進行を定める
ワークフローは、目的を実現する操作や処理を、順序、分岐、並行処理、待機、完了条件として定義します。注文確定のワークフローは、ユースケースの目的を実現するアプリケーション・モデルです。在庫確保、支払い承認、注文確定を順に進め、先行する結果に応じて次の処理を選びます。個別の注文に共通して適用する進行規則をCMLに記述し、Textusがその規則に従って処理を進めます。
アプリケーション側のワークフローが複数の処理の進行を定め、ドメイン側の注文の状態機械が対象の状態変化を定めます。注文確定のワークフローは、注文の状態機械が許す操作と遷移 (Transition)を利用します。ワークフロー自身も実行中や外部応答待ちといった状態 (State)を持ち得ますが、注文の状態と処理の進行状態は区別し、操作とイベントを通して対応付けます。
状態機械で許される状態遷移を定める
状態機械は、対象が取り得る状態と、イベントに応じて許される遷移を記述します。現在の状態、受け取るイベント、遷移条件、遷移先、遷移に伴う処理を対応付けます。状態名だけでなく、その状態で何ができ、どの条件で次の状態へ進めるかをモデルにします。
操作・イベントと静的構造を結び付ける
ワークフローと状態機械で扱う対象は、第3回のエンティティ、値、関係と対応します。注文O-101が持つ明細、その明細が参照する商品P-1、数量と金額を、静的モデルと同じ意味で使います。オペレーションには、対象の責務 (Responsibility)と入力・結果の型、事前条件・事後条件を記述します。モデルから利用する操作を、実在する対象と契約へ結び付けます。
待機・失敗・補償を振る舞いに含める
同じ注文O-101で、在庫確保後に支払いが拒否された場合を考えます。ワークフローには在庫解放を行う失敗分岐を定義し、注文の状態機械では確定済みへ進めないようにします。補償は実行済みの処理に対して業務上必要な後続処理を行うものであり、外部効果を必ず元に戻せることを意味しません。補償の失敗や人間の対応も扱います。
ユースケースと実行可能モデルの接続をモデル化する
アプリケーション・モデルの起点となるユースケースに、実現すべき要求を記述します。その目的とシナリオを実現するワークフロー、および利用するドメイン側の操作・状態機械との接続をモデル化し、要求の実現を検査します。
ユースケースに要求を記述する
ユースケース・モデルには、利用者が達成したい目的とシナリオを要求として記述します。注文確定の例では、在庫と支払いの条件を満たす注文を確定することを目的とし、作成中の注文、確定を求める操作、期待する結果を記述します。ユースケース自体を実行するのではなく、その要求を実現するワークフローと状態機械へ対応付けます。
要求と実現の接続をモデル化する
実例と規則を往復して検証する
注文確定のユースケースを、実例ベースで検証します。正常系、支払い拒否、外部応答待ちのそれぞれについて、シナリオの目的・前提・結果と操作順序が対応しているかを確認します。実例で不足する条件が見つかったら、一般規則へ反映する対象を整理します。
注文の実例を各モデルへ照合する
注文O-101のユースケースのシナリオを、まずオペレーションとエンティティへ突き合わせます。シナリオに登場する対象が存在し、その対象が操作の責務を持つか、注文・明細・商品の識別子や関係が整合するか、数量と金額、操作の入力・結果が型と不変条件 (Invariant)を満たすかを確認します。
検査・レビュー・変更を支えるハーネス
動的モデルを定義・検査・実行する基盤は、通常の開発における振る舞いの誤りを扱い、AI開発では生成・変更にも制約を働かせます。ワークフローと状態機械が実行経路を制約し、要求モデルとの接続が目的への適合を検査します。両方を維持することで、動作することと要求を実現することを確認しながら変更できます。
検査と直接実行によってハーネスとして働かせる
モデルの規則を処理系が解釈し、検査と実行に適用することで、AIが生成・変更できる範囲に制約が働きます。モデル検査をビルドに組み込み、状態変更や操作を契約に従う実行境界へ通します。モデル駆動開発のためのこの基盤が、AI活用にも有効なハーネスになります。規則を文章や図として参照するだけの場合とは、処理系が規則を適用する点で異なります。
モデル上の照合に使った注文O-101の実例を、実装を動かす検証にも引き継ぎます。正常系では必要な処理の後に確定済みとなるか、支払い拒否時には在庫解放が行われ確定済みとならないかを、実行結果から確かめます。モデル間の整合性と実装の動作は、別の確認対象として扱います。
モデル・アップ・ダウンとレビューへの活用
第2回で扱ったモデル・アップ・ダウンは、モデルを具体化して実現へつなぐことと、目的に応じて抽象化したモデルを導出することです。ユースケースとワークフロー・状態機械の接続は要求と実現の対応を表し、モデル・アップ・ダウンは具体化・抽象化を表します。モデルの種類が異なることや、両者を対応付けることだけでモデルダウンとは扱いません。
モデルアップでは、実行するワークフローや状態機械から、業務の流れを確認しやすい抽象モデルや図を導出します。レビューの目的に応じて詳細を整理し、元のモデルとの対応を保つことで、人間が目的や業務規則への適合を確認し、指摘を開発中のモデルへ戻せます。第4回では、実行可能モデルをレビューに活用する方法として位置付けます。
相互作用図やアクティビティ図などのUML (Unified Modeling Language)由来の図は、必要に応じて参考資料として作成できます。CMLモデルからレビュー用に抽象化して導出する場合は、モデルアップの表現としても利用できます。任意に作った参考図がすべてモデルアップになるわけではありません。これらの図は、SimpleModelingの主フローでCMLに記述する3種類の動的モデルには含めず、元のモデルとの対応を明らかにして使います。
AIの判断と決定済みの手続きを分担する
ワークフローをまとまりのある操作として利用する
注文確定のような意味のあるワークフローを、エージェントから利用できるまとまりのある操作として公開します。入力、事前条件 (Precondition)、結果、失敗時の意味を契約に含めると、エージェントは内部の細かな操作を一つずつ組み立てずに利用できます。通常経路が定まった処理では、ツール選択と再推論の回数を減らせます。削減量は処理の内容と構成によります。
依存 (Dependency)コンポーネント (Component)のワークフローをサブワークフローとして組み合わせる場合も、呼出しと結果の契約を通して接続します。ケーパビリティ・モデルは提供する能力と実現の対応を保持し、ワークフローはその能力をどう編成するかを表します。実行するのは対応付けられた操作、ワークフロー、状態機械であり、ケーパビリティ (Capability)の中間表現そのものではありません。
まとめと後続回への接続
参照
用語集
- Cozy Modeling Language (CML)
-
CML(Cozy Modeling Language)は、オブジェクト・モデルのうち、プログラム生成と実行へ接続する実行可能モデルを記述するSimpleModelingの形式モデリング言語です。
- モデル (Model)
-
Modelとは、対象を特定のPurposeとConcernに基づいて選択し、理解、判断、検証、構築に利用できる形で表した抽象です。対象そのものではなく、目的に必要な要素、関係、意味を保持する表現です。
- エラー (error)
-
汎用的な表現として用いられる用語。ソフトウェア工学では多義的に使われ、バグや障害全般を指す。SimpleModeling では広義のラベルとして使用し、個別には Mistake・Defect・Fault・Failure・Deviation に整理する。
- Textus
-
Textusは、SimpleModelingによって実現されたソフトウェアを動作させるための実行基盤です。アプリケーションに共通する実行、運用、連携の機構を提供します。
- シンプルモデリング (SimpleModeling)
-
SimpleModelingは、KnowledgeからDomain Modelを構成し、CMLで形式化し、CozyとAIによって実行可能ソフトウェアへ実現し、Textus上で動作させる、モデリング中心のソフトウェア開発方法論と技術体系です。
- 制約 (Constraint)
-
UMLにおけるConstraintは、一つ以上のModel ElementのSemanticsの一部を宣言するため、自然言語または機械可読言語で表した条件または制限です。評価結果はBooleanであり、評価は副作用を持ちません。
- 振る舞い (Behavior)
-
UMLにおけるBehaviorは、そのContextとなるBehaviored Classifierが時間とともにどのようにStateを変えるかを定める仕様です。可能な実行、創発する振る舞い、または特定の実行例を表せます。
- 状態機械 (StateMachine)
-
UMLにおけるStateMachineは、Eventの発生によって起動されるTransitionでStateのグラフをたどり、システム要素のevent-driven Behaviorを表すBehaviorです。
- 操作 (Operation)
-
UMLにおけるOperationは、関連するBehaviorを呼び出すための名前、型、Parameter、Constraintを定めるClassifierのBehavioral Featureです。Operationは呼び出し契約を定め、MethodなどのBehaviorがその実現を担います。
- 逸脱 (deviation)
-
計算値や観測値が、基準値や真値から外れている状態。観測可能な量的ずれを表す。
- 同一性 (Identity)
-
Identityとは、値やStateが変化しても、ある対象を他の対象と区別し、時間を通じて同じ対象として追跡するための同一性です。IdentifierはIdentityを表現または参照する値であり、Identityそのものと同義ではありません。
- 型 (Type)
-
Undefined
- ドメイン・モデル (Domain Model)
-
Undefined
- アプリケーション・モデル (Application Model)
-
アプリケーション・モデル(Application Model)とは、ユースケースをアプリケーションがどのように実現するかを、参加者、役割、責務、協調、相互作用、状態遷移、イベント、サービス、操作、結果によって表す目的別のモデルです。
- ユースケース (Use Case)
-
UMLにおけるUse Caseは、対象システムがActorまたは他の利害関係者に観測可能な価値あるResultをもたらすために実行するActionの集合を定めるModel Elementです。
- ユースケース・モデル (Use Case Model)
-
ユースケース・モデル(Use Case Model)とは、利用者や外部主体がシステムを利用する目的と、その目的を達成するシナリオおよび期待する結果を、Actor、Goal、Use Case、Scenario、Outcomeによって表す目的別のモデルです。
- 実行可能モデル (Executable Model)
-
Undefined
- 識別子 (Identifier)
-
Identifierとは、Identityを持つ対象または相関対象を参照し、他の対象から区別するために使用する値です。IdentifierはIdentityを表現できますが、対象が時間を通じて同じ対象であるというIdentityの意味そのものではありません。
- イベント (Event)
-
UMLにおけるEventは、Behaviorの実行中に発生し得る出来事を記述するものです。EventのOccurrenceを受け取ることで、StateMachineのTransitionなどのBehaviorが起動されます。
- 状態 (State)
-
UMLにおけるStateは、ある不変条件が成立している状況をモデル化したものです。Objectの現在のStateによって、受け付けられるEventやOperation、成立するConstraint、次に可能なTransitionが変わります。
- 遷移 (Transition)
-
UMLにおけるTransitionは、StateMachine内のSource VertexからTarget Vertexへ進む有向関係です。Trigger、Guard、Effectなどによって、いつ遷移し何を実行するかを定めます。
- 責務 (Responsibility)
-
Responsibilityとは、ObjectまたはRoleが、何を知り、判断し、行い、守るべきかを表す義務です。構造上の情報だけでなく、規則とBehaviorの所有を定めます。
- 不変条件 (Invariant)
-
Invariantとは、対象が有効である間、観測可能な安定点で常に成立しなければならないConstraintです。Object、Type、または複数要素からなる構造に適用できます。
- 仕様確認 (verification)
-
Verification(仕様確認)とは、規定された設計仕様や要求仕様に対して、実装が一致しているかを確認する行為である。
- UML (Unified Modeling Language)
-
オブジェクト指向分析・設計のための統一モデリング言語。クラス図、シーケンス図、ユースケース図などを通じてシステム構造と動作を表現する。UPおよびCBDの基盤言語。
- 事前条件 (Precondition)
-
Preconditionとは、Operationを契約に従って呼び出す前に、呼び出し側が成立させる必要があるConstraintです。
- 依存 (Dependency)
-
UMLにおけるDependencyは、ClientとなるModel Elementの仕様または実装が、Supplierとなる別のModel Elementの定義へ意味的または構造的に依存することを表すDirected Relationshipです。
- ケーパビリティ (Capability)
-
ケーパビリティ(Capability)とは、モデルまたはシステムが利用者や対象領域に対して何を可能にするかを表す概念です。実現方法ではなく、提供できる結果や働きに着目します。
- コンポーネント (Component)
-
責務・契約・依存関係を明示的に定義し、再利用可能で交換可能な単位としてカプセル化されたソフトウェア構成要素。論理モデルでは抽象構造単位として、物理モデルでは実装・デプロイメント単位として扱われる。
- ビュー (View)
-
Viewとは、Modelを特定のPurposeとConcernに応じて選択し、理解、判断、検証、利用できる形で投影した表現です。ViewはModelの一部を見せるものであり、元のModelとは別に意味を所有しません。
- 妥当性確認 (validation)
-
Validation(妥当性確認)とは、システムや機能が利用目的や要求仕様に対して妥当であるかを確認する行為である。
