← トップページ(目次)に戻る

6. データ要件と構造定義

本システムで扱うデータ定義です。記録時に各モジュール(YOLO、OCR、Python)が個別に取得する「生データ」の構造を先に行い、それらをコンテキスト理解や自己修復のために集約・紐付けした「統合データ」の構造を後ろに定義します。

6.1. リソースディレクトリ構成と命名規則

JSONファイル自体の肥大化を防ぎ、かつ画像パスを決定論的に特定するため、マクロごとに一意なディレクトリ(workflow_ID)を作成し、リソースをカプセル化します。

macros/
└── wf_12345/             // workflow_IDをルートとする
    ├── integrated.json   // 統合データ(1マクロにつき1つ)
    ├── workflow.json     // ワークフローデータ(1マクロにつき1つ)
    ├── images/           // 画像格納用ディレクトリ
    │   ├── evt_001_pre.png   // 操作直前の全体スクリーンショット(※マウスクリックおよびキー操作の両方で生成)
    │   ├── evt_001_crop.png  // 操作対象UI要素のクロップ画像
    │   ├── evt_002_pre.png
    │   └── ...
    └── temp/             // 一時データ格納ディレクトリ(統合・生成フェーズ完了後に自動破棄)
        ├── input_logs.json   // リアルタイム操作の生ログ(1マクロにつき1つ)
        ├── evt_001_yolo.json // イベントごとのYOLO認識生データ
        └── evt_001_ocr.json  // イベントごとのOCR認識生データ

※操作直後(Post)のスクリーンショットに関する設計変更:
操作の直後に個別のスクリーンショット(post)を撮る仕様は廃止されました。これは、連続する「次の操作の直前(pre)」に撮影される画像が、実質的に前のアクションの直後状態を写していると判断できるためです。これにより、不要なキャプチャ処理のオーバーヘッドとストレージへの二重保存を防止します。

※生データおよび画像リソースのライフサイクルについて:
各モジュールが取得する生データ(YOLO、OCR、入力ログ)は、マクロの生成処理中にのみ temp/ ディレクトリ内へ一時的に保存され、生成完了後に自動破棄されます。また、images/ 内に保存されるスクリーンショットは、マウスクリック時だけでなくキーボード操作時(文字入力等)にも撮影がトリガーされます。ただし、連続したテキスト入力のように「画面の変化率が著しく低い操作」が続いた場合、ストレージ容量の圧迫やデータの冗長化を防ぐため、前回のスクリーンショットとの差分解析を行い、変化率が閾値未満のときは該当する低い画像を自動的に削除・間引きする最適化が実行されます。

6.2. 生データ構造定義(一時データ)

解析モード(録画)中、各認識エンジンおよびフックモジュールが出力するデータ構造です(統合後に破棄)。

6.2.1. UI認識データ(YOLO Engine)

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/evt_{event_id}_yolo.json

プロパティ (階層) 説明・格納される値
uiAnalysis.timestamp number 画像を取得・解析した時間(Unixタイムスタンプ)
uiAnalysis.boundingBox object 認識したUI要素のバウンディングボックス座標 {x, y, width, height}
uiAnalysis.type string 物体認識されたUIの種類(button, dropdown, input など)
uiAnalysis.confidence number AIによるUI認識の信頼度・精度 (0.0〜1.0)

6.2.2. テキスト認識データ(OCR Engine)

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/evt_{event_id}_ocr.json

プロパティ (階層) 説明・格納される値
textAnalysis.timestamp number 画像を取得・解析した時間(Unixタイムスタンプ)
textAnalysis.boundingBox object 認識したテキスト領域のバウンディングボックス座標 {x, y, width, height}
textAnalysis.content string OCRエンジンにより読み取られた文字列内容
textAnalysis.confidence number OCRによるテキスト認識の信頼度・精度 (0.0〜1.0)

6.2.3. 入力操作データ(Python OS Hook)

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/input_logs.json

プロパティ (階層) 説明・格納される値
inputLog.timestamp number OSレベルで操作をフック・検出した時間(Unixタイムスタンプ)
inputLog.type string 入力操作の種類(click_down, key_down, mouse_scroll など)
inputLog.content string 具体的な入力内容(left_click, Enter, または入力文字など)
inputLog.windowName string 操作対象となったアプリケーションのウィンドウタイトル名
inputLog.windowSize object 対象ウィンドウの全体サイズ {width, height}
inputLog.windowCoordinates object 対象ウィンドウのデスクトップ上における絶対座標 {x, y}
inputLog.cursorCoordinates object 操作が実行された瞬間のマウスカーソルの絶対座標 {x, y}(※キー操作時はNoneを許容)

6.4. 統合データ構造定義

自律機能やAI生成コアが「コンテキスト理解」を確保するため、一時データをウィンドウ基準の階層型ツリー(DOMライク)に統合したデータモデルです。

※階層ツリー構築と推論誤差の吸収 (IoA判定):
YOLOやOCRが検出した要素の親子関係(包含関係)を構築する際、単なる座標の完全内包ではなく、交差面積率(IoA: Intersection over Area)を計算します。AIの推論による数ピクセルのはみ出しを許容するため、子要素の面積のうち閾値(例: 70%)以上が親要素と重なっていれば内包されていると判定し、堅牢なXMLライクのUIツリーを構築します。

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/integrated.json

プロパティ (階層) 説明・格納される値
id string 統合ログの一意なID (例: evt_001)
timestamp number アクション実行時のUnixタイムスタンプ
window.name string 操作対象となったアクティブウィンドウの名前(タイトル)
window.size object ウィンドウのサイズ {width, height}
window.coordinates object ウィンドウの画面上の絶対座標 {x, y}
window.UIs array 対象ウィンドウ内で認識され、操作に関与したUI要素の配列(ルート要素)
window.UIs[].type string UIの種類(form, container, button, input 等)
window.UIs[].relativeBoundingBox object 対象ウィンドウの左上を原点(0,0)とした相対座標とサイズ {x, y, width, height}
window.UIs[].confidence number AIによるUI認識精度 (0.0〜1.0)
window.UIs[].action object 当該UIに対して行われた入力操作の詳細(非インタラクティブ要素の場合はnull)
window.UIs[].action.inputType string 入力タイプ(click_down, key_down 等)
window.UIs[].action.inputValue string 入力内容(left_click, Enter 等)
window.UIs[].action.cursorRelativeCoordinates object 対象ウィンドウ内でのカーソル相対座標 {x, y}
window.UIs[].action.diffRatio number 操作による前画面変化率(待機判定に使用)
window.UIs[].context array UI要素を直接補足する周辺情報(テキストやアイコン等)の配列
window.UIs[].context[].type string コンテキストの種類(text, icon 等)
window.UIs[].context[].content string 読み取られたテキストや記号の種類名
window.UIs[].context[].relativeBoundingBox object 対象ウィンドウ内での相対座標とサイズ {x, y, width, height}
window.UIs[].context[].confidence number 認識精度 (0.0〜1.0)
window.UIs[].context[].parentRelevance number 親要素(対象UI)との関連度合い(距離や意味合いから算出)
window.UIs[].children array 子UI要素の配列(交差面積率による内包判定から再帰的に構築されるツリー構造)

6.5. 統合データ JSONフォーマット例

{
  "id": "evt_012",
  "timestamp": 1717654800123,
  "window": {
    "name": "社内システム - Google Chrome",
    "size": { "width": 1920, "height": 1080 },
    "coordinates": { "x": 0, "y": 0 },
    "UIs": [
      {
        "type": "form",
        "relativeBoundingBox": { "x": 1000, "y": 200, "width": 400, "height": 300 },
        "confidence": 0.90,
        "action": null,
        "context": [],
        "children": [
          {
            "type": "button",
            "relativeBoundingBox": { "x": 1220, "y": 280, "width": 60, "height": 40 },
            "confidence": 0.95,
            "action": {
              "inputType": "click_down",
              "inputValue": "left_click",
              "cursorRelativeCoordinates": { "x": 1250, "y": 300 },
              "diffRatio": 0.12
            },
            "context": [
              {
                "type": "text",
                "content": "保存する",
                "relativeBoundingBox": { "x": 1225, "y": 285, "width": 50, "height": 30 },
                "confidence": 0.98,
                "parentRelevance": 0.99
              }
            ],
            "children": []
          }
        ]
      }
    ]
  }
}

6.6. ワークフローデータと変数データの構造定義 (Omnipotent Workflow)

統合ログからAIによって抽出・生成され、実行エンジンへと引き渡されるマクロシナリオの構造です。本システムでは、あらゆるユーザー操作にスケーラブルに対応するため、「コマンドパターン」と「ユニバーサルセレクタ」を採用した抽象度の高い設計(Omnipotent Workflow)としています。

🧠 構造設計の意図と拡張性へのアプローチ

6.6.1. ワークフロー変数定義 (variables.json)

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/variables.json

プロパティ 説明・構造の意図
(key_name) string/number 検索キーワード、対象ファイル名、URLなど、実行環境や目的に依存する具体的なデータ。
意図: ここに具体値を集約させることで、同じ操作手順のマクロであっても、このファイルの値を差し替えるだけで汎用的に転用可能にします。

6.6.2. ワークフロー実行シナリオ定義 (workflow.json)

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/workflow.json

プロパティ (階層) 説明・構造の意図
version string スキーマのバージョン(例: "2.0")。パーサーの後方互換性を担保するため。
metadata object OS、画面解像度、所要時間などの実行環境メタデータ。マクロ共有時に環境差異を吸収するヒントとして使用。
steps array 物理的な操作を意味的な作業単位に要約したステップの配列。
steps[].intent string 標準化されたアクション分類(DRAG_AND_DROP, WAIT_FOR_PROCESS など)。
意図: AIや実行エンジンが「このステップで最終的に何を達成したいのか」を文脈として理解するためのフラグ。
steps[].description string ステップの目的を説明する自然言語の文章(英語)。
steps[].context object 実行前に満たすべき前提条件(アクティブなウィンドウ名など)。
意図: 予期せぬ画面での操作暴発を防ぐアサーション。修復エンジン(Healer)の復帰基準となります。
steps[].action.command string 実行すべきシステムのルートコマンド(MOUSE_CLICK, MOUSE_DRAG, TYPE_TEXT, SYSTEM_WAIT 等)。
steps[].action.parameters object コマンドの実行に必要なペイロード(変数群)。コマンドの種類に応じて動的に中身(target, destination, key, text等)が変わる多態性オブジェクト。
...parameters.target
(UniversalSelector)
object 操作対象を特定するための複合情報(semantic_role, text_contains, image_template, absolute_coordinates)。
意図: 一つのUIを探す際に、複数の手段(テキスト検索→画像検索→座標)をフォールバックとして持たせ、堅牢性を担保します。
steps[].fallback_raw_events array この要約ステップの根拠となった統合ログ(integrated.json)の生イベントID。エラートレース用。

6.7. データ JSONフォーマット例

コマンドパターンとユニバーサルセレクタを採用した、あらゆる操作に対応可能なマクロの生成例です。

📁 variables.json

{
  "target_file_name": "report_2026.pdf",
  "search_keyword": "ai macro system"
}

📁 workflow.json

{
  "version": "2.0",
  "workflow_ID": "wf_omnipotent_001",
  "metadata": {
    "os": "Windows",
    "resolution": { "width": 1920, "height": 1080 },
    "duration_ms": 15000
  },
  "steps": [
    {
      "step_id": 1,
      "intent": "DRAG_AND_DROP",
      "description": "Drag the specific file to the upload dropzone.",
      "context": {
        "active_window_name": "Explorer"
      },
      "action": {
        "command": "MOUSE_DRAG",
        "parameters": {
          "target": {
            "semantic_role": "listitem",
            "text_contains": "${target_file_name}"
          },
          "destination": {
            "semantic_role": "dropzone",
            "image_template": "upload_area_template.png"
          },
          "button": "left"
        }
      },
      "fallback_raw_events": ["evt_001", "evt_002"]
    },
    {
      "step_id": 2,
      "intent": "COPY_TEXT",
      "description": "Copy the selected text using keyboard shortcuts.",
      "context": {
        "active_window_name": "Browser"
      },
      "action": {
        "command": "KEYBOARD_SHORTCUT",
        "parameters": {
          "modifiers": ["control"],
          "key": "c"
        }
      },
      "fallback_raw_events": ["evt_003"]
    },
    {
      "step_id": 3,
      "intent": "WAIT_FOR_PROCESS",
      "description": "Wait until the loading spinner disappears before proceeding.",
      "context": {},
      "action": {
        "command": "SYSTEM_WAIT",
        "parameters": {
          "condition": "ELEMENT_NOT_VISIBLE",
          "target": {
            "semantic_role": "progressbar"
          },
          "timeout_ms": 10000
        }
      },
      "fallback_raw_events": []
    }
  ]
}

6.8. アプリケーション設定データ(config.json)

ユーザーが画面上の設定エリアから変更した接続先エンドポイントなどの情報を管理・永続化するためのデータ構造です。本ファイルはアプリケーションのルートディレクトリに配置されます。

保存先階層: ai-macro-system/config.json

プロパティ 説明・格納される値
ai_mode string AIの動作モード("local" または "cloud")
llm_host string マクロ生成用AI(LLM)の接続先(IPアドレスまたはホスト名)
llm_port string LLM APIのポート番号。未指定時はデフォルトで "8844" を使用
cv_host string Computer Vision API(YOLO/OCR)の接続先(IPアドレスまたはホスト名)
cv_port string Computer Vision APIのポート番号。未指定時はデフォルトで "8843" を使用

6.9. アプリケーション設定 JSONフォーマット例

{
  "ai_mode": "local",
  "llm_host": "127.0.0.1",
  "llm_port": "8844",
  "cv_host": "192.168.1.10",
  "cv_port": "8843"
}

6.10. 実行可能マクロデータ(Executable Macro)

実行エンジンが直接解釈可能な、メソッド名と解決済み引数を持つマクロ用JSONです。LLMが workflow.json の意図と integrated.json の座標データを組み合わせて生成した状態を表現し、実行時にそのまま使用されます。

保存先階層: ai-macro-system/macros/wf_{workflow_ID}/executable_macro.json (またはLLMからの直接返却)

プロパティ (階層) 説明・格納される値
macro_id string マクロを一意に識別する識別子ID
target_application string 操作対象となる主要なアプリケーション名、またはウィンドウタイトル名
commands array 実行エンジンがシーケンシャルに呼び出す実行コマンドオブジェクトの配列
commands[].method string 呼び出す操作メソッド名。リテラル限定("wait", "click", "type_text", "press_key")
commands[].args object メソッドごとに定義される、実行時解決済みの引数オブジェクト(多態性データ構造)
...args (method: "wait") object 待機コマンド用のペイロード。内包プロパティ:
duration (number): 次のコマンド実行まで待機する秒数
...args (method: "click") object マウスボタン入力用のペイロード。内包プロパティ:
x (number): デスクトップ上の絶対X座標
y (number): デスクトップ上の絶対Y座標
button (string): 使用ボタン("left", "right" など)
clicks (number): クリック回数(1=シングル、2=ダブル)
...args (method: "type_text") object キーボード文字列入力用のペイロード。内包プロパティ:
text (string): フォーム等に直接流し込む入力対象の文字列内容
...args (method: "press_key") object 単発の特殊キー制御用のペイロード。内包プロパティ:
key (string): 入力するキー名("tab", "enter", "esc" など)

📁 実行可能マクロのJSONフォーマット例(事務作業シナリオ)

Webブラウザ上の業務システム(顧客管理システムや経費精算など)で、「新規登録ボタンを押し、フォームに社名とメールアドレスを入力して保存する」といった一般的なデータ入力作業を想定した例です。

{
  "macro_id": "macro_002_customer_registration",
  "target_application": "Google Chrome - 顧客管理システム",
  "commands": [
    {
      "method": "wait",
      "args": {
        "duration": 1.0
      }
    },
    {
      "method": "click",
      "args": {
        "x": 1200,
        "y": 150,
        "button": "left",
        "clicks": 1
      }
    },
    {
      "method": "wait",
      "args": {
        "duration": 0.5
      }
    },
    {
      "method": "click",
      "args": {
        "x": 400,
        "y": 300,
        "button": "left",
        "clicks": 1
      }
    },
    {
      "method": "type_text",
      "args": {
        "text": "株式会社テスト"
      }
    },
    {
      "method": "press_key",
      "args": {
        "key": "tab"
      }
    },
    {
      "method": "type_text",
      "args": {
        "text": "info@example.com"
      }
    },
    {
      "method": "click",
      "args": {
        "x": 400,
        "y": 600,
        "button": "left",
        "clicks": 1
      }
    }
  ]
}

💡 事務作業を想定したシナリオの解説

  1. 画面の読み込み待ち (wait): 1秒待機し、システムの画面が完全に表示されるのを待ちます。
  2. 「新規登録」ボタンのクリック (click): 画面右上(例: x=1200, y=150)にあるボタンをクリックします。
  3. フォーム展開の待機 (wait): 入力フォームが開くのを0.5秒待ちます。
  4. 「会社名」入力欄のフォーカス (click): 入力欄(例: x=400, y=300)をクリックしてカーソルを合わせます。
  5. 会社名の入力 (type_text): "株式会社テスト" という文字列を直接入力します。
  6. 次の入力欄へ移動 (press_key): tab キーを押下し、マウスを使わずに次の「メールアドレス」入力欄へフォーカスを移動させます。
  7. メールアドレスの入力 (type_text): "info@example.com" を入力します。
  8. 「保存」ボタンのクリック (click): 画面下部(例: x=400, y=600)の保存ボタンをクリックして完了します。

事務作業の場合、マウスによる座標クリック(click)だけでなく、入力効率の高い tab キーでの移動(press_key)や、まとまった文字列の流し込み(type_text)が多用されます。このデータ構造により、そうしたRPA特有の挙動も無理なく表現できます。