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 keunggulan teknologi AI percakapan, keahlian penelusuran, dan model dasar Google untuk menciptakan 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 Anda.

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

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

Yang akan Anda pelajari

  • Cara membuat aplikasi Vertex AI Search untuk data tidak terstruktur sebagai PDF yang di-ingest dari bucket Cloud Storage
  • Cara membuat endpoint HTTP menggunakan deployment berbasis sumber di Cloud Run
  • Cara membuat akun layanan yang mengikuti prinsip hak istimewa terendah untuk digunakan oleh layanan Cloud Run dalam membuat kueri aplikasi Vertex AI Search
  • Cara memanggil layanan Cloud Run untuk membuat kueri 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 adalah pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Continue.

d95252b003979716.png

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

7833d5e1c5d18f54.png

Virtual machine ini dilengkapi dengan semua alat pengembangan yang diperlukan. VM 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 telah 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 Anda dapat mulai menggunakan Vertex AI Search, ada beberapa API yang perlu diaktifkan.

Pertama, codelab ini mengharuskan penggunaan API Vertex AI Search and Conversation, BigQuery, Cloud Storage. 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 Continue and activate the API.

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

  1. Di konsol Google Cloud, buka halaman Search & Conversation. Klik New app.
  2. Di panel Pilih jenis aplikasi, pilih Penelusuran.
  3. Pastikan Fitur Enterprise 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 App name, masukkan nama untuk aplikasi Anda. ID aplikasi Anda akan muncul di bawah nama aplikasi.
  6. Pilih global (Global) sebagai lokasi untuk aplikasi Anda, lalu klik Continue.
  7. Di panel Data stores, klik Create new data store.
  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 Unstructured documents, lalu klik Continue.
  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 Data stores, pilih penyimpanan data baru Anda, lalu klik Create.
  15. Di halaman Data penyimpanan data, klik tab Aktivitas untuk melihat status penyerapan data. Impor selesai akan ditampilkan di kolom Status saat proses impor selesai.
  16. Klik tab Dokumen untuk melihat jumlah dokumen yang diimpor.
  17. Di menu navigasi, klik Preview untuk menguji aplikasi penelusuran.
  18. Di kotak penelusuran, masukkan final lab due date, lalu tekan Enter untuk melihat hasil.

5. Buat 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 yang didukung lainnya, Anda dapat melihat daftarnya di sini.

Buat kode sumber untuk fungsi

Pertama, buat direktori dan cd ke direktori tersebut.

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

Kemudian, 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 digunakan layanan Cloud Run dalam 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 otomatis memasukkan layanan Cloud Run ke dalam container.

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

Kemudian, 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 menanyakan 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"

Hasil Anda akan terlihat mirip dengan contoh output di bawah:

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 di-ingest 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 digunakan oleh layanan Cloud Run dalam membuat kueri aplikasi Vertex AI Search.
  • Cara memanggil layanan Cloud Run untuk membuat kueri aplikasi Vertex AI Search

8. Pembersihan

Untuk menghindari biaya yang tidak disengaja (misalnya, jika Cloud Function ini tidak sengaja dipanggil lebih banyak daripada alokasi pemanggilan Cloud Function bulanan Anda di tingkat 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 Anda memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, memilih project yang Anda buat di Langkah 2, lalu memilih Hapus. Jika menghapus project, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.