Mendapatkan jawaban dan tindak lanjut

Halaman ini memperkenalkan penelusuran dengan jawaban dan tindak lanjut untuk Agent Search dan menunjukkan cara mengimplementasikannya untuk aplikasi penelusuran kustom menggunakan panggilan metode.

Penelusuran dengan jawaban dan tindak lanjut didasarkan pada metode jawaban. Metode answer menggantikan fitur ringkasan dari metode search yang lebih lama dan semua fitur dari metode converse yang tidak digunakan lagi. 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

Agent Search 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 dalam kasus berikut:

  • Anda hanya memerlukan hasil penelusuran, bukan jawaban generatif.

  • Anda memiliki salah satu dari hal berikut:

    • Data media atau layanan kesehatan
    • Embedding Anda sendiri
    • Kontrol sinonim atau pengalihan
    • Faset
    • Kode negara pengguna
  • Anda perlu menjelajahi data di penyimpanan data umum.

Gunakan metode jawab dan telusuri 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 susunan kata dan klasifikasi kueri.

Pengungkapan ulang kueri

Parafrasa 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
    Turn 1: laptops for school laptop untuk sekolah
    Giliran 2: bukan mac laptop untuk sekolah selain mac
    Turn 3: bigger screen and i also need wireless keyboard and mouse 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
  • Menyederhanakan kueri panjang untuk meningkatkan pengambilan (memerlukan opsi Respons generatif).

    Misalnya: Kueri panjang dipersingkat menjadi kueri biasa.

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

    Penalaran multi-langkah memerlukan pengaktifan opsi Respons generatif.

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 preambul kustom.

  • Pilih model Vertex AI 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 informasi yang kuat.

  • Pilih untuk menampilkan pertanyaan terkait. Pertanyaan terkait adalah saran yang dapat dipilih pengguna, bukan memasukkan pertanyaan mereka sendiri.

  • Tambahkan informasi personalisasi ke kueri agar jawaban 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.

Sebelum memulai

Bergantung pada jenis aplikasi yang Anda miliki, lengkapi persyaratan berikut:

  • Jika Anda memiliki aplikasi penelusuran terstruktur, tidak terstruktur, atau situs, aktifkan opsi berikut:

    • Fitur edisi Enterprise: Memberi Anda akses ke fitur jawaban generatif inti. Hal ini mencakup semua fitur pembuatan jawaban, kecuali fitur jawaban generatif lanjutan, seperti pertanyaan terkait, penyederhanaan kueri, kueri multi-turn, dan jawaban multimodal yang menampilkan gambar dan diagram.
    • Respons generatif: Fitur ini memberi Anda akses ke fitur jawaban generatif lanjutan yang memerlukan penalaran multi-langkah, penyederhanaan kueri, kueri multi-turn, pertanyaan terkait, dan jawaban multimodal yang menampilkan gambar dan diagram.
  • Selain itu, jika Anda memiliki penyimpanan data penelusuran situs, aktifkan Advanced website indexing.

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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?".

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 mungkin 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "Bandingkan database BigQuery dan Spanner?".

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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. Jawaban ini 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda kueri.
    • 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 menampilkan hasil penelusuran. (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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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. Nilai maksimumnya adalah 25.
    • 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 memotong dokumen dan ContentSearchSpec. Kolom ini hanya tersedia di API versi v1alpha.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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

Agent Search 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.", alih-alih 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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.

Untuk mengetahui informasi umum tentang grounding di Vertex AI, lihat Memeriksa grounding dengan RAG. Metode groundingConfigs.check dipanggil oleh metode jawaban.

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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.

Hanya menampilkan jawaban yang beralasan kuat

Perintah berikut menunjukkan cara menampilkan hanya jawaban yang dianggap berdasarkan fakta yang kuat dalam korpus, yaitu informasi di penyimpanan data. Jawaban yang tidak didasarkan pada sumber yang kuat 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.

Untuk mengetahui informasi umum tentang grounding di Vertex AI, lihat Memeriksa grounding dengan RAG. Metode groundingConfigs.check dipanggil oleh metode jawaban.

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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 seperti 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran.
    • PREAMBLE: petunjuk natural language untuk menyesuaikan jawaban. Misalnya, coba show the answer format in an ordered list atau give a very detailed answer.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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

Metode jawaban dapat menyarankan pertanyaan terkait, yang dapat dipilih pengguna, bukan memasukkan pertanyaan mereka sendiri. Misalnya, saat Anda bertanya "Kapan waktu terbaik dalam setahun untuk berlibur di Meksiko?", selain menjawab pertanyaan Anda, metode jawaban 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 turis di Meksiko?".

Untuk menerima pertanyaan terkait, Anda harus menentukan penyertaannya dengan setiap kueri, dan pertanyaan tersebut ditampilkan sebagai array string dalam respons.

Jika jawaban dilewati dan kolom answerSkippedReasons ditampilkan dalam respons, pertanyaan terkait tidak akan disertakan dalam output.

Sebelum memulai

Pastikan Anda telah mengaktifkan opsi Respons generatif untuk aplikasi.

Prosedur

Perintah berikut menunjukkan cara meminta pertanyaan terkait untuk disertakan dengan jawaban.

REST

Untuk mendapatkan pertanyaan terkait dengan jawaban yang dihasilkan:

  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"},
            "relatedQuestionsSpec": { "enable": true }
          }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas yang berisi pertanyaan atau kueri penelusuran. Misalnya, "jenis data apa yang dapat saya impor ke Agent Search?".

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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 yang login menelusuri informasi tentang upgrade 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen 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 informasi personalisasi secara singkat—misalnya, Customer profile data, including model, plan, and billing status. Model menggunakan deskripsi ini dan informasi personalisasi 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 data yang cukup 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 tahun 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 telah mengaktifkan opsi Respons generatif untuk aplikasi.

  • 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 Parser tata letak. Meskipun tidak sepenuhnya diperlukan, hal ini 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas dalam bahasa Inggris yang berisi pertanyaan atau kueri penelusuran.
    • MODEL_VERSION: Versi model. Untuk mengetahui informasi selengkapnya, lihat Versi dan siklus proses model generatif jawaban.
    • IMAGE_SOURCE: enumerasi untuk meminta agar jawaban menyertakan diagram yang dihasilkan, FIGURE_GENERATION_ONLY, atau bahwa 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.

Untuk mendapatkan diagram dalam jawaban yang ditampilkan, Anda harus mengaktifkan opsi Respons generatif.

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 memotong 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Penelusuran Agen yang ingin Anda buat kuerinya.
    • QUERY: string teks bebas dalam bahasa Inggris yang berisi pertanyaan atau kueri penelusuran.
    • MODEL_VERSION: Versi model. Untuk mengetahui informasi selengkapnya, lihat Versi dan siklus proses model generatif 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 daripada memasukkan pertanyaan lanjutan mereka sendiri. Untuk mendapatkan saran pertanyaan terkait, Anda harus mengaktifkan opsi Respons generatif.

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 liburan 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 pertanyaan lanjutan, 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.

Tentang sesi

Untuk memahami cara kerja tindak lanjut di Penelusuran Agen, Anda perlu memahami sesi.

Sesi terdiri dari kueri teks yang diberikan oleh pengguna dan respons yang diberikan oleh Agent Search.

Pasangan kueri dan respons ini terkadang disebut sebagai giliran. Pada 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 diwakili 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. Jika dipetakan ke ID pseudo pengguna dalam peristiwa pengguna aplikasi Anda, model ini dapat membantu Anda menyajikan hasil yang dipersonalisasi untuk pengguna.

  • Waktu mulai dan waktu berakhir.

  • Giliran, yang merupakan pasangan jawaban kueri.

Sebelum memulai

Sebelum menjalankan kueri yang meminta pertanyaan lanjutan, pastikan Anda telah mengaktifkan opsi Respons generatif untuk aplikasi.

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 Google Cloud Anda.

    • APP_ID: ID aplikasi Agent Search.

    • USER_PSEUDO_ID: string berenkode UTF-8, yang bertindak sebagai ID pseudonim unik yang melacak pengguna. Panjang maksimumnya adalah 128 karakter. Google sangat merekomendasikan penggunaan kolom ini karena dapat meningkatkan performa model dan kualitas personalisasi. Anda dapat menggunakan cookie HTTP untuk kolom ini, yang secara unik mengidentifikasi pengunjung di satu perangkat. Beberapa pertimbangan penting adalah sebagai berikut:

      • ID ini tidak berubah saat pengunjung login atau logout dari situs.
      • Kolom ini tidak boleh ditetapkan ke ID yang sama untuk beberapa pengguna. Jika tidak, ID pengguna yang sama dapat menggabungkan histori peristiwa dari pengguna yang berbeda dan menurunkan kualitas model.
      • Kolom ini tidak boleh menyertakan informasi identitas pribadi (PII).
      • Untuk permintaan penelusuran atau penjelajahan tertentu, kolom ini harus dipetakan ke kolom userPseudoId yang sesuai di peristiwa pengguna.

      Untuk informasi selengkapnya, lihat userPseudoId.

    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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • 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 dan Memfilter penelusuran situs.

    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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • SESSION_ID: ID sesi yang ingin Anda dapatkan.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • SESSION_ID: ID sesi yang ingin Anda hapus.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 lain
  • 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • SESSION_ID: ID sesi yang ingin Anda perbarui.
    • NEW_STATE: nilai baru untuk status—misalnya, IN_PROGRESS.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • USER_PSEUDO_ID: ID pseudo pengguna yang sesinya ingin Anda cantumkan.

Python

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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 Google Cloud Anda.
    • APP_ID: ID aplikasi Agent Search.
    • 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Agent Search.

Untuk melakukan autentikasi ke Agent Search, 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