Menggunakan Vertex AI Search di PDF (data tidak terstruktur) di Cloud Storage dari layanan Cloud Run

1. Pengantar

Ringkasan

Vertex AI Search and Conversation (sebelumnya dikenal sebagai Generative AI App Builder) memungkinkan developer memanfaatkan kecanggihan model dasar, keahlian penelusuran, dan teknologi AI percakapan Google untuk membuat aplikasi AI generatif tingkat perusahaan. Codelab ini berfokus pada penggunaan Vertex AI Search, tempat Anda dapat membangun aplikasi penelusuran berkualitas Google berdasarkan data Anda sendiri dan menyematkan kotak penelusuran di halaman web atau aplikasi.

Cloud Run adalah platform komputasi terkelola yang memungkinkan Anda menjalankan container secara langsung di atas infrastruktur Google yang skalabel. Anda dapat men-deploy kode yang ditulis dalam bahasa pemrograman apa pun di Cloud Run (yang mampu dimasukkan ke dalam container) dengan menggunakan opsi deployment berbasis sumber.

Dalam codelab ini, Anda akan membuat layanan Cloud Run menggunakan deployment berbasis sumber guna mengambil hasil penelusuran untuk konten tidak terstruktur dalam file PDF di bucket Cloud Storage. Anda dapat mempelajari lebih lanjut cara menyerap konten tidak terstruktur di sini.

Yang akan Anda pelajari

  • Cara membuat aplikasi Vertex AI Search untuk data tidak terstruktur sebagai PDF yang diserap dari bucket Cloud Storage
  • Cara membuat endpoint HTTP menggunakan deployment berbasis sumber di Cloud Run
  • Cara membuat akun layanan dengan mengikuti prinsip hak istimewa terendah untuk layanan Cloud Run yang akan digunakan untuk membuat kueri aplikasi Vertex AI Search
  • Cara memanggil layanan Cloud Run untuk mengkueri aplikasi Vertex AI Search

2. Penyiapan dan Persyaratan

Prasyarat

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

d95252b003979716.png

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mengaktifkan API

Sebelum dapat mulai menggunakan Vertex AI Search, ada beberapa API yang perlu Anda aktifkan.

Pertama, codelab ini memerlukan penggunaan Vertex AI Search and Conversation, BigQuery, dan Cloud Storage API. Anda dapat mengaktifkan API tersebut di sini.

Kedua, ikuti langkah-langkah berikut untuk mengaktifkan Vertex AI Search and Conversation API:

  1. Di konsol Google Cloud, buka Konsol Vertex AI Search and Conversation.
  2. Baca dan setujui Persyaratan Layanan, lalu klik Lanjutkan dan aktifkan API.

4. Membuat aplikasi penelusuran untuk data tidak terstruktur dari Cloud Storage

  1. Di Konsol Google Cloud, buka Search & Halaman percakapan. Klik Aplikasi baru.
  2. Di panel Select app type, pilih Search.
  3. Pastikan Fitur perusahaan diaktifkan untuk menerima jawaban yang diekstrak kata demi kata dari dokumen Anda.
  4. Pastikan opsi Fitur LLM lanjutan diaktifkan untuk menerima ringkasan penelusuran.
  5. Di kolom Nama aplikasi, masukkan nama aplikasi Anda. ID aplikasi Anda muncul di bawah nama aplikasi.
  6. Pilih global (Global) sebagai lokasi untuk aplikasi Anda, lalu klik Continue.
  7. Di panel Penyimpanan data, klik Buat penyimpanan data baru.
  8. Di panel Select a data source, pilih Cloud Storage.
  9. Di panel Import data from GCS, pastikan Folder dipilih.
  10. Di kolom gs://, masukkan nilai berikut: cloud-samples-data/gen-app-builder/search/stanford-cs-224 Bucket Cloud Storage ini berisi file PDF dari folder Cloud Storage yang tersedia secara publik untuk tujuan pengujian.
  11. Pilih Dokumen tidak terstruktur, lalu klik Lanjutkan.
  12. Di panel Configure your data store, pilih global (Global) sebagai lokasi untuk penyimpanan data Anda.
  13. Masukkan nama untuk penyimpanan data Anda. Anda akan menggunakan nama ini nanti dalam codelab ini saat men-deploy layanan Cloud Run. Klik Create.
  14. Di panel Penyimpanan data, pilih penyimpanan data baru Anda, lalu klik Buat.
  15. Di halaman Data penyimpanan data Anda, klik tab Aktivitas untuk melihat status penyerapan data Anda. Impor selesai ditampilkan di kolom Status saat proses impor selesai.
  16. Klik tab Dokumen untuk melihat jumlah dokumen yang diimpor.
  17. Di menu navigasi, klik Pratinjau untuk menguji aplikasi penelusuran.
  18. Di kotak penelusuran, masukkan final lab due date, lalu tekan Enter untuk melihat hasil Anda.

5. Membuat layanan Cloud Run

Di bagian ini, Anda akan membuat layanan Cloud Run yang menerima string kueri untuk istilah penelusuran Anda. Layanan ini akan menggunakan library klien python untuk Discovery Engine API. Untuk runtime lain yang didukung, Anda dapat melihat daftarnya di sini.

Membuat kode sumber untuk fungsi

Pertama, buat direktori dan {i>cd<i} ke direktori tersebut.

mkdir docs-search-service-python && cd $_

Lalu, buat file requirements.txt dengan konten berikut:

blinker==1.6.3
cachetools==5.3.1
certifi==2023.7.22
charset-normalizer==3.3.0
click==8.1.7
Flask==3.0.0
google-api-core==2.12.0
google-auth==2.23.3
google-cloud-discoveryengine==0.11.2
googleapis-common-protos==1.61.0
grpcio==1.59.0
grpcio-status==1.59.0
idna==3.4
importlib-metadata==6.8.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
numpy==1.26.1
proto-plus==1.22.3
protobuf==4.24.4
pyasn1==0.5.0
pyasn1-modules==0.3.0
requests==2.31.0
rsa==4.9
urllib3==2.0.7
Werkzeug==3.0.1
zipp==3.17.0

Selanjutnya, buat file sumber main.py dengan konten berikut:

from typing import List
import json
import os
from flask import Flask
from flask import request

app = Flask(__name__)

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

project_id = os.environ.get('PROJECT_ID')
location = "global"  # Values: "global", "us", "eu"
data_store_id = os.environ.get('SEARCH_ENGINE_ID')

print(project_id)
print(data_store_id)

@app.route("/")
def search_storage():

    search_query = request.args.get("searchQuery")

    result = search_sample(project_id, location, data_store_id, search_query)
    return result

def search_sample(
    project_id: str,
    location: str,
    data_store_id: str,
    search_query: str,
) -> str:
    #  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.SearchServiceClient(client_options=client_options)

    # The full resource name of the search engine serving config
    # e.g. projects/{project_id}/locations/{location}/dataStores/{data_store_id}/servingConfigs/{serving_config_id}
    serving_config = client.serving_config_path(
        project=project_id,
        location=location,
        data_store=data_store_id,
        serving_config="default_config",
    )

    # Optional: Configuration options for search
    # Refer to the `ContentSearchSpec` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest.ContentSearchSpec
    content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec(
        # For information about snippets, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/snippets
        snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec(
            return_snippet=True
        ),
        # For information about search summaries, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/get-search-summaries
        summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec(
            summary_result_count=5,
            include_citations=True,
            ignore_adversarial_query=True,
            ignore_non_summary_seeking_query=True,
        ),
    )


    # Refer to the `SearchRequest` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        page_size=10,
        content_search_spec=content_search_spec,
        query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(
            condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,
        ),
        spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(
            mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO
        ),
    )

    response = client.search(request)

    return response.summary.summary_text

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Menyiapkan variabel lingkungan

Dalam kode ini, Anda akan membuat beberapa variabel lingkungan untuk meningkatkan keterbacaan perintah gcloud yang digunakan dalam codelab ini.

PROJECT_ID=$(gcloud config get-value project)

SERVICE_NAME="search-storage-pdfs-python"
SERVICE_REGION="us-central1"

# update with your data store name
SEARCH_ENGINE_ID=<your-data-store-name>

Membuat Akun Layanan

Codelab ini menunjukkan cara membuat akun layanan untuk layanan Cloud Run yang akan digunakan untuk mengakses Vertex AI Search API.

SERVICE_ACCOUNT="cloud-run-vertex-ai-search"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run Vertex AI Search service account"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/discoveryengine.editor'

Men-deploy layanan Cloud Run

Sekarang, Anda dapat menggunakan deployment berbasis sumber untuk memasukkan layanan Cloud Run ke dalam container secara otomatis.

gcloud run deploy $SERVICE_NAME \
--region=$SERVICE_REGION \
--source=. \
--service-account $SERVICE_ACCOUNT \
--update-env-vars SEARCH_ENGINE_ID=$SEARCH_ENGINE_ID,PROJECT_ID=$PROJECT_ID \
--no-allow-unauthenticated

lalu Anda dapat menyimpan URL Cloud Run sebagai variabel lingkungan untuk digunakan nanti.

ENDPOINT_URL="$(gcloud run services describe $SERVICE_NAME --region=$SERVICE_REGION --format='value(status.url)')"

6. Memanggil layanan Cloud Run

Sekarang Anda dapat memanggil layanan Cloud Run dengan string kueri untuk meminta What is the final lab due date?.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "$ENDPOINT_URL?searchQuery=what+is+the+final+lab+due+date"

Hasilnya akan terlihat seperti contoh output di bawah ini:

The final lab is due on Tuesday, March 21 at 4:30 PM [1].

7. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Sebaiknya tinjau dokumentasi tentang Vertex AI Search dan Cloud Run.

Yang telah kita bahas

  • Cara membuat aplikasi Vertex AI Search untuk data tidak terstruktur sebagai PDF yang diserap dari bucket Cloud Storage
  • Cara membuat endpoint HTTP menggunakan deployment berbasis sumber di Cloud Run
  • Cara membuat akun layanan dengan mengikuti prinsip hak istimewa terendah untuk layanan Cloud Run agar dapat digunakan untuk membuat kueri aplikasi Vertex AI Search.
  • Cara memanggil layanan Cloud Run untuk mengkueri aplikasi Vertex AI Search

8. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, jika Cloud Function ini secara tidak sengaja dipanggil lebih sering daripada alokasi pemanggilan Cloud Function bulanan dalam paket gratis), Anda dapat menghapus Cloud Function atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus Cloud Function, buka Konsol Cloud Cloud Function di https://console.cloud.google.com/functions/ dan hapus fungsi imagen_vqa (atau $FUNCTION_NAME jika Anda menggunakan nama yang berbeda).

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, pilih project yang dibuat pada Langkah 2, lalu pilih Hapus. Jika project dihapus, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.