Создайте приложение для патентного поиска с помощью Spanner, Vector Search & Близнецы 1.0 Про!

1. Обзор

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

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

Цель

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

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

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

  1. Создайте экземпляр Spanner.
  2. Загрузите общедоступные наборы данных патентов Google.
  3. Создайте удалённую модель для встраивания текста с помощью модели Gemini 1.0 Pro.
  4. Создавайте генеративные аналитические выводы на основе загруженного набора данных.
  5. Сгенерируйте векторные представления на основе полученных данных.
  6. Выполните поисковые запросы на выявление сходства в наборе данных.

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

14cfdde5e24258a.png

Требования

  • Браузер, например 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 Vertex AI и Spanner включены, найдя их в консоли. В качестве альтернативы вы также можете использовать следующую команду в терминале Cloud Shell:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

Другой вариант — воспользоваться этой ссылкой .

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

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

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

Создайте экземпляр Spanner.

  1. Создайте экземпляр Spanner с именем spanner-vertex .
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

Создайте базу данных

  1. В консоли Google Cloud откройте страницу Spanner .
  2. Выберите экземпляр spanner-vertex из списка.
  3. В разделе «Базы данных» нажмите «Создать базу данных» .
  4. Задайте имя базы данных как patents.
  5. Нажмите «Создать» , чтобы создать базу данных.

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

  1. В консоли Google Cloud откройте страницу Spanner .
  2. Выберите экземпляр spanner-vertex из списка.
  3. Выберите базу данных patents .
  4. На вкладке «Таблицы» нажмите «Создать таблицу» . Откроется страница Spanner Studio.
  5. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  6. Выполните следующий запрос:
CREATE TABLE patents_data (
   id string(25), type string(25), number string(20), country string(2), date string(20), abstract string(300000), title string(100000),kind string(5), num_claims numeric, filename string(100), withdrawn numeric, 
) PRIMARY KEY (id);

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

В качестве набора данных мы будем использовать общедоступные наборы данных патентов Google на платформе BigQuery. Для выполнения запросов мы будем использовать Spanner Studio. В репозитории spanner-gemini-search находится скрипт insert_into_patents_data.sql , который мы будем запускать для загрузки данных о патентах.

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

5. Создайте удаленную модель для Gemini 1.0 Pro

После загрузки данных о патентах в базу данных мы создадим удаленную модель, которая будет использовать модель искусственного интеллекта Gemini 1.0 Pro Vertex для генерации сводного набора заголовков и ключевых слов.

Выполните следующую команду DDL в редакторе Spanner Studio:

  1. В меню навигации щелкните Spanner Studio . В панели «Проводник» отобразится список объектов в вашей базе данных.
  2. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  3. Выполните следующий запрос:
CREATE MODEL gemini_pro_model INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

6. Создайте удаленную модель для встраивания текста.

Результат предыдущего шага включает в себя сводную информацию, состоящую из заголовка и ключевых слов. Мы преобразуем этот ответ в векторные представления, которые помогут нам генерировать подходящие совпадения при выполнении запроса. Мы будем использовать Text Embedding Gecko 003 model от Vertex AI, удаленно подключенную к Spanner.

  1. В меню навигации щелкните Spanner Studio . В панели «Проводник» отобразится список объектов в вашей базе данных.
  2. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  3. Выполните следующий запрос:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
 embeddings
   STRUCT<
     statistics STRUCT<truncated BOOL, token_count FLOAT64>,
     values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
 endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/textembedding-gecko@003');
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

7. Создавайте генеративные идеи на основе аннотаций к патентам.

Мы создадим таблицу patents_data_gemini для хранения результатов генерации аналитических выводов, которые мы получим, используя модель Gemini 1.5 Pro, созданную нами ранее.

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

  1. В меню навигации щелкните Spanner Studio . В панели «Проводник» отобразится список объектов в вашей базе данных.
  2. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  3. Выполните следующий запрос:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

Получайте ценные аналитические данные.

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

INSERT INTO patents_data_gemini (id, gemini_response)
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b where id not in (select id from patents_data_gemini) limit 50
));

Примечание: Если на этом этапе возникает ошибка «Превышен лимит квоты» (что возможно в случае небольших сумм бесплатных кредитов), попробуйте пропустить операцию вставки и выполнить только запрос SELECT, описанный в разделе обходных решений ниже.

Раздел «Временное решение»:

SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))

Обратите внимание на полученные данные.

В таблице представлены результаты анализа, полученные в ответ на вопрос 'Identify the areas of work or keywords in this abstract', из поискового запроса.

Примечание: Если вы выполнили запрос из раздела с обходным решением вместо запроса INSERT DDL, пропустите этот раздел и выполните вместо него последний запрос SELECT на этой странице.

Давайте выполним следующий запрос, чтобы проверить результаты анализа:

select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;

Получены следующие результаты:

6041fab164aaab93.png

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

select title, abstract, gemini_response from patents_data a inner join (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))) b
on a.id = b.id;

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

8. Сгенерируйте векторные представления для полученных результатов анализа.

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

Примечание: Если вы выполняли запрос по разделу "Обходные пути" на предыдущем шаге, вы можете пропустить этот шаг и перейти к запросу по разделу "Обходные пути" и на этом шаге.

Выполните следующий запрос для генерации эмбеддингов:

  1. В меню навигации щелкните Spanner Studio . В панели «Проводник» отобразится список объектов в вашей базе данных.
  2. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  3. Выполните следующий запрос для создания таблицы patents_data_embeddings .
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .
  2. Выполните следующий запрос для генерации эмбеддингов.
INSERT INTO patents_data_embeddings (id, patents_embeddings)
SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM patents_data_gemini));
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

Проанализируйте результаты.

В таблице представлены векторные представления, сгенерированные для заголовка и аннотированного текста.

Давайте выполним следующий запрос, чтобы проверить результаты:

select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;

Получены следующие результаты:

a1e968bac4ab1cb.png

Раздел «Временные решения» :

Если вы использовали обходной путь на других этапах, воспользуйтесь этим запросом:

select title, abstract, b.patents_embeddings from patents_data a inner join 
(SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
)))))) b
on a.id = b.id;

В результате должны получиться те же результаты, что показаны на скриншоте выше.

9. Подготовка к векторному поиску

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

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

Выполните следующий запрос:

  1. В меню навигации щелкните Spanner Studio . В панели «Проводник» отобразится список объектов в вашей базе данных.
  2. Откройте новую вкладку, щелкнув вкладку «Новый редактор SQL» .
  3. Выполните следующий запрос для создания таблицы patents_data_embeddings .
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join patents_data_gemini b on a.id = b.id
inner join patents_data_embeddings c on a.id = c.id
ORDER BY distance
LIMIT 10;
  1. Нажмите кнопку «Выполнить» . Результаты вашего запроса отобразятся в таблице «Результаты» .

Примечание: Если вы использовали запросы из раздела с обходными решениями из-за ошибок квот в одном из первых операторов вставки, вы можете пропустить все остальные шаги и сразу выполнить приведенный ниже запрос, чтобы увидеть результаты поиска ближайшего соседа по векторным представлениям в базе данных Spanner:

SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join (SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b 
)))))) c on a.id = c.id
ORDER BY distance
LIMIT 2;

Проанализируйте результаты.

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

Получены следующие результаты:

d26ca8b8238bdf25.png

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

10. Уборка

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

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

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

Поздравляем! Вы успешно выполнили поиск сходства, используя встроенный в Spanner векторный поиск. Кроме того, вы убедились, насколько легко работать с моделями встраивания и LLM для обеспечения функциональности генеративного ИИ непосредственно с помощью SQL.

Что дальше?

Подробнее о функции поиска ближайшего соседа (KNN-векторный поиск) в Spanner можно узнать здесь: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Вы также можете узнать больше о том, как выполнять онлайн-прогнозирование с помощью SQL, используя интеграцию Spanner с VertexAI, здесь: https://cloud.google.com/spanner/docs/ml