Создайте умного торгового помощника с помощью AlloyDB и Vertex AI Agent Builder — Часть 1

1. Обзор

В современном быстро меняющемся мире розничной торговли предоставление исключительного обслуживания клиентам и обеспечение персонализированного опыта покупок имеет первостепенное значение. Мы проведем вас в техническое путешествие по созданию основанного на знаниях чат-приложения, предназначенного для ответа на вопросы клиентов, поиска продуктов и адаптации результатов поиска. Это инновационное решение сочетает в себе возможности AlloyDB для хранения данных, собственную аналитическую систему для контекстного понимания, Gemini (большая языковая модель) для проверки релевантности и Agent Builder от Google для быстрой загрузки интеллектуального диалогового помощника.

Задача: современные розничные покупатели ожидают мгновенных ответов и рекомендаций по продуктам, соответствующих их уникальным предпочтениям. Традиционные методы поиска часто не обеспечивают такого уровня персонализации.

Решение: Наше чат-приложение, основанное на знаниях, справится с этой задачей. Он использует богатую базу знаний, полученную на основе ваших розничных данных, для понимания намерений клиентов, разумного реагирования и предоставления сверхрелевантных результатов.

Что ты построишь

В рамках этой лабораторной работы (Часть 1) вы:

  1. Создайте экземпляр AlloyDB и загрузите набор данных электронной торговли.
  2. Включите расширения pgvector и генеративной модели искусственного интеллекта в AlloyDB.
  3. Генерация вложений из описания продукта
  4. Выполняйте поиск косинусного сходства в реальном времени для текста поиска пользователя.
  5. Разверните решение в бессерверных функциях Cloud Run.

Во второй части лабораторной работы будут рассмотрены шаги Agent Builder.

Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной оплатой.

2. Архитектура

Поток данных. Давайте подробнее рассмотрим, как данные перемещаются через нашу систему:

Проглатывание :

Наш первый шаг — загрузить данные о розничной торговле (инвентарь, описания продуктов, взаимодействие с клиентами) в AlloyDB.

Аналитический механизм:

Мы будем использовать AlloyDB в качестве аналитической системы для выполнения следующих задач:

  1. Извлечение контекста: механизм анализирует данные, хранящиеся в AlloyDB, чтобы понять взаимосвязи между продуктами, категориями, поведением клиентов и т. д., если это применимо.
  2. Создание встраивания: встраивания (математические представления текста) создаются как для запроса пользователя, так и для информации, хранящейся в AlloyDB.
  3. Векторный поиск: механизм выполняет поиск по сходству, сравнивая встраивание запроса с встраиванием описаний продуктов, обзоров и других соответствующих данных. Это определяет 25 наиболее важных «ближайших соседей».

Проверка Близнецов:

Эти потенциальные ответы отправляются в Gemini для оценки. Gemini определяет, действительно ли они актуальны и безопасны ли, которыми можно поделиться с пользователем.

Генерация ответа:

Проверенные ответы структурируются в массив JSON, а весь механизм упаковывается в бессерверную функцию запуска облака, которая вызывается из Agent Builder.

Разговорное взаимодействие:

Agent Builder представляет ответы пользователю в формате естественного языка, облегчая двусторонний диалог. Эта часть будет рассмотрена в последующей лабораторной работе.

3. Прежде чем начать

Создать проект

  1. В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте .
  3. Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud, в которую предварительно загружен bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

Изображение кнопки «Активировать Cloud Shell»

  1. После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что для проекта установлен идентификатор вашего проекта, используя следующую команду:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>
  1. Включите необходимые 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, куда будет загружен набор данных электронной коммерции.

Создайте кластер и экземпляр

  1. Перейдите на страницу AlloyDB в Cloud Console. Самый простой способ найти большинство страниц в Cloud Console — это выполнить их поиск с помощью панели поиска консоли.
  2. Выберите СОЗДАТЬ КЛАСТЕР на этой странице:

f76ff480c8c889aa.png

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

538dba58908162fb.png

  1. Когда вы выберете сеть по умолчанию, вы увидите экран, подобный показанному ниже. Выберите НАСТРОЙКА СОЕДИНЕНИЯ.
    7939bbb6802a91bf.png
  2. Далее выберите «Использовать автоматически выделенный диапазон IP-адресов» и нажмите «Продолжить». Просмотрев информацию, выберите СОЗДАТЬ СОЕДИНЕНИЕ. 768ff5210e79676f.png
  3. После настройки сети вы можете продолжить создание кластера. Нажмите CREATE CLUSTER, чтобы завершить настройку кластера, как показано ниже:

e06623e55195e16e.png

Обязательно измените идентификатор экземпляра на « shopping-instance" .

Обратите внимание, что создание кластера займет около 10 минут. В случае успеха вы должны увидеть экран, похожий на этот:

24eec29fa5cfdb3e.png

5. Прием данных

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

847e35f1bf8a8bd8.png

Возможно, вам придется подождать, пока ваш экземпляр завершится. Как только это произойдет, войдите в AlloyDB, используя учетные данные, которые вы создали при создании кластера. Используйте следующие данные для аутентификации в PostgreSQL:

  • Имя пользователя: « postgres »
  • База данных: « postgres ».
  • Пароль: « alloydb »

После успешной аутентификации в AlloyDB Studio команды SQL вводятся в редактор. Вы можете добавить несколько окон редактора, используя плюс справа от последнего окна.

91a86d9469d499c4.png

Вы будете вводить команды для 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) );

При успешном выполнении вышеуказанной команды вы сможете просмотреть таблицу в базе данных. Пример скриншота показан ниже:

908e33bbff58a6d.png

Прием данных

Для этой лабораторной работы у нас есть тестовые данные примерно из 200 записей в этом файле SQL . Он содержит id, category, sub_category, uri, image и content . Остальные поля будут заполнены позже в лабораторной работе.

Скопируйте оттуда 20 строк/инструкций вставки, а затем вставьте эти строки в пустую вкладку редактора и выберите «Выполнить».

Чтобы просмотреть содержимое таблицы, разверните раздел «Проводник», пока не увидите таблицу с именем «Одежда». Нажмите трехточие (⋮), чтобы увидеть возможность запроса таблицы. Оператор SELECT откроется на новой вкладке редактора.

b31ece70e670ab89.png

Предоставить разрешение

Запустите приведенный ниже оператор, чтобы предоставить пользователю postgres права на выполнение функции embedding :

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Предоставьте РОЛЬ пользователя Vertex AI сервисной учетной записи AlloyDB.

Перейдите в терминал 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 вашего вновь созданного экземпляра. Это обновит поле 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. Создайте вложения для контекста

Компьютерам гораздо проще обрабатывать числа, чем текст. Система внедрения преобразует текст в ряд чисел с плавающей запятой, которые должны представлять текст, независимо от того, как он сформулирован, на каком языке он используется и т. д.

Рассмотрим описание прибрежного места. Его можно назвать «на воде», «на берегу моря», «пройти из комнаты к океану», «сюр-ла-мер», «на берегу океана» и т. д. Все эти термины выглядят по-разному, но их смысловое значение или машинное значение изучая терминологию, их вложения должны быть очень близки друг к другу.

Теперь, когда данные и контекст готовы, мы запустим 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;

Это должно вернуть вектор внедрения, который выглядит как массив чисел с плавающей запятой, для примера текста в запросе, как показано ниже:

c69c08d085389f74.png

Примечание. Недавно созданные проекты Google Cloud на уровне бесплатного пользования могут столкнуться с проблемами квот, когда речь идет о количестве запросов на внедрение, разрешенных в секунду для моделей внедрения. Мы предлагаем вам использовать фильтрационный запрос для идентификатора, а затем выборочно выбирать 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;

Давайте рассмотрим этот запрос подробно:

В этом запросе

  1. Текст поиска пользователя: «Я хочу женские топы, розовые повседневные, только из чистого хлопка».
  2. Мы конвертируем его во встраивания в методе embedding() используя модель: text-embedding-004 . Этот шаг должен выглядеть знакомо после предыдущего шага, где мы применили функцию внедрения ко всем элементам таблицы.
  3. " <=> " представляет собой использование метода расстояния COSINE SIMILARITY . Вы можете найти все доступные меры сходства в документации pgvector .
  4. Мы преобразуем результат метода внедрения в векторный тип, чтобы сделать его совместимым с векторами, хранящимися в базе данных.
  5. LIMIT 5 означает, что мы хотим извлечь 5 ближайших соседей для искомого текста.

Результат выглядит следующим образом:

4193a68737400535.png

Как вы можете видеть по результатам, совпадения довольно близки к искомому тексту. Попробуйте изменить цвет, чтобы увидеть, как изменятся результаты.

9. Проверка соответствия с LLM

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

Обеспечение настройки экземпляра для Gemini

Сначала проверьте, включена ли интеграция Google ML для вашего кластера и экземпляра. В AlloyDB Studio введите следующую команду:

show google_ml_integration.enable_model_support;

Если значение отображается как «включено» , вы можете пропустить следующие 2 шага и перейти непосредственно к настройке интеграции AlloyDB и модели Vertex AI.

  1. Перейдите к основному экземпляру вашего кластера AlloyDB и нажмите «РЕДАКТИРОВАТЬ ОСНОВНОЙ ЭКЗЕМПЛЯР».

456ffdf292d3c0e0.png

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

6a59351fcd2a9d35.png

Если для него не установлено значение «включено», установите для него значение «включено», а затем нажмите кнопку «ОБНОВИТЬ ЭКЗЕМПЛЯР ». Этот шаг займет несколько минут.

Интеграция моделей AlloyDB и Vertex AI

Теперь вы можете подключиться к 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 AI. Выполните следующую команду:

GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Примечание. Если вы используете существующий проект Google Cloud и существующий кластер/экземпляр AlloyDB, созданный некоторое время назад, вам может потребоваться удалить старые ссылки на модель Gemini-1.5 и создать заново с помощью приведенного выше оператора CALL и запустить Grant Execute. снова в функции ml_predict_row на случай, если у вас возникнут проблемы при предстоящих вызовах Gemini-1.5.

Оценка ответов

Хотя в следующем разделе мы будем использовать один большой запрос, чтобы гарантировать разумность ответов на запрос, сам запрос может быть трудным для понимания. Сейчас мы посмотрим на кусочки и посмотрим, как они соберутся воедино через несколько минут.

  1. Сначала мы отправим запрос в базу данных, чтобы получить 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
  1. Чтобы определить, насколько действительны ответы, мы воспользуемся сложным запросом, в котором объясним, как оценивать ответы. Он использует 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."
  1. Используя этот запрос, мы затем проверим «качественность» ответов в таблице 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;
  1. predict_row возвращает результат в формате JSON. Код « -> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" используется для извлечения фактического текста из этого JSON. Чтобы увидеть фактический возвращаемый JSON, вы можете удалить этот код.
  2. Наконец, чтобы получить поле LLM, вам просто нужно извлечь его из таблицы x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Это можно объединить в один следующий запрос следующим образом.

Перед запуском вам нужно будет удалить таблицы 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 потоковая передача включена по умолчанию, поэтому фактический ответ распределяется по нескольким строкам: 14e74d71293b7b9.png

10. Разместите приложение в Интернете.

Готовы разместить это приложение в Интернете? Выполните следующие действия, чтобы сделать эту систему знаний бессерверной с функциями облачного запуска:

  1. Перейдите в раздел «Функции Cloud Run» в Google Cloud Console, чтобы СОЗДАТЬ новую функцию Cloud Run, или воспользуйтесь ссылкой: https://console.cloud.google.com/functions/add .
  2. Выберите среду как « Функция Cloud Run ». Укажите имя функции « retail-engine » и выберите регион «us-central1». Установите для параметра Аутентификация значение «Разрешить неаутентифицированные вызовы» и нажмите «ДАЛЕЕ» . Выберите Java 17 в качестве среды выполнения и встроенный редактор для исходного кода.
  3. По умолчанию для точки входа будет установлено значение « gcfv2.HelloHttpFunction ». Замените код-заполнитель в HelloHttpFunction.java и pom.xml вашей функции Cloud Run кодом из файла Java и XML соответственно.
  4. Не забудьте изменить заполнитель $PROJECT_ID и учетные данные подключения AlloyDB на свои значения в файле Java. Учетные данные AlloyDB — это те же учетные данные, которые мы использовали в начале этой лабораторной работы. Если вы использовали другие значения, измените их в файле Java.
  5. Нажмите «Развернуть» .

После развертывания, чтобы предоставить облачной функции доступ к нашему экземпляру базы данных AlloyDB, мы создадим соединитель VPC .

ВАЖНЫЙ ШАГ:

После того как вы приступили к развертыванию, вы сможете увидеть функции в консоли Google Cloud Run Functions . Найдите вновь созданную функцию ( retail-engine ), щелкните ее, затем нажмите «РЕДАКТИРОВАТЬ» и измените следующее:

  1. Перейдите в раздел «Среда выполнения, сборка, подключения и настройки безопасности».
  2. Увеличьте таймаут до 180 секунд.
  3. Перейдите на вкладку ПОДКЛЮЧЕНИЯ:

4e83ec8a339cda08.png

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

8126ec78c343f199.png

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

7baf980463a86a5c.png

  1. Нажмите CREATE, и этот соединитель теперь должен быть указан в настройках исходящего трафика.
  2. Выберите вновь созданный соединитель
  3. Выберите маршрутизацию всего трафика через этот соединитель VPC.
  4. Нажмите «ДАЛЕЕ» , а затем «РАЗВЕРТЫВАТЬ» .

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 .

И результат:

88bc1ddfb5644a28.png

Вот и все! Выполнить поиск вектора сходства с использованием модели Embeddings для данных AlloyDB очень просто.

Создание разговорного агента!

Агент создается во второй части этой лабораторной работы.

12. Очистка

Если вы планируете выполнить часть 2 этой лабораторной работы, пропустите этот шаг, поскольку при этом текущий проект будет удален.

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом посте, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу», чтобы удалить проект.

13. Поздравления

Поздравляем! Вы успешно выполнили поиск по сходству с помощью поиска AlloyDB, pgvector и Vector. Объединив возможности AlloyDB , Vertex AI и Vector Search , мы сделали гигантский шаг вперед, сделав контекстный и векторный поиск доступным, эффективным и по-настоящему осмысленным. В следующей части лабораторной работы рассматриваются этапы создания агента.

,

1. Обзор

В современном быстро меняющемся мире розничной торговли предоставление исключительного обслуживания клиентам и обеспечение персонализированного опыта покупок имеет первостепенное значение. Мы проведем вас в техническое путешествие по созданию основанного на знаниях чат-приложения, предназначенного для ответа на вопросы клиентов, поиска продуктов и адаптации результатов поиска. Это инновационное решение сочетает в себе возможности AlloyDB для хранения данных, собственную аналитическую систему для контекстного понимания, Gemini (большая языковая модель) для проверки релевантности и Agent Builder от Google для быстрой загрузки интеллектуального диалогового помощника.

Задача: современные розничные покупатели ожидают мгновенных ответов и рекомендаций по продуктам, соответствующих их уникальным предпочтениям. Традиционные методы поиска часто не обеспечивают такого уровня персонализации.

Решение: Наше чат-приложение, основанное на знаниях, справится с этой задачей. Он использует богатую базу знаний, полученную на основе ваших розничных данных, для понимания намерений клиентов, разумного реагирования и предоставления сверхрелевантных результатов.

Что ты построишь

В рамках этой лабораторной работы (Часть 1) вы:

  1. Создайте экземпляр AlloyDB и загрузите набор данных электронной торговли.
  2. Включите расширения pgvector и генеративной модели искусственного интеллекта в AlloyDB.
  3. Генерация вложений из описания продукта
  4. Выполняйте поиск косинусного сходства в реальном времени для текста поиска пользователя.
  5. Разверните решение в бессерверных функциях Cloud Run.

Во второй части лабораторной работы будут рассмотрены шаги Agent Builder.

Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной оплатой.

2. Архитектура

Поток данных. Давайте подробнее рассмотрим, как данные перемещаются через нашу систему:

Проглатывание :

Наш первый шаг — загрузить данные о розничной торговле (инвентарь, описания продуктов, взаимодействие с клиентами) в AlloyDB.

Аналитический механизм:

Мы будем использовать AlloyDB в качестве аналитической системы для выполнения следующих задач:

  1. Извлечение контекста: механизм анализирует данные, хранящиеся в AlloyDB, чтобы понять взаимосвязи между продуктами, категориями, поведением клиентов и т. д., если это применимо.
  2. Создание встраивания: встраивания (математические представления текста) создаются как для запроса пользователя, так и для информации, хранящейся в AlloyDB.
  3. Векторный поиск: механизм выполняет поиск по сходству, сравнивая встраивание запроса с встраиванием описаний продуктов, обзоров и других соответствующих данных. Это определяет 25 наиболее важных «ближайших соседей».

Проверка Близнецов:

Эти потенциальные ответы отправляются в Gemini для оценки. Gemini определяет, действительно ли они актуальны и безопасны ли, которыми можно поделиться с пользователем.

Генерация ответа:

Проверенные ответы структурируются в массив JSON, а весь механизм упаковывается в бессерверную функцию запуска облака, которая вызывается из Agent Builder.

Разговорное взаимодействие:

Agent Builder представляет ответы пользователю в формате естественного языка, облегчая двусторонний диалог. Эта часть будет рассмотрена в последующей лабораторной работе.

3. Прежде чем начать

Создать проект

  1. В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте .
  3. Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud, в которую предварительно загружен bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

Изображение кнопки «Активировать Cloud Shell»

  1. После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что для проекта установлен идентификатор вашего проекта, используя следующую команду:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>
  1. Включите необходимые 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, куда будет загружен набор данных электронной коммерции.

Создайте кластер и экземпляр

  1. Перейдите на страницу AlloyDB в Cloud Console. Самый простой способ найти большинство страниц в Cloud Console — это выполнить их поиск с помощью панели поиска консоли.
  2. Выберите СОЗДАТЬ КЛАСТЕР на этой странице:

f76ff480c8c889aa.png

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

538dba58908162fb.png

  1. Когда вы выберете сеть по умолчанию, вы увидите экран, подобный показанному ниже. Выберите НАСТРОЙКА СОЕДИНЕНИЯ.
    7939bbb6802a91bf.png
  2. Далее выберите «Использовать автоматически выделенный диапазон IP-адресов» и нажмите «Продолжить». Просмотрев информацию, выберите СОЗДАТЬ СОЕДИНЕНИЕ. 768ff5210e79676f.png
  3. После настройки сети вы можете продолжить создание кластера. Нажмите CREATE CLUSTER, чтобы завершить настройку кластера, как показано ниже:

e06623e55195e16e.png

Обязательно измените идентификатор экземпляра на « shopping-instance" .

Обратите внимание, что создание кластера займет около 10 минут. В случае успеха вы должны увидеть экран, похожий на этот:

24eec29fa5cfdb3e.png

5. Прием данных

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

847e35f1bf8a8bd8.png

Возможно, вам придется подождать, пока ваш экземпляр завершится. Как только это произойдет, войдите в AlloyDB, используя учетные данные, которые вы создали при создании кластера. Используйте следующие данные для аутентификации в PostgreSQL:

  • Имя пользователя: « postgres »
  • База данных: « postgres ».
  • Пароль: « alloydb »

После успешной аутентификации в AlloyDB Studio команды SQL вводятся в редактор. Вы можете добавить несколько окон редактора, используя плюс справа от последнего окна.

91a86d9469d499c4.png

Вы будете вводить команды для 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) );

При успешном выполнении вышеуказанной команды вы сможете просмотреть таблицу в базе данных. Пример скриншота показан ниже:

908e33bbff58a6d.png

Прием данных

Для этой лабораторной работы у нас есть тестовые данные примерно из 200 записей в этом файле SQL . Он содержит id, category, sub_category, uri, image и content . Остальные поля будут заполнены позже в лабораторной работе.

Скопируйте оттуда 20 строк/инструкций вставки, а затем вставьте эти строки в пустую вкладку редактора и выберите «Выполнить».

Чтобы просмотреть содержимое таблицы, разверните раздел «Проводник», пока не увидите таблицу с именем «Одежда». Нажмите трехточие (⋮), чтобы увидеть возможность запроса таблицы. Оператор SELECT откроется на новой вкладке редактора.

b31ece70e670ab89.png

Предоставить разрешение

Запустите приведенный ниже оператор, чтобы предоставить пользователю postgres права на выполнение функции embedding :

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Предоставьте РОЛЬ пользователя Vertex AI сервисной учетной записи AlloyDB.

Перейдите в терминал 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 вашего вновь созданного экземпляра. Это обновит поле 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. Создайте вложения для контекста

Компьютерам гораздо проще обрабатывать числа, чем текст. Система внедрения преобразует текст в ряд чисел с плавающей запятой, которые должны представлять текст, независимо от того, как он сформулирован, на каком языке он используется и т. д.

Рассмотрим описание прибрежного места. Его можно назвать «на воде», «на берегу моря», «пройти из комнаты к океану», «сюр-ла-мер», «на берегу океана» и т. д. Все эти термины выглядят по-разному, но их смысловое значение или машинное значение изучая терминологию, их вложения должны быть очень близки друг к другу.

Теперь, когда данные и контекст готовы, мы запустим 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;

Это должно вернуть вектор внедрения, который выглядит как массив чисел с плавающей запятой, для примера текста в запросе, как показано ниже:

c69c08d085389f74.png

Примечание. Недавно созданные проекты Google Cloud на уровне бесплатного пользования могут столкнуться с проблемами квот, когда речь идет о количестве запросов на внедрение, разрешенных в секунду для моделей внедрения. Мы предлагаем вам использовать фильтрационный запрос для идентификатора, а затем выборочно выбирать 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;

Давайте рассмотрим этот запрос подробно:

В этом запросе

  1. Текст поиска пользователя: «Я хочу женские топы, розовые повседневные, только из чистого хлопка».
  2. Мы конвертируем его во встраивания в методе embedding() используя модель: text-embedding-004 . Этот шаг должен выглядеть знакомо после предыдущего шага, где мы применили функцию внедрения ко всем элементам таблицы.
  3. " <=> " представляет собой использование метода расстояния COSINE SIMILARITY . Вы можете найти все доступные меры сходства в документации pgvector .
  4. Мы преобразуем результат метода внедрения в векторный тип, чтобы сделать его совместимым с векторами, хранящимися в базе данных.
  5. LIMIT 5 означает, что мы хотим извлечь 5 ближайших соседей для искомого текста.

Результат выглядит следующим образом:

4193a68737400535.png

Как вы можете видеть по результатам, совпадения довольно близки к искомому тексту. Попробуйте изменить цвет, чтобы увидеть, как изменятся результаты.

9. Проверка соответствия с LLM

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

Обеспечение настройки экземпляра для Gemini

Сначала проверьте, включена ли интеграция Google ML для вашего кластера и экземпляра. В AlloyDB Studio введите следующую команду:

show google_ml_integration.enable_model_support;

Если значение отображается как «включено» , вы можете пропустить следующие 2 шага и перейти непосредственно к настройке интеграции AlloyDB и модели Vertex AI.

  1. Перейдите к основному экземпляру вашего кластера AlloyDB и нажмите «РЕДАКТИРОВАТЬ ОСНОВНОЙ ЭКЗЕМПЛЯР».

456ffdf292d3c0e0.png

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

6a59351fcd2a9d35.png

Если для него не установлено значение «включено», установите для него значение «включено», а затем нажмите кнопку «ОБНОВИТЬ ЭКЗЕМПЛЯР ». Этот шаг займет несколько минут.

Интеграция моделей AlloyDB и Vertex AI

Теперь вы можете подключиться к 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 AI. Выполните следующую команду:

GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Примечание. Если вы используете существующий проект Google Cloud и существующий кластер/экземпляр AlloyDB, созданный некоторое время назад, вам может потребоваться удалить старые ссылки на модель Gemini-1.5 и создать заново с помощью приведенного выше оператора CALL и запустить Grant Execute. снова в функции ml_predict_row на случай, если у вас возникнут проблемы при предстоящих вызовах Gemini-1.5.

Оценка ответов

Хотя в следующем разделе мы будем использовать один большой запрос, чтобы гарантировать разумность ответов на запрос, сам запрос может быть трудным для понимания. Сейчас мы посмотрим на кусочки и посмотрим, как они соберутся воедино через несколько минут.

  1. Сначала мы отправим запрос в базу данных, чтобы получить 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
  1. Чтобы определить, насколько действительны ответы, мы воспользуемся сложным запросом, в котором объясним, как оценивать ответы. Он использует 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."
  1. Используя этот запрос, мы затем проверим «качественность» ответов в таблице 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;
  1. predict_row возвращает результат в формате JSON. Код « -> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" используется для извлечения фактического текста из этого JSON. Чтобы увидеть фактический возвращаемый JSON, вы можете удалить этот код.
  2. Наконец, чтобы получить поле LLM, вам просто нужно извлечь его из таблицы x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Это можно объединить в один следующий запрос следующим образом.

Перед запуском вам нужно будет удалить таблицы 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 потоковая передача включена по умолчанию, поэтому фактический ответ распределяется по нескольким строкам: 14e74d71293b7b9.png

10. Разместите приложение в Интернете.

Готовы разместить это приложение в Интернете? Выполните следующие действия, чтобы сделать эту систему знаний бессерверной с функциями облачного запуска:

  1. Перейдите в раздел «Функции Cloud Run» в Google Cloud Console, чтобы СОЗДАТЬ новую функцию Cloud Run, или воспользуйтесь ссылкой: https://console.cloud.google.com/functions/add .
  2. Выберите среду как « Функция Cloud Run ». Укажите имя функции « retail-engine » и выберите регион «us-central1». Установите для параметра Аутентификация значение «Разрешить неаутентифицированные вызовы» и нажмите «ДАЛЕЕ» . Выберите Java 17 в качестве среды выполнения и встроенный редактор для исходного кода.
  3. По умолчанию для точки входа будет установлено значение « gcfv2.HelloHttpFunction ». Замените код-заполнитель в HelloHttpFunction.java и pom.xml вашей функции Cloud Run кодом из файла Java и XML соответственно.
  4. Не забудьте изменить заполнитель $PROJECT_ID и учетные данные подключения AlloyDB на свои значения в файле Java. Учетные данные AlloyDB — это те же учетные данные, которые мы использовали в начале этой лабораторной работы. Если вы использовали другие значения, измените их в файле Java.
  5. Нажмите «Развернуть» .

После развертывания, чтобы предоставить облачной функции доступ к нашему экземпляру базы данных AlloyDB, мы создадим соединитель VPC .

ВАЖНЫЙ ШАГ:

После того как вы приступили к развертыванию, вы сможете увидеть функции в консоли Google Cloud Run Functions . Найдите вновь созданную функцию ( retail-engine ), щелкните ее, затем нажмите «РЕДАКТИРОВАТЬ» и измените следующее:

  1. Перейдите в раздел «Среда выполнения, сборка, подключения и настройки безопасности».
  2. Увеличьте таймаут до 180 секунд.
  3. Перейдите на вкладку ПОДКЛЮЧЕНИЯ:

4e83ec8a339cda08.png

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

8126ec78c343f199.png

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

7baf980463a86a5c.png

  1. Нажмите CREATE, и этот соединитель теперь должен быть указан в настройках исходящего трафика.
  2. Выберите вновь созданный соединитель
  3. Выберите маршрутизацию всего трафика через этот соединитель VPC.
  4. Нажмите «ДАЛЕЕ» , а затем «РАЗВЕРТЫВАТЬ» .

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 .

И результат:

88bc1ddfb5644a28.png

Вот и все! Выполнить поиск вектора сходства с использованием модели Embeddings для данных AlloyDB очень просто.

Создание разговорного агента!

Агент создается во второй части этой лабораторной работы.

12. Очистка

Если вы планируете выполнить часть 2 этой лабораторной работы, пропустите этот шаг, поскольку при этом текущий проект будет удален.

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом посте, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу», чтобы удалить проект.

13. Поздравления

Поздравляем! Вы успешно выполнили поиск по сходству с помощью поиска AlloyDB, pgvector и Vector. Объединив возможности AlloyDB , Vertex AI и Vector Search , мы сделали гигантский шаг вперед, сделав контекстный и векторный поиск доступным, эффективным и по-настоящему осмысленным. В следующей части лабораторной работы рассматриваются этапы создания агента.