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

Создать таблицу

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

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;

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

Запустите приведенный ниже оператор, чтобы разрешить выполнение функции «встраивания»:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

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

В консоли 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"

Измените таблицу, добавив столбец Vector для хранения внедрений.

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

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

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

В качестве нашего набора данных будут использоваться общедоступные наборы данных Google Patents на BigQuery. Мы будем использовать AlloyDB Studio для выполнения наших запросов. Репозиторий alydb-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 операторов вставки для быстрой демонстрации этого варианта использования.
  6. Нажмите «Выполнить» . Результаты вашего запроса появятся в таблице «Результаты» .

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

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

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

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

25a1d7ef0e49e91e.png

Обновите векторное поле Abstract_embeddings.

Запустите приведенный ниже DML, чтобы обновить рефераты патентов в таблице с соответствующими встраиваниями:

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

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

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

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

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

  1. Текст поиска пользователя: «Новая модель машинного обучения, связанная с обработкой естественного языка».
  2. Мы конвертируем его во встраивания в методе embedding(), используя модель: textembedding-gecko@003.
  3. «<=>» представляет собой использование метода расстояния COSINE SIMILARITY.
  4. Мы преобразуем результат метода внедрения в векторный тип, чтобы сделать его совместимым с векторами, хранящимися в базе данных.
  5. LIMIT 10 означает, что мы выбираем 10 наиболее близких совпадений искомого текста.

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

8e77af965fc787ae.png

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

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

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

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

a800ee1eb6cb8a5b.png

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

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

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

// 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('textembedding-gecko@003', '" + 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. Нажмите CREATE, и этот соединитель теперь должен быть указан в настройках исходящего трафика.
  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

Вы также можете протестировать его из списка облачных функций . Выберите развернутую функцию и перейдите на вкладку «ТЕСТИРОВАНИЕ». В текстовом поле «Настроить триггерное событие» для запроса 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. Объединив возможности AlloyDB , Vertex AI и Vector Search , мы сделали гигантский шаг вперед, сделав поиск литературы доступным, эффективным и по-настоящему осмысленным.