1. Обзор
В современном быстро меняющемся мире розничной торговли предоставление исключительного обслуживания клиентов и обеспечение персонализированного опыта покупок имеет первостепенное значение. Мы проведем вас через техническое путешествие по созданию приложения для чата, основанного на знаниях, предназначенного для ответа на вопросы клиентов, помощи в поиске товаров и персонализации результатов поиска. Это инновационное решение сочетает в себе возможности AlloyDB для хранения данных, собственную аналитическую систему для контекстного анализа, Gemini (Large Language Model) для проверки релевантности и Google Agent Builder для быстрого запуска интеллектуального разговорного помощника.
Задача: Современные покупатели в розничной торговле ожидают мгновенных ответов и рекомендаций по товарам, соответствующих их уникальным предпочтениям. Традиционные методы поиска часто не обеспечивают такого уровня персонализации.
Решение: Наше приложение для чата, основанное на знаниях, решает эту задачу напрямую. Оно использует обширную базу знаний, полученную из ваших данных о розничной торговле, чтобы понимать намерения клиентов, интеллектуально реагировать и предоставлять максимально релевантные результаты.
Что вы построите
В рамках этой лабораторной работы (Часть 1) вы:
- Создайте экземпляр AlloyDB и загрузите набор данных по электронной коммерции.
- Включите расширения pgvector и генеративного ИИ в AlloyDB.
- Сгенерируйте векторные представления на основе описания товара.
- Выполняйте поиск сходства по косинусному закону в реальном времени для поискового запроса пользователя.
- Разверните решение в бессерверной среде Cloud Run Functions.
Вторая часть лабораторной работы будет посвящена этапам работы с Agent Builder.
Требования
2. Архитектура
Поток данных: Давайте подробнее рассмотрим, как данные перемещаются в нашей системе:
Приём внутрь :
Наш первый шаг — это загрузка данных о розничной торговле (инвентарь, описания товаров, взаимодействие с клиентами) в AlloyDB.
Аналитический механизм:
Для выполнения следующих действий мы будем использовать AlloyDB в качестве аналитического механизма:
- Извлечение контекста: Механизм анализирует данные, хранящиеся в AlloyDB, чтобы понять взаимосвязи между продуктами, категориями, поведением клиентов и т. д., в зависимости от ситуации.
- Создание векторных представлений: Векторные представления (математические представления текста) генерируются как для запроса пользователя, так и для информации, хранящейся в AlloyDB.
- Векторный поиск: поисковая система выполняет поиск сходства, сравнивая векторное представление запроса с векторными представлениями описаний товаров, отзывов и других релевантных данных. Это позволяет определить 25 наиболее релевантных «ближайших соседей».
Проверка Gemini:
Эти потенциальные ответы отправляются в Gemini для оценки. Gemini определяет, действительно ли они актуальны и безопасны для передачи пользователю.
Генерация ответа:
Проверенные ответы структурируются в массив JSON, а весь механизм упаковывается в бессерверную облачную функцию запуска, которая вызывается из Agent Builder.
Разговорное взаимодействие:
Agent Builder предоставляет пользователю ответы в формате естественного языка, способствуя диалогу. Эта часть будет рассмотрена в последующей лабораторной работе.
3. Прежде чем начать
Создать проект
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

- После подключения к Cloud Shell необходимо проверить, прошли ли вы аутентификацию и установлен ли идентификатор вашего проекта, используя следующую команду:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не задан, используйте следующую команду для его установки:
gcloud config set project <YOUR_PROJECT_ID>
- Включите необходимые API.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
Альтернативой команде gcloud является поиск каждого продукта в консоли или использование этой ссылки .
Если какой-либо API отсутствует, вы всегда можете включить его в процессе реализации.
Для получения информации о командах gcloud и их использовании обратитесь к документации .
4. Настройка базы данных
В этой лабораторной работе мы будем использовать AlloyDB в качестве базы данных для хранения данных о розничной торговле. Она использует кластеры для размещения всех ресурсов, таких как базы данных и журналы. Каждый кластер имеет основной экземпляр , который обеспечивает точку доступа к данным. Таблицы будут содержать сами данные.
Давайте создадим кластер AlloyDB, экземпляр и таблицу, куда будут загружены данные об электронной коммерции.
Создайте кластер и экземпляр.
- Перейдите на страницу AlloyDB в Cloud Console. Большинство страниц в Cloud Console легко найти, используя строку поиска консоли.
- На этой странице выберите пункт «СОЗДАТЬ КЛАСТЕР»:

- Вы увидите экран, похожий на тот, что показан ниже. Создайте кластер и экземпляр со следующими значениями:
- Идентификатор кластера: "
shopping-cluster" - пароль: "
alloydb" - Совместимость с PostgreSQL 15
- Регион: "
us-central1" - Сетевые настройки: "
default"

- После выбора сети по умолчанию вы увидите экран, похожий на показанный ниже. Выберите «НАСТРОЙКА СОЕДИНЕНИЯ».

- Затем выберите «Использовать автоматически выделенный диапазон IP-адресов» и продолжите. После проверки информации выберите «СОЗДАТЬ СОЕДИНЕНИЕ».

- После настройки сети вы можете продолжить создание кластера. Нажмите кнопку «СОЗДАТЬ КЛАСТЕР», чтобы завершить настройку кластера, как показано ниже:

Обязательно измените идентификатор экземпляра на " shopping-instance" .
Обратите внимание, что создание кластера займет около 10 минут. После успешного завершения процесса вы должны увидеть экран, похожий на этот:

5. Ввод данных
Теперь пришло время добавить таблицу с данными о магазине. Перейдите в AlloyDB, выберите основной кластер, а затем AlloyDB Studio:

Возможно, вам потребуется дождаться завершения создания экземпляра. После этого войдите в AlloyDB, используя учетные данные, которые вы создали при создании кластера. Для аутентификации в PostgreSQL используйте следующие данные:
- Имя пользователя: "
postgres" - База данных: "
postgres" - Пароль: "
alloydb"
После успешной аутентификации в AlloyDB Studio команды SQL вводятся в редакторе. Вы можете добавить несколько окон редактора, используя значок плюса справа от последнего окна.

Команды для AlloyDB будут вводиться в окнах редактора, используя при необходимости параметры «Выполнить», «Форматировать» и «Очистить».
Включить расширения
Для создания этого приложения мы будем использовать расширения pgvector и google_ml_integration . Расширение pgvector позволяет хранить и искать векторные представления. Расширение google_ml_integration предоставляет функции, которые вы используете для доступа к конечным точкам прогнозирования Vertex AI и получения прогнозов в формате SQL. Включите эти расширения, выполнив следующие DDL-скрипты:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
Чтобы проверить, какие расширения включены в вашей базе данных, выполните следующую SQL-команду:
select extname, extversion from pg_extension;
Создайте таблицу
Создайте таблицу, используя приведенный ниже оператор DDL:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
После успешного выполнения указанной выше команды вы сможете просмотреть таблицу в базе данных. Пример скриншота показан ниже:

Ввод данных
For this lab, we have test data of about 200 records in this SQL file . It contains the id, category, sub_category, uri, image , and content . The other fields will be filled in later in the lab.
Скопируйте 20 строк/вставок оттуда, затем вставьте эти строки в пустую вкладку редактора и выберите «Выполнить».
Чтобы просмотреть содержимое таблицы, разверните раздел «Проводник», пока не увидите таблицу с именем apparels. Выберите триколор (⋮), чтобы увидеть возможность выполнить запрос к таблице. В новой вкладке редактора откроется оператор SELECT.

Предоставить разрешение
Выполните указанную ниже команду, чтобы предоставить пользователю postgres права на выполнение функции embedding :
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Предоставьте учетной записи службы AlloyDB роль пользователя Vertex AI.
Перейдите в терминал Cloud Shell и введите следующую команду:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. Контекст
Вернуться на страницу экземпляра AlloyDB.
Для создания встраивания нам потребуется context , то есть вся информация, которую мы хотим включить в одно поле. Мы сделаем это, создав описание продукта (которое назовем pdt_desc ). В нашем случае мы будем использовать всю информацию о каждом продукте, но если вы будете делать это со своими данными, вы можете свободно изменять данные любым способом, который сочтете целесообразным для вашего бизнеса.
Выполните следующую команду в AlloyDB Studio для вашего только что созданного экземпляра. Это обновит поле pdt_desc данными контекста:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
Этот DML-оператор создает простую контекстную сводку, используя информацию из всех доступных полей таблицы и других зависимостей (если таковые имеются в вашем случае). Для более точного набора информации и создания контекста вы можете настроить данные любым способом, который сочтете целесообразным для вашего бизнеса.
7. Создайте векторные представления для контекста.
Компьютерам гораздо проще обрабатывать числа, чем текст. Система встраивания преобразует текст в последовательность чисел с плавающей запятой, которые должны представлять текст независимо от его формулировки, используемого языка и т. д.
Рассмотрим описание приморского места. Его можно назвать «на берегу», «на пляже», «в шаговой доступности от номера», «sur la mer», «на берегу океана» и т. д. Все эти термины выглядят по-разному, но их семантическое значение или, в терминологии машинного обучения, их векторные представления должны быть очень близки друг к другу.
Теперь, когда данные и контекст готовы, мы выполним SQL-запрос для добавления векторных представлений описания продукта в таблицу в поле embedding . Существует множество моделей векторного представления, которые можно использовать. Мы используем text-embedding-004 от Vertex AI. Обязательно используйте одну и ту же модель векторного представления во всем проекте!
Примечание: Если вы используете существующий проект Google Cloud, созданный некоторое время назад, вам может потребоваться продолжить использовать более старые версии модели встраивания текста, такие как textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
Ещё раз взгляните на таблицу apparels , чтобы увидеть некоторые встраивания. Обязательно повторно выполните оператор SELECT, чтобы увидеть изменения.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
Эта команда должна вернуть вектор эмбеддингов, который выглядит как массив чисел с плавающей запятой, для примера текста в запросе, как показано ниже:

Примечание: В новых проектах Google Cloud, созданных в рамках бесплатного уровня, могут возникнуть проблемы с ограничением количества запросов на встраивание в секунду для моделей встраивания. Мы рекомендуем использовать фильтр по ID, а затем выборочно выбирать от 1 до 5 записей и так далее при генерации встраивания.
8. Выполните векторный поиск.
Теперь, когда таблица, данные и векторные представления готовы, давайте выполним векторный поиск в реальном времени для поискового запроса пользователя.
Предположим, пользователь задает вопрос:
«Мне нужны женские топы, розовые, повседневные, только из чистого хлопка».
Вы можете найти совпадения, выполнив следующий запрос:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Давайте рассмотрим этот запрос подробнее:
В этом запросе,
- Поисковый запрос пользователя: "Мне нужны женские топы, розовые, повседневные, только из чистого хлопка".
- Мы преобразуем его в векторные представления в методе
embedding(), используя модель:text-embedding-004. Этот шаг должен показаться вам знакомым после предыдущего шага, где мы применили функцию embedding ко всем элементам таблицы. - "
<=>" обозначает использование метода расстояния COSINE SIMILARITY . Все доступные меры сходства можно найти в документации pgvector . - Мы преобразуем результат метода встраивания в векторный тип, чтобы обеспечить его совместимость с векторами, хранящимися в базе данных.
- Параметр LIMIT 5 означает, что мы хотим извлечь 5 ближайших соседей для искомого текста.
Результат выглядит так:

Как вы можете видеть в результатах, совпадения довольно близки к поисковому запросу. Попробуйте изменить цвет, чтобы увидеть, как изменятся результаты.
Важное примечание:
Теперь предположим, что мы хотим повысить производительность (время выполнения запроса), эффективность и полноту результатов векторного поиска, используя индекс ScaNN . Пожалуйста, ознакомьтесь с шагами в этой статье , чтобы сравнить разницу в результатах с индексом и без него. Для удобства здесь приведены только шаги по созданию индекса:
- Поскольку кластер, экземпляр, контекст и эмбеддинги уже созданы, нам остается только установить расширение ScaNN, используя следующую команду:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- Далее мы создадим индекс (ScaNN):
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
В приведенном выше DDL-скрипте apparel_index — это имя индекса.
«Одежда» — это мой стол.
«Scann» — это метод индексации.
«embedding» — это столбец в таблице, который я хочу проиндексировать.
"Косинус" — это метод измерения расстояния, который я хочу использовать с индексом.
"54" — это количество разделов, применяемых к этому индексу. Установите любое значение от 1 до 1048576. Для получения дополнительной информации о том, как определить это значение, см. раздел "Настройка индекса ScaNN" .
Я использовал квадратный корень из количества точек данных, как рекомендовано в репозитории ScaNN (при разбиении на разделы num_leaves должно быть приблизительно равно квадратному корню из количества точек данных).
- Проверьте, создан ли индекс, используя следующий запрос:
SELECT * FROM pg_stat_ann_indexes;
- Выполните векторный поиск, используя тот же запрос, что и раньше, но без индекса:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
Приведенный выше запрос — это тот же самый запрос, который мы использовали в лабораторной работе на шаге 8. Однако теперь у нас есть индексированное поле.
- Проведите тест с помощью простого поискового запроса с индексом и без него (удалив индекс):
white tops for girls without any print
Приведенный выше поисковый запрос в векторном поиске по индексированным данным эмбеддингов обеспечивает качественные результаты поиска и высокую эффективность. Эффективность значительно повышается (по времени выполнения: 10,37 мс без ScaNN и 0,87 мс с ScaNN) при использовании индекса. Для получения дополнительной информации по этой теме, пожалуйста, обратитесь к этому блогу .
9. Проверка соответствия с помощью LLM
Before moving on and creating a service to return the best matches to an application, let's use a generative AI model to validate if these potential responses are truly relevant and safe to share with the user.
Убедитесь, что экземпляр настроен для работы с Gemini.
Сначала проверьте, включена ли интеграция Google ML для вашего кластера и экземпляра. В AlloyDB Studio выполните следующую команду:
show google_ml_integration.enable_model_support;
Если значение отображается как «включено» , вы можете пропустить следующие 2 шага и сразу перейти к настройке интеграции AlloyDB и Vertex AI Model.
- Перейдите к основному экземпляру вашего кластера AlloyDB и нажмите «РЕДАКТИРОВАТЬ ОСНОВНОЙ ЭКЗЕМПЛЯР».

- Перейдите в раздел «Флаги» в расширенных параметрах конфигурации и убедитесь, что
google_ml_integration.enable_model_support flagустановлен в значение «on», как показано ниже:

Если параметр не установлен в положение «включено», установите его в положение «включено», а затем нажмите кнопку «ОБНОВИТЬ ЭКЗЕМПЛЯР ». Этот шаг займет несколько минут.
Интеграция AlloyDB и модели искусственного интеллекта Vertex
Теперь вы можете подключиться к AlloyDB Studio и выполнить следующую инструкцию DML для настройки доступа к моделям Gemini из AlloyDB, используя идентификатор вашего проекта там, где это указано. Перед выполнением команды может появиться предупреждение о синтаксической ошибке, но в целом она должна выполниться без проблем.
Для начала создадим подключение к модели Gemini 1.5, как показано ниже. Не забудьте заменить $PROJECT_ID в приведенной ниже команде на идентификатор вашего проекта Google Cloud.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
Проверить модели, настроенные для доступа, можно с помощью следующей команды в AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
Наконец, нам необходимо предоставить пользователям базы данных разрешение на выполнение функции ml_predict_row для запуска прогнозов с помощью моделей искусственного интеллекта Google Vertex. Выполните следующую команду:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Примечание: Если вы используете существующий проект Google Cloud и кластер/экземпляр AlloyDB, созданный некоторое время назад, вам может потребоваться удалить старые ссылки на модель gemini-1.5 и создать ее заново с помощью приведенного выше оператора CALL, а затем снова запустить команду grant execute on function ml_predict_row, если у вас возникнут проблемы при последующих вызовах gemini-1.5.
Оценка ответов
While we'll end up using one large query in the next section to ensure the responses from the query are reasonable, the query can be difficult to understand. We'll look at the pieces now and see how they come together in a few minutes.
- Сначала мы отправим запрос в базу данных, чтобы получить 5 наиболее близких совпадений с запросом пользователя. Для простоты мы жестко зададим запрос, но не волнуйтесь, мы добавим его в него позже. Мы включаем описание товара из таблицы
apparelsи добавляем два новых поля — одно, которое объединяет описание с индексом, и другое с исходным запросом. Все это сохраняется в таблице с именемxyz(это просто временное имя таблицы).
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Результатом этого запроса станут 5 наиболее похожих строк, относящихся к запросу пользователя. Новая таблица xyz будет содержать 5 строк, каждая из которых будет иметь следующие столбцы:
-
literature -
content -
user_text
- Чтобы определить, насколько корректны ответы, мы воспользуемся сложным запросом, в котором объясним, как оценивать ответы. В качестве части запроса используются
user_textиcontentиз таблицыxyz.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Затем, используя этот запрос, мы проверим «качество» ответов в таблице
xyz.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- Функция
predict_rowвозвращает результат в формате JSON. Код "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"используется для извлечения фактического текста из этого JSON. Чтобы увидеть фактический возвращаемый JSON, вы можете удалить этот код. - Наконец, чтобы получить поле LLM, вам просто нужно извлечь его из таблицы x:
SELECT
LLM_RESPONSE
FROM
x;
- Это можно объединить в один следующий запрос следующим образом.
Если вы уже выполняли указанные выше запросы для проверки промежуточных результатов, вам потребуется удалить таблицы xyz и x из базы данных AlloyDB перед запуском этой команды.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Хотя это всё ещё может показаться сложным, надеюсь, вы сможете лучше это понять. Результаты показывают, есть ли совпадение, каков процент совпадения и некоторое объяснение рейтинга.
Обратите внимание, что в модели Gemini потоковая передача включена по умолчанию, поэтому фактический ответ распределяется по нескольким строкам: 
10. Разместите приложение в интернете.
Готовы перенести это приложение в веб-среду? Следуйте приведенным ниже шагам, чтобы сделать этот механизм знаний бессерверным с помощью Cloud Run Functions:
- Чтобы создать новую функцию Cloud Run Function, перейдите в раздел Cloud Run Functions в консоли Google Cloud или воспользуйтесь ссылкой: https://console.cloud.google.com/functions/add .
- Выберите среду " Cloud Run function ". Укажите имя функции " retail-engine " и регион "us-central1". Установите аутентификацию в значение "Разрешить неаутентифицированные вызовы" и нажмите "Далее ". Выберите Java 17 в качестве среды выполнения и встроенный редактор для исходного кода.
- По умолчанию точка входа будет установлена на "
gcfv2.HelloHttpFunction". Замените код-заполнитель в файлахHelloHttpFunction.javaиpom.xmlвашей функции Cloud Run кодом из Java-файла и XML-файла соответственно. - Не забудьте заменить значение параметра $PROJECT_ID и учетные данные для подключения к AlloyDB в Java-файле на ваши собственные значения. Учетные данные AlloyDB — это те, которые мы использовали в начале этого практического занятия. Если вы использовали другие значения, пожалуйста, измените их в Java-файле.
- Нажмите « Развернуть» .
После развертывания, чтобы обеспечить доступ облачной функции к нашему экземпляру базы данных AlloyDB, мы создадим коннектор VPC .
ВАЖНЫЙ ШАГ:
После завершения развертывания вы сможете увидеть функции в консоли Google Cloud Run Functions . Найдите только что созданную функцию ( retail-engine ), щелкните по ней, затем нажмите «Редактировать» и измените следующие параметры:
- Перейдите в раздел «Среда выполнения», «Сборка», «Подключения» и «Параметры безопасности».
- Увеличьте время ожидания до 180 секунд.
- Перейдите на вкладку «СОЕДИНЕНИЯ»:

- В настройках входящего трафика убедитесь, что выбран параметр «Разрешить весь трафик».
- В настройках исходящего трафика щелкните раскрывающееся меню «Сеть» и выберите пункт «Добавить новый коннектор VPC», затем следуйте инструкциям в появившемся диалоговом окне:

- Укажите имя для VPC-коннектора и убедитесь, что регион совпадает с регионом вашего экземпляра. Оставьте значение «Сеть» по умолчанию и установите подсеть как «Пользовательский диапазон IP-адресов» с диапазоном IP-адресов 10.8.0.0 или аналогичным доступным значением.
- Разверните раздел «ПОКАЗАТЬ НАСТРОЙКИ МАСШТАБИРОВАНИЯ» и убедитесь, что параметры конфигурации установлены точно следующим образом:

- Нажмите кнопку СОЗДАТЬ, и этот соединитель должен появиться в списке настроек исходящего трафика.
- Выберите только что созданный соединитель.
- Выберите вариант, при котором весь трафик будет направляться через этот VPC-коннектор.
- Нажмите «Далее» , а затем «Развернуть» .
11. Протестируйте приложение.
После развертывания обновленной облачной функции вы должны увидеть конечную точку в следующем формате:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
Вы можете проверить это в терминале Cloud Shell, выполнив следующую команду:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
В качестве альтернативы, вы можете протестировать функцию Cloud Run следующим образом:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
И вот результат:

Вот и всё! Выполнить поиск по вектору сходства с использованием модели Embeddings на данных AlloyDB очень просто.
Создание диалогового агента!
Агент создается во второй части этой лабораторной работы.
12. Уборка
Если вы планируете выполнить вторую часть этой лабораторной работы, пропустите этот шаг, так как это приведет к удалению текущего проекта.
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия:
- В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите проект, который хотите удалить, и нажмите кнопку «Удалить» .
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить» , чтобы удалить проект.
13. Поздравляем!
Поздравляем! Вы успешно выполнили поиск сходства с использованием AlloyDB, pgvector и Vector search. Объединив возможности AlloyDB , Vertex AI и Vector Search , мы сделали огромный шаг вперед в обеспечении доступности, эффективности и подлинной смысловой направленности контекстного и векторного поиска. Следующая часть этой лабораторной работы посвящена этапам создания агента.