Cloud Run सेवा से, Cloud Storage में मौजूद PDF (अनस्ट्रक्चर्ड डेटा) पर Vertex AI Search का इस्तेमाल करना

1. परिचय

खास जानकारी

Vertex AI Search and Conversation (पहले इसे Generative AI App Builder के नाम से जाना जाता था) की मदद से डेवलपर, Google के फ़ाउंडेशन मॉडल, खोज से जुड़ी विशेषज्ञता, और बातचीत वाले एआई की टेक्नोलॉजी का इस्तेमाल करके, बड़े संगठनों के लिए जनरेटिव एआई ऐप्लिकेशन बना सकते हैं. इस कोडलैब में, Vertex AI Search का इस्तेमाल करने के बारे में बताया गया है. इसकी मदद से, अपने डेटा पर Google की क्वालिटी वाला सर्च ऐप्लिकेशन बनाया जा सकता है. साथ ही, अपने वेब पेजों या ऐप्लिकेशन में सर्च बार को एम्बेड किया जा सकता है.

Cloud Run, मैनेज किया गया कंप्यूट प्लैटफ़ॉर्म है. इसकी मदद से, कंटेनर को सीधे तौर पर Google के स्केलेबल इंफ़्रास्ट्रक्चर पर चलाया जा सकता है. सोर्स पर आधारित डिप्लॉयमेंट विकल्प का इस्तेमाल करके, Cloud Run पर किसी भी प्रोग्रामिंग भाषा में लिखा गया कोड डिप्लॉय किया जा सकता है. हालांकि, यह कोड कंटेनर में रखा जा सकता हो.

इस कोडलैब में, सोर्स-आधारित डिप्लॉयमेंट का इस्तेमाल करके Cloud Run सेवा बनाई जाएगी. इससे Cloud Storage बकेट में मौजूद PDF फ़ाइलों में, बिना किसी स्ट्रक्चर वाले कॉन्टेंट के लिए खोज के नतीजे पाए जा सकेंगे. अनस्ट्रक्चर्ड कॉन्टेंट को शामिल करने के बारे में यहां ज़्यादा जानें.

आपको क्या सीखने को मिलेगा

  • Cloud Storage बकेट से लिए गए PDF के तौर पर, बिना स्ट्रक्चर वाले डेटा के लिए Vertex AI Search ऐप्लिकेशन बनाने का तरीका
  • Cloud Run में सोर्स-आधारित डिप्लॉयमेंट का इस्तेमाल करके एचटीटीपी एंडपॉइंट बनाने का तरीका
  • Cloud Run सेवा के लिए, कम से कम ज़रूरी अनुमतियों के सिद्धांत के तहत सेवा खाता बनाने का तरीका, ताकि Vertex AI Search ऐप्लिकेशन से क्वेरी की जा सके
  • Vertex AI Search ऐप्लिकेशन से क्वेरी करने के लिए, Cloud Run सेवा को कैसे चालू करें

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.

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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. एपीआई चालू करें

Vertex AI Search का इस्तेमाल शुरू करने से पहले, आपको कई एपीआई चालू करने होंगे.

सबसे पहले, इस कोडलैब के लिए Vertex AI Search and Conversation, BigQuery, और Cloud Storage API का इस्तेमाल करना ज़रूरी है. यहां जाकर उन एपीआई को चालू किया जा सकता है.

इसके बाद, Vertex AI Search and Conversation API को चालू करने के लिए, यह तरीका अपनाएं:

  1. Google Cloud Console में, Vertex AI Search and Conversation Console पर जाएं.
  2. सेवा की शर्तें पढ़ें और उनसे सहमत हों. इसके बाद, जारी रखें पर क्लिक करें और एपीआई चालू करें.

4. Cloud Storage से मिले अनस्ट्रक्चर्ड डेटा के लिए, खोज करने वाला ऐप्लिकेशन बनाना

  1. Google Cloud Console में, खोज और बातचीत वाला पेज पर जाएं. नया ऐप्लिकेशन पर क्लिक करें.
  2. ऐप्लिकेशन टाइप चुनें पैनल में, सर्च चुनें.
  3. पक्का करें कि आपके दस्तावेज़ों से सटीक जवाब पाने के लिए, Enterprise की सुविधाएं चालू हों.
  4. खोज के नतीजों की खास जानकारी पाने के लिए, पक्का करें कि ऐडवांस एलएलएम की सुविधाएं विकल्प चालू हो.
  5. ऐप्लिकेशन का नाम फ़ील्ड में, अपने ऐप्लिकेशन का नाम डालें. ऐप्लिकेशन के नाम के नीचे, आपका ऐप्लिकेशन आईडी दिखेगा.
  6. अपने ऐप्लिकेशन के लिए, जगह के तौर पर global (Global) चुनें. इसके बाद, जारी रखें पर क्लिक करें.
  7. डेटा स्टोर पैनल में, नया डेटा स्टोर बनाएं पर क्लिक करें.
  8. डेटा सोर्स चुनें पैनल में जाकर, Cloud Storage को चुनें.
  9. GCS से डेटा इंपोर्ट करें पैनल में, पक्का करें कि फ़ोल्डर चुना गया हो.
  10. gs:// फ़ील्ड में, यह वैल्यू डालें: cloud-samples-data/gen-app-builder/search/stanford-cs-224 इस Cloud Storage बकेट में, सार्वजनिक तौर पर उपलब्ध Cloud Storage फ़ोल्डर की PDF फ़ाइलें शामिल हैं. इनका इस्तेमाल जांच के लिए किया जाता है.
  11. अनस्ट्रक्चर्ड दस्तावेज़ चुनें. इसके बाद, जारी रखें पर क्लिक करें.
  12. अपना डेटा स्टोर कॉन्फ़िगर करें पैनल में, अपने डेटा स्टोर के लिए global (ग्लोबल) को लोकेशन के तौर पर चुनें.
  13. अपने डेटा स्टोर के लिए कोई नाम डालें. Cloud Run सेवा को डिप्लॉय करते समय, इस कोडलैब में बाद में इस नाम का इस्तेमाल किया जाएगा. बनाएं पर क्लिक करें.
  14. डेटा स्टोर पैनल में, अपना नया डेटा स्टोर चुनें और बनाएं पर क्लिक करें.
  15. अपने डेटा स्टोर के डेटा पेज पर, गतिविधि टैब पर क्लिक करके, डेटा इनजेस्ट करने की स्थिति देखें. इंपोर्ट की प्रोसेस पूरी होने पर, स्थिति कॉलम में इंपोर्ट पूरा हुआ दिखता है.
  16. इंपोर्ट किए गए दस्तावेज़ों की संख्या देखने के लिए, दस्तावेज़ टैब पर क्लिक करें.
  17. नेविगेशन मेन्यू में, झलक पर क्लिक करके, खोज ऐप्लिकेशन को आज़माएं.
  18. खोज बार में final lab due date डालें. इसके बाद, नतीजे देखने के लिए Enter दबाएं.

5. Cloud Run सेवा बनाना

इस सेक्शन में, आपको एक Cloud Run सेवा बनानी होगी. यह सेवा, आपके खोज शब्दों के लिए क्वेरी स्ट्रिंग स्वीकार करती है. यह सेवा, Discovery Engine API के लिए Python क्लाइंट लाइब्रेरी का इस्तेमाल करेगी. जिन अन्य रनटाइम के साथ यह सुविधा काम करती है उनकी सूची यहां देखी जा सकती है.

फ़ंक्शन के लिए सोर्स कोड बनाना

सबसे पहले, एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में 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 सेवा के लिए सेवा खाता बनाने का तरीका बताया गया है. इस खाते का इस्तेमाल करके, 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

इसके बाद, Cloud Run यूआरएल को एनवायरमेंट वैरिएबल के तौर पर सेव किया जा सकता है, ताकि बाद में इसका इस्तेमाल किया जा सके.

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 से जुड़े दस्तावेज़ पढ़ें.

हमने क्या-क्या बताया

  • Cloud Storage बकेट से लिए गए PDF के तौर पर, बिना स्ट्रक्चर वाले डेटा के लिए Vertex AI Search ऐप्लिकेशन बनाने का तरीका
  • Cloud Run में सोर्स-आधारित डिप्लॉयमेंट का इस्तेमाल करके एचटीटीपी एंडपॉइंट बनाने का तरीका
  • Cloud Run सेवा के लिए, कम से कम ज़रूरी अनुमतियों के सिद्धांत के मुताबिक सेवा खाता बनाने का तरीका, ताकि Vertex AI Search ऐप्लिकेशन से क्वेरी की जा सके.
  • Vertex AI Search ऐप्लिकेशन से क्वेरी करने के लिए, Cloud Run सेवा को कैसे चालू करें

8. व्यवस्थित करें

अनचाहे शुल्क से बचने के लिए, (उदाहरण के लिए, अगर इस Cloud Function को मुफ़्त टियर में Cloud Function को हर महीने इस्तेमाल करने की तय सीमा से ज़्यादा बार इस्तेमाल किया जाता है), तो Cloud Function को मिटा दें या चरण 2 में बनाए गए प्रोजेक्ट को मिटा दें.

Cloud फ़ंक्शन को मिटाने के लिए, Cloud Function Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/functions/ पर जाएं. इसके बाद, imagen_vqa फ़ंक्शन (या अगर आपने किसी दूसरे नाम का इस्तेमाल किया है, तो $FUNCTION_NAME) को मिटाएं.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.