2025/10/30に開催された kaonavi Tech Talk #21 にて登壇した際の資料になります
データとAIで明らかになる、私たちの課題。Snowflake MCP,Salesforce MCPに触れて / Data and AI Insights
こんにちは。株式会社カオナビの本江雄人(ほんごうゆうと)です。 普段はデータチームの立ち上げやデータ基盤の運用を担当しています。
私たちは、プロダクトが提供する価値をデータで可視化するため、データ基盤の導入やモニタリングを進めてきました。 さらに、様々な部署でのデータ活用を促進する活動の一環として、Snowflake MCPやSalesforce MCPの利用を申請し、利用を促進してみました。
MCPの導入により、ディレクターなどがSQLを書かずに自然言語で顧客の利用状況を確認できるようになり、 データ活用の裾野を広げる一歩となりました。
しかし、これらのMCPを使ってみて、私たちは データとAIに関する新たな「課題」 に直面しました。 本記事では、その2つの課題と、そこから得られた学びについて共有します。
Snowflake MCPの導入により、データ基盤の利用者数は増加し、データアクセスの民主化が進みました。 非エンジニアにも活用が広がり、データへの関心も向上しました。
一方で、「めっちゃ雑にAIに問い合わせしても、なかなか欲しい結果は得られず」、分析結果の質が悪いという新たな課題が浮上しました。 AIがアクセスしやすくなったことで、データ基盤側の構造的な問題が露呈したのです。
第一の原因は、データの意味が一意に定まっておらず、AIの解釈が揺らいでしまうことでした。
COMMENT 等の定義(メタデータ)がない。対策:
この問題に対し、私たちはLLMを使って不足していた COMMENT を埋めてもらいました。
/* LLMによってCOMMENTを補完した例 */
STATUS_CODE NUMBER(38,0) COMMENT 'HTTPステータスコード by LLM',
RESPONSE_TIME FLOAT COMMENT 'HTTP応答時間(秒) by LLM',
HOST VARCHAR(16777216) COMMENT 'ホスト名 by LLM',これにより、AIの認識ミス(集計ミス)も減少しました。
第二の原因は、データ構造の複雑さです。 モデリング(martの準備や中間集計等)をしていないRAWデータ、例えばRedmineからそのまま同期したような正規化されたテーブル群は、AIが正しく集計を実施するのが困難でした。
対策: 現在、ディメンショナルモデリングの適応を含むデータ基盤の再構築を実施中です。
ディメンショナルモデリングは、データを「事実(ファクト)」と「次元(ディメンション)」に分けて組織化し、分析を容易にすることを目指す手法です。
この構造は、分析者も(ついでにAIも)理解しやすいはずだと考えています。
人間にやさしい(=メタデータが整備され、モデリングされている)データは、AIがミス・失敗しにくくなる
次に、Salesforceのデータです。 このデータもSnowflakeに同期し、プロダクト企画などに活用しています。 データの不具合調査などを補佐してもらう目的で、Salesforce MCPの利用申請も実施しました。
しかし、ここでもAIが集計に失敗するオブジェクト(仮に「注文書」とします)が存在しました。
そのオブジェクトは、以下のような「横持ち」のデータ構造になっていました。
| 品名1 | 金額1 | 品名2 | 金額2 | ... |
|---|---|---|---|---|
| 商品A | 200円 | 商品B | 300円 | ... |
| 商品C | 500円 | 商品D | 300円 | ... |
| 商品B | 270円 | 商品C | 0円 | ... |
この構造は、AIにとって(そして人間にとっても)集計が非常に困難です。
問題点1: 動的なクエリが必要 「全明細のコードと金額を取得」したい場合、SQL(SOQL)では以下のように、存在する全てのカラム(例では12個)をハードコーディングで書く必要があります。
/* 横持ちデータの場合 */
SELECT
ItemCode1__c, ItemPrice1__c,
ItemCode2__c, ItemPrice2__c,
ItemCode3__c, ItemPrice3__c,
... (12個全部書く必要がある)もしこれが「縦持ち」(注文と注文明細が別オブジェクト)であれば、シンプルに書けます。
/* 縦持ちデータの場合 */
SELECT ItemCode, Price FROM OrderLineItems問題点2: 集計が複雑
「特定の商品コードが含まれる注文を全部探す」場合、WHERE句が地獄のようになります。
/* 横持ちデータの場合 */
WHERE ItemCode1_c = 'ITEM-001'
OR ItemCode2_c = 'ITEM-001'
OR ItemCode3__c = 'ITEM-001'
... (12回繰り返し)これは、SpreadSheetやExcelで集計するにもツラい構造です。
Salesforceには「主従関係 (Master-Detail Relationship)」といった仕組みがあり、これを使えば「注文(親)」と「注文明細(子)」のような、集計しやすい「縦持ち」のデータ構造を実現できます。 AIに相談しても、DBの正規化等を勧められるでしょう。
実は、このオブジェクトに関しては、Salesforceで実際に集計作業をする方から**「ツラい」という噂をかねてから聞いていました**。 AIにこの集計作業をさせてみたのは、その背景があったからです。
AIが作業を失敗する場所 ≒ 人間にとって非効率な場所
今回、SnowflakeとSalesforceのMCPに触れてみて、2つのことが明らかになりました。
ここから導き出される結論は、 「AIが作業を失敗する場所は、データ構造の見直しやプロセス改善の絶好の機会である」 ということです。
さらに言えば、そのデータ構造の見直しやプロセス改善ができたとしたら、それは 「AIで作業を代替できるまで整った設計・設定になっている」 ということではないでしょうか。
AIに触れ、AIが失敗するのを見て「AIは使えない」と結論づけるのは簡単です。 しかし、その失敗をAIのせいにせず、私たちのデータやプロセスを疑うことで、改善のサイクルを回すことができます。
このサイクルを通じて、「人にも、AIにも優しい」「効率的な仕組み」 を一緒に目指していきましょう。
