# セマンティックレイヤーとは

指標の計算方法と意味を1か所に定義し、BIツールや表計算、AIが同じ定義を参照できるようにする層です。部署間の数字のずれを軽減しますが、定義の保守と変更管理の担当が必要です。

## セマンティックレイヤーとは

セマンティックレイヤーは売上や解約率といった指標の計算方法と、月別・地域別といった集計の切り口の意味を1か所で定義する層です。複数の利用先がその定義を共通して参照します。元データとBI（Business Intelligence）ツールやAIエージェントなどの利用側との間に、返品の扱いや集計日の基準といった業務上の計算規則を[共通に配置する技法](https://www.thoughtworks.com/radar/techniques/semantic-layer)です。例えば、売上高に返品を含めるか、注文日と出荷日のどちらで集計するかを定義に記述しておくと、営業部のBIツールも経理部の表計算も同じ定義で集計できます。部署ごとのレシピ帳を廃止し、共通のレシピ集を用意するようなものです。

![元データはセマンティックレイヤーへ入力されます。そこには指標の計算方法と集計の切り口が定義されています。BIツール、表計算、AIには同じ定義が提供されます](https://media.marketing.kdotdev-tunnel.org/glossary-semantic-layer-50334d94cf271b28d382de7866b2a2ed1d9ffcfef80ffcefbf8a553f48ce58b0.png)

BIツールは集計結果を画面に表示し、データウェアハウスは元データを蓄積します。これに対し、セマンティックレイヤーの役割は定義の管理です。[dbt Semantic Layer](https://docs.getdbt.com/docs/use-dbt-semantic-layer/sl-architecture)や[Looker](https://docs.cloud.google.com/looker/docs/what-is-lookml)は、利用先の要求に応じて、データベースへの問い合わせ文であるSQLを定義から生成します。複数のレポートが共通利用するデータ項目と計算方法をBIツール内で管理する共有モデルも、この層の実装の1つです。

## 数字が一致しない原因の1つは集計式の分散

元データが正確でも、同名の指標を別の式で計算していれば、数字は部署ごとに異なります。例えば、営業部は注文日で集計し、経理部は出荷済みの分だけを集計し、返品の扱いも画面ごとに異なる状態です。業務ロジックがダッシュボードや下流アプリに分散すると、[定義が無自覚のうちに乖離していきます](https://www.thoughtworks.com/radar/techniques/semantic-layer)。利用先にAIが追加されたことも注目の理由です。大規模言語モデルで文章を単純にSQLへ変換すると、売上計上のような業務規則がテーブルの構造の外にある場合は特に、[不正確な結果になりやすい](https://www.thoughtworks.com/radar/techniques/semantic-layer)とされています。

![同じ元データでも営業部のBIは注文日、経理部の表計算は出荷済みだけを集計するので、売上の数字は部署ごとに異なります](https://media.marketing.kdotdev-tunnel.org/glossary-semantic-layer-7216b159552b006dd39ce4b92a515ea4b0f5fcd15bfc5904ce8a69a41a3a5bed.png)

近年は[Snowflakeのsemantic view](https://docs.snowflake.com/en/user-guide/views-semantic/overview)や[Databricksのmetric view](https://docs.databricks.com/aws/en/metric-views/)のように、データ基盤の製品への内蔵例が[増加しています](https://www.thoughtworks.com/radar/techniques/semantic-layer)。

## 独立した層の追加が必要になる条件

### 独立した層を追加する目安

利用先が1つのBIツールだけで、その共有モデルで定義を管理できている場合、独立したセマンティックレイヤーを追加する必要性は高くありません。この場合は指標名・計算式・責任者を記述した定義書を共有モデルと並行して保守すれば十分です。複数のBIツールで同じ定義が必要になり、重複実装や数字の一致確認が継続する場合は、独立した層の追加を検討します。

判断の指標は重複実装の数、修正と一致確認にかかる時間、誤集計の影響度です。これらの作業は指標・部署・利用先の増加に伴って増加しやすいため、次のうち2つ以上に該当する場合は追加を検討します。経験に基づく目安で、業界の基準ではありません。

- 共通で管理したい指標が10個以上
- その指標を利用する部署が3つ以上
- 共有モデルから参照できない取り出し先が1つ以上
- 集計式を自分で記述する人が5人以上

指標が少なくても、経営会議や外部報告に利用する指標は定義を厳密に管理します。導入の効果が限定的になりやすいのは、次の場合です。

- 不一致の原因が元データの欠損や重複
- 部署間で売上などの意味に合意できていない
- 定義の保守担当を配置できない

セマンティックレイヤーは確定した定義を各利用先に提供するだけで、妥当な定義の選定はしません。先に業務側で意味を決定します。目的が異なれば受注額と会計上の売上高のように複数の定義が並存するため、名称・用途・計算条件を区別して管理します。統一の対象は目的と条件が同じなのに式が異なる指標に限ります。

### 定義の置き場所の選択

置き場所は次の条件で選択します。

- 今のBIの共有モデルから、必要な利用先へ定義を共有できるか。他のBIツールから参照できる製品の例は[Looker](https://cloud.google.com/looker-modeling)
- 共有できない利用先で式の重複管理が発生するか。その場合の複数ツールに共通する独立した層の例はdbt Semantic LayerやCube
- データ基盤が内蔵する機能で十分か

![定義の置き場所の選び方です。BIの共有モデルで必要な利用先へ共有できる場合は、そのモデルで管理します。共有できない場合はデータ基盤の機能を確認し、共有できる場合は基盤の機能を利用し、できない場合は独立した層を追加します](https://media.marketing.kdotdev-tunnel.org/glossary-semantic-layer-cec815892b2b37662f1497418fc55bc315f0a7fede0fdc5514375f664a44dca8.png)

共通仕様のOpen Semantic Interchangeは、現在[Apache Ossie](https://ossie.apache.org/updates/archive/2026/)として開発中です。[直接読める製品は限られ、多くは変換ツールを経由します](https://www.snowflake.com/en/developers/guides/getting-started-with-apache-osi/)。特定の製品の書式だけで定義を管理する場合は、置き場所の移行費用を想定します。

## セマンティックレイヤーの導入後の運用コスト

主なコストは元データの項目や関係を業務上の指標に対応させるデータモデリングへの[先行投資](https://www.thoughtworks.com/radar/techniques/semantic-layer)です。広範囲への展開では旧来のレポートの並行稼働で不一致が再発する場合があるため、[1つの領域からの開始が推奨されています](https://www.thoughtworks.com/radar/techniques/semantic-layer)。最初は例えば5指標前後の1領域に限定します。

![指標ごとに、業務側の責任者が意味を決定し、技術担当が定義を記述して検証し、業務側の責任者が承認します](https://media.marketing.kdotdev-tunnel.org/glossary-semantic-layer-e333e7e97835db55a07753801830b6d10cf60babd73452ea730ad32291ab0dbb.png)

### 運用で発生する作業

- 定義の保守: 指標の追加、条件の変更、元テーブルの変更への追従。工数は変更頻度、データ源、検証と承認の範囲で変動するため、最初の領域で記録して展開後を試算する
- 担当の分担: 定義を記述して検証する技術担当と、意味を決定して承認する業務側の責任者を、指標ごとに指定する
- 閲覧権限: 共通化するのは定義で、閲覧範囲は別に設定する。dbtではデータ基盤へ接続するための[認証情報が閲覧範囲を決定する](https://docs.getdbt.com/docs/use-dbt-semantic-layer/setup-sl)ため、BIやAIからの接続でも制限が維持されるか確認する
- 計算費用と接続保守: 問い合わせはデータ基盤の計算費用になる。dbtにはEnterprise／Enterprise+向けの[キャッシュ機能](https://docs.getdbt.com/docs/use-dbt-semantic-layer/sl-cache)があり、対応する実行環境などの条件がある
- 障害時の対応: 共通部分が停止すると複数の利用先に影響するため、監視と復旧の担当を指定する
- 変更管理: dbtでは[本番へ反映した定義が、それを利用する問い合わせに適用される](https://docs.getdbt.com/docs/use-dbt-semantic-layer/dbt-sl)。画面や表計算への反映時期は各ツールの更新設定で異なる

定義の変更で過去の月次資料と数字が一致しなくなる場合は、変更管理の担当が変更前に影響する画面と資料を一覧化し、変更日と理由を記録し、新旧の数字を併記します。[Lookerは定義ファイルの変更履歴を、バージョン管理ソフトウェアのGitで記録し](https://cloud.google.com/looker/docs/version-control-and-deploying-changes)、本番に影響しない開発モードで検証してから反映します。dbtの[検証機能](https://docs.getdbt.com/docs/build/validation)は定義が参照する列やテーブルの実在を確認し、元テーブルの変更による不具合の早期発見に使用できます。

dbtでは外部BI向けサービスと、共通定義に基づく指標の問い合わせ用APIが[Starter以上のプラン](https://docs.getdbt.com/docs/use-dbt-semantic-layer/sl-architecture)で提供されるため、機能の選定時にプランを確認します。SQLを生成するMetricFlow単体では利用できません。

## よくある誤解

導入しただけで数字が一致する、という誤解があります。セマンティックレイヤーを経由した集計ではずれを軽減できますが、対象期間、条件、更新時点、閲覧権限のいずれかが相違すると、数字は異なる場合があります。直接記述されたSQLや旧来のレポートが存在すると、別の式も併存します。対象の指標を1つ選択し、既存の計算箇所を一覧化して共通定義の参照へ移行し、新旧の差を同条件で確認します。参照できない利用先があれば、置き場所を再検討します。

![セマンティックレイヤーを経由した集計は同じ定義になります。直接記述されたSQLや旧来のレポートには、別の式が併存します](https://media.marketing.kdotdev-tunnel.org/glossary-semantic-layer-56ebe684a1ab5f7979cc8760d2dac1eec96dc03c92a601efab49d2ee355a8766.png)

データウェアハウスやBIツールの代わりになる、という誤解もあります。Snowflakeでは[semantic viewが保存するのはデータそのものではなく定義](https://docs.snowflake.com/en/user-guide/views-semantic/overview)なので、データを蓄積する場所と画面に表示するツールは別に必要です。
