Sử dụng Vertex AI Search trên các tệp PDF (dữ liệu phi cấu trúc) trong Cloud Storage của một dịch vụ Cloud Run

1. Giới thiệu

Tổng quan

Công cụ tìm kiếm và trò chuyện bằng AI tạo sinh (trước đây gọi là Trình tạo ứng dụng dựa trên AI tạo sinh) giúp nhà phát triển khai thác sức mạnh của các mô hình nền tảng, kiến thức chuyên môn về hoạt động tìm kiếm và các công nghệ AI đàm thoại của Google để tạo ra các ứng dụng dựa trên AI tạo sinh cấp doanh nghiệp. Lớp học lập trình này tập trung vào việc sử dụng Vertex AI Search. Tại đây, bạn có thể tạo ứng dụng tìm kiếm đạt chất lượng của Google bằng dữ liệu của riêng mình và nhúng thanh tìm kiếm vào các trang web hoặc ứng dụng của mình.

Cloud Run là một nền tảng điện toán được quản lý cho phép bạn chạy các vùng chứa ngay trên cơ sở hạ tầng có thể mở rộng của Google. Bạn có thể triển khai mã được viết bằng ngôn ngữ lập trình bất kỳ trên Cloud Run (có khả năng đặt bên trong vùng chứa) bằng cách sử dụng tuỳ chọn triển khai dựa trên nguồn.

Trong lớp học lập trình này, bạn sẽ tạo một dịch vụ Cloud Run bằng cách sử dụng phương thức triển khai dựa trên nguồn để truy xuất kết quả tìm kiếm đối với nội dung phi cấu trúc trong các tệp PDF trong bộ chứa Cloud Storage. Bạn có thể tìm hiểu thêm về cách nhập nội dung không có cấu trúc tại đây.

Kiến thức bạn sẽ học được

  • Cách tạo ứng dụng Vertex AI Search cho dữ liệu phi cấu trúc dưới dạng tệp PDF được nhập từ bộ chứa Cloud Storage
  • Cách tạo điểm cuối HTTP bằng tính năng triển khai dựa trên nguồn trong Cloud Run
  • Cách tạo tài khoản dịch vụ theo nguyên tắc đặc quyền tối thiểu để dịch vụ Cloud Run dùng để truy vấn ứng dụng Vertex AI Search
  • Cách gọi dịch vụ Cloud Run để truy vấn ứng dụng Vertex AI Search

2. Thiết lập và yêu cầu

Điều kiện tiên quyết

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

d95252b003979716.png

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

7833d5e1c5d18f54.pngS

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật API

Trước khi có thể bắt đầu sử dụng Vertex AI Search, bạn sẽ cần bật một số API.

Trước tiên, lớp học lập trình này yêu cầu bạn sử dụng các API Vertex AI Search and Conversations, BigQuery, Cloud Storage. Bạn có thể bật các API đó tại đây.

Thứ hai, hãy làm theo các bước sau để bật Vertex AI Search and Conversations API:

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến bảng điều khiển Cuộc trò chuyện và Tìm kiếm của Vertex AI.
  2. Đọc và đồng ý với Điều khoản dịch vụ, sau đó nhấp vào Tiếp tục và kích hoạt API.

4. Tạo ứng dụng tìm kiếm cho dữ liệu phi cấu trúc trong Cloud Storage

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến phần Tìm kiếm và Trang cuộc trò chuyện. Nhấp vào Ứng dụng mới.
  2. Trong ngăn Select app type (Chọn loại ứng dụng), hãy chọn Search (Tìm kiếm).
  3. Hãy nhớ bật các tính năng dành cho doanh nghiệp để nhận câu trả lời được trích xuất nguyên văn từ tài liệu của bạn.
  4. Hãy nhớ bật lựa chọn Các tính năng LLM nâng cao để nhận nội dung tóm tắt về hoạt động tìm kiếm.
  5. Trong trường Tên ứng dụng, hãy nhập tên cho ứng dụng của bạn. ID ứng dụng của bạn xuất hiện dưới tên ứng dụng.
  6. Chọn Toàn cầu (Toàn cầu) làm vị trí cho ứng dụng của bạn, sau đó nhấp vào Tiếp tục.
  7. Trong ngăn Kho dữ liệu, hãy nhấp vào Tạo kho dữ liệu mới.
  8. Trong ngăn Select a data source (Chọn nguồn dữ liệu), hãy chọn Cloud Storage.
  9. Trong ngăn Import data from GCS (Nhập dữ liệu từ GCS), hãy nhớ chọn Folder (Thư mục).
  10. Trong trường gs://, hãy nhập giá trị sau: cloud-samples-data/gen-app-builder/search/stanford-cs-224 Bộ chứa Cloud Storage này chứa các tệp PDF từ một thư mục Cloud Storage công khai dành cho mục đích kiểm thử.
  11. Chọn Tài liệu không có cấu trúc, rồi nhấp vào Tiếp tục.
  12. Trong ngăn Định cấu hình kho dữ liệu của bạn, hãy chọn toàn cầu (Toàn cầu) làm vị trí cho kho dữ liệu của bạn.
  13. Nhập tên cho kho dữ liệu của bạn. Bạn sẽ sử dụng tên này sau trong lớp học lập trình này khi triển khai dịch vụ Cloud Run. Nhấp vào Create (Tạo).
  14. Trong ngăn Kho dữ liệu, hãy chọn kho dữ liệu mới của bạn rồi nhấp vào Tạo.
  15. Trên trang Dữ liệu của kho dữ liệu, hãy nhấp vào thẻ Hoạt động để xem trạng thái nhập dữ liệu của bạn. Trạng thái Đã nhập đã hoàn tất sẽ xuất hiện trong cột Trạng thái khi quá trình nhập hoàn tất.
  16. Nhấp vào thẻ Tài liệu để xem số lượng tài liệu đã nhập.
  17. Trong trình đơn điều hướng, hãy nhấp vào Xem trước để kiểm tra ứng dụng tìm kiếm.
  18. Trong thanh tìm kiếm, hãy nhập final lab due date rồi nhấn phím Enter để xem kết quả.

5. Tạo dịch vụ Cloud Run

Trong phần này, bạn sẽ tạo dịch vụ Cloud Run chấp nhận chuỗi truy vấn cho cụm từ tìm kiếm của bạn. Dịch vụ này sẽ sử dụng thư viện ứng dụng python cho API Discovery Engine. Đối với các môi trường thời gian chạy được hỗ trợ khác, bạn có thể xem danh sách tại đây.

Tạo mã nguồn cho hàm

Trước tiên, hãy tạo một thư mục và cd vào thư mục đó.

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

Sau đó, hãy tạo một tệp requirements.txt với nội dung sau:

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

Tiếp theo, hãy tạo tệp nguồn main.py có nội dung sau:

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)))

Thiết lập biến môi trường

Trong mã này, bạn sẽ tạo một số biến môi trường để cải thiện khả năng đọc các lệnh gcloud được dùng trong lớp học lập trình này.

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>

Tạo Tài khoản dịch vụ

Lớp học lập trình này hướng dẫn bạn cách tạo tài khoản dịch vụ cho dịch vụ Cloud Run để dùng cho việc truy cập vào 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'

Triển khai dịch vụ Cloud Run

Giờ đây, bạn có thể sử dụng phương thức triển khai dựa trên nguồn để tự động vùng chứa dịch vụ Cloud Run.

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

sau đó bạn có thể lưu URL trên Cloud Run dưới dạng biến môi trường để sử dụng sau này.

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

6. Gọi dịch vụ Cloud Run

Giờ đây, bạn có thể gọi dịch vụ Cloud Run bằng chuỗi truy vấn để hỏi 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"

Kết quả của bạn sẽ có dạng tương tự như kết quả mẫu dưới đây:

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

7. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình!

Bạn nên tham khảo tài liệu về Vertex AI SearchCloud Run.

Nội dung đã đề cập

  • Cách tạo ứng dụng Vertex AI Search cho dữ liệu phi cấu trúc dưới dạng tệp PDF được nhập từ bộ chứa Cloud Storage
  • Cách tạo điểm cuối HTTP bằng tính năng triển khai dựa trên nguồn trong Cloud Run
  • Cách tạo tài khoản dịch vụ theo nguyên tắc về đặc quyền tối thiểu để dịch vụ Cloud Run dùng để truy vấn ứng dụng Vertex AI Search.
  • Cách gọi dịch vụ Cloud Run để truy vấn ứng dụng Vertex AI Search

8. Dọn dẹp

Để tránh các khoản phí vô tình (ví dụ: nếu Hàm đám mây này vô tình bị gọi nhiều lần hơn mức phân bổ lệnh gọi Hàm đám mây hằng tháng của bạn ở bậc miễn phí), bạn có thể xoá Hàm đám mây hoặc xoá dự án bạn đã tạo ở Bước 2.

Để xoá Hàm Cloud, hãy truy cập vào Bảng điều khiển Cloud của Cloud Function tại https://console.cloud.google.com/functions/ rồi xoá hàm imagen_vqa (hoặc $FUNCTION_NAME nếu bạn sử dụng tên khác).

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án mà bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ phải thay đổi các dự án trong Cloud SDK của mình. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list.