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

1. مقدمه

نمای کلی

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

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

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

چیزی که یاد خواهید گرفت

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

2. راه اندازی و الزامات

پیش نیازها

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

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

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

3. API ها را فعال کنید

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

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

دوم، این مراحل را دنبال کنید تا Vertex AI Search and Conversation API را فعال کنید:

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

4. یک برنامه جستجو برای داده های بدون ساختار از Cloud Storage ایجاد کنید

  1. در کنسول Google Cloud، به صفحه جستجو و مکالمه بروید. برنامه جدید را کلیک کنید.
  2. در قسمت انتخاب نوع برنامه ، جستجو را انتخاب کنید.
  3. مطمئن شوید که ویژگی های Enterprise برای دریافت پاسخ هایی که به طور کلمه به کلمه از اسناد شما استخراج می شوند فعال است.
  4. مطمئن شوید که گزینه Advanced LLM features برای دریافت خلاصه جستجو فعال باشد.
  5. در قسمت نام برنامه ، نامی برای برنامه خود وارد کنید. شناسه برنامه شما در زیر نام برنامه ظاهر می شود.
  6. جهانی (Global) را به عنوان مکان برنامه خود انتخاب کنید و سپس روی Continue کلیک کنید.
  7. در بخش ذخیره‌های داده ، روی ایجاد فروشگاه داده جدید کلیک کنید.
  8. در صفحه انتخاب منبع داده ، Cloud Storage را انتخاب کنید.
  9. در بخش Import data from GCS ، مطمئن شوید که Folder انتخاب شده است.
  10. در فیلد gs:// ، مقدار زیر را وارد کنید: cloud-samples-data/gen-app-builder/search/stanford-cs-224 این سطل Cloud Storage حاوی فایل‌های PDF از یک پوشه Cloud Storage در دسترس عموم برای اهداف آزمایشی است.
  11. اسناد Unstructured را انتخاب کنید و سپس روی Continue کلیک کنید.
  12. در قسمت Configure your data store ، global (Global) را به عنوان محل ذخیره داده خود انتخاب کنید.
  13. یک نام برای ذخیره داده خود وارد کنید. بعداً هنگام استقرار سرویس Cloud Run خود از این نام در این کد لبه استفاده خواهید کرد. روی ایجاد کلیک کنید.
  14. در بخش ذخیره‌های داده ، ذخیره‌سازی داده جدید خود را انتخاب کرده و روی ایجاد کلیک کنید.
  15. در صفحه داده فروشگاه داده خود، روی برگه Activity کلیک کنید تا وضعیت انتقال داده های خود را ببینید. هنگامی که فرآیند وارد کردن کامل شد، نمایش های تکمیل شده وارد کردن در ستون وضعیت نمایش داده می شود.
  16. برای مشاهده تعداد اسناد وارد شده، روی برگه اسناد کلیک کنید.
  17. در منوی پیمایش، روی Preview کلیک کنید تا برنامه جستجو را آزمایش کنید.
  18. در نوار جستجو، final lab due date را وارد کنید و سپس Enter را فشار دهید تا نتایج خود را مشاهده کنید.

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

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

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

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

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 استفاده شده در این codelab ایجاد خواهید کرد.

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 ایجاد کنید تا از آن برای دسترسی به 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'

سرویس 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

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

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

6. با سرویس 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].

7. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم!

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

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

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

8. پاکسازی کنید

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

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

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