Merender respons agen sebagai visualisasi

Conversational Analytics API dapat menghasilkan visualisasi interaktif yang didasarkan pada pertanyaan pengguna. API menampilkan diagram sebagai konfigurasi JSON Vega-Lite atau gambar SVG (untuk sumber data Looker dan hanya dalam versi API v1alpha dan v1beta). Anda juga dapat menginstruksikan agen untuk membuat diagram dengan persyaratan tertentu. Visualisasi dibuat menggunakan hasil data yang diperoleh sebagai respons terhadap pertanyaan pengguna.

Diagram batang menampilkan total harga jual dan jumlah pesanan celana untuk kelompok usia 20-30 tahun dan 40-50 tahun di negara bagian California.

Diagram area menampilkan performa harga penjualan total bulanan selama 12 bulan terakhir, dengan puncak $3.395,12 dan rata-rata $2.517,68.

Visualisasi yang didukung

API ini menggunakan Vega-Lite untuk membuat visualisasi dan mendukung semua fitur Vega-Lite standar. Jenis diagram berikut didukung:

  • Area
  • Batang
  • Geobentuk
  • Peta panas
  • Garis (Deret waktu)
  • Lingkaran
  • Sebar

Cara pembuatan diagram

Agen mengidentifikasi hasil data yang relevan dan meneruskannya ke subagen. Subagen ini menjalankan kode Python untuk menghasilkan konfigurasi JSON Vega-Lite untuk diagram. API ini menggunakan konteks percakapan untuk lebih memahami maksud pengguna saat membuat diagram. Dengan memanfaatkan Python, API dapat membuat diagram yang lebih kompleks.

Agen dapat melakukan transformasi data kecil, seperti penggabungan atau penerapan filter, untuk membuat diagram lebih relevan dan mudah dibaca.

Format output

Diagram ditampilkan dalam pesan hasil chart dan dapat diberikan dalam format berikut:

Anda dapat meminta gambar menggunakan kolom ChartOptions dalam konteks. Saat gambar diminta, API akan memberikan gambar dan output JSON Vega-Lite.

Menampilkan respons agen sebagai visualisasi

Bagian ini menunjukkan cara menggunakan Python SDK untuk merender visualisasi dari spesifikasi diagram yang diberikan dalam respons Conversational Analytics API. Kode contoh mengekstrak spesifikasi diagram (dalam format Vega-Lite) dari kolom chart respons dan menggunakan library Altair (yang dibangun di Vega-Lite) untuk merender diagram, menyimpannya sebagai gambar, dan menampilkannya.

Untuk mengetahui detail selengkapnya tentang merender diagram dengan Vega-Lite dan ekosistem Vega-Lite, lihat Alat untuk Membuat Visualisasi Vega-Lite.

Contoh: Merender diagram dari output Vega-Lite

Contoh ini menunjukkan cara merender diagram batang dari respons agen Conversational Analytics API. Contoh ini mengirimkan permintaan dengan perintah berikut:

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

Kode contoh menentukan fungsi bantuan berikut:

  • render_chart_response: Mengekstrak konfigurasi Vega-Lite dari pesan chart, mengonversinya ke format yang dapat digunakan oleh library Altair, merender diagram, menyimpannya ke chart.png, dan menampilkannya.
  • chat: Mengirim permintaan ke Conversational Analytics API menggunakan variabel inline_context dan daftar messages saat ini, memproses respons streaming, dan jika diagram ditampilkan, memanggil render_chart_response untuk menampilkannya.

Untuk menggunakan contoh kode berikut, ganti kode berikut:

  • sqlgen-testing: ID project penagihan Anda yang telah mengaktifkan API yang diperlukan.
  • Create a bar graph that shows the top five states by the total number of airports: Perintah yang ingin Anda kirim ke Conversational Analytics API.
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(val) for k, val in v.items()}
    elif isinstance(v, proto.marshal.collections.RepeatedComposite):
      return [_convert(el) for el in v]
    elif isinstance(v, (int, float, str, bool, type(None))):
      return v
    else:
      return MessageToDict(v)

  try:
    vega_config = _convert(resp.result.vega_config)
    chart = alt.Chart.from_dict(vega_config)
    chart.save('chart.png')
    chart.display()
    print("Chart rendered and saved as chart.png")
  except Exception as e:
    print(f"Error rendering chart: {e}")

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

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

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

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

    for reply in stream:
      if reply.system_message and hasattr(reply.system_message, 'chart'):
        # ChartMessage includes `query` for generating a chart and `result` with the generated chart.
        if hasattr(reply.system_message.chart, 'result'):
          print("Chart result found in response.")
          render_chart_response(reply.system_message.chart)
        else:
          print("Chart message found, but no result yet.")
      # Append system messages to maintain context for follow-up turns
      if reply.system_message:
          messages.append(geminidataanalytics.Message(system_message=reply.system_message))

  except Exception as e:
    print(f"Error calling API: {e}")

# Example Usage:
# Assuming 'inline_context' and 'messages' are initialized as per "Build a data agent using the Python SDK"
# Example initialization (replace with your actual context and message history):
# inline_context = geminidataanalytics.InlineContext(...)
# messages = []

# 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")