1. Обзор
В различных отраслях патентные исследования являются важнейшим инструментом для понимания конкурентной среды, выявления потенциальных возможностей лицензирования или приобретения, а также предотвращения нарушения существующих патентов.
Патентные исследования обширны и сложны. Проанализировать бесчисленные технические рефераты в поисках соответствующих инноваций — непростая задача. Традиционный поиск по ключевым словам часто бывает неточным и отнимает много времени. Тезисы длинные и технические, что затрудняет быстрое понимание основной идеи. Это может привести к тому, что исследователи упустят ключевые патенты или потратят время на получение нерелевантных результатов.
Секрет этой революции кроется в векторном поиске. Вместо того чтобы полагаться на простое сопоставление ключевых слов, векторный поиск преобразует текст в числовые представления (вложения). Это позволяет нам осуществлять поиск по смыслу запроса, а не только по конкретным используемым словам. В мире поиска литературы это меняет правила игры. Представьте себе, что вы нашли патент на «носимой пульсометр», даже если точная фраза не используется в документе.
Цель
В этой лаборатории мы будем работать над тем, чтобы сделать процесс поиска патентов более быстрым, интуитивным и невероятно точным, используя AlloyDB, расширение pgvector и встроенные приложения Gemini 1.5 Pro, Embeddings и Vector Search.
Что ты построишь
В рамках этой лабораторной работы вы:
- Создайте экземпляр AlloyDB и загрузите данные общедоступного набора данных патентов.
- Включите расширения pgvector и генеративной модели искусственного интеллекта в AlloyDB.
- Создание вложений на основе идей
- Выполняйте поиск косинусного сходства в реальном времени для текста поиска пользователя.
- Разверните решение в бессерверных облачных функциях.
На следующей диаграмме представлен поток данных и шаги, необходимые для реализации.
High level diagram representing the flow of the Patent Search Application with AlloyDB
Требования
2. Прежде чем начать
Создать проект
- В Google Cloud Console на странице выбора проекта выберите или создайте проект 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 в терминале 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
, который мы запустим для загрузки патентных данных.
- В консоли Google Cloud откройте страницу AlloyDB .
- Выберите вновь созданный кластер и щелкните экземпляр.
- В меню навигации AlloyDB нажмите AlloyDB Studio . Войдите, используя свои учетные данные.
- Откройте новую вкладку, щелкнув значок «Новая вкладка» справа.
- Скопируйте оператор запроса
insert
из сценарияinsert_into_patents_data.sql
, упомянутого выше, в редактор. Вы можете скопировать 50–100 операторов вставки для быстрой демонстрации этого варианта использования. - Нажмите «Выполнить» . Результаты вашего запроса появятся в таблице «Результаты» .
5. Создайте встраивания для данных о патентах.
Сначала давайте проверим функцию внедрения, выполнив следующий пример запроса:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Это должно вернуть вектор внедрения, который выглядит как массив чисел с плавающей запятой, для образца текста в запросе. Выглядит так:
Обновите векторное поле 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;
В этом запросе
- Текст поиска пользователя: «Новая модель машинного обучения, связанная с обработкой естественного языка».
- Мы конвертируем его во встраивания в методе embedding(), используя модель: textembedding-gecko@003.
- «<=>» представляет собой использование метода расстояния COSINE SIMILARITY.
- Мы преобразуем результат метода внедрения в векторный тип, чтобы сделать его совместимым с векторами, хранящимися в базе данных.
- LIMIT 10 означает, что мы выбираем 10 наиболее близких совпадений искомого текста.
Ниже приведен результат:
Как вы можете видеть по результатам, совпадения довольно близки к искомому тексту.
7. Разместите приложение в Интернете.
Готовы разместить это приложение в Интернете? Выполните следующие действия:
- Перейдите в редактор Cloud Shell и щелкните значок «Cloud Code — Войти» в левом нижнем углу (строке состояния) редактора. Выберите текущий проект Google Cloud, для которого включена оплата, и убедитесь, что вы также вошли в тот же проект из Gemini (в правом углу строки состояния).
- Щелкните значок Cloud Code и подождите, пока не появится диалоговое окно Cloud Code. Выберите «Новое приложение» и во всплывающем окне «Создать новое приложение» выберите приложение «Облачные функции»:
На странице 2/2 всплывающего окна «Создать новое приложение» выберите «Java: Hello World», введите имя вашего проекта как «alloydb-pgvector» в предпочитаемом вами месте и нажмите «ОК»:
- В полученной структуре проекта найдите pom.xml и замените его содержимым из файла репо. Он должен иметь эти зависимости в дополнение к еще паре:
- Замените файл 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);
}
- Чтобы развернуть только что созданную облачную функцию, выполните следующую команду из терминала 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 . Найдите вновь созданную функцию и откройте ее, отредактируйте конфигурации и измените следующее:
- Перейдите в раздел «Среда выполнения, сборка, подключения и настройки безопасности».
- Увеличьте таймаут до 180 секунд.
- Перейдите на вкладку ПОДКЛЮЧЕНИЯ:
- В настройках входящего трафика убедитесь, что выбран параметр «Разрешить весь трафик».
- В настройках «Выходной трафик» щелкните раскрывающийся список «Сеть», выберите параметр «Добавить новый соединитель VPC» и следуйте инструкциям, которые вы увидите во всплывающем диалоговом окне:
- Укажите имя соединителя VPC и убедитесь, что регион совпадает с регионом вашего экземпляра. Оставьте значение «Сеть» по умолчанию и установите «Подсеть» в качестве «Пользовательский диапазон IP-адресов» с доступным диапазоном IP-адресов 10.8.0.0 или чем-то похожим.
- Разверните ПОКАЗАТЬ НАСТРОЙКИ МАСШТАБИРОВАНИЯ и убедитесь, что у вас установлена следующая конфигурация:
- Нажмите CREATE, и этот соединитель теперь должен быть указан в настройках исходящего трафика.
- Выберите вновь созданный соединитель
- Выберите маршрутизацию всего трафика через этот соединитель 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"}'
Результат:
Вы также можете протестировать его из списка облачных функций . Выберите развернутую функцию и перейдите на вкладку «ТЕСТИРОВАНИЕ». В текстовом поле «Настроить триггерное событие» для запроса json введите следующее:
{"search": "A new Natural Language Processing related Machine Learning Model"}
Нажмите кнопку ПРОВЕРИТЬ ФУНКЦИЮ, и вы увидите результат в правой части страницы:
Вот и все! Выполнить поиск вектора сходства с использованием модели Embeddings для данных AlloyDB очень просто.
9. Очистка
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом посте, выполните следующие действия:
- В консоли Google Cloud перейдите в раздел «Управление» .
- страница ресурсов .
- В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу» , чтобы удалить проект.
10. Поздравления
Поздравляем! Вы успешно выполнили поиск по сходству с помощью поиска AlloyDB, pgvector и Vector. Объединив возможности AlloyDB , Vertex AI и Vector Search , мы сделали гигантский шаг вперед, сделав поиск литературы доступным, эффективным и по-настоящему осмысленным.