Personnaliser les graphiques dans Snowflake Intelligence

Snowflake Intelligence génère automatiquement des graphiques à partir de vos données. Vous pouvez personnaliser ces graphiques, en contrôlant les couleurs, les polices, les types de graphiques, etc., en ajoutant une configuration à votre agent ou à votre vue sémantique.

Vue d’ensemble

La personnalisation fonctionne à deux niveaux :

  • Niveau Agent : S’applique à tous les graphiques de chaque vue sémantique associée à l’agent. Utilisez cette option pour les valeurs par défaut globales telles que les couleurs et les polices de marque.

  • Niveau de vue sémantique : S’applique uniquement aux graphiques générés à partir de cette vue sémantique spécifique. Utilisez cette option pour les règles spécifiques aux colonnes et les préférences de type de graphique spécifiques au domaine.

À chaque niveau, deux mécanismes sont disponibles :

  • vega_template : Une spécification `Vega-Lite <https://vega.github.io/vega-lite/>`_JSON partielle qui est fusionné de manière déterministe dans chaque graphique généré. Utilisez ceci pour tout ce qui doit toujours s’appliquer.

  • Instructions en texte libre : Conseils en langage naturel injectés dans l’invite de génération du graphique. Le LLM fait de son mieux pour les respecter, mais ils ne sont pas garantis.

Note

Lorsque l’agent et la vue sémantique définissent tous deux un vega_template, le modèle d’agent est appliqué en premier et le modèle de vue sémantique est appliqué en second. En cas de clés conflictuelles, la vue sémantique l’emporte.

Personnalisation au niveau de l’agent

Ajoutez un bloc <chart_customization> à l’intérieur de instructions.orchestration dans la configuration de votre agent. Vous pouvez combiner un thème de polices et une palette par défaut globale :

<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>

Utilisez le niveau d’agent pour :

  • La palette de couleurs de la marque

  • Le thème visuel par défaut (polices, arrière-plan)

  • Les préférences de style inter-domaines

  • Les paramètres par défaut pour le formatage des nombres ou des devises

Évitez les mappages de couleurs spécifiques aux colonnes au niveau de l’agent. Les noms des colonnes diffèrent selon les vues sémantiques et sont ignorés silencieusement lorsqu’ils ne sont pas trouvés.

Personnalisation au niveau de la vue sémantique

Ajoutez un bloc <chart_customization> à l’intérieur du champ module_custom_instructions.sql_generation de votre YAML de vue sémantique. Ce champ a priorité sur l’ancien champ custom_instructions lorsque les deux sont définis.

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:
  ...

Utilisez le niveau de la vue sémantique pour :

  • Mappages de couleur par colonne

  • Règles de type de graphique spécifiques au domaine

  • Formatage spécifique à la métrique

  • Remplacement des valeurs par défaut au niveau de l’agent

À utiliser avec précaution : les modèles affectent chaque graphique

vega_template est fusionné dans chaque graphique généré à ce niveau. Il n’y a pas de filtrage par question ou par graphique. Si vous ajoutez un remplacement encoding.y au niveau de l’agent, il s’applique aux graphiques à barres, aux graphiques linéaires, aux diagrammes de répartition et aux graphiques en secteurs.

Avant d’ajouter un modèle, consultez les points suivants :

  • Portée : Les modèles de niveau agent affectent tous les graphiques de toutes les vues sémantiques. Préférez le niveau de vue sémantique lorsqu’une règle est spécifique à un domaine ou à un ensemble de données.

  • Encodages génériques : Un encodage de modèle qui omet field (par exemple,`` »y »: {« axis »: {« format »: « … »}}``) s’applique à chaque axe y de graphique, quelle que soit la colonne tracée. Utilisez field pour l’épingler à une colonne spécifique lorsque la vue sémantique est connue.

  • Remplacements de marque : Définir "mark": "line" au niveau de l’agent force chaque graphique à être défini sur une ligne, y compris ceux où le LLM choisirait correctement une barre ou un diagramme. Remplacez uniquement mark au niveau de la vue sémantique lorsque vous avez des connaissances approfondies des données.

  • Tableaux de transformation : Une transformation calculate dans le modèle (par exemple,``_color``) est injectée dans le tableau transform de chaque graphique. Si les données ne contiennent pas la colonne référencée, Vega-Lite produit les valeurs null silencieusement pour le champ calculé.

En cas de doute, commencez par le niveau de la vue sémantique et passez au niveau de l’agent uniquement après avoir confirmé que la règle est sûre pour tous les graphiques.

Pour valider un modèle avant de le déployer, collez une spécification de graphique représentative (avec votre vega_template déjà fusionné) dans l’Éditeur Vega. L’éditeur affiche des avertissements et des erreurs en direct dans la console. Un modèle valide ne doit produire aucun avertissement. Objets communs à intercepter de cette façon : noms de propriété non valides, discordances de type, expressions calculate inatteignables et erreurs de configuration d’échelle.

Polices

Les paramètres de police sont contrôlés par le bloc config dans vega_template. Toutes les propriétés des polices sont appliquées globalement au graphique et affectent chaque graphique généré, quelles que soient les données.

Note

Utilisez les familles de polices génériques CSS pour une compatibilité maximale. Les graphiques dans Snowflake Intelligence sont rendus dans deux contextes : dans l’UI du navigateur Snowsight (côté client, les polices dépendent de l’OS et du navigateur de l’utilisateur) et un navigateur) et côté serveur dans un conteneur Linux pour la validation et l’exportation d’images. Les polices nommées comme Arial ou Georgia peuvent ne pas être installées dans le conteneur côté serveur. Les familles génériques CSS sont toujours résolues correctement dans les deux contextes :

Famille générique

Résolue en

sans-serif

Air (Windows/macOS), DejaVu Sans ou Liberation Sans (Linux)

serif

Times New Roman (Windows/macOS), DejaVu Serif ou Liberation Serif (Linux)

monospace

Courier New (Windows/macOS), DejaVu Sans Mono ou Liberation Mono (Linux)

Si vous avez besoin d’une police de marque personnalisée, elle doit être installée dans le conteneur de rendu côté serveur et fournie via CSS``@font-face`` dans|sf-web-interface|.

{
  "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" }
  }
}

Propriétés courantes de la police config :

Propriété

Où s’applique-t-elle ?

title.font, title.fontSize, title.fontWeight, title.fontStyle

Titre du graphique

axis.labelFont, axis.labelFontSize

Libellés de coche d’axe

axis.titleFont, axis.titleFontSize

Titres d’axes (par exemple, « Revenus »)

header.labelFont, header.labelFontSize

Facette/en-têtes petits-multiples

legend.labelFont, legend.labelFontSize

Libellés de valeur de légende

legend.titleFont, legend.titleFontSize

Titre de légende

mark.font

Marques de texte (annotations)

Vous pouvez également définir une couleur background générale en plus des polices :

{
  "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" }
  }
}

Couleurs

Instructions LLM (soft)

La façon la plus simple d’appliquer des règles de couleur est de les décrire en texte libre. Le LLM les interprète au mieux.

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

Utilisez cette option pour obtenir rapidement une indication approximative des couleurs lorsque des valeurs hexadécimales exactes ne sont pas nécessaires.

Mappage de valeur exacte avec _color

Mappez des valeurs de colonnes spécifiques en couleurs hexadécimales exactes à l’aide d’une transformation calculate. Les valeurs non répertoriées reçoivent une chaîne vide et Vega-Lite les renvoie avec sa propre valeur par défaut.

{
  "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" } }
    }
  }
}

Utilisez cette option lorsque vous avez besoin de couleurs exactes et garanties pour chaque valeur connue.

Note

La transformation _color et le bloc encoding.color sont toujours fusionnés dans le graphique, quelle que soit la colonne choisir par le LLM pour la coloration. Cela signifie que :

  • Le mappage ne fonctionne correctement que lorsque le canal de couleur du graphique utilise effectivement la même colonne que celle référencée dans l’expression calculate (par exemple, STATUS). Si le LLM attribue une couleur à une colonne différente, le champ _color est présent dans les données mais les couleurs ne correspondent pas.

  • Une seule colonne peut être ciblée par modèle.

Valeurs épinglées avec retour de la palette

Épinglez des couleurs pour les valeurs clés et laissez le reste être attribué automatiquement à partir d’une palette. Utilisez "merge": "extend" pour préserver les choix de couleur du LLM existants et ajoutez uniquement de nouveaux mappages.

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

Les valeurs de données ne figurant pas dans domain reçoivent automatiquement la prochaine couleur disponible de scheme. Après l’affectation, scheme est supprimé de la spécification finale.

Noms de schéma pris en charge : tableau10, tableau20, category10, category20, category20b, category20c, dark2, paired, pastel1, pastel2, set1, set2, set3, accent.

Désactivation de la mise en forme Snowsight

Par défaut, Snowflake Intelligence applique les ajustements de thème de l’UI Snowsight sur le graphique généré. Pour exclure et afficher le graphique exactement comme spécifié dans votre vega_template, définissez ui-merge sur "none" dans usermeta :

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

Ceci est utile lorsque vous souhaitez un contrôle total sur la sortie visuelle, par exemple lorsque vous appliquez un thème de marque personnalisé et que vous ne voulez pas que Snowsight remplace les couleurs, les polices ou les arrière-plans.

Note

ui-merge est interprété par le rendu côté client Snowsight, et non par le backend orchestrateur. Cela n’a aucun effet sur la spécification de graphique produite par le moteur de fusion. Cela contrôle uniquement la façon dont Snowsight applique son propre thème sur la spécification finale lors de l’affichage du graphique dans le navigateur.

Formatage des nombres et des devises (expérimental)

Les libellés d’axe et de légende peuvent être formatés à l’aide de Chaînes au format D3 via vega_template. Ceci est utile pour appliquer des symboles de devises, des décimales ou des suffixes SI dans tous les graphiques.

Définissez axis.format pour les axes quantitatifs (x, y) et legend.format pour les légendes de couleur/taille :

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

Note

axis.format est appliqué par Vega-Lite uniquement lorsque le type de données du canal est "quantitative". Si le LLM déduit un type différent (par exemple, "ordinal" pour une année ou la colonne ID), la chaîne de format est ignorée silencieusement. Il s’agit d’une limitation acceptée de l’approche vega_template car la fusion est appliquée sans inspecter les types déduits.

Solution de contournement : Forcer le type explicitement dans le modèle (Mode override) :

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

Cela garantit que le format s’applique, mais peut affecter d’autres rendus dépendants du type (coches d’axe, binning).

Chaînes de format D3 courantes :

Format

Exemple de sortie

Utiliser pour

$,.0f

1 234 567 $

Montants en dollars, pas de décimales

$,.2f

1 234 567,89 $

Montants en dollars, 2 décimales

,.0f

1 234 567

Grands entiers avec séparateur de milliers

.1%

42,3 %

Pourcentages

.2s

1,2 M

Grands nombres avec préfixe SI

.2f

3.14

Correction de 2 décimales

Appliquez le formatage à tous les canaux quantitatifs au niveau de l’agent (sans connaître le nom spécifique de la colonne) :

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

Utilisez "merge": "extend" afin que le format soit ajouté uniquement aux canaux déjà remplis par le LLM, sans écraser leurs paramètres field ou type.

Modes de fusion

Contrôlez comment vega_template interagit avec le graphique LLM généré en définissant "usermeta": {"merge": "<mode>"} à l’intérieur du modèle.

Mode

Comportement

override (par défaut)

Les valeurs des modèles écrasent le graphique. Utilisez cette option lorsque vous devez appliquer un paramètre spécifique.

extend

Les valeurs existantes des graphiques sont préservées. De nouvelles clés et des entrées d’échelle supplémentaires sont ajoutées. Utilisez cette option lorsque vous souhaitez les ajouter au graphique sans remplacer celles que le LLM a choisies.

Règles qui s’appliquent aux deux modes :

  • Le bloc data n’est jamais écrasé.

  • Les remplacements d’encodage ne s’appliquent que lorsque le champ field du modèle correspond au field du graphique, ou le modèle omet field.

  • Après la fusion, les entrées de domaine non présentes dans les données réelles sont automatiquement supprimées.

Exemple : forcer un graphique linéaire

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