Snowflake Intelligence でチャートをカスタマイズする

Snowflake Intelligence はデータからチャートを自動的に生成します。エージェントまたはセマンティックビューに構成を追加することで、これらのチャートをカスタマイズし、色、フォント、チャートタイプなどを制御できます。

概要

カスタマイズは2つのレベルで機能します。

  • エージェントレベル:エージェントにアタッチされたすべてのセマンティックビューのすべてのチャートに適用されます。ブランドの色やフォントなどのグローバルなデフォルトに使用します。

  • セマンティックビューレベル:その特定のセマンティックビューから生成されたチャートにのみ適用されます。列固有のルールとドメイン固有のチャートタイプ設定に使用します。

各レベルでは、2つのメカニズムが使用可能です。

  • vega_template:部分的な`Vega-Lite<https://vega.github.io/vega-lite/>`_JSON は、生成されたすべてのチャートに決定論的にマージされる仕様です。常に適用する必要があるすべての機能に使用します。

  • 自由テキストの手順:チャート生成プロンプトに注入された自然言語ガイダンス。LLM はこれらを従うために最善を尽くしますが、保証されていません。

注釈

エージェントとセマンティックビューの両方が vega_template を定義している場合、エージェントテンプレートが最初に適用され、セマンティックビューテンプレートが2番目に適用されます。競合するキーの場合は、セマンティックビューが優先されます。

エージェントレベルのカスタマイズ

エージェント構成の instructions.orchestration<chart_customization> ブロックを追加します。フォントのテーマとグローバルのデフォルトパレットを組み合わせることができます。

<chart_customization>
Prefer horizontal bar charts for ranked data.
vega_template:
{
  "background": "antiquewhite",
  "config": {
    "title":  { "font": "monospace", "fontStyle": "italic", "fontSize": 20, "fontWeight": "lighter" },
    "axis":   { "labelFont": "monospace", "titleFont": "monospace", "titleFontSize": 15, "labelFontSize": 10 },
    "header": { "labelFont": "monospace", "titleFont": "monospace", "labelFontSize": 10 },
    "legend": { "labelFont": "monospace", "titleFont": "monospace", "titleFontSize": 18, "labelFontSize": 15 },
    "mark":   { "font": "monospace" }
  }
}
</chart_customization>

次にはエージェントレベルを使用します。

  • ブランドカラーパレット

  • デフォルトの視覚テーマ(フォント、バックグラウンド)

  • クロスドメインのスタイル設定

  • 数値または通貨形式のデフォルト

エージェントレベルでの列固有の色マッピングは避けます。列名はセマンティックビュー間で異なり、見つからない場合は無視されます。

セマンティックビューレベルのカスタマイズ

セマンティックビュー YAML の module_custom_instructions.sql_generation フィールドに <chart_customization> ブロックを追加します。両方のフィールドが設定されている場合、このフィールドは従来の custom_instructions フィールドより優先されます。

CREATE OR REPLACE SEMANTIC VIEW my_db.my_schema.my_view
  FROM @my_stage/semantic_view.yaml;
# semantic_view.yaml
name: my_view
module_custom_instructions:
  sql_generation: |
    <chart_customization>
    Always use a line chart for time series data.
    vega_template:
    {
      "transform": [
        {
          "calculate": "datum.CATEGORY === 'Furniture' ? '#4e79a7' : datum.CATEGORY === 'Technology' ? '#f28e2b' : datum.CATEGORY === 'Office Supplies' ? '#e15759' : ''",
          "as": "_color"
        }
      ],
      "encoding": {
        "color": { "field": "CATEGORY", "type": "nominal", "scale": { "range": { "field": "_color" } } }
      }
    }
    </chart_customization>
tables:
  ...

以下には、セマンティックビューレベルを使用します。

  • 列ごとの色マッピング

  • ドメイン固有のチャート型ルール

  • メトリック固有のフォーマット

  • エージェントレベルのデフォルトの上書き

使用上の注意:テンプレートはすべてのチャートに影響します

vega_template は、そのレベルで生成された すべてのチャート にマージされます。質問ごとやチャートごとのフィルタリングはありません。encoding.y 上書きをエージェントレベルに追加すると、棒グラフ、折れ線グラフ、散布図、円グラフなどに適用されます。

テンプレートを追加する前に、次のことを考慮してください。

  • 範囲:エージェントレベルのテンプレートは、すべてのセマンティックビューにわたるすべてのチャートに影響します。ルールが1つのドメインまたはデータセットに固有の場合は、セマンティックビューレベルを優先します。

  • ワイルドカードエンコーディングfield``(例:"y": {"axis": {"format": "..."}}``)を省略するテンプレートエンコーディングは、どの列がプロットされているかに関わらず、すべてのグラフの y 軸に適用されます。セマンティックビューがわかっている場合、 field を使用して特定の列に固定します。

  • オーバーライドをマーク:エージェントレベルで "mark": "line" を設定すると、 LLM が正しく棒グラフや円グラフを選択するようなグラフも含め、すべてのグラフが強制的に折れ線グラフになります。データに関するドメイン知識があるセマンティックビューレベルでのみ、 mark をオーバーライドします。

  • 配列を変換:テンプレートでの calculate 変換(例:_color)はすべてのチャートの transform 配列に注入されます。データに参照列が含まれていない場合、Vega-Liteは計算フィールドに暗黙的に null 値を生成します。

よく分からない場合は、セマンティックビューレベルから開始し、ルールがすべてのチャートで安全であることを確認した後にのみエージェントレベルに昇格します。

デプロイする前にテンプレートを検証するには、代表的なチャート仕様(vega_template が既にマージされているもの)を `Vegaエディター<https://vega.github.io/editor>`_ に貼り付けます。エディターはコンソールにライブ警告とエラーを表示します。有効なテンプレートは警告を生成しません。この方法でキャッチする一般的なもの:無効なプロパティ名、型の不一致、到達不能の calculate 式、およびスケール構成エラー。

フォント

フォントの設定は vega_template 内の config ブロックで制御できます。すべてのフォントプロパティはチャートにグローバルに適用され、データに関係なく、生成されたすべてのチャートに影響を与えます。

注釈

互換性を最大限に高めるには、 CSS の汎用フォントファミリーを使用します。Snowflake Intelligence におけるグラフは、2つのコンテキストでレンダリングされます。1つは Snowsight ブラウザー UI(クライアント側、フォントはユーザーの OS および ブラウザーに依存)、もう1つは検証と画像エクスポートのためのLinuxコンテナ内のサーバー側です。Arial または Georgia などの名前付きフォントは、サーバー側のコンテナにインストールされていない可能性があります。 CSS の汎用フォントファミリーは、両方のコンテキストで常に正しく解決されます。

ジェネリックファミリー

解決先

sans-serif

Arial(Windows/macOS)、DejaVu SansまたはLiberation Sans(Linux)

serif

Times New Roman(Windows/macOS)、DejaVu SerifまたはLiberation Serif(Linux)

monospace

Courier New(Windows/macOS)、DejaVu Sans MonoまたはLiberation Mono(Linux)

カスタムブランドフォントが必要な場合は、サーバー側レンダリングコンテナにインストールし、 および Snowsight の CSS``@font-face`` を介して提供する必要があります。

{
  "config": {
    "title":  { "font": "serif", "fontSize": 20, "fontWeight": "bold", "fontStyle": "italic" },
    "axis":   { "labelFont": "monospace", "titleFont": "monospace", "labelFontSize": 11, "titleFontSize": 13 },
    "header": { "labelFont": "serif", "titleFont": "serif", "labelFontSize": 11 },
    "legend": { "labelFont": "serif", "titleFont": "serif", "labelFontSize": 12, "titleFontSize": 13 },
    "mark":   { "font": "serif" }
  }
}

共通 config フォントプロパティ:

プロパティ

適用される場所

title.fonttitle.fontSizetitle.fontWeighttitle.fontStyle

チャートのタイトル

axis.labelFontaxis.labelFontSize

軸目盛りラベル

axis.titleFontaxis.titleFontSize

軸タイトル(例:「収益」)

header.labelFontheader.labelFontSize

ファセット/複数の小さなヘッダー

legend.labelFontlegend.labelFontSize

凡例値ラベル

legend.titleFontlegend.titleFontSize

凡例のタイトル

mark.font

テキストマーク(注釈)

フォントと一緒にグローバル background 色を設定することもできます。

{
  "background": "#f9f9f9",
  "config": {
    "title":  { "font": "monospace", "fontStyle": "italic", "fontSize": 20, "fontWeight": "lighter" },
    "axis":   { "labelFont": "monospace", "titleFont": "monospace", "titleFontSize": 15, "labelFontSize": 10 },
    "header": { "labelFont": "monospace", "titleFont": "monospace", "labelFontSize": 10 },
    "legend": { "labelFont": "monospace", "titleFont": "monospace", "titleFontSize": 18, "labelFontSize": 15 },
    "mark":   { "font": "monospace" }
  }
}

LLM 手順(ソフト)

色規則を適用する最も簡単な方法は、自由テキストで説明することです。LLM はこれらをベストエフォートベーシスで解釈します。

<chart_customization>
Color Active status green, Inactive status red, and Pending status yellow.
</chart_customization>

正確な16進値が必要ない場合は、迅速でおおよその色ガイダンスを使用してください。

_colorによる正確な値のマッピング

calculate 変換を使用して、特定の列の値を正確な16進数の色にマッピングします。リストされていない値は空の文字列を受け取り、Vega-Liteはそれらを独自のデフォルトでレンダリングします。

{
  "transform": [
    {
      "calculate": "datum.STATUS === 'Active' ? '#22c55e' : datum.STATUS === 'Inactive' ? '#ef4444' : datum.STATUS === 'Pending' ? '#eab308' : ''",
      "as": "_color"
    }
  ],
  "encoding": {
    "color": {
      "field": "STATUS",
      "type": "nominal",
      "scale": { "range": { "field": "_color" } }
    }
  }
}

既知の値すべてに対して正確で保証された色が必要な場合に使用します。

注釈

_color 変換および encoding.color ブロックは、 LLM がどの列に基づいて色付けを選択したかに関わらず、常にチャートに統合されます。** この統合はSnowflakeのプライバシー重視の基礎に基づいているため、安心して 駆動型のユースケースを利用できます。これは次のことを意味します。

  • マッピングは、チャートの色チャネルが実際に calculate 式で参照される同じ列を使用する場合にのみ正しく機能します(例:STATUS)LLM が別の列に色を割り当てた場合、 _color フィールドはデータに存在しますが、色が一致しません。

  • 1つのテンプレートにつきターゲットにできる列は1つだけです。

パレットフォールバックで固定された値

キー値の色を固定し、残りをパレットから自動割り当てできるようにします。"merge": "extend" を使用して LLM の既存の色使いを保存し、新しいマッピングのみを追加します。

{
  "encoding": {
    "color": {
      "scale": {
        "domain": ["Furniture", "Technology", "Office Supplies"],
        "range":  ["#4e79a7", "#f28e2b", "#e15759"],
        "scheme": "tableau10"
      }
    }
  },
  "usermeta": { "merge": "extend" }
}

domain にないデータ値は、 scheme から次に利用可能な色が自動的に割り当てられます。割り当て後、 scheme は最終仕様から削除されます。

サポートされているスキーム名:tableau10tableau20category10category20category20bcategory20cdark2pairedpastel1pastel2set1set2set3accent

Snowsightスタイルの無効化

デフォルトでは、 Snowflake Intelligence は生成されたグラフの上に |sf-web-interface|UI テーマの調整を適用します。オプトアウトし、 vega_template で指定されたとおりにチャートをレンダリングするには、 usermetaui-merge"none" に設定します。

{
  "usermeta": { "ui-merge": "none" }
}

これは、視覚的な出力をフルコントロールしたい場合に便利です。例えば、カスタムブランドテーマを適用する際に、 Snowsight が色、フォント、または背景を上書きしないようにしたい場合などです。

注釈

ui-merge は、オーケストレーションのバックエンドではなく、Snowsightクライアント側のレンダリングによって解釈されます。マージエンジンによって生成されるチャート仕様には影響しません。ブラウザーでチャートを表示するときに、最終的な仕様の上にSnowsight独自のテーマを適用する方法のみを制御します。

数値と通貨のフォーマット(試験)

vega_template を通じて、 `D3形式文字列<https://d3js.org/d3-format>`_ を使用して軸と凡例のラベルをフォーマットできます。これは、すべてのチャートで通貨記号、小数点以下の桁数、または SI 接尾辞を統一するのに役立ちます。

量的な軸(xy)には axis.format を、色/サイズの凡例には legend.format を設定します。

{
  "encoding": {
    "y": { "axis": { "format": "$,.0f" } }
  }
}

注釈

axis.format はチャネルのデータ型が "quantitative" の場合にのみVega-liteによって適用されます。LLM が異なる型を推測する場合(例:"ordinal" が年または ID 列など)、形式文字列は警告なしで無視されます。これは、 vega_template アプローチの許容される制限事項であり、推論された型を検査せずにマージが適用されるためです。

回避策:テンプレートで明示的に型を強制します(override モード):

{
  "encoding": {
    "y": { "type": "quantitative", "axis": { "format": "$,.0f" } }
  }
}

これにより、形式の適用が保証されますが、他の型依存のレンダリング(軸目盛り、ビニング)に影響を与える可能性があります。

一般的なD3形式文字列:

形式

出力例

用途

$,.0f

$1,234,567

ドル額、小数なし

$,.2f

$1,234,567.89

ドル額、小数点以下2桁

,.0f

1,234,567

桁区切りの大きな整数

.1%

42.3%

割合

.2s

1.2M

SI 接頭辞付きの大きな数

.2f

3.14

小数点以下2桁まで固定

エージェントレベルですべての定量チャネルにフォーマットを適用するには(特定の列名を知ることなく):

{
  "encoding": {
    "y": { "axis": { "format": "$,.0f" } },
    "x": { "axis": { "format": "$,.0f" } },
    "color": { "legend": { "format": "$,.0f" } }
  },
  "usermeta": { "merge": "extend" }
}

"merge": "extend" を使用すると、 LLM に既にデータが入力されているチャネルにのみフィーマットが追加され、 field または type の設定が上書きされません。

マージモード

テンプレート内で "usermeta": {"merge": "<mode>"} を設定することで、 vega_template が LLM で生成されたチャートとどのように連携するかを制御できます。

モード

動作

override (デフォルト)

テンプレート値はチャートを上書きします。特定の設定を強制する必要がある場合に使用します。

extend

既存のチャート値は保持されます。新しいキーとスケールエントリが追加されました。LLM が選択したものを置き換えずにチャートに情報を追加する場合に使用します。

両方のモードに適用されるルール。

  • data ブロックが上書きされることはありません。

  • エンコードの上書きは、テンプレートの field がチャートの field と一致する場合、またはテンプレートが field を省略している場合にのみ適用されます。

  • マージ後、実際のデータに存在しないドメインエントリは自動的に削除されます。

例:折れ線グラフを強制する

{
  "mark": "line",
  "usermeta": { "merge": "override" }
}