Используйте 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-файлов, полученных из корзины Cloud Storage.
  • Как создать конечную точку HTTP с помощью развертывания на основе источника в Cloud Run
  • Как создать учетную запись службы в соответствии с принципом наименьших привилегий для службы Cloud Run, чтобы использовать ее для запроса приложения Vertex AI Search.
  • Как вызвать службу Cloud Run для запроса приложения Vertex AI Search

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

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

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

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

cb81e7c8e34bc8d.png

Если вы запускаете 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. Выполните следующую команду в 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 .
  2. Прочтите и согласитесь с Условиями обслуживания, затем нажмите «Продолжить» и активируйте API.

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

  1. В консоли Google Cloud перейдите на страницу «Поиск и общение» . Нажмите «Новое приложение» .
  2. На панели «Выбор типа приложения» выберите «Поиск» .
  3. Убедитесь, что функции Enterprise включены , чтобы получать ответы, дословно извлеченные из ваших документов.
  4. Убедитесь, что опция «Дополнительные функции LLM» включена , чтобы получать сводные данные поиска.
  5. В поле Имя приложения введите имя вашего приложения. Идентификатор вашего приложения отображается под названием приложения.
  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. На панели «Настройка хранилища данных» выберите «Глобальный» (Global) в качестве местоположения вашего хранилища данных.
  13. Введите имя для вашего хранилища данных. Вы будете использовать это имя позже в этой лаборатории кода при развертывании службы Cloud Run. Нажмите Создать .
  14. На панели «Хранилища данных» выберите новое хранилище данных и нажмите « Создать» .
  15. На странице «Данные» вашего хранилища данных перейдите на вкладку «Активность» , чтобы просмотреть статус приема данных. Импорт завершен отображается в столбце Статус, когда процесс импорта завершен.
  16. Перейдите на вкладку «Документы» , чтобы увидеть количество импортированных документов.
  17. В меню навигации нажмите «Предварительный просмотр» , чтобы протестировать приложение поиска.
  18. В строке поиска введите final lab due date и нажмите Enter , чтобы просмотреть результаты.

5. Создайте сервис Cloud Run.

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

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

Сначала создайте каталог и перейдите в него.

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

8. Очистка

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

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

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