Mendapatkan jawaban dan tindak lanjut (Lama)

Halaman ini memperkenalkan penelusuran dengan jawaban dan tindak lanjut untuk Gemini Enterprise dan menunjukkan cara mengimplementasikannya menggunakan panggilan metode.

Penelusuran dengan jawaban dan tindak lanjut didasarkan pada metode jawaban. Metode answer juga memiliki beberapa fitur tambahan penting, seperti kemampuan untuk menangani kueri yang kompleks.

Fitur metode jawaban

Fitur utama metode jawaban adalah sebagai berikut:

  • Kemampuan untuk menghasilkan jawaban atas kueri yang kompleks. Misalnya, metode jawaban dapat menguraikan kueri gabungan, seperti berikut, menjadi beberapa kueri yang lebih kecil untuk menampilkan hasil yang lebih baik yang digunakan untuk memberikan jawaban yang lebih baik:

    • "Berapa pendapatan Google Cloud dan Google Ads pada tahun 2024?"
    • "Setelah berapa tahun sejak didirikan, Google mencapai pendapatan 1 miliar USD?"
  • Kemampuan untuk menggabungkan penelusuran dan pembuatan jawaban dalam percakapan multi-turn dengan memanggil metode jawaban di setiap giliran.

  • Kemampuan untuk menyambungkan dengan metode penelusuran guna mengurangi latensi penelusuran. Anda dapat memanggil metode penelusuran dan metode jawaban secara terpisah serta merender hasil penelusuran dan jawaban di iframe yang berbeda pada waktu yang berbeda. Artinya, Anda dapat menampilkan hasil penelusuran (10 link biru) kepada pengguna dalam hitungan milidetik. Anda tidak perlu menunggu jawaban dibuat sebelum dapat menampilkan hasil penelusuran.

Fitur jawaban dan tindak lanjut dapat dibagi menjadi tiga fase kueri, penelusuran, dan jawaban:

Kapan harus menggunakan jawaban dan kapan harus menggunakan penelusuran

Gemini Enterprise memiliki dua metode yang digunakan untuk membuat kueri aplikasi. Keduanya memiliki fitur yang berbeda, tetapi tumpang-tindih.

Gunakan metode answer jika:

  • Anda menginginkan jawaban (atau ringkasan) yang dihasilkan AI dari hasil penelusuran.

  • Anda menginginkan penelusuran multi-turn, yaitu penelusuran yang mempertahankan konteks sehingga memungkinkan pertanyaan lanjutan.

Gunakan metode search jika:

  • Anda hanya memerlukan hasil penelusuran, bukan jawaban yang dihasilkan.

  • Anda ingin menampilkan lebih dari sepuluh hasil penelusuran ("link biru").

  • Anda memiliki salah satu dari hal berikut:

    • Embedding Anda sendiri
    • Kontrol sinonim atau pengalihan
    • Faset
    • Kode negara pengguna

Gunakan metode jawaban dan penelusuran bersama-sama saat:

  • Anda ingin menampilkan lebih dari sepuluh hasil penelusuran, dan Anda menginginkan jawaban yang dihasilkan.

  • Anda mengalami masalah latensi dan ingin menampilkan hasil penelusuran dengan cepat sebelum jawaban yang dihasilkan ditampilkan.

Fitur fase kueri

Fitur jawaban dan tindak lanjut mendukung pemrosesan kueri bahasa alami.

Bagian ini menjelaskan dan mengilustrasikan berbagai opsi untuk pengubahan frasa dan klasifikasi kueri.

Pengungkapan ulang kueri

Frasa ulang kueri diaktifkan secara default. Fitur ini memilih cara terbaik untuk menyusun ulang kueri secara otomatis guna meningkatkan hasil penelusuran. Fitur ini juga dapat menangani kueri yang tidak memerlukan pengubahan susunan kata.

  • Memecah kueri kompleks menjadi beberapa kueri dan melakukan sub-kueri sinkron.

    Misalnya: Kueri yang kompleks dipecah menjadi empat kueri yang lebih kecil dan lebih sederhana.

    Input pengguna Subkueri yang dibuat dari kueri kompleks
    Apa kesamaan pekerjaan dan hobi Andie Ram dan Arnaud Clément?
    • Pekerjaan Andie Ram
    • pekerjaan Arnaud Clément
    • Hobi Andie Ram
    • Hobi Arnaud Clément
  • Menyintesis kueri multi-turn, untuk membuat pertanyaan lanjutan yang berbasis konteks dan stateful.

    Misalnya: Kueri yang disintesis dari input pengguna di setiap giliran mungkin terlihat seperti ini:

    Input pengguna Kueri disintesis
    Giliran 1: laptop untuk sekolah laptop untuk sekolah
    Giliran 2: bukan mac laptop untuk sekolah selain mac
    Giliran 3: layar lebih besar dan saya juga memerlukan keyboard dan mouse nirkabel laptop layar lebih besar untuk sekolah, bukan mac, dengan keyboard dan mouse nirkabel
    Giliran 4: dan ransel untuk laptop itu laptop layar lebih besar untuk sekolah bukan mac dengan keyboard dan mouse nirkabel serta ransel untuk laptop tersebut
  • Sederhanakan kueri panjang untuk meningkatkan pengambilan.

    Misalnya: Kueri panjang dipersingkat menjadi kueri sederhana.

    Input pengguna Kueri yang disederhanakan
    Saya mencoba mencari tahu mengapa tombol \"Tambahkan ke Keranjang\" di situs kami tidak berfungsi dengan baik. Sepertinya saat pengguna mengklik tombol, item tidak ditambahkan ke keranjang dan mereka menerima pesan error. Saya telah memeriksa kodenya dan sepertinya sudah benar, jadi saya tidak yakin apa masalahnya. Dapatkah Anda membantu saya memecahkan masalah ini? Tombol "Tambahkan ke Keranjang" tidak berfungsi di situs.
  • Melakukan penalaran multi-langkah

    Penalaran multi-langkah didasarkan pada paradigma ReAct (reason + act) yang memungkinkan LLM menyelesaikan tugas kompleks menggunakan penalaran bahasa alami. Secara default, jumlah langkah maksimum adalah lima.

    Contoh:

    Input pengguna Dua langkah untuk menghasilkan jawaban
    Setelah berapa tahun sejak didirikan, Google mencapai pendapatan 1 miliar USD? Langkah 1:
    [Thought]: I need to know when Google was founded, then I can query it is revenue since then.
    [Tindakan] Telusuri: Kapan Google didirikan?[Amati Hasil Penelusuran]: "1998"

    Langkah 2:
    [Pemikiran]: Sekarang saya perlu menelusuri pendapatan tahunan Google sejak tahun 1998, dan mencari tahu kapan pendapatan tersebut melebihi 1 miliar untuk pertama kalinya.
    [Act] Search: Google revenue since 1998
    [Observe Search Results] Google revenue in 1998, Google revenue in 1999…..
    [Answer]: Google mencapai pendapatan lebih dari 1 miliar USD pada tahun 2003 [1], 5 tahun setelah didirikan pada tahun 1998[2].

Klasifikasi kueri

Opsi klasifikasi kueri adalah untuk mengidentifikasi kueri adversarial dan kueri yang tidak mencari jawaban. Secara default, opsi klasifikasi kueri dinonaktifkan.

Untuk mengetahui informasi selengkapnya tentang kueri adversarial dan kueri yang tidak mencari jawaban, lihat Mengabaikan kueri adversarial dan Mengabaikan kueri yang tidak mencari ringkasan.

Fitur fase penelusuran

Untuk penelusuran, metode jawaban memiliki opsi yang sama dengan metode penelusuran. Misalnya:

Fitur fase jawaban

Selama fase jawaban, saat jawaban dihasilkan dari hasil penelusuran, Anda dapat mengaktifkan fitur yang sama seperti dalam metode penelusuran. Contoh:

  • Mendapatkan kutipan untuk menunjukkan sumber setiap kalimat dalam jawaban. Untuk mengetahui informasi selengkapnya, lihat Menyertakan kutipan.

  • Gunakan preamble perintah untuk menyesuaikan jawaban untuk hal-hal seperti nada, gaya, dan panjang respons. Untuk mengetahui informasi selengkapnya, lihat Menentukan preamble kustom.

  • Pilih model yang akan digunakan untuk pembuatan jawaban. Untuk mengetahui informasi selengkapnya, lihat Versi dan siklus proses model pembuatan jawaban.

  • Pilih apakah akan mengabaikan kueri yang telah diklasifikasikan sebagai adversarial atau tidak mencari jawaban.

    Untuk mengetahui informasi selengkapnya tentang kueri adversarial dan kueri yang tidak mencari jawaban, lihat Mengabaikan kueri adversarial dan Mengabaikan kueri yang tidak mencari ringkasan. Kueri yang tidak mencari jawaban juga disebut kueri yang tidak mencari ringkasan.

Fitur fase jawaban tambahan yang tidak tersedia dalam metode penelusuran adalah:

  • Mendapatkan skor dukungan untuk setiap klaim (kalimat dalam jawaban yang dihasilkan). Skor dukungan adalah nilai floating point dalam rentang [0,1] yang menunjukkan seberapa kuat klaim tersebut didasarkan pada data di penyimpanan data. Untuk mengetahui informasi selengkapnya, lihat Menampilkan skor dukungan grounding.

  • Mendapatkan skor dukungan gabungan untuk jawaban. Skor dukungan menunjukkan seberapa baik jawaban didasarkan pada data di penyimpanan data. Untuk mengetahui informasi selengkapnya, lihat Menampilkan skor dukungan grounding.

  • Hanya menampilkan jawaban yang didasarkan pada fakta. Anda dapat memilih untuk hanya menampilkan jawaban yang memenuhi nilai minimum skor dukungan tertentu. Untuk mengetahui informasi selengkapnya, lihat Hanya menampilkan jawaban yang didasarkan pada fakta.

  • Tambahkan informasi personalisasi ke kueri agar jawabannya dapat disesuaikan untuk setiap pengguna. Untuk mengetahui informasi selengkapnya, lihat Mempersonalisasi jawaban.

Untuk menerima jawaban multimodal yang menyertakan diagram atau gambar selain teks, opsi berikut tersedia:

  • Mendapatkan jawaban yang menyertakan diagram dan grafik yang memetakan data yang terdapat dalam jawaban. Untuk mengetahui informasi selengkapnya, lihat Membuat diagram untuk jawaban.

  • Mengambil gambar dari penyimpanan data. Jika penyimpanan data berisi gambar, metode jawaban dapat menampilkan gambar dalam jawaban. Gambar dari penyimpanan data juga dapat ditampilkan dalam referensi jika kutipan diminta. Untuk mengetahui informasi selengkapnya, lihat Mengambil gambar yang ada dari penyimpanan data.

Penelusuran dan jawaban (dasar)

Perintah berikut menunjukkan cara memanggil metode answer dan menampilkan jawaban yang dihasilkan dan daftar hasil penelusuran, dengan link ke sumber.

Perintah ini hanya menampilkan input yang diperlukan. Opsi dibiarkan pada nilai defaultnya.

REST

Untuk menelusuri dan mendapatkan hasil dengan jawaban yang dihasilkan, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"}
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?".

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Perintah fase kueri

Bagian ini menunjukkan cara menentukan opsi untuk fase kueri panggilan metode answer.

Penelusuran dan jawaban (parafrasa dinonaktifkan)

Perintah berikut menunjukkan cara memanggil metode answer dan menampilkan jawaban yang dihasilkan dan daftar hasil penelusuran. Jawabannya bisa berbeda dari jawaban sebelumnya karena opsi pengungkapan ulang dinonaktifkan.

REST

Untuk menelusuri dan mendapatkan hasil dengan jawaban yang dihasilkan tanpa menerapkan pengubahan frasa kueri, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
               "queryRephraserSpec": {
                  "disable": true
            }
        }
          }'
    
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?".

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Telusuri dan jawab (tentukan langkah maksimum)

Perintah berikut menunjukkan cara memanggil metode answer dan menampilkan jawaban yang dihasilkan dan daftar hasil penelusuran. Jawabannya berbeda dari jawaban sebelumnya karena jumlah langkah pengungkapan ulang telah ditingkatkan.

REST

Untuk menelusuri dan mendapatkan hasil dengan jawaban yang dihasilkan yang memungkinkan hingga lima langkah pengungkapan ulang, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
                "queryRephraserSpec": {
                    "maxRephraseSteps": MAX_REPHRASE
                 }
             }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?".
    • MAX_REPHRASE: jumlah maksimum langkah parafrase. Nilai terbesar yang diizinkan adalah 5. Jika tidak ditetapkan atau jika ditetapkan ke kurang dari 1, nilainya adalah default, 1.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Penelusuran dan jawaban dengan klasifikasi kueri

Perintah berikut menunjukkan cara memanggil metode answer untuk menanyakan apakah kueri bersifat adversarial, tidak mencari jawaban, atau tidak keduanya.

Respons menyertakan jenis klasifikasi untuk kueri, tetapi jawaban itu sendiri tidak terpengaruh oleh klasifikasi. Jika ingin mengubah perilaku jawaban sesuai dengan jenis kueri, Anda dapat melakukannya di fase jawaban. Lihat Mengabaikan kueri adversarial dan Mengabaikan kueri yang tidak mencari ringkasan.

REST

Untuk menentukan apakah kueri bersifat adversarial atau tidak mencari jawaban, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
                "queryClassificationSpec": {
                    "types": ["QUERY_CLASSIFICATION_TYPE"]
                 }
             }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "halo".
    • QUERY_CLASSIFICATION_TYPE: jenis kueri yang ingin Anda identifikasi: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY, atau keduanya.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Perintah fase penelusuran: Menelusuri dan menjawab dengan opsi hasil penelusuran

Bagian ini menunjukkan cara menentukan opsi untuk bagian fase penelusuran dari panggilan metode answer, opsi seperti menetapkan jumlah maksimum dokumen yang ditampilkan, meningkatkan, dan memfilter, serta cara mendapatkan jawaban saat Anda memberikan hasil penelusuran Anda sendiri.

Perintah berikut menunjukkan cara memanggil metode answer dan menentukan berbagai opsi untuk cara hasil penelusuran ditampilkan. (Hasil penelusuran tidak bergantung pada jawaban.)

REST

Untuk menetapkan berbagai opsi terkait hasil penelusuran yang ditampilkan dan cara menampilkannya, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
              "searchSpec": {
              "searchParams": {
                "maxReturnResults": MAX_RETURN_RESULTS,
                "filter": "FILTER",
                "boostSpec": BOOST_SPEC,
                "orderBy": "ORDER_BY",
                "searchResultMode": SEARCH_RESULT_MODE
               }
             }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?"
    • MAX_RETURN_RESULTS: jumlah hasil penelusuran yang akan ditampilkan. Nilai defaultnya adalah 10.
    • FILTER: filter menentukan dokumen mana yang dikueri. Jika metadata dokumen memenuhi spesifikasi filter, dokumen tersebut akan dikueri. Untuk mengetahui informasi selengkapnya, termasuk sintaksis filter, lihat Memfilter penelusuran kustom untuk data terstruktur atau tidak terstruktur.
    • BOOST_SPEC: spesifikasi penguatan memungkinkan Anda memperkuat dokumen tertentu dalam hasil penelusuran, yang dapat memengaruhi jawaban. Untuk mengetahui informasi selengkapnya, termasuk sintaksis untuk spesifikasi penguatan, lihat Memperkuat hasil penelusuran.
    • ORDER_BY: urutan dokumen yang ditampilkan. Dokumen dapat diurutkan berdasarkan kolom dalam objek Document. Ekspresi orderBy bersifat peka huruf besar/kecil. Jika kolom ini tidak dapat dikenali, INVALID_ARGUMENT akan ditampilkan.
    • SEARCH_RESULT_MODE: menentukan mode hasil penelusuran: DOCUMENTS atau CHUNKS. Untuk mengetahui informasi selengkapnya, lihat Mengurai dan membuat potongan dokumen dan ContentSearchSpec. Kolom ini hanya tersedia di API versi v1alpha.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Perintah fase jawaban

Bagian ini menunjukkan cara menyesuaikan panggilan metode answer. Anda dapat menggabungkan opsi berikut sesuai kebutuhan.

Mengabaikan kueri yang berlawanan dan kueri yang tidak mencari jawaban

Perintah berikut menunjukkan cara menghindari menjawab kueri adversarial dan kueri yang tidak mencari jawaban saat memanggil metode answer.

REST

Untuk melewati jawaban atas kueri yang bersifat adversarial atau tidak mencari jawaban, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "ignoreAdversarialQuery": true,
               "ignoreNonAnswerSeekingQuery": true
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Hanya tampilkan jawaban yang relevan

Gemini Enterprise dapat menilai seberapa relevan hasil dengan kueri. Jika tidak ada hasil yang dianggap cukup relevan, Anda dapat memilih untuk menampilkan jawaban pengganti: "We do not have a summary for your query.", daripada menghasilkan jawaban dari hasil yang tidak relevan atau kurang relevan.

Perintah berikut menunjukkan cara menampilkan jawaban penggantian jika ada hasil yang tidak relevan saat memanggil metode answer.

REST

Untuk menampilkan jawaban penggantian jika tidak ada hasil yang relevan, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "ignoreLowRelevantContent": true
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Menampilkan skor dukungan grounding

Perintah berikut menunjukkan cara menampilkan skor dukungan grounding untuk jawaban dan klaim.

REST

Untuk menampilkan skor dukungan untuk setiap klaim (kalimat dalam jawaban) dan skor dukungan gabungan untuk jawaban, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "groundingSpec": {
               "includeGroundingSupports": true,
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Hanya tampilkan jawaban yang didasarkan pada informasi yang kuat

Perintah berikut menunjukkan cara hanya menampilkan jawaban yang dianggap berdasarkan fakta yang kuat dalam korpus, yaitu informasi di penyimpanan data. Jawaban yang tidak didasarkan pada sumber yang baik akan difilter.

Anda memilih nilai minimum tingkat rendah atau tinggi untuk skor dukungan grounding. Kemudian, jawaban hanya ditampilkan jika memenuhi atau melebihi tingkat tersebut. Anda dapat bereksperimen dengan dua nilai minimum filter dan tanpa nilai minimum untuk menentukan tingkat filter yang kemungkinan akan memberikan hasil terbaik bagi pengguna Anda.

REST

Untuk menampilkan jawaban hanya jika jawaban tersebut memenuhi nilai minimum skor dukungan, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "groundingSpec": {
               "filteringLevel": "FILTER_LEVEL"
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • FILTER_LEVEL: enumerasi untuk memfilter jawaban berdasarkan skor dukungan grounding. Opsinya adalah: FILTERING_LEVEL_LOW dan FILTERING_LEVEL_HIGH. Jika filteringLevel tidak disertakan, tidak ada filter skor dukungan yang diterapkan ke jawaban.

Menentukan model jawaban

Perintah berikut menunjukkan cara mengubah versi model yang digunakan untuk menghasilkan jawaban.

Untuk mengetahui informasi tentang model yang didukung, lihat Versi dan siklus proses model pembuatan jawaban.

REST

Untuk membuat jawaban menggunakan model yang berbeda dari model default, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "modelSpec": {
                  "modelVersion": "MODEL_VERSION",
               }
             }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • MODEL_VERSION: versi model yang ingin Anda gunakan untuk menghasilkan jawaban. Untuk mengetahui informasi selengkapnya, lihat Versi dan siklus proses model pembuatan jawaban.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Menentukan preamble kustom

Perintah berikut menunjukkan cara menetapkan preamble untuk jawaban yang dihasilkan. Pengantar berisi petunjuk bahasa alami untuk menyesuaikan jawaban. Anda dapat meminta penyesuaian seperti panjang, tingkat detail, gaya output (seperti "sederhana"), bahasa output, fokus jawaban, dan format (seperti tabel, poin, dan XML). Misalnya, preamble dapat berupa "Jelaskan seolah-olah Anda adalah anak berusia sepuluh tahun".

Preambul dapat memberikan dampak signifikan terhadap kualitas jawaban yang dihasilkan. Untuk mengetahui informasi tentang hal yang harus ditulis dalam preambul dan contoh preambul yang baik, lihat Tentang preambul kustom.

REST

Untuk membuat jawaban menggunakan model yang berbeda dari model default, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "promptSpec": {
                   "preamble": "PREAMBLE",
               }
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • PREAMBLE: petunjuk bahasa alami untuk menyesuaikan jawaban. Misalnya, coba show the answer format in an ordered list atau give a very detailed answer.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Sertakan kutipan

Perintah berikut menunjukkan cara meminta kutipan untuk disertakan dengan jawaban.

REST

Untuk membuat jawaban menggunakan model yang berbeda dari model default, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "includeCitations": INCLUDE_CITATIONS
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • INCLUDE_CITATIONS: menentukan apakah akan menyertakan metadata kutipan dalam jawaban. Nilai defaultnya adalah false.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Menetapkan kode bahasa jawaban

Perintah berikut menunjukkan cara menetapkan kode bahasa untuk jawaban.

REST

Untuk membuat jawaban menggunakan model yang berbeda dari model default, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "answerLanguageCode": "ANSWER_LANGUAGE_CODE"
               }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • ANSWER_LANGUAGE_CODE: kode bahasa untuk jawaban. Gunakan tag bahasa yang ditentukan oleh BCP47: Tag untuk Mengidentifikasi Bahasa.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
        # Use the 2026 stable production model for answer generation
        model_version="gemini-2.5-flash/answer_gen/stable",
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Mempersonalisasi jawaban

Jika ada informasi spesifik tentang pengguna yang tersedia—misalnya, data di profil, Anda dapat menentukan informasi tersebut di objek endUserMetadata sehingga hasil kueri dapat dipersonalisasi untuk pengguna.

Misalnya, jika pengguna menelusuri informasi tentang mengupgrade ponsel, informasi dari profilnya, seperti model ponsel dan paket seluler saat ini, memberikan informasi yang dapat mempersonalisasi jawaban yang dihasilkan.

Untuk menambahkan informasi pribadi tentang pengguna yang membuat kueri dan membuat jawaban yang mempertimbangkan informasi pribadi, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
    -d '{
        "query": { "text": "QUERY"},
        "endUserSpec": {
           "endUserMetadata": [
             {
               "chunkInfo": {
                  "content": "PERSONALIZED_INFO",
                  "documentMetadata":  { "title": "INFO_DESCRIPTION"}
               }
             }
           ]
        }
      }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • PERSONALIZATION_INFO: string yang berisi informasi khusus untuk pengguna yang membuat kueri. Misalnya, This customer has a Pixel 6 Pro purchased over a period of 24-months starting 2023-01-15. This customer is on the Business Plus International plan. No payment is due at this time. Batas panjang untuk string ini adalah 8.000 karakter.
    • INFO_DESCRIPTION: string yang menjelaskan secara singkat informasi personalisasi—misalnya, Customer profile data, including model, plan, and billing status. Model ini menggunakan deskripsi dan informasi personalisasi ini saat membuat jawaban yang disesuaikan untuk kueri.

Membuat diagram untuk jawaban

Metode answer dapat membuat diagram dan menampilkannya sebagai bagian dari jawaban atas kueri.

Anda dapat secara khusus meminta agar jawaban menyertakan diagram, misalnya, "Plot tingkat pertumbuhan tahun ke tahun pembayaran bisnis kecil selama bertahun-tahun dengan data yang tersedia". Jika sistem menentukan bahwa data yang ada sudah cukup, diagram akan ditampilkan. Biasanya, beberapa teks jawaban ditampilkan bersama diagram.

Selain itu, jika ada cukup data untuk membuat diagram, metode jawaban dapat menampilkan diagram meskipun kueri tidak secara eksplisit meminta diagram. Misalnya, "Apa peningkatan skor HDI yang terkait dengan lebih banyak akses ke air minum bersih dalam dekade antara 2010 dan 2020?"

Hanya satu diagram yang dibuat per jawaban. Namun, diagram tersebut mungkin merupakan diagram gabungan, yang berisi diagram lain yang lebih kecil. Contoh diagram gabungan:

diagram gabungan berisi empat diagram yang lebih kecil

Batasan

Kueri harus dalam bahasa Inggris.

Skenario kegagalan umum

Anda tidak akan selalu mendapatkan gambar yang ditampilkan bersama jawaban Anda. Jika tidak ada data yang memadai, angka tidak dapat dibuat.

Skenario kegagalan lainnya mencakup kegagalan eksekusi kode dan waktu tunggu habis. Jika salah satu hal ini terjadi, ubah susunan kata kueri Anda dan coba lagi.

Sebelum memulai

Sebelum menjalankan kueri yang meminta diagram yang dihasilkan, lakukan hal berikut:

  • Pastikan Anda menggunakan model Gemini 2.0 atau yang lebih baru. Untuk mengetahui informasi tentang model, lihat Versi dan siklus proses model pembuatan jawaban.

  • Jika Anda memiliki penyimpanan data tidak terstruktur yang menyertakan dokumen dengan banyak tabel dan gambar, aktifkan Layout parser. Meskipun tidak mutlak diperlukan, hal ini akan memberikan hasil yang lebih berkualitas.

Prosedur

REST

Panggil metode answer sebagai berikut untuk menampilkan jawaban yang dapat menyertakan diagram yang dihasilkan dari data di penyimpanan data:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
              "model_spec": {
                 "model_version": "MODEL_VERSION"
             },
              "multimodalSpec": {
                 "imageSource": "IMAGE_SOURCE"
                 }
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas dalam bahasa Inggris yang berisi pertanyaan atau kueri penelusuran.
    • MODEL_VERSION: Versi model stable atau model lain yang didukung, lihat Versi dan siklus proses model pembuatan jawaban.
    • IMAGE_SOURCE: enumerasi untuk meminta agar jawaban menyertakan diagram yang dihasilkan, FIGURE_GENERATION_ONLY, atau agar jawaban dapat menyertakan diagram yang dihasilkan atau gambar yang ada dari penyimpanan data, ALL_AVAILABLE_SOURCES.

Mengambil gambar yang ada dari penyimpanan data

Anda dapat memilih agar gambar dari penyimpanan data ditampilkan bersama jawaban dan dalam referensi kutipan. Penyimpanan data harus berupa penyimpanan data tidak terstruktur dengan parser tata letak diaktifkan.

Jika imageSource adalah CORPUS_IMAGE_ONLY atau ALL_AVAILABLE_SOURCES, metode answer dapat mengambil gambar dari penyimpanan data sebagaimana mestinya. Namun, mengaktifkan fitur ini tidak berarti gambar akan selalu ditampilkan.

Anda akan mendapatkan satu gambar (maksimum) per jawaban. Kutipan dapat berisi beberapa gambar.

Batasan

  • Aplikasi yang Anda gunakan harus terhubung ke penyimpanan data tidak terstruktur. Gambar tidak dapat ditampilkan dari situs atau dari penyimpanan data terstruktur.

  • Kueri harus dalam bahasa Inggris.

  • Anotasi gambar melalui parser tata letak harus diterapkan ke penyimpanan data. Untuk mengetahui informasi tentang parser tata letak, lihat Mengurai dan membagi dokumen.

Prosedur

REST

Panggil metode answer sebagai berikut untuk menampilkan jawaban yang dapat menyertakan gambar dari penyimpanan data dalam jawaban:

  1. Jalankan perintah curl berikut:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
              "model_spec": {
                 "model_version": "MODEL_VERSION"
              },
              includeCitations: true,
              "multimodalSpec": {
                 "imageSource": "IMAGE_SOURCE"
                 }
            }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas dalam bahasa Inggris yang berisi pertanyaan atau kueri penelusuran.
    • MODEL_VERSION: Versi model stable atau model lain yang didukung, lihat Versi dan siklus proses model pembuatan jawaban.
    • IMAGE_SOURCE: enumerasi untuk meminta agar jawaban menyertakan gambar dari penyimpanan data, CORPUS_IMAGE_ONLY, atau agar jawaban dapat menyertakan gambar dari penyimpanan data atau diagram yang dihasilkan, ALL_AVAILABLE_SOURCES.

Perintah untuk pertanyaan lanjutan

Tindak lanjut adalah kueri multi-turn. Setelah kueri pertama dalam sesi tindak lanjut, "giliran" berikutnya akan mempertimbangkan interaksi sebelumnya. Dengan pertanyaan lanjutan, metode jawaban juga dapat menyarankan pertanyaan terkait, yang dapat dipilih pengguna, bukan memasukkan pertanyaan lanjutan mereka sendiri.

Semua fitur jawaban dan tindak lanjut yang dijelaskan di bagian sebelumnya, seperti kutipan, filter, SafeSearch, mengabaikan jenis kueri tertentu, dan menggunakan preambul untuk menyesuaikan jawaban, dapat diterapkan bersama dengan tindak lanjut.

Contoh sesi lanjutan

Berikut adalah contoh sesi dengan tindak lanjut. Misalnya, Anda ingin mengetahui tentang berlibur di Meksiko:

  • Giliran 1:

    • Anda: Kapan waktu terbaik dalam setahun untuk berlibur di Meksiko?

    • Jawaban dengan pertanyaan lanjutan: Waktu terbaik untuk berlibur di Meksiko adalah selama musim kemarau, yang berlangsung dari November hingga April.

  • Giliran 2:

    • Anda: Berapa kurs yang berlaku?

    • Jawaban dengan tindak lanjut: 1 USD setara dengan sekitar 17,65 peso Meksiko.

  • Giliran 3:

    • Anda: Berapa suhu rata-rata di bulan Desember?

    • Jawaban dengan tindak lanjut: Suhu rata-rata bervariasi dari 21-25 °C. Suhu rata-rata Cancun adalah ~ 25 °C.

Tanpa tindak lanjut, pertanyaan Anda "Berapa nilai tukarnya?" tidak akan dapat dijawab karena penelusuran reguler tidak akan tahu bahwa Anda menginginkan nilai tukar Meksiko. Demikian pula, tanpa tindak lanjut, tidak akan ada konteks yang diperlukan untuk memberikan suhu khusus untuk Meksiko.

Saat Anda bertanya "Kapan waktu terbaik dalam setahun untuk berlibur di Meksiko?", selain menjawab pertanyaan Anda, jawaban dan pertanyaan lanjutan dapat menyarankan pertanyaan lain yang mungkin Anda ajukan, seperti "Bulan apa yang paling murah untuk berlibur di Meksiko?" dan "Bulan apa yang paling banyak dikunjungi wisatawan di Meksiko?".

Setelah fitur pertanyaan terkait diaktifkan, pertanyaan akan ditampilkan sebagai string dalam respons.

Tentang sesi

Untuk memahami cara kerja tindak lanjut di Gemini Enterprise, Anda perlu memahami sesi.

Sesi terdiri dari kueri teks yang diberikan oleh pengguna dan respons yang diberikan oleh Gemini Enterprise.

Pasangan kueri dan respons ini terkadang disebut sebagai giliran. Dalam contoh sebelumnya, giliran kedua terdiri dari "Berapa nilai tukarnya?" dan "1 USD setara dengan sekitar 17,65 peso Meksiko".

Sesi disimpan bersama aplikasi. Dalam aplikasi, sesi direpresentasikan oleh resource sesi.

Selain berisi pesan kueri dan respons, resource sesi memiliki:

  • Nama unik (ID sesi).

  • Status (sedang berlangsung atau selesai).

  • ID pseudo pengguna, yang merupakan ID pengunjung yang melacak pengguna. ID ini dapat ditetapkan secara terprogram.

  • Waktu mulai dan waktu berakhir.

  • Giliran, yang merupakan pasangan jawaban kueri.

Menyimpan informasi sesi dan mendapatkan respons

Anda dapat menggunakan command line untuk membuat respons dan jawaban penelusuran serta menyimpannya, bersama dengan setiap kueri dalam sesi.

REST

Untuk menggunakan command line guna membuat sesi dan menghasilkan respons dari input pengguna, ikuti langkah-langkah berikut:

  1. Tentukan aplikasi tempat Anda ingin menyimpan sesi:

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions" \
      -d '{
            "userPseudoId": "USER_PSEUDO_ID"
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.

    • APP_ID: ID aplikasi.

    • USER_PSEUDO_ID: ini adalah ID unik untuk melacak pengunjung penelusuran. Misalnya, Anda dapat menerapkan ini dengan cookie HTTP, yang secara unik mengidentifikasi pengunjung di satu perangkat.

    Contoh perintah dan hasil

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/collections/default_collection/engines/my-app/sessions"
    -d '{
    "userPseudoId": "test_user"
    }'
    
    { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943", "state": "IN_PROGRESS", "userPseudoId": "test_user", "startTime": "2024-09-13T18:47:10.465311Z", "endTime": "2024-09-13T18:47:10.465311Z" }
  2. Catat ID sesi, yaitu angka di akhir kolom name: dalam respons JSON. Dalam contoh hasil, ID-nya adalah 5386462384953257772. Anda memerlukan ID ini di langkah berikutnya.

  3. Buat jawaban dan tambahkan ke sesi di aplikasi Anda:

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "session": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID",
              "searchSpec":{ "searchParams": {"filter": "FILTER"} }
    }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • SESSION_ID: ID untuk sesi yang Anda buat di langkah 1. Ini adalah digit di akhir kolom name:, yang dicatat pada langkah 2. Untuk sesi, gunakan ID sesi yang sama di setiap giliran.
    • FILTER: kolom teks untuk memfilter penelusuran menggunakan ekspresi filter. Nilai defaultnya adalah string kosong. Cara Anda membuat filter bervariasi, bergantung pada apakah Anda memiliki data tidak terstruktur dengan metadata, data terstruktur, atau data situs. Untuk mengetahui informasi selengkapnya, lihat Memfilter penelusuran kustom untuk data terstruktur atau tidak terstruktur.

    Contoh perintah dan hasil

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/collections/default_collection/engines/my-app/servingConfigs/default_search:answer"
    -d '{
    "query": { "text": "Compare bigquery with spanner database?"},
    "session":  "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943",
    }'
        
    { "answer": { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943/answers/4861507376861383072", "state": "SUCCEEDED", "answerText": "BigQuery and Spanner are both powerful tools that can be used together to handle transactional and analytical workloads. Spanner is a fully managed relational database optimized for transactional workloads, while BigQuery is a serverless data warehouse designed for business agility. Spanner provides seamless replication across regions in Google Cloud and processes over 1 billion requests per second at peak. BigQuery analyzes over 110 terabytes of data per second. Users can leverage federated queries to read data from Spanner and write to a native BigQuery table. \n", "steps": [ { "state": "SUCCEEDED", "description": "Rephrase the query and search.", "actions": [ { "searchAction": { "query": "Compare bigquery with spanner database?" }, "observation": { "searchResults": [ { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/ecc0e7547253f4ca3ff3328ce89995af", "uri": "https://cloud.google.com/blog/topics/developers-practitioners/how-spanner-and-bigquery-work-together-handle-transactional-and-analytical-workloads", "title": "How Spanner and BigQuery work together to handle transactional and analytical workloads | Google Cloud Blog", "snippetInfo": [ { "snippet": "Using Cloud \u003cb\u003eSpanner\u003c/b\u003e and \u003cb\u003eBigQuery\u003c/b\u003e also allows customers to build their \u003cb\u003edata\u003c/b\u003e clouds using Google Cloud, a unified, open approach to \u003cb\u003edata\u003c/b\u003e-driven transformation ...", "snippetStatus": "SUCCESS" } ] }, { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/d7e238f73608a860e00b752ef80e2941", "uri": "https://cloud.google.com/blog/products/databases/cloud-spanner-gets-stronger-with-bigquery-federated-queries", "title": "Cloud Spanner gets stronger with BigQuery-federated queries | Google Cloud Blog", "snippetInfo": [ { "snippet": "As enterprises compete for market share, their need for real-time insights has given rise to increased demand for transactional \u003cb\u003edatabases\u003c/b\u003e to support \u003cb\u003edata\u003c/b\u003e ...", "snippetStatus": "SUCCESS" } ] }, { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/e10a5a3c267dc61579e7c00fefe656eb", "uri": "https://cloud.google.com/blog/topics/developers-practitioners/replicating-cloud-spanner-bigquery-scale", "title": "Replicating from Cloud Spanner to BigQuery at scale | Google Cloud Blog", "snippetInfo": [ { "snippet": "... \u003cb\u003eSpanner data\u003c/b\u003e into \u003cb\u003eBigQuery\u003c/b\u003e for analytics. In this post, you will learn how to efficiently use this feature to replicate large tables with high throughput ...", "snippetStatus": "SUCCESS" } ] }, ... { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/8100ad36e1cac149eb9fc180a41d8f25", "uri": "https://cloud.google.com/blog/products/gcp/from-nosql-to-new-sql-how-spanner-became-a-global-mission-critical-database", "title": "How Spanner became a global, mission-critical database | Google Cloud Blog", "snippetInfo": [ { "snippet": "... SQL \u003cb\u003evs\u003c/b\u003e. NoSQL dichotomy may no longer be relevant." The \u003cb\u003eSpanner\u003c/b\u003e SQL query processor, while recognizable as a standard implementation, has unique ...", "snippetStatus": "SUCCESS" } ] } ] } } ] } ] }, "session": { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943", "state": "IN_PROGRESS", "userPseudoId": "test_user", "turns": [ { "query": { "queryId": "projects/123456/locations/global/questions/741830", "text": "Compare bigquery with spanner database?" }, "answer": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943/answers/4861507376861383072" } ], "startTime": "2024-09-13T18:47:10.465311Z", "endTime": "2024-09-13T18:47:10.465311Z" }, "answerQueryToken": "NMwKDAjFkpK3BhDU24uZAhIkNjZlNDIyZWYtMDAwMC0yMjVmLWIxMmQtZjQwMzA0M2FkYmNj" }
  4. Ulangi langkah 3 untuk setiap kueri baru dalam sesi.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def create_session(
    project_id: str,
    location: str,
    engine_id: str,
    user_pseudo_id: str,
) -> discoveryengine.Session:
    """Creates a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        user_pseudo_id: A unique identifier for tracking visitors. For example, this
          could be implemented with an HTTP cookie, which should be able to
          uniquely identify a visitor on a single device.
    Returns:
        discoveryengine.Session: The newly created Session.
    """

    client = discoveryengine.SessionServiceClient()

    session = client.create_session(
        # The full resource name of the engine
        parent=f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}",
        session=discoveryengine.Session(user_pseudo_id=user_pseudo_id),
    )

    # Send Session name in `answer_query()`
    print(f"Session: {session.name}")
    return session

Mendapatkan sesi dari penyimpanan data

Perintah berikut menunjukkan cara memanggil metode get dan mendapatkan sesi dari penyimpanan data.

REST

Untuk mendapatkan sesi dari penyimpanan data, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • SESSION_ID: ID sesi yang ingin Anda dapatkan.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def get_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> discoveryengine.Session:
    """Retrieves a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    """

    client = discoveryengine.SessionServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    session = client.get_session(name=name)

    print(f"Session details: {session}")
    return session

Menghapus sesi dari aplikasi

Perintah berikut menunjukkan cara memanggil metode delete dan menghapus sesi dari penyimpanan data.

Secara default, sesi yang sudah lebih dari 60 hari akan otomatis dihapus. Namun, jika Anda ingin menghapus sesi tertentu—misalnya, jika sesi tersebut berisi konten sensitif, gunakan panggilan API ini untuk menghapusnya.

REST

Untuk menghapus sesi dari aplikasi, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • SESSION_ID: ID sesi yang ingin Anda hapus.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def delete_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> None:
    """Deletes a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    """

    client = discoveryengine.SessionServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    client.delete_session(name=name)

    print(f"Session {name} deleted.")

Memperbarui sesi

Ada berbagai alasan mengapa Anda mungkin ingin memperbarui sesi. Misalnya, untuk melakukan salah satu hal berikut:

  • Menandai sesi sebagai selesai
  • Menggabungkan pesan dari satu sesi ke sesi lainnya
  • Mengubah ID pseudo pengguna

Perintah berikut menunjukkan cara memanggil metode patch dan mengupdate sesi di penyimpanan data.

REST

Untuk memperbarui sesi dari aplikasi, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID?updateMask=state" \
      -d '{
            "state": "NEW_STATE"
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • SESSION_ID: ID sesi yang ingin Anda perbarui.
    • NEW_STATE: nilai baru untuk status—misalnya, IN_PROGRESS.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine
from google.protobuf import field_mask_pb2


def update_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> discoveryengine.Session:
    """Updates a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    Returns:
        discoveryengine.Session: The updated Session.
    """
    client = discoveryengine.SessionServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    session = discoveryengine.Session(
        name=name,
        state=discoveryengine.Session.State.IN_PROGRESS,  # Options: IN_PROGRESS, STATE_UNSPECIFIED
    )

    # Fields to Update
    update_mask = field_mask_pb2.FieldMask(paths=["state"])

    session = client.update_session(session=session, update_mask=update_mask)
    print(f"Updated session: {session.name}")
    return session

Mencantumkan semua sesi

Perintah berikut menunjukkan cara memanggil metode list dan mencantumkan sesi di penyimpanan data.

REST

Untuk mencantumkan sesi aplikasi, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X GET \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.SessionServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response

Mencantumkan sesi untuk pengguna

Perintah berikut menunjukkan cara memanggil metode list untuk mencantumkan sesi yang terkait dengan pengguna atau pengunjung.

REST

Untuk mencantumkan sesi yang terkait dengan pengguna atau pengunjung, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X GET \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions?filter=userPseudoId=USER_PSEUDO_ID"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • USER_PSEUDO_ID: ID pseudo pengguna yang sesinya ingin Anda cantumkan.

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.SessionServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response

Mencantumkan sesi untuk pengguna dan status

Perintah berikut menunjukkan cara memanggil metode list untuk mencantumkan sesi dalam status tertentu untuk pengguna tertentu.

REST

Untuk mencantumkan sesi pengguna yang terbuka atau tertutup dan terkait dengan pengguna atau pengunjung tertentu, lakukan hal berikut:

  1. Jalankan perintah curl berikut:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions?filter=userPseudoId=USER_PSEUDO_ID%20AND%20state=STATE"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • APP_ID: ID aplikasi.
    • USER_PSEUDO_ID: ID pseudo pengguna yang sesinya ingin Anda cantumkan.
    • STATE: status sesi: STATE_UNSPECIFIED (ditutup atau tidak diketahui) atau IN_PROGRESS (terbuka).

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Gemini Enterprise menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Gemini Enterprise Python.

Untuk melakukan autentikasi ke Gemini Enterprise, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.SessionServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response