Используйте Vertex AI Search для PDF-файлов (неструктурированных данных) в облачном хранилище из службы Cloud Run.

1. Введение

Обзор

Vertex AI Search and Conversation (ранее известный как Generative AI App Builder) позволяет разработчикам использовать возможности базовых моделей Google, экспертные знания в области поиска и технологии разговорного ИИ для создания корпоративных приложений на основе генеративного ИИ. В этом практическом занятии мы рассмотрим использование Vertex AI Search, где вы сможете создать поисковое приложение Google-качества на основе собственных данных и встроить строку поиска в свои веб-страницы или приложение.

Cloud Run — это управляемая вычислительная платформа, позволяющая запускать контейнеры непосредственно поверх масштабируемой инфраструктуры Google. Вы можете развертывать на Cloud Run код, написанный на любом языке программирования (который можно поместить в контейнер), используя опцию развертывания на основе исходного кода .

В этом практическом задании вы создадите сервис Cloud Run, используя развертывание на основе источника, для получения результатов поиска неструктурированного контента в PDF-файлах, хранящихся в хранилище Cloud Storage. Подробнее о загрузке неструктурированного контента можно узнать здесь .

Что вы узнаете

  • Как создать приложение Vertex AI Search для поиска неструктурированных данных в формате PDF, загружаемых из облачного хранилища.
  • Как создать HTTP-конечную точку с использованием развертывания на основе источника в Cloud Run
  • Как создать учетную запись службы, следуя принципу минимальных привилегий, для использования службой Cloud Run для выполнения запросов к приложению Vertex AI Search.
  • Как вызвать службу Cloud Run для выполнения запросов к приложению Vertex AI Search

2. Настройка и требования

Предварительные требования

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . d1264ca30785e435.png .

cb81e7c8e34bc8d.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вы увидели промежуточный экран, нажмите «Продолжить» .

d95252b003979716.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

7833d5e1c5d18f54.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.

После подключения к 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].

3. Включите API.

Прежде чем начать использовать Vertex AI Search, вам потребуется включить несколько API.

Во-первых, для выполнения этого практического задания необходимо использовать API Vertex AI Search and Conversation, BigQuery и Cloud Storage. Вы можете включить эти API здесь .

Во-вторых, выполните следующие действия, чтобы включить API поиска и диалогов Vertex AI:

  1. В консоли Google Cloud перейдите в консоль Vertex AI Search and Conversation .
  2. Ознакомьтесь с условиями предоставления услуг и примите их, затем нажмите «Продолжить» и активируйте API.

4. Создайте приложение для поиска неструктурированных данных из облачного хранилища.

  1. В консоли Google Cloud перейдите на страницу «Поиск и диалоги» . Нажмите «Создать приложение» .
  2. В панели «Выберите тип приложения» выберите «Поиск» .
  3. Убедитесь, что функция «Корпоративные функции» включена для получения ответов, извлекаемых дословно из ваших документов.
  4. Убедитесь, что параметр «Расширенные функции LLM» включен для получения сводной информации по результатам поиска.
  5. В поле «Название приложения» введите название для вашего приложения. Идентификатор вашего приложения (App ID) будет отображаться под названием приложения.
  6. Выберите «Глобальный» (Global) в качестве местоположения для вашего приложения, а затем нажмите «Продолжить» .
  7. В панели «Хранилища данных» нажмите «Создать новое хранилище данных» .
  8. В панели «Выберите источник данных» выберите «Облачное хранилище» .
  9. В панели «Импорт данных из GCS» убедитесь, что выбран пункт «Папка» .
  10. В поле gs:// введите следующее значение: cloud-samples-data/gen-app-builder/search/stanford-cs-224 Этот сегмент Cloud Storage содержит PDF-файлы из общедоступной папки Cloud Storage для целей тестирования.
  11. Выберите «Неструктурированные документы» , а затем нажмите «Продолжить» .
  12. В панели «Настройка хранилища данных» выберите «Глобальное» в качестве местоположения для вашего хранилища данных.
  13. Введите имя для вашего хранилища данных. Это имя вы будете использовать позже в этом практическом занятии при развертывании службы Cloud Run. Нажмите «Создать» .
  14. В панели «Хранилища данных» выберите новое хранилище данных и нажмите «Создать» .
  15. На странице «Данные» вашего хранилища данных перейдите на вкладку «Действия» , чтобы просмотреть статус загрузки данных. Когда процесс импорта завершится, в столбце «Статус» отобразится сообщение «Импорт завершен» .
  16. Чтобы увидеть количество импортированных документов, перейдите на вкладку «Документы» .
  17. В меню навигации нажмите «Предварительный просмотр» , чтобы протестировать приложение поиска.
  18. В строке поиска введите final lab due date , а затем нажмите Enter , чтобы просмотреть результаты.

5. Создайте службу Cloud Run.

В этом разделе вы создадите сервис Cloud Run, который будет принимать строку запроса для ваших поисковых терминов. Этот сервис будет использовать клиентские библиотеки Python для API Discovery Engine . Список других поддерживаемых сред выполнения можно посмотреть здесь .

Создайте исходный код для функции.

Сначала создайте директорию и перейдите в неё с помощью команды `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>

Создать учетную запись службы

В этом практическом задании показано, как создать учетную запись службы для доступа к API поиска Vertex AI.

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

Что мы рассмотрели

  • Как создать приложение Vertex AI Search для поиска неструктурированных данных в формате PDF, загружаемых из облачного хранилища.
  • Как создать HTTP-конечную точку с использованием развертывания на основе источника в Cloud Run
  • Как создать учетную запись службы, следуя принципу минимальных привилегий, для использования службой Cloud Run при выполнении запросов к приложению Vertex AI Search.
  • Как вызвать службу Cloud Run для выполнения запросов к приложению Vertex AI Search

8. Уборка

Чтобы избежать непреднамеренных списаний средств (например, если эта облачная функция будет случайно вызвана больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов облачных функций в бесплатном тарифе ), вы можете либо удалить облачную функцию, либо удалить проект, созданный на шаге 2.

Чтобы удалить облачную функцию, перейдите в консоль облачных функций по адресу https://console.cloud.google.com/functions/ и удалите функцию imagen_vqa (или переменную $FUNCTION_NAME, если вы использовали другое имя).

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .