Mem-build agen data menggunakan Python SDK

Halaman ini menunjukkan cara menggunakan Python SDK untuk membuat permintaan ke Conversational Analytics API. Contoh kode Python menunjukkan cara menyelesaikan tugas berikut:

Mengautentikasi dan menyiapkan lingkungan Anda

Untuk menggunakan Python SDK for Conversational Analytics API, ikuti petunjuk di notebook Colaboratory SDK Conversational Analytics API untuk mendownload dan menginstal SDK. Perhatikan bahwa metode download dan isi SDK Colab dapat berubah.

Setelah menyelesaikan petunjuk penyiapan di notebook, Anda dapat menggunakan kode berikut untuk mengimpor library SDK yang diperlukan, mengautentikasi Akun Google Anda dalam lingkungan Colaboratory, dan melakukan inisialisasi klien untuk membuat permintaan API:

from google.colab import auth
auth.authenticate_user()

from google.cloud import geminidataanalytics

data_agent_client = geminidataanalytics.DataAgentServiceClient()
data_chat_client = geminidataanalytics.DataChatServiceClient()

Tentukan project penagihan dan petunjuk sistem

Contoh kode Python berikut menentukan project penagihan dan petunjuk sistem yang digunakan di seluruh skrip Anda:

# Billing project
billing_project = "my_project_name"

# System instructions
system_instruction = "Help the user analyze their data."

Ganti nilai sampel sebagai berikut:

  • my_project_name: ID project penagihan Anda yang telah mengaktifkan API yang diperlukan.
  • Help the user analyze their data.: Instruksi sistem untuk memandu perilaku agen dan menyesuaikannya dengan kebutuhan data Anda. Misalnya, Anda dapat menggunakan petunjuk sistem untuk menentukan istilah bisnis, mengontrol panjang respons, atau menetapkan pemformatan data. Idealnya, tentukan petunjuk sistem menggunakan format YAML yang direkomendasikan dalam Menulis petunjuk sistem yang efektif untuk memberikan panduan yang mendetail dan terstruktur.

Menghubungkan ke sumber data

Bagian berikut menunjukkan cara menentukan detail koneksi untuk sumber data agen Anda. Agen Anda dapat terhubung ke data di Looker, BigQuery, atau Looker Studio.

Menghubungkan ke data Looker

Contoh kode berikut menunjukkan cara menentukan detail untuk koneksi ke Eksplorasi Looker dengan kunci API atau token akses. Anda hanya dapat terhubung ke satu Eksplorasi Looker dalam satu waktu dengan Conversational Analytics API.

Kunci API

Anda dapat membuat koneksi dengan instance Looker menggunakan kunci API Looker yang dibuat, seperti yang dijelaskan dalam Mengautentikasi dan menghubungkan ke sumber data dengan Conversational Analytics API.

looker_client_id = "my_looker_client_id"
looker_client_secret = "my_looker_client_secret"
looker_instance_uri = "https://my_company.looker.com"
lookml_model = "my_model"
explore = "my_explore"

looker_explore_reference = geminidataanalytics.LookerExploreReference()
looker_explore_reference.looker_instance_uri = looker_instance_uri
looker_explore_reference.lookml_model = lookml_model
looker_explore_reference.explore = explore

credentials = geminidataanalytics.Credentials()
credentials.oauth.secret.client_id = looker_client_id
credentials.oauth.secret.client_secret = looker_client_secret

datasource_references = geminidataanalytics.DatasourceReferences()
datasource_references.looker.explore_references = [looker_explore_reference]

# Do not include the following line during agent creation
datasource_references.credentials = credentials

Ganti nilai sampel sebagai berikut:

  • my_looker_client_id: ID klien kunci API Looker yang Anda buat.
  • my_looker_client_secret: Rahasia klien dari kunci API Looker yang Anda buat.
  • https://my_company.looker.com: URL lengkap instance Looker Anda.
  • my_model: Nama model LookML yang menyertakan Eksplorasi yang ingin Anda hubungkan.
  • my_explore: Nama Eksplorasi Looker yang ingin Anda kueri oleh agen data.

Token akses

Anda dapat membuat koneksi dengan instance Looker menggunakan token akses, seperti yang dijelaskan dalam Mengautentikasi dan menghubungkan ke sumber data dengan Conversational Analytics API.

looker_access_token = "my_access_token"
looker_instance_uri = "https://my_company.looker.com"
lookml_model = "my_model"
explore = "my_explore"

looker_explore_reference = geminidataanalytics.LookerExploreReference()
looker_explore_reference.looker_instance_uri = looker_instance_uri
looker_explore_reference.lookml_model = lookml_model
looker_explore_reference.explore = explore

credentials = geminidataanalytics.Credentials()
credentials.oauth.token.access_token = looker_access_token

datasource_references = geminidataanalytics.DatasourceReferences()
datasource_references.looker.explore_references = [looker_explore_reference]

# Do not include the following line during agent creation
datasource_references.credentials = credentials

Ganti nilai sampel sebagai berikut:

  • my_access_token: Nilai access_token yang Anda buat untuk mengautentikasi ke Looker.
  • https://my_company.looker.com: URL lengkap instance Looker Anda.
  • my_model: Nama model LookML yang menyertakan Eksplorasi yang ingin Anda hubungkan.
  • my_explore: Nama Eksplorasi Looker yang ingin Anda kueri oleh agen data.

Menghubungkan ke data BigQuery

Dengan Conversational Analytics API, tidak ada batasan ketat pada jumlah tabel BigQuery yang dapat Anda hubungkan. Namun, menghubungkan ke sejumlah besar tabel dapat mengurangi akurasi atau menyebabkan Anda melampaui batas token input model.

Contoh kode berikut menentukan koneksi ke beberapa tabel BigQuery.

bigquery_table_reference = geminidataanalytics.BigQueryTableReference()
bigquery_table_reference.project_id = "my_project_id"
bigquery_table_reference.dataset_id = "my_dataset_id"
bigquery_table_reference.table_id = "my_table_id"

bigquery_table_reference_2 = geminidataanalytics.BigQueryTableReference()
bigquery_table_reference_2.project_id = "my_project_id_2"
bigquery_table_reference_2.dataset_id = "my_dataset_id_2"
bigquery_table_reference_2.table_id = "my_table_id_2"

bigquery_table_reference_3 = geminidataanalytics.BigQueryTableReference()
bigquery_table_reference_3.project_id = "my_project_id_3"
bigquery_table_reference_3.dataset_id = "my_dataset_id_3"
bigquery_table_reference_3.table_id = "my_table_id_3"

# Connect to your data source
datasource_references = geminidataanalytics.DatasourceReferences()
datasource_references.bq.table_references = [bigquery_table_reference, bigquery_table_reference_2, bigquery_table_reference_3]

Ganti nilai sampel sebagai berikut:

  • my_project_id: ID project Google Cloud yang berisi set data dan tabel BigQuery yang ingin Anda hubungkan. Untuk terhubung ke set data publik, tentukan bigquery-public-data.
  • my_dataset_id: ID set data BigQuery. Contoh, san_francisco.
  • my_table_id: ID tabel BigQuery. Contoh, street_trees.

Menghubungkan ke data Looker Studio

Contoh kode berikut menentukan koneksi ke sumber data Looker Studio.

studio_datasource_id = "my_datasource_id"

studio_references = geminidataanalytics.StudioDatasourceReference()
studio_references.datasource_id = studio_datasource_id

## Connect to your data source
datasource_references.studio.studio_references = [studio_references]

Pada contoh sebelumnya, ganti my_datasource_id dengan ID sumber data.

Menyiapkan konteks untuk chat stateful atau stateless

Conversational Analytics API mendukung percakapan multi-giliran, yang memungkinkan pengguna mengajukan pertanyaan lanjutan yang didasarkan pada konteks sebelumnya. Contoh kode Python berikut menunjukkan cara menyiapkan konteks untuk chat stateful atau stateless:

  • Chat berstatus: Google Cloud menyimpan dan mengelola histori percakapan. Chat dengan status memiliki sifat multi-giliran, karena API mempertahankan konteks dari pesan sebelumnya. Anda hanya perlu mengirim pesan saat ini untuk setiap giliran.
  • Chat tanpa status: Aplikasi Anda mengelola histori percakapan. Anda harus menyertakan seluruh histori percakapan dengan setiap pesan baru. Untuk contoh mendetail tentang cara mengelola percakapan multi-putaran dalam mode stateless, lihat Membuat percakapan multi-putaran stateless.

Chat dengan status

Contoh kode berikut menyiapkan konteks untuk chat stateful, dengan Google Cloud menyimpan dan mengelola histori percakapan. Anda juga dapat mengaktifkan analisis lanjutan dengan Python secara opsional dengan menyertakan baris published_context.options.analysis.python.enabled = True dalam contoh kode berikut.

# Set up context for stateful chat
published_context = geminidataanalytics.Context()
published_context.system_instruction = system_instruction
published_context.datasource_references = datasource_references
# Optional: To enable advanced analysis with Python, include the following line:
published_context.options.analysis.python.enabled = True

Chat tanpa status

Contoh kode berikut menyiapkan konteks untuk chat stateless, tempat Anda harus mengirim seluruh histori percakapan dengan setiap pesan. Anda juga dapat mengaktifkan analisis lanjutan dengan Python secara opsional dengan menyertakan baris inline_context.options.analysis.python.enabled = True dalam contoh kode berikut.

# Set up context for stateless chat
# datasource_references.looker.credentials = credentials
inline_context = geminidataanalytics.Context()
inline_context.system_instruction = system_instruction
inline_context.datasource_references = datasource_references
# Optional: To enable advanced analysis with Python, include the following line:
inline_context.options.analysis.python.enabled = True

Membuat agen data

Contoh kode Python berikut membuat permintaan API untuk membuat agen data, yang kemudian dapat Anda gunakan untuk melakukan percakapan tentang data Anda. Agen data dikonfigurasi dengan sumber data, petunjuk sistem, dan konteks yang ditentukan.

data_agent_id = "data_agent_1"

data_agent = geminidataanalytics.DataAgent()
data_agent.data_analytics_agent.published_context = published_context
data_agent.name = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}" # Optional

request = geminidataanalytics.CreateDataAgentRequest(
    parent=f"projects/{billing_project}/locations/global",
    data_agent_id=data_agent_id, # Optional
    data_agent=data_agent,
)

try:
    data_agent_client.create_data_agent(request=request)
    print("Data Agent created")
except Exception as e:
    print(f"Error creating Data Agent: {e}")

Dalam contoh sebelumnya, ganti nilai data_agent_1 dengan ID unik untuk agen data.

Buat percakapan

Contoh kode Python berikut membuat permintaan API untuk membuat percakapan.

# Initialize request arguments
data_agent_id = "data_agent_1"
conversation_id = "conversation_1"

conversation = geminidataanalytics.Conversation()
conversation.agents = [f'projects/{billing_project}/locations/global/dataAgents/{data_agent_id}']
conversation.name = f"projects/{billing_project}/locations/global/conversations/{conversation_id}"

request = geminidataanalytics.CreateConversationRequest(
    parent=f"projects/{billing_project}/locations/global",
    conversation_id=conversation_id,
    conversation=conversation,
)

# Make the request
response = data_chat_client.create_conversation(request=request)

# Handle the response
print(response)

Ganti nilai sampel sebagai berikut:

  • data_agent_1: ID agen data, seperti yang ditentukan dalam blok kode contoh di Membuat agen data.
  • conversation_1: ID unik untuk percakapan.

Mengelola agen data dan percakapan

Contoh kode berikut menunjukkan cara mengelola agen data dan percakapan menggunakan Conversational Analytics API. Anda dapat melakukan tugas berikut:

Mendapatkan agen data

Contoh kode Python berikut menunjukkan cara membuat permintaan API untuk mengambil agen data yang sebelumnya Anda buat.

# Initialize request arguments
data_agent_id = "data_agent_1"
request = geminidataanalytics.GetDataAgentRequest(
    name=f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}",
)

# Make the request
response = data_agent_client.get_data_agent(request=request)

# Handle the response
print(response)

Pada contoh sebelumnya, ganti nilai data_agent_1 dengan ID unik untuk agen data yang ingin Anda ambil.

Mencantumkan agen data

Kode berikut menunjukkan cara mencantumkan semua agen data untuk project tertentu dengan memanggil metode list_data_agents. Untuk mencantumkan semua agen, Anda harus memiliki izin geminidataanalytics.dataAgents.list di project. Untuk mengetahui informasi selengkapnya tentang peran IAM yang menyertakan izin ini, lihat daftar peran yang telah ditetapkan.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
request = geminidataanalytics.ListDataAgentsRequest(
    parent=f"projects/{billing_project}/locations/global",
)

# Make the request
page_result = data_agent_client.list_data_agents(request=request)

# Handle the response
for response in page_result:
    print(response)

Ganti YOUR-BILLING-PROJECT dengan ID project penagihan Anda.

Mencantumkan agen data yang dapat diakses

Kode berikut menunjukkan cara mencantumkan semua agen data yang dapat diakses untuk project tertentu dengan memanggil metode list_accessible_data_agents.

billing_project = "YOUR-BILLING-PROJECT"
creator_filter = "YOUR-CREATOR-FILTER"
location = "global"
request = geminidataanalytics.ListAccessibleDataAgentsRequest(
    parent=f"projects/{billing_project}/locations/global",
    creator_filter=creator_filter
)

# Make the request
page_result = data_agent_client.list_accessible_data_agents(request=request)

# Handle the response
for response in page_result:
    print(response)

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • YOUR-CREATOR-FILTER: Filter yang akan diterapkan berdasarkan pembuat agen data. Nilai yang mungkin mencakup NONE (default), CREATOR_ONLY, dan NOT_CREATOR_ONLY.

Memperbarui agen data

Contoh kode berikut menunjukkan cara memperbarui agen data dengan memanggil metode update_data_agent pada resource agen data. Permintaan memerlukan objek DataAgent yang menyertakan nilai baru untuk kolom yang ingin Anda ubah, dan parameter update_mask yang mengambil objek FieldMask untuk menentukan kolom yang akan diupdate.

Untuk memperbarui agen data, Anda harus memiliki izin IAM geminidataanalytics.dataAgents.update pada agen. Untuk mengetahui informasi selengkapnya tentang peran IAM yang menyertakan izin ini, lihat daftar peran yang telah ditetapkan.

data_agent_id = "data_agent_1"
billing_project = "YOUR-BILLING-PROJECT"
data_agent = geminidataanalytics.DataAgent()
data_agent.data_analytics_agent.published_context = published_context
data_agent.name = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"
data_agent.description = "Updated description of the data agent."

update_mask = field_mask_pb2.FieldMask(paths=['description', 'data_analytics_agent.published_context'])

request = geminidataanalytics.UpdateDataAgentRequest(
    data_agent=data_agent,
    update_mask=update_mask,
)

try:
    # Make the request
    data_agent_client.update_data_agent(request=request)
    print("Data Agent Updated")
except Exception as e:
    print(f"Error updating Data Agent: {e}")

Ganti nilai sampel sebagai berikut:

  • data_agent_1: ID agen data yang ingin Anda perbarui.
  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • Updated description of the data agent.: Deskripsi agen data yang diperbarui.

Menetapkan kebijakan IAM untuk agen data

Untuk membagikan agen, Anda dapat menggunakan metode set_iam_policy untuk menetapkan peran IAM kepada pengguna di agen tertentu. Permintaan mencakup binding yang menentukan peran mana yang harus ditetapkan kepada pengguna mana.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
data_agent_id = "data_agent_1"
role = "roles/geminidataanalytics.dataAgentEditor"
users = "222larabrown@gmail.com, cloudysanfrancisco@gmail.com"

resource = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"

# Construct the IAM policy
binding = policy_pb2.Binding(
    role=role,
    members= [f"user:{i.strip()}" for i in users.split(",")]
)

policy = policy_pb2.Policy(bindings=[binding])

# Create the request
request = iam_policy_pb2.SetIamPolicyRequest(
    resource=resource,
    policy=policy
)

# Send the request
try:
    response = data_agent_client.set_iam_policy(request=request)
    print("IAM Policy set successfully!")
    print(f"Response: {response}")
except Exception as e:
    print(f"Error setting IAM policy: {e}")

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • data_agent_1: ID agen data yang ingin Anda tetapkan kebijakan IAM-nya.
  • 222larabrown@gmail.com, cloudysanfrancisco@gmail.com: Daftar email pengguna yang dipisahkan koma yang ingin Anda beri peran tertentu.

Mendapatkan kebijakan IAM untuk agen data

Contoh kode berikut menunjukkan cara menggunakan metode get_iam_policy untuk mengambil kebijakan IAM untuk agen data. Permintaan menentukan jalur resource agen data.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
data_agent_id = "data_agent_1"

resource = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"
request = iam_policy_pb2.GetIamPolicyRequest(
            resource=resource,
        )
try:
    response = data_agent_client.get_iam_policy(request=request)
    print("IAM Policy fetched successfully!")
    print(f"Response: {response}")
except Exception as e:
    print(f"Error setting IAM policy: {e}")

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • data_agent_1: ID agen data yang ingin Anda dapatkan kebijakan IAM-nya.

Menghapus agen data

Contoh kode berikut menunjukkan cara menggunakan metode delete_data_agent untuk menghapus sementara agen data. Saat Anda menghapus sementara agen, agen tersebut akan dihapus, tetapi masih dapat diambil dalam waktu 30 hari. Permintaan menentukan URL resource agen data.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
data_agent_id = "data_agent_1"

request = geminidataanalytics.DeleteDataAgentRequest(
    name=f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}",
)

try:
    # Make the request
    data_agent_client.delete_data_agent(request=request)
    print("Data Agent Deleted")
except Exception as e:
    print(f"Error deleting Data Agent: {e}")

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • data_agent_1: ID agen data yang ingin Anda hapus.

Mendapatkan percakapan

Contoh kode berikut menunjukkan cara menggunakan metode get_conversation untuk mengambil informasi tentang percakapan yang ada. Permintaan menentukan jalur resource percakapan.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
conversation_id = "conversation_1"

request = geminidataanalytics.GetConversationRequest(
    name = f"projects/{billing_project}/locations/global/conversations/{conversation_id}"
)

# Make the request
response = data_chat_client.get_conversation(request=request)

# Handle the response
print(response)

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • conversation_1: ID percakapan yang ingin Anda ambil.

Membuat daftar percakapan

Contoh kode berikut menunjukkan cara mencantumkan percakapan untuk project tertentu dengan memanggil metode list_conversations. Permintaan menentukan URL resource induk, yaitu project dan lokasi (misalnya, projects/my-project/locations/global).

Secara default, metode ini menampilkan percakapan yang Anda buat. Admin (pengguna dengan peran IAM cloudaicompanion.topicAdmin) dapat melihat semua percakapan dalam project.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"
request = geminidataanalytics.ListConversationsRequest(
    parent=f"projects/{billing_project}/locations/global",
)

# Make the request
response = data_chat_client.list_conversations(request=request)

# Handle the response
print(response)

Ganti YOUR-BILLING-PROJECT dengan ID project penagihan tempat Anda mengaktifkan API yang diperlukan.

Mencantumkan pesan dalam percakapan

Contoh kode berikut menunjukkan cara menggunakan metode list_messages untuk mengambil semua pesan dalam percakapan. Permintaan menentukan jalur resource percakapan.

Untuk mencantumkan pesan, Anda harus memiliki izin cloudaicompanion.topics.get dalam percakapan.

billing_project = "YOUR-BILLING-PROJECT"
location = "global"

conversation_id = "conversation_1"

request = geminidataanalytics.ListMessagesRequest(
    parent=f"projects/{billing_project}/locations/global/conversations/{conversation_id}",
)

# Make the request
response = data_chat_client.list_messages(request=request)

# Handle the response
print(response)

Ganti nilai sampel sebagai berikut:

  • YOUR-BILLING-PROJECT: ID project penagihan Anda.
  • conversation_1: ID percakapan yang ingin Anda lihat pesannya.

Menggunakan API untuk mengajukan pertanyaan

Setelah Anda membuat agen data dan percakapan, contoh kode Python berikut akan mengirimkan kueri ke agen. Kode ini menggunakan konteks yang Anda siapkan untuk chat stateful atau stateless. API menampilkan aliran pesan yang merepresentasikan langkah-langkah yang dilakukan agen untuk menjawab kueri.

Chat dengan status

Mengirim permintaan chat stateful dengan referensi Conversation

Anda dapat mengirim permintaan chat stateful ke agen data dengan mereferensikan resource Conversation yang sebelumnya Anda buat.

# Create a request that contains a single user message (your question)
question = "Which species of tree is most prevalent?"
messages = [geminidataanalytics.Message()]
messages[0].user_message.text = question

data_agent_id = "data_agent_1"
conversation_id = "conversation_1"

# Create a conversation_reference
conversation_reference = geminidataanalytics.ConversationReference()
conversation_reference.conversation = f"projects/{billing_project}/locations/global/conversations/{conversation_id}"
conversation_reference.data_agent_context.data_agent = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"
# conversation_reference.data_agent_context.credentials = credentials

# Form the request
request = geminidataanalytics.ChatRequest(
    parent = f"projects/{billing_project}/locations/global",
    messages = messages,
    conversation_reference = conversation_reference
)

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

# Handle the response
for response in stream:
    show_message(response)

Ganti nilai sampel sebagai berikut:

  • Which species of tree is most prevalent?: Pertanyaan dalam bahasa alami untuk dikirim ke agen data.
  • data_agent_1: ID unik untuk agen data, seperti yang ditentukan dalam Membuat agen data.
  • conversation_1: ID unik untuk percakapan, seperti yang ditentukan dalam Membuat percakapan.

Chat tanpa status

Contoh kode berikut menunjukkan cara mengirim kueri ke agen data saat Anda telah menyiapkan konteks untuk chat tanpa status. Anda dapat mengirim kueri stateless dengan mereferensikan resource DataAgent yang ditentukan sebelumnya atau dengan menggunakan konteks inline dalam permintaan.

Mengirim permintaan chat stateless dengan referensi DataAgent

Anda dapat mengirim kueri ke agen data dengan mereferensikan resource DataAgent yang sebelumnya Anda buat.

# Create a request that contains a single user message (your question)
question = "Which species of tree is most prevalent?"
messages = [geminidataanalytics.Message()]
messages[0].user_message.text = question

data_agent_id = "data_agent_1"

data_agent_context = geminidataanalytics.DataAgentContext()
data_agent_context.data_agent = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"
# data_agent_context.credentials = credentials

# Form the request
request = geminidataanalytics.ChatRequest(
    parent=f"projects/{billing_project}/locations/global",
    messages=messages,
    data_agent_context = data_agent_context
)

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

# Handle the response
for response in stream:
    show_message(response)

Ganti nilai sampel sebagai berikut:

  • Which species of tree is most prevalent?: Pertanyaan dalam bahasa alami untuk dikirim ke agen data.
  • data_agent_1: ID unik untuk agen data, seperti yang ditentukan dalam Membuat agen data.

Mengirim permintaan chat tanpa status dengan konteks inline

Contoh kode berikut menunjukkan cara menggunakan parameter inline_context untuk memberikan konteks langsung dalam permintaan chat tanpa status Anda.

# Create a request that contains a single user message (your question)
question = "Which species of tree is most prevalent?"
messages = [geminidataanalytics.Message()]
messages[0].user_message.text = question

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

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

# Handle the response
for response in stream:
    show_message(response)

Pada contoh sebelumnya, ganti Which species of tree is most prevalent? dengan pertanyaan bahasa alami untuk dikirim ke agen data.

Membuat percakapan multi-giliran tanpa status

Untuk mengajukan pertanyaan lanjutan dalam percakapan tanpa status, aplikasi Anda harus mengelola konteks percakapan dengan mengirimkan seluruh histori pesan dengan setiap permintaan baru. Contoh berikut menunjukkan cara membuat percakapan multi-giliran dengan mereferensikan agen data atau menggunakan konteks inline untuk menyediakan sumber data secara langsung.

# List that is used to track previous turns and is reused across requests
conversation_messages = []

data_agent_id = "data_agent_1"

# Use data agent context
data_agent_context = geminidataanalytics.DataAgentContext()
data_agent_context.data_agent = f"projects/{billing_project}/locations/global/dataAgents/{data_agent_id}"
# data_agent_context.credentials = credentials

# Helper function for calling the API
def multi_turn_Conversation(msg):

    message = geminidataanalytics.Message()
    message.user_message.text = msg

    # Send a multi-turn request by including previous turns and the new message
    conversation_messages.append(message)

    request = geminidataanalytics.ChatRequest(
        parent=f"projects/{billing_project}/locations/global",
        messages=conversation_messages,
        # Use data agent context
        data_agent_context=data_agent_context,
        # Use inline context
        # inline_context=inline_context,
    )

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

    # Handle the response
    for response in stream:
      show_message(response)
      conversation_messages.append(response)

# Send the first turn request
multi_turn_Conversation("Which species of tree is most prevalent?")

# Send follow-up turn request
multi_turn_Conversation("Can you show me the results as a bar chart?")

Dalam contoh sebelumnya, ganti nilai sampel sebagai berikut:

  • data_agent_1: ID unik untuk agen data, seperti yang ditentukan dalam blok kode contoh di Membuat agen data.
  • Which species of tree is most prevalent?: Pertanyaan dalam bahasa alami untuk dikirim ke agen data.
  • Can you show me the results as a bar chart?: Pertanyaan lanjutan yang dibuat berdasarkan atau menyempurnakan pertanyaan sebelumnya.

Menentukan fungsi helper

Contoh kode berikut berisi definisi fungsi helper yang digunakan dalam contoh kode sebelumnya. Fungsi ini membantu mengurai respons dari API dan menampilkan hasilnya.

from pygments import highlight, lexers, formatters
import pandas as pd
import requests
import json as json_lib
import altair as alt
import IPython
from IPython.display import display, HTML

import proto
from google.protobuf.json_format import MessageToDict, MessageToJson

def handle_text_response(resp):
  parts = getattr(resp, 'parts')
  print(''.join(parts))

def display_schema(data):
  fields = getattr(data, 'fields')
  df = pd.DataFrame({
    "Column": map(lambda field: getattr(field, 'name'), fields),
    "Type": map(lambda field: getattr(field, 'type'), fields),
    "Description": map(lambda field: getattr(field, 'description', '-'), fields),
    "Mode": map(lambda field: getattr(field, 'mode'), fields)
  })
  display(df)

def display_section_title(text):
  display(HTML('<h2>{}</h2>'.format(text)))

def format_looker_table_ref(table_ref):
 return 'lookmlModel: {}, explore: {}, lookerInstanceUri: {}'.format(table_ref.lookml_model, table_ref.explore, table_ref.looker_instance_uri)

def format_bq_table_ref(table_ref):
  return '{}.{}.{}'.format(table_ref.project_id, table_ref.dataset_id, table_ref.table_id)

def display_datasource(datasource):
  source_name = ''
  if 'studio_datasource_id' in datasource:
   source_name = getattr(datasource, 'studio_datasource_id')
  elif 'looker_explore_reference' in datasource:
   source_name = format_looker_table_ref(getattr(datasource, 'looker_explore_reference'))
  else:
    source_name = format_bq_table_ref(getattr(datasource, 'bigquery_table_reference'))

  print(source_name)
  display_schema(datasource.schema)

def handle_schema_response(resp):
  if 'query' in resp:
    print(resp.query.question)
  elif 'result' in resp:
    display_section_title('Schema resolved')
    print('Data sources:')
    for datasource in resp.result.datasources:
      display_datasource(datasource)

def handle_data_response(resp):
  if 'query' in resp:
    query = resp.query
    display_section_title('Retrieval query')
    print('Query name: {}'.format(query.name))
    print('Question: {}'.format(query.question))
    print('Data sources:')
    for datasource in query.datasources:
      display_datasource(datasource)
  elif 'generated_sql' in resp:
    display_section_title('SQL generated')
    print(resp.generated_sql)
  elif 'result' in resp:
    display_section_title('Data retrieved')

    fields = [field.name for field in resp.result.schema.fields]
    d = {}
    for el in resp.result.data:
      for field in fields:
        if field in d:
          d[field].append(el[field])
        else:
          d[field] = [el[field]]

    display(pd.DataFrame(d))

def handle_chart_response(resp):
  def _value_to_dict(v):
    if isinstance(v, proto.marshal.collections.maps.MapComposite):
      return _map_to_dict(v)
    elif isinstance(v, proto.marshal.collections.RepeatedComposite):
      return [_value_to_dict(el) for el in v]
    elif isinstance(v, (int, float, str, bool)):
      return v
    else:
      return MessageToDict(v)

  def _map_to_dict(d):
    out = {}
    for k in d:
      if isinstance(d[k], proto.marshal.collections.maps.MapComposite):
        out[k] = _map_to_dict(d[k])
      else:
        out[k] = _value_to_dict(d[k])
    return out

  if 'query' in resp:
    print(resp.query.instructions)
  elif 'result' in resp:
    vegaConfig = resp.result.vega_config
    vegaConfig_dict = _map_to_dict(vegaConfig)
    alt.Chart.from_json(json_lib.dumps(vegaConfig_dict)).display();

def show_message(msg):
  m = msg.system_message
  if 'text' in m:
    handle_text_response(getattr(m, 'text'))
  elif 'schema' in m:
    handle_schema_response(getattr(m, 'schema'))
  elif 'data' in m:
    handle_data_response(getattr(m, 'data'))
  elif 'chart' in m:
    handle_chart_response(getattr(m, 'chart'))
  print('\n')