Создайте приложение для патентного поиска с помощью AlloyDB, Vector Search & Вертекс ИИ!

1. Обзор

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

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

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

Цель

В этом практическом занятии мы будем работать над тем, чтобы сделать процесс поиска патентов быстрее, интуитивнее и невероятно точным, используя AlloyDB, расширение pgvector и встроенные инструменты Gemini 1.5 Pro, Embeddings и Vector Search.

Что вы построите

В рамках этой лабораторной работы вы:

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

Следующая диаграмма иллюстрирует поток данных и этапы реализации.

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

Требования

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

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

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

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект 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 в терминале Cloud Shell:
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 является поиск каждого продукта в консоли или использование этой ссылки .

Для получения информации о командах gcloud и их использовании обратитесь к документации .

3. Подготовьте базу данных AlloyDB.

Давайте создадим кластер AlloyDB, экземпляр и таблицу, куда будут загружены данные о патентах.

Создайте объекты AlloyDB.

Создайте кластер и экземпляр с идентификатором кластера " patent-cluster ", паролем " alloydb ", совместимостью с PostgreSQL 15 и регионом " us-central1 ", сетевыми настройками " default ". Установите идентификатор экземпляра на " patent-instance ". Нажмите "СОЗДАТЬ КЛАСТЕР". Подробная информация о создании кластера приведена по этой ссылке: https://cloud.google.com/alloydb/docs/cluster-create .

Создайте таблицу

В AlloyDB Studio можно создать таблицу, используя приведенный ниже оператор DDL:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;

Включить расширения

Для создания приложения для поиска патентов мы будем использовать расширения pgvector и google_ml_integration. Расширение pgvector позволяет хранить и искать векторные представления. Расширение google_ml_integration предоставляет функции, которые вы используете для доступа к конечным точкам прогнозирования Vertex AI для получения прогнозов в формате SQL. Включите эти расширения, выполнив следующие DDL-скрипты:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

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

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

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Предоставьте учетной записи службы AlloyDB роль пользователя Vertex AI.

В консоли Google Cloud IAM предоставьте учетной записи службы AlloyDB (которая выглядит следующим образом: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) доступ к роли "Пользователь Vertex AI". В поле PROJECT_NUMBER будет указан номер вашего проекта.

В качестве альтернативы вы также можете предоставить доступ с помощью команды gcloud:

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"

Измените таблицу, добавив столбец «Вектор» для хранения векторных представлений.

Выполните приведенный ниже DDL-скрипт, чтобы добавить поле abstract_embeddings в только что созданную таблицу. Этот столбец позволит хранить векторные значения текста:

ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);

4. Загрузите данные о патентах в базу данных.

В качестве набора данных мы будем использовать общедоступные наборы данных патентов Google на платформе BigQuery. Для выполнения запросов мы будем использовать AlloyDB Studio. В репозитории alloydb-pgvector содержится скрипт insert_into_patents_data.sql который мы будем запускать для загрузки данных о патентах.

  1. В консоли Google Cloud откройте страницу AlloyDB .
  2. Выберите созданный кластер и щелкните по его экземпляру.
  3. В меню навигации AlloyDB нажмите AlloyDB Studio . Войдите в систему, используя свои учетные данные.
  4. Откройте новую вкладку, нажав на значок «Новая вкладка» справа.
  5. Скопируйте в редактор оператор insert из скрипта insert_into_patents_data.sql , упомянутого выше. Для быстрой демонстрации этого варианта использования можно скопировать от 50 до 100 операторов INSERT.
  6. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

5. Создайте векторные представления данных о патентах.

Для начала протестируем функцию встраивания, выполнив следующий пример запроса:

SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');

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

25a1d7ef0e49e91e.png

Обновите поле Abstract_Embeddings Vector.

Выполните приведенный ниже DML-запрос, чтобы обновить аннотации патентов в таблице, добавив в них соответствующие векторные представления:

UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);

6. Выполните векторный поиск.

Теперь, когда таблица, данные и векторные представления готовы, давайте выполним векторный поиск в реальном времени для поискового запроса пользователя. Вы можете проверить это, выполнив запрос ниже:

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

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

  1. Поисковый запрос пользователя: «Новая модель машинного обучения, связанная с обработкой естественного языка».
  2. Мы преобразуем его в векторные представления в методе embedding(), используя модель gemini-embedding-001.
  3. Символ "<=>" обозначает использование метода расстояния косинусного сходства.
  4. Мы преобразуем результат метода встраивания в векторный тип, чтобы обеспечить его совместимость с векторами, хранящимися в базе данных.
  5. LIMIT 10 означает, что мы выбираем 10 наиболее близких совпадений с поисковым текстом.

Ниже приведён результат:

8e77af965fc787ae.png

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

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

Готовы перенести это приложение в веб-браузер? Следуйте инструкциям ниже:

  1. Перейдите в редактор Cloud Shell и нажмите значок «Cloud Code — Войти» в левом нижнем углу (строка состояния) редактора. Выберите свой текущий проект Google Cloud, в котором включена оплата, и убедитесь, что вы также вошли в этот проект через Gemini (в правом углу строки состояния).
  2. Щелкните значок Cloud Code и дождитесь появления диалогового окна Cloud Code. Выберите «Новое приложение», а во всплывающем окне «Создать новое приложение» выберите приложение Cloud Functions:

a800ee1eb6cb8a5b.png

На странице 2/2 всплывающего окна «Создать новое приложение» выберите Java: Hello World, введите имя вашего проекта как "alloydb-pgvector" в нужном месте и нажмите OK:

5b09446ecf7d4f8d.png

  1. В полученной структуре проекта найдите файл pom.xml и замените его содержимым из файла репозитория. В нем должны присутствовать следующие зависимости, а также еще несколько:

2b3a3cdd75a57711.png

  1. Замените файл HelloWorld.java содержимым из файла репозитория .

Обратите внимание, что вам необходимо заменить приведенные ниже значения на ваши фактические данные:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

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

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('tgemini-embedding-001', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. Для развертывания только что созданной облачной функции выполните следующую команду в терминале Cloud Shell. Не забудьте сначала перейти в соответствующую папку проекта, используя команду:
cd alloydb-pgvector

Затем выполните команду:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

ВАЖНЫЙ ШАГ:

После завершения развертывания вы сможете увидеть функции в консоли Google Cloud Run Functions . Найдите созданную функцию, откройте ее, отредактируйте конфигурацию и внесите следующие изменения:

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

4e83ec8a339cda08.png

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

8126ec78c343f199.png

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

7baf980463a86a5c.png

  1. Нажмите кнопку СОЗДАТЬ, и этот соединитель должен появиться в списке настроек исходящего трафика.
  2. Выберите только что созданный соединитель.
  3. Выберите вариант, при котором весь трафик будет направляться через этот VPC-коннектор.

8. Протестируйте приложение.

После развертывания вы должны увидеть конечную точку в следующем формате:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

Вы можете проверить это в терминале Cloud Shell, выполнив следующую команду:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

Результат:

da3dcfac7d024031.png

Вы также можете протестировать его из списка Cloud Functions . Выберите развернутую функцию и перейдите на вкладку «ТЕСТИРОВАНИЕ». В текстовом поле «Настройка события запуска для запроса JSON» введите следующее:

{"search": "A new Natural Language Processing related Machine Learning Model"}

Нажмите кнопку «ПРОВЕРИТЬ ФУНКЦИЮ», и вы увидите результат в правой части страницы:

e21f806d661996ff.png

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

9. Уборка

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

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

10. Поздравляем!

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