
# Formize を使用した MLOps パイプラインにおける継続的データガバナンス

スケールして機械学習モデルを提供する企業は、パラドックスに直面します。イテレーションが速くなるほど、トレーニング、検証、推論に使用されるデータが社内ポリシーや外部規制に準拠していることを保証するのが難しくなります。従来のデータガバナンス手法――手動監査、定期レポート、静的系統マップ――は、現代の MLOps ワークフローの速度に追いつけません。

Formize は、低コードのデータ系統・コンプライアンスエンジンとして、まさにこの課題に対応するために作られました。Formize を CI/CD パイプラインに組み込むことで、組織は **系統をリアルタイムで取得**、**ポリシーをコードとして適用**、そして **品質ダッシュボードを即座に提供** できるようになります。

本記事では以下を行います。

1. 継続的データガバナンスのコア概念を概説する。  
2. Formize が一般的な MLOps ツール（GitHub Actions、Jenkins、Kubeflow、MLflow）と統合する方法を示す。  
3. ソースコントロールフックから自動コンプライアンスチェックまでの、エンドツーエンド実装をステップバイステップで解説する。  
4. データフローを可視化した Mermaid 図を提供する。  
5. スケーリング上の考慮点、セキュリティ、将来への備えについて議論する。

> **重要なポイント:** Formize が CI/CD パイプラインのネイティブステップになると、データ系統、ポリシー適用、品質モニタリングが *定期的* ではなく *継続的* な活動になります。

---

## 1. なぜ継続的ガバナンスが重要か

| 従来のアプローチ | 継続的アプローチ |
|----------------------|----------------------|
| 監査は四半期ごと、またはインシデント後に実施 | 監査はすべてのコミット、ビルド、デプロイ時に実施 |
| 手動の系統図は古くなる | 自動系統グラフはリアルタイム状態を反映 |
| ポリシー違反が遅れて発見され、修正コストが高い | ポリシー違反は即座にパイプラインをブロック |
| 非技術者への可視性が限定的 | リアルタイムダッシュボードでデータ管理者と監査人が活用可能 |

**定期的** から **継続的** へのシフトは、ウォーターフォールから DevOps への進化に似ています。自動テストがコードの欠陥を早期に検出するように、自動ガバナンスはデータの欠陥を早期に検出します。

---

## 2. コア構成要素

1. **Formize エンジン** – 系統取得、ポリシー定義、監査トレイル保存のための API を提供  
2. **MLOps オーケストレータ** – Jenkins、GitHub Actions、Azure Pipelines、または Kubeflow パイプラインがモデルのトレーニングとデプロイを駆動  
3. **アーティファクトリポジトリ** – データセット、モデルバイナリ、フィーチャーストアが格納される S3、Azure Blob、GCS  
4. **Policy-as-Code** – GDPR、HIPAA、内部データ使用ポリシーをエンコードする YAML/JSON ルール  
5. **可観測性レイヤー** – Formize メトリクスを表示する Grafana/Prometheus ダッシュボード  

すべてのコンポーネントは RESTful エンドポイントまたはイベントストリーム（Kafka、Pub/Sub）で通信します。以下の Mermaid 図がデータフローを示しています。

```mermaid
graph LR
    subgraph CI_CD["CI/CD パイプライン"]
        A["Git コミット"] --> B["ビルドステージ"]
        B --> C["テストステージ"]
        C --> D["トレーニングステージ"]
        D --> E["モデルレジストリ"]
    end

    subgraph Governance["Formize ガバナンス"]
        F["系統取得"] --> G["ポリシーエンジン"]
        G --> H["コンプライアンスレポート"]
        H --> I["ダッシュボード"]
    end

    D -->|データセットアクセス| F
    E -->|モデルアーティファクト| F
    G -->|違反イベント| CI_CD
    CI_CD -->|ビルド失敗| B
    I -->|アラート| Developers
```

*すべてのノードラベルは Mermaid の要件に従い二重引用符で囲まれています。*

---

## 3. ステップバイステップ統合

### 3.1. Policy-as-Code の定義

リポジトリのルートに `policies.yaml` ファイルを作成します。

```yaml
policies:
  - id: "PII-001"
    description: "明示的な同意がない限り、PII フィールドはトレーニングに使用できない"
    condition: "dataset.contains('ssn') or dataset.contains('email')"
    action: "block"
    severity: "high"

  - id: "DATA-RETENTION-01"
    description: "5 年以上古いトレーニングデータはアーカイブする必要がある"
    condition: "dataset.age > 5y"
    action: "warn"
    severity: "medium"
```

Formize は **系統取得** ステップでこのファイルを読み取り、各ルールを受信データセットのメタデータに対して評価します。

### 3.2. パイプラインに Formize フックを追加

以下はトレーニングジョブ完了後に実行される GitHub Actions のスニペットです。

```yaml
name: MLOps CI/CD

on:
  push:
    branches: [ main ]

jobs:
  train-and-govern:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: pip install -r requirements.txt

      - name: Run training script
        id: train
        run: |
          python train.py --data s3://bucket/raw-data/2024-08-01.csv --output model.pkl

      - name: Capture lineage & enforce policy
        env:
          FORMIZE_API_KEY: ${{ secrets.FORMIZE_API_KEY }}
        run: |
          curl -X POST https://api.formize.io/v1/lineage \
            -H "Authorization: Bearer $FORMIZE_API_KEY" \
            -H "Content-Type: application/json" \
            -d @- <<EOF
          {
            "pipeline_id": "github-actions-mlops",
            "run_id": "${{ github.run_id }}",
            "artifact": "model.pkl",
            "dataset": "s3://bucket/raw-data/2024-08-01.csv",
            "metadata": {
              "commit_sha": "${{ github.sha }}",
              "author": "${{ github.actor }}",
              "timestamp": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
            },
            "policy_file": "policies.yaml"
          }
          EOF
```

いずれかのポリシーが `block` を返すと、ステップは非ゼロステータスで終了し、ジョブ全体が失敗します。この **フェイルファスト** 動作により、コンプライアンス違反データが本番に到達することはありません。

### 3.3. 系統を中央グラフに保存

Formize は自動的に有向非循環グラフ（DAG）を内部の Neo4j ストアに書き込みます。Cypher でクエリできます。

```cypher
MATCH (d:Dataset)-[:USED_IN]->(t:TrainingRun)-[:PRODUCED]->(m:Model)
WHERE d.name CONTAINS 'raw-data'
RETURN d.name, t.run_id, m.version
ORDER BY t.timestamp DESC
LIMIT 10;
```

結果は Formize UI で可視化でき、カスタムダッシュボード用に Grafana へエクスポートすることも可能です。

### 3.4. リアルタイムダッシュボード

Formize メトリクスを取得する Prometheus エクスポーターを作成します。

```go
package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    policyViolations = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "formize_policy_violations_total",
            Help: "Total number of policy violations detected",
        },
        []string{"policy_id", "severity"},
    )
)

func main() {
    // Assume we receive webhook events from Formize
    http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {
        // Parse JSON, increment counters...
    })
    prometheus.MustRegister(policyViolations)
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":9090", nil)
}
```

Grafana は `formize_policy_violations_total` をパイプライン別にプロットでき、データ管理者に即時の可視性を提供します。

---

## 4. ガバナンス層のスケーリング

| 課題 | 推奨ソリューション |
|-----------|----------------------|
| 高頻度パイプライン（1日数百回実行） | Formize をクラスターモードでロードバランサーの背後にデプロイし、系統イベントのバッチ取り込みを有効化する。 |
| マルチクラウドデータソース | Formize のクラウド非依存コネクタ（S3、Azure Blob、GCS）を使用し、統一リソース識別子スキーマを設定する。 |
| チーム横断的なポリシー所有権 | Formize のロールベースアクセス制御（RBAC）を活用し、各ドメインチームがポリシーファイルを所有し、中央チームがエンジンを管理できるようにする。 |
| 監査トレイルの不変性 | Formize をブロックチェーンアンカー（例：Ethereum または Hyperledger）と組み合わせ、各系統取引を暗号的に封印する。 |

---

## 5. セキュリティとコンプライアンスの考慮事項

1. **API キー管理** – `FORMIZE_API_KEY` をシークレットマネージャー（GitHub Secrets、Azure Key Vault）に保存し、キーは四半期ごとにローテーションする。  
2. **データ最小化** – Formize へは **メタデータ**（ハッシュ、スキーマ、タイムスタンプ）のみを送信し、生の PII は決して送信しない。  
3. **転送時暗号化** – すべての Formize エンドポイントは TLS 1.3 を強制します。  
4. **保持ポリシー** – 組織の保持期間を超える系統データを削除するよう Formize を設定し、GDPR の “忘れられる権利” に合わせる。  

---

## 6. ガバナンススタックの将来対応

- **AI 支援ポリシー生成:** LLM を使用して、観測されたデータドリフトパターンに基づく新しいポリシールールを提案する。  
- **イベント駆動アーキテクチャ:** 超低遅延のために HTTP 呼び出しを Kafka トピック（`lineage.events`、`policy.violations`）に置き換える。  
- **セルフサービスポータル:** データサイエンティストが Formize 搭載 UI を通じて一時的なポリシー例外をリクエストできるようにし、自動承認ワークフローを提供する。  

---

## 7. まとめ

Formize を MLOps CI/CD パイプラインに組み込むことで、データガバナンスは **受動的なチェックポイント** から **継続的で自動化された保護** に変わります。すべてのステージで系統を取得し、policy-as-code を評価し、リアルタイムメトリクスを提示することで、組織は以下を実現できます。

- コンプライアンスリスクと監査工数を削減  
- データ品質を犠牲にせずモデル提供を加速  
- 規制当局や内部監査人向けに透明で監査可能なトレイルを提供  

まずは単一パイプラインから始め、ポリシー定義を繰り返し改善し、水平にスケールしてください。その結果、現代の開発速度に追随できる、堅牢で信頼できる AI デリバリープラットフォームが実現します。