営業部でプリセールスをやっていると、デモで「これは刺さったな」と思った直後に、いちばん本質的な質問をもらうことがあります。今回はDatabricksのAI/BIダッシュボードとGenieに関する、まさにそんな話です。
毎日同じこと聞くの?
ある日の商談で
「こちらがDatabricksのAI/BIダッシュボードです。売上や生産量など、経営判断に必要な概況を一目で確認できます」
「ここまでなら他の分析ツールでもできます。そこで別の軸で深掘りしたいときに使うのがGenieです。自然言語で聞けば、その場で経営判断に使える分析ができます(ドヤッ)」
すると、お客様からひと言。
「それ、毎日同じこと聞かないといけないんですか?」
……なるほど、確かに。せっかくダッシュボードがあるなら、毎回「Genieに聞く」を押して同じ質問をするより、最初から概況が表示されていた方が自然です。
なら最初から表示してしまえばいい
ということで Genieを“その場で呼ぶ”のではなく、“更新時に先回りして要約させる” ようにします。
データ更新パイプライン
↓
Genie概況Job
↓
Genieが概況を生成
↓
ダッシュボードのテキストウィジェットを更新
これなら、利用者はダッシュボードを開いた瞬間に概況を読めます。必要ならそこからさらに「Genieに聞く」で深掘りすればいい。
- ダッシュボード: 最初に見る経営の概況
- Genie: 気になったところを深掘りする対話役
毎回同じ質問を投げるのではなく、定型の“朝会サマリ”は先に出しておく方が、業務ではずっと使いやすいと感じました。
ポイントはMarkdownで返してもらうこと
この仕組みでいちばん大事だったのは、GenieにMarkdown形式で返してもらうことです。
ダッシュボードのテキストウィジェットにそのまま反映したいので、ただ文章を返してもらうだけでは少し扱いづらいです。見出しや箇条書きが揃っていた方が、そのまま「概況サマリ」として載せやすくなります。
また、Genieスペースをリンクさせることで、ベンチマークや一般的な指示で調整も出来るので管理が楽
なので、Genieに投げるプロンプト側で、最初から回答形式をかなり明示しました。
PROMPT = (
"化学素材ビジネスの概況を、対象テーブル(生産・売上)から読み取り説明をしてください。"
"Markdown形式で要約してください。"
"全体で400〜500字程度としてください。"
"説明中の売上は見やすい単位で表示してください。"
"次の構成で回答することを必ず守ってください。"
"## 生産量と売上の概況 "
"### 国別の売上動向 "
"### 商品カテゴリ別生産状況のハイライト "
"### 直近30日に売上が急増・急減した商品名 "
"## 次のアクション提案 "
)
Genieへの問い合わせ部分はこんな感じです。
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
def call_genie(space_id: str, content: str) -> str:
msg = w.genie.start_conversation_and_wait(
space_id=space_id,
content=content
)
parts = []
for att in (getattr(msg, "attachments", None) or []):
text = getattr(att, "text", None)
if text is not None:
content_text = getattr(text, "content", None)
if content_text:
parts.append(content_text)
query = getattr(att, "query", None)
if query is not None:
desc = getattr(query, "description", None)
if desc and desc not in parts:
parts.append(desc)
summary = "\n\n".join(p.strip() for p in parts if p and p.strip())
if not summary:
summary = getattr(msg, "content", "") or ""
return summary.strip()
Genie Spaceにプロンプトを投げて、返ってきた説明文を集めているだけです。返答を「あとで整形する前提」ではなく、最初からMarkdownとして使える形で返してもらうことでした。
Jobで回して、朝イチで読めるダッシュボードにする
最後はJobからGenieに問い合わせて、返ってきたMarkdownをダッシュボードのテキストウィジェットへ書き戻します。
summary = call_genie(space_id, prompt)
lines = to_markdown_lines(summary)
dashboard = w.lakeview.get(dashboard_id=dashboard_id)
# 対象widgetのlinesを書き換え
w.lakeview.update(dashboard_id=dashboard_id, dashboard=dashboard)
実際のノートブックでは、テキストウィジェット名を指定して multilineTextboxSpec.lines を更新し、最後に公開版へ反映しています。
今までは「ダッシュボードを見る → Genieに聞く → 毎回似た質問をする」だったのが、今は「ダッシュボードを開く → まず概況が読める → 気になるところだけGenieで深掘りする」というデモシナリオになっています。
Genieは対話の入口としてすごく便利です。ただ、毎日ほぼ同じことを聞くなら、それはもう先に表示しておいた方がいい。デモでお客様に言われたひと言から始まったのですが、結果的にはかなり“ダッシュボードらしい使い方”に近づいた気がしています。
参考
- Genieスペース リソースをDatabricksアプリに追加する | Databricks on AWS
https://docs.databricks.com/aws/ja/dev-tools/databricks-apps/genie - Databricks AI/BIダッシュボードからカスタマイズされたGenieスペースをリンク
https://qiita.com/taka_yayoi/items/17c41c9da78091988eef

