О практической работе
1. Обзор
В различных отраслях патентные исследования являются важнейшим инструментом для понимания конкурентной среды, выявления потенциальных возможностей лицензирования или приобретения, а также предотвращения нарушения существующих патентов.
Патентные исследования — обширная и сложная сфера. Просматривать бесчисленные технические аннотации в поисках релевантных инноваций — непростая задача. Традиционные поиски по ключевым словам часто неточны и требуют много времени. Аннотации слишком длинные и технически сложные, что затрудняет быстрое понимание основной идеи. Это может привести к тому, что исследователи упустят важные патенты или потратят время на нерелевантные результаты.
Секрет этой революции кроется в векторном поиске. Вместо того чтобы полагаться на простое сопоставление ключевых слов, векторный поиск преобразует текст в числовые представления (внедрения). Это позволяет нам искать по смыслу запроса, а не только по конкретным словам. В мире поиска литературы это настоящий прорыв. Представьте, что вы нашли патент на «носимый пульсометр», даже если точная фраза в документе не используется.
Цель
В этой лабораторной работе мы постараемся сделать процесс поиска патентов более быстрым, интуитивно понятным и невероятно точным, используя AlloyDB, расширение pgvector, а также встроенную платформу Gemini 1.5 Pro, встроенные функции и векторный поиск.
Что вы построите
В рамках этой лабораторной работы вы:
- Создайте экземпляр AlloyDB и загрузите данные из общедоступного набора данных Patents.
- Включить pgvector и расширения генеративных моделей ИИ в AlloyDB
- Генерация вложений из идей
- Выполнить поиск косинусного сходства в реальном времени для текста пользовательского поиска
- Разверните решение в бессерверных облачных функциях
На следующей диаграмме представлен поток данных и этапы реализации.
High level diagram representing the flow of the Patent Search Application with AlloyDB
Требования
2. Прежде чем начать
Создать проект
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и предустановленную вместе с bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.
- После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что проекту присвоен ваш идентификатор проекта, с помощью следующей команды:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы подтвердить, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не настроен, используйте следующую команду для его настройки:
gcloud config set project <YOUR_PROJECT_ID>
- Включите необходимые API. Вы можете использовать команду gcloud в терминале 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"
Измените таблицу, добавив столбец «Вектор» для хранения вложений.
Выполните следующий DDL-код, чтобы добавить поле abstract_embeddings в только что созданную таблицу. Этот столбец позволит хранить векторные значения текста:
ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);
4. Загрузить патентные данные в базу данных
В качестве набора данных мы будем использовать общедоступные наборы данных Google Patents в BigQuery. Для выполнения запросов мы будем использовать AlloyDB Studio. Репозиторий alloydb-pgvector содержит скрипт insert_into_patents_data.sql
, который мы запустим для загрузки патентных данных.
- В консоли Google Cloud откройте страницу AlloyDB .
- Выберите только что созданный кластер и щелкните экземпляр.
- В меню навигации AlloyDB выберите AlloyDB Studio . Войдите, используя свои учётные данные.
- Откройте новую вкладку, нажав на значок «Новая вкладка» справа.
- Скопируйте оператор запроса на
insert
из упомянутого выше скриптаinsert_into_patents_data.sql
в редактор. Вы можете скопировать 50–100 операторов для быстрой демонстрации этого варианта использования. - Нажмите кнопку «Выполнить» . Результаты запроса появятся в таблице «Результаты» .
5. Создание вложений для патентных данных
Сначала давайте протестируем функцию встраивания, выполнив следующий пример запроса:
SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Этот метод должен вернуть вектор вложений, который выглядит как массив чисел с плавающей точкой, для образца текста в запросе. Выглядит это примерно так:
Обновите векторное поле abstract_embeddings
Запустите приведенный ниже 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;
В этом запросе,
- Текст поиска пользователя: «Новая модель машинного обучения, связанная с обработкой естественного языка».
- Мы преобразуем его в встраивание в методе embedding(), используя модель: gemini-embedding-001.
- «<=>» представляет собой использование метода расстояния КОСИНУСНОГО ПОДОБИЯ.
- Мы преобразуем результат метода встраивания в векторный тип, чтобы сделать его совместимым с векторами, хранящимися в базе данных.
- LIMIT 10 означает, что мы выбираем 10 наиболее близких совпадений искомого текста.
Ниже представлен результат:
Как вы можете заметить в результатах, совпадения довольно близки к искомому тексту.
7. Перенести приложение в веб
Готовы опубликовать это приложение в интернете? Выполните следующие шаги:
- Откройте редактор Cloud Shell и нажмите значок «Cloud Code — Войти» в левом нижнем углу (строка состояния) редактора. Выберите текущий проект Google Cloud, в котором включена оплата, и убедитесь, что вы вошли в тот же проект через Gemini (в правом углу строки состояния).
- Нажмите на значок Cloud Code и дождитесь появления диалогового окна Cloud Code. Выберите «Новое приложение» и во всплывающем окне «Создать новое приложение» выберите приложение Cloud Functions:
На странице 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
Обратите внимание, что функция ожидает текст поиска в качестве входного параметра с ключом «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);
}
- Чтобы развернуть только что созданную облачную функцию, выполните следующую команду в терминале 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 секунд.
- Перейдите на вкладку ПОДКЛЮЧЕНИЯ:
- В настройках Ingress убедитесь, что выбран параметр «Разрешить весь трафик».
- В настройках выхода нажмите на раскрывающийся список «Сеть», выберите пункт «Добавить новый коннектор VPC» и следуйте инструкциям, которые вы увидите во всплывающем диалоговом окне:
- Укажите имя для VPC-коннектора и убедитесь, что регион совпадает с регионом вашего экземпляра. Оставьте значение «Сеть» по умолчанию и выберите для параметра «Подсеть» значение «Настраиваемый диапазон IP-адресов» (Custom IP Range) с диапазоном IP-адресов 10.8.0.0 или аналогичным доступным.
- Разверните ПОКАЗАТЬ ПАРАМЕТРЫ МАСШТАБИРОВАНИЯ и убедитесь, что у вас установлена следующая конфигурация:
- Нажмите кнопку СОЗДАТЬ, и этот соединитель теперь должен быть указан в настройках выхода.
- Выберите недавно созданный соединитель.
- Выберите, чтобы весь трафик направлялся через этот 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 и векторного поиска. Объединив возможности AlloyDB , Vertex AI и векторного поиска , мы сделали огромный шаг вперёд в обеспечении доступности, эффективности и осмысленности поиска литературы.