Antwort eines KI-Agenten als Visualisierung rendern

Auf dieser Seite wird beschrieben, wie Sie mit dem Python SDK eine Visualisierung aus den Diagrammspezifikationen rendern, die in einer Antwort der Conversational Analytics API enthalten sind. Im Beispielcode wird die Diagrammspezifikation (im Vega-Lite-Format) aus dem Feld chart der Antwort extrahiert und die Vega-Altair-Bibliothek verwendet, um das Diagramm zu rendern, als Bild zu speichern und anzuzeigen.

Beispiel: Balkendiagramm aus einer API rendern

In diesem Beispiel wird gezeigt, wie ein Balkendiagramm aus einer Agent-Antwort der Conversational Analytics API gerendert wird. Im Beispiel wird eine Anfrage mit dem folgenden Prompt gesendet:

"Create a bar graph that shows the top five states by the total number of airports."

Im Beispielcode werden die folgenden Hilfsfunktionen definiert:

  • render_chart_response: Extrahiert die Vega-Lite-Konfiguration aus der chart-Nachricht, konvertiert sie in ein Format, das von der Vega-Altair-Bibliothek verwendet werden kann, rendert das Diagramm, speichert es in chart.png und zeigt es an.
  • chat: Sendet eine Anfrage an die Conversational Analytics API mit der Variablen inline_context und der aktuellen Liste messages, verarbeitet die Streaming-Antwort und ruft render_chart_response auf, um das Diagramm anzuzeigen, falls eines zurückgegeben wird.

Wenn Sie den folgenden Beispielcode verwenden möchten, ersetzen Sie Folgendes:

  • sqlgen-testing: Die ID Ihres Abrechnungsprojekts, in dem die erforderlichen APIs aktiviert sind.
  • Create a bar graph that shows the top five states by the total number of airports: Der Prompt, den Sie an die Conversational Analytics API senden möchten.
from google.cloud import geminidataanalytics
from google.protobuf.json_format import MessageToDict
import altair as alt
import proto

# Helper function for rendering chart response
def render_chart_response(resp):
  def _convert(v):
    if isinstance(v, proto.marshal.collections.maps.MapComposite):
      return {k: _convert(v) for k, v in v.items()}
    elif isinstance(v, proto.marshal.collections.RepeatedComposite):
      return [_convert(el) for el in v]
    elif isinstance(v, (int, float, str, bool)):
      return v
    else:
      return MessageToDict(v)

  vega_config = _convert(resp.result.vega_config)
  chart = alt.Chart.from_dict(vega_config)
  chart.save('chart.png')
  chart.display()

# Helper function for calling the API
def chat(q: str):
  billing_project = "sqlgen-testing"

  input_message = geminidataanalytics.Message(
      user_message=geminidataanalytics.UserMessage(text=q)
  )

  client = geminidataanalytics.DataChatServiceClient()
  request = geminidataanalytics.ChatRequest(
      inline_context=inline_context,
      parent=f"projects/{billing_project}/locations/global",
      messages=messages,
  )

  # Make the request
  stream = client.chat(request=request)

  for reply in stream:
    if "chart" in reply.system_message:
      # ChartMessage includes `query` for generating a chart and `result` with the generated chart.
      if "result" in reply.system_message.chart:
        render_chart_response(reply.system_message.chart)

# Send the prompt to make a bar graph
chat("Create a bar graph that shows the top five states by the total number of airports.")