0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Genieに毎日聞くの、やめました。AI/BIダッシュボードに概況を表示する

0
Posted at

営業部でプリセールスをやっていると、デモで「これは刺さったな」と思った直後に、いちばん本質的な質問をもらうことがあります。今回はDatabricksのAI/BIダッシュボードとGenieに関する、まさにそんな話です。

毎日同じこと聞くの?

ある日の商談で

「こちらがDatabricksのAI/BIダッシュボードです。売上や生産量など、経営判断に必要な概況を一目で確認できます」

「ここまでなら他の分析ツールでもできます。そこで別の軸で深掘りしたいときに使うのがGenieです。自然言語で聞けば、その場で経営判断に使える分析ができます(ドヤッ)」

すると、お客様からひと言。

「それ、毎日同じこと聞かないといけないんですか?」

……なるほど、確かに。せっかくダッシュボードがあるなら、毎回「Genieに聞く」を押して同じ質問をするより、最初から概況が表示されていた方が自然です。

genie_dashboard_customer_question_illustration.png
確かにおっしゃるとおりでございます

なら最初から表示してしまえばいい

ということで 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 を更新し、最後に公開版へ反映しています。

screenshot-1777195039382.png

今までは「ダッシュボードを見る → Genieに聞く → 毎回似た質問をする」だったのが、今は「ダッシュボードを開く → まず概況が読める → 気になるところだけGenieで深掘りする」というデモシナリオになっています。

Genieは対話の入口としてすごく便利です。ただ、毎日ほぼ同じことを聞くなら、それはもう先に表示しておいた方がいい。デモでお客様に言われたひと言から始まったのですが、結果的にはかなり“ダッシュボードらしい使い方”に近づいた気がしています。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?