استفاده از Vertex AI Search در PDF (داده‌های بدون ساختار) در Cloud Storage از سرویس Cloud Run

۱. مقدمه

نمای کلی

ابزار Vertex AI Search and Conversation (که قبلاً با نام Generative AI App Builder شناخته می‌شد) به توسعه‌دهندگان اجازه می‌دهد تا از قدرت مدل‌های بنیادی گوگل، تخصص جستجو و فناوری‌های هوش مصنوعی محاوره‌ای برای ایجاد برنامه‌های هوش مصنوعی مولد در سطح سازمانی استفاده کنند. این آزمایشگاه کد بر استفاده از Vertex AI Search تمرکز دارد، جایی که می‌توانید یک برنامه جستجوی با کیفیت گوگل را بر اساس داده‌های خود بسازید و یک نوار جستجو را در صفحات وب یا برنامه خود جاسازی کنید.

Cloud Run یک پلتفرم محاسباتی مدیریت‌شده است که به شما امکان می‌دهد کانتینرها را مستقیماً روی زیرساخت مقیاس‌پذیر گوگل اجرا کنید. می‌توانید با استفاده از گزینه استقرار مبتنی بر منبع، کدی را که به هر زبان برنامه‌نویسی نوشته شده است (و قابلیت قرار دادن درون یک کانتینر را دارد) روی Cloud Run مستقر کنید.

در این آزمایشگاه کد، شما یک سرویس Cloud Run با استفاده از استقرار مبتنی بر منبع ایجاد خواهید کرد تا نتایج جستجو برای محتوای بدون ساختار در فایل‌های PDF در یک مخزن ذخیره‌سازی ابری را بازیابی کند. می‌توانید اطلاعات بیشتری در مورد دریافت محتوای بدون ساختار را اینجا کسب کنید.

آنچه یاد خواهید گرفت

  • نحوه ایجاد یک برنامه جستجوی هوش مصنوعی Vertex برای داده‌های بدون ساختار به عنوان فایل‌های PDF که از یک مخزن ذخیره‌سازی ابری دریافت می‌شوند
  • نحوه ایجاد یک نقطه پایانی HTTP با استفاده از استقرار مبتنی بر منبع در Cloud Run
  • نحوه ایجاد یک حساب کاربری سرویس با رعایت اصل حداقل امتیاز برای سرویس Cloud Run جهت استفاده جهت پرس و جو از برنامه Vertex AI Search
  • نحوه فراخوانی سرویس Cloud Run برای پرس و جو از برنامه Vertex AI Search

۲. تنظیمات و الزامات

پیش‌نیازها

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

d95252b003979716.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی دستور

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. فعال کردن APIها

قبل از اینکه بتوانید از Vertex AI Search استفاده کنید، باید چندین API را فعال کنید.

اولاً، این آزمایشگاه کد نیاز به استفاده از APIهای Vertex AI Search and Conversation، BigQuery و Cloud Storage دارد. می‌توانید این APIها را از اینجا فعال کنید .

دوم، برای فعال کردن API جستجو و مکالمه Vertex AI، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به کنسول Vertex AI Search and Conversation بروید.
  2. شرایط خدمات را بخوانید و با آنها موافقت کنید، سپس روی ادامه کلیک کنید و API را فعال کنید.

۴. یک برنامه جستجو برای داده‌های بدون ساختار از فضای ذخیره‌سازی ابری ایجاد کنید

  1. در کنسول گوگل کلود، به صفحه جستجو و مکالمه بروید. روی برنامه جدید کلیک کنید.
  2. در پنجره انتخاب نوع برنامه ، جستجو را انتخاب کنید.
  3. مطمئن شوید که ویژگی‌های سازمانی فعال هستند تا بتوانید پاسخ‌هایی را که کلمه به کلمه از اسناد شما استخراج شده‌اند، دریافت کنید.
  4. مطمئن شوید که گزینه ویژگی‌های پیشرفته LLM برای دریافت خلاصه جستجو فعال است.
  5. در فیلد نام برنامه ، یک نام برای برنامه خود وارد کنید. شناسه برنامه شما زیر نام برنامه نمایش داده می‌شود.
  6. مکان برنامه خود را سراسری (Global) انتخاب کنید و سپس روی ادامه کلیک کنید.
  7. در پنل «ذخیره‌های داده» ، روی «ایجاد ذخیره داده جدید» کلیک کنید.
  8. در قسمت انتخاب منبع داده ، گزینه Cloud Storage را انتخاب کنید.
  9. در پنجره‌ی «وارد کردن داده‌ها از GCS» ، مطمئن شوید که گزینه‌ی «پوشه» انتخاب شده است.
  10. در فیلد gs:// ، مقدار زیر را وارد کنید: cloud-samples-data/gen-app-builder/search/stanford-cs-224 این مخزن ذخیره‌سازی ابری حاوی فایل‌های PDF از یک پوشه ذخیره‌سازی ابری عمومی برای اهداف آزمایشی است.
  11. اسناد بدون ساختار را انتخاب کنید و سپس روی ادامه کلیک کنید.
  12. در پنجره پیکربندی محل ذخیره‌سازی داده ، گزینه سراسری (Global) را به عنوان محل ذخیره‌سازی داده خود انتخاب کنید.
  13. یک نام برای محل ذخیره داده خود وارد کنید. از این نام بعداً در این آزمایشگاه کد، هنگام استقرار سرویس Cloud Run خود استفاده خواهید کرد. روی Create کلیک کنید.
  14. در قسمت Data stores ، محل ذخیره داده جدید خود را انتخاب کرده و روی Create کلیک کنید.
  15. در صفحه داده‌های فروشگاه داده خود، روی زبانه فعالیت کلیک کنید تا وضعیت مصرف داده خود را مشاهده کنید. پس از اتمام فرآیند واردات، عبارت «واردات تکمیل شد» در ستون وضعیت نمایش داده می‌شود.
  16. برای مشاهده تعداد اسناد وارد شده، روی برگه اسناد کلیک کنید.
  17. در منوی ناوبری، برای آزمایش برنامه جستجو، روی پیش‌نمایش کلیک کنید.
  18. در نوار جستجو، final lab due date را وارد کنید و سپس برای مشاهده نتایج، Enter را فشار دهید.

۵. سرویس Cloud Run را ایجاد کنید

در این بخش، شما یک سرویس Cloud Run ایجاد خواهید کرد که یک رشته پرس و جو برای عبارات جستجوی شما می‌پذیرد. این سرویس از کتابخانه‌های کلاینت پایتون برای API موتور اکتشاف استفاده خواهد کرد. برای سایر زمان‌های اجرای پشتیبانی شده، می‌توانید لیست را اینجا مشاهده کنید .

کد منبع تابع را ایجاد کنید

ابتدا یک دایرکتوری ایجاد کنید و با دستور cd به آن دایرکتوری بروید.

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

سپس، یک فایل requirements.txt با محتوای زیر ایجاد کنید:

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

سپس، یک فایل منبع main.py با محتوای زیر ایجاد کنید:

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

متغیرهای محیطی را تنظیم کنید

در این کد، شما چند متغیر محیطی ایجاد خواهید کرد تا خوانایی دستورات gcloud مورد استفاده در این آزمایشگاه کد را بهبود بخشید.

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>

ایجاد حساب کاربری سرویس

این آزمایشگاه کد به شما نشان می‌دهد که چگونه یک حساب کاربری سرویس برای سرویس Cloud Run ایجاد کنید تا از آن برای دسترسی به API جستجوی هوش مصنوعی Vertex استفاده کنید.

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'

سرویس Cloud Run را مستقر کنید

اکنون می‌توانید از یک استقرار مبتنی بر منبع برای کانتینریزه کردن خودکار سرویس 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

و سپس می‌توانید آدرس اینترنتی Cloud Run را به عنوان یک متغیر محیطی ذخیره کنید تا بعداً از آن استفاده کنید.

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

۶. با سرویس Cloud Run تماس بگیرید

اکنون می‌توانید سرویس Cloud Run خود را با یک رشته پرس‌وجو فراخوانی کنید و بپرسید 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"

نتایج شما باید مشابه خروجی مثال زیر باشد:

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

۷. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات مربوط به Vertex AI Search و Cloud Run را بررسی کنید.

آنچه ما پوشش داده‌ایم

  • نحوه ایجاد یک برنامه جستجوی هوش مصنوعی Vertex برای داده‌های بدون ساختار به عنوان فایل‌های PDF که از یک مخزن ذخیره‌سازی ابری دریافت می‌شوند
  • نحوه ایجاد یک نقطه پایانی HTTP با استفاده از استقرار مبتنی بر منبع در Cloud Run
  • نحوه ایجاد یک حساب کاربری سرویس با رعایت اصل حداقل امتیاز برای سرویس Cloud Run جهت استفاده جهت پرس و جو از برنامه Vertex AI Search.
  • نحوه فراخوانی سرویس Cloud Run برای پرس و جو از برنامه Vertex AI Search

۸. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، (برای مثال، اگر این تابع ابری ناخواسته بیشتر از تخصیص فراخوانی تابع ابری ماهانه شما در سطح رایگان فراخوانی شود)، می‌توانید تابع ابری یا پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید، حذف کنید.

برای حذف تابع ابری، به کنسول ابری تابع ابری در آدرس https://console.cloud.google.com/functions/ بروید و تابع imagen_vqa (یا $FUNCTION_NAME را در صورتی که از نام دیگری استفاده کرده‌اید) حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه Delete را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.