Crie um app de pesquisa de patentes com o Spanner, a pesquisa de vetores e Gemini 1.0 Pro

1. Visão geral

Em diferentes setores, a pesquisa de patentes é uma ferramenta essencial para entender o cenário competitivo, identificar possíveis oportunidades de licenciamento ou aquisição e evitar a violação de patentes existentes.

A pesquisa de patentes é vasta e complexa. Examinar inúmeros resumos técnicos para encontrar inovações relevantes é uma tarefa assustadora. As pesquisas tradicionais com base em palavras-chave geralmente são imprecisas e demoradas. Resumos são longos e técnicos, o que dificulta a compreensão rápida da ideia central. Isso pode levar os pesquisadores a perderem patentes importantes ou perderem tempo com resultados irrelevantes.

Objetivo

Neste codelab, vamos trabalhar para tornar o processo de pesquisa de patentes mais rápido, intuitivo e incrivelmente preciso, aproveitando o Spanner e o Gemini 1.0 Pro, os embeddings e a pesquisa vetorial.

O que você vai criar

Como parte deste laboratório, você vai:

  1. Criar uma instância do Spanner
  2. Carregar conjuntos de dados públicos do Google Patentes
  3. Criar um modelo remoto para embeddings de texto com o modelo Gemini 1.0 Pro
  4. Criar insights generativos com base no conjunto de dados carregado
  5. Gerar embeddings dos insights
  6. Emitir consultas de pesquisa por semelhança no conjunto de dados

O diagrama a seguir representa o fluxo de dados e as etapas envolvidas na implementação.

14cfdde5e24258a.png

Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Ter um projeto do Google Cloud com o faturamento ativado.

2. Antes de começar

Criar um projeto

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto .
  3. Você usará o Cloud Shell, um ambiente de linha de comando em execução no Google Cloud que vem pré-carregado com o bq. Clique em "Ativar o Cloud Shell" na parte de cima do console do Google Cloud.

Imagem do botão "Ativar o Cloud Shell"

  1. Depois de se conectar ao Cloud Shell, verifique se você já está autenticado e se o projeto está configurado com o ID do seu projeto usando o seguinte comando:
gcloud auth list
  1. Execute o comando a seguir no Cloud Shell para confirmar que o comando gcloud conhece seu projeto.
gcloud config list project
  1. Se o projeto não estiver definido, use este comando:
gcloud config set project <YOUR_PROJECT_ID>
  1. Verifique se as APIs Vertex AI e Spanner estão ativadas pesquisando-as no console. Como alternativa, também é possível usar o seguinte comando no terminal do Cloud Shell:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

Outra alternativa é usar este link.

Consulte a documentação para ver o uso e os comandos gcloud.

3. Prepare o banco de dados do Spanner

Vamos criar uma instância, um banco de dados e uma tabela do Spanner em que o conjunto de dados de patentes será carregado.

Criar uma instância do Spanner

  1. Crie uma instância do Spanner chamada spanner-vertex.
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

Criar um banco de dados

  1. No console do Google Cloud, abra a página Spanner.
  2. Selecione a instância spanner-vertex na lista.
  3. Em Bancos de dados, clique em Criar banco de dados.
  4. Defina o nome do banco de dados como patentes.
  5. Clique em Criar para criar o banco de dados.

Criar uma tabela

  1. No console do Google Cloud, abra a página Spanner.
  2. Selecione a instância spanner-vertex na lista.
  3. Selecione o banco de dados patents.
  4. Na guia Tabelas, clique em Criar tabela. A página do Spanner Studio vai ser aberta.
  5. Abra uma nova guia clicando na Nova guia do editor SQL.
  6. Execute a seguinte consulta:
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. Carregar dados de patentes no banco de dados

Nosso conjunto de dados será usado com os conjuntos de dados públicos do Google Patentes no BigQuery. Vamos usar o Spanner Studio para executar nossas consultas. O repositório spanner-gemini-search inclui o script insert_into_patents_data.sql que vamos executar para carregar os dados de patente.

  1. No console do Google Cloud, abra a página Spanner.
  2. Selecione a instância spanner-vertex na lista.
  3. Selecione o banco de dados patents.
  4. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  5. Abra uma nova guia clicando na Nova guia do editor SQL.
  6. Copie a instrução de consulta insert do script insert_into_patents_data.sql no editor. Você pode copiar de 50 a 100 declarações de inserção para uma demonstração rápida desse caso de uso.
  7. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

5. Criar um modelo remoto para o Gemini 1.0 Pro

Depois que os dados da patente forem carregados no banco de dados, vamos criar um modelo remoto que usa o modelo da Vertex AI do Gemini 1.0 Pro para gerar um conjunto resumido de títulos e palavras-chave.

Execute o seguinte comando DDL no editor do Spanner Studio:

  1. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  2. Abra uma nova guia clicando na Nova guia do editor SQL.
  3. Execute a seguinte consulta:
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. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

6. Criar modelo remoto para embeddings de texto

O resultado da etapa anterior inclui um resumo consolidado que consiste em um título e palavras-chave. Vamos converter essa resposta em embeddings que vão nos ajudar a gerar correspondências apropriadas quando executarmos uma consulta. Vamos usar o Text Embedding Gecko 003 model da Vertex AI remotamente no Spanner.

  1. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  2. Abra uma nova guia clicando na Nova guia do editor SQL.
  3. Execute a seguinte consulta:
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. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

7. Criar insights generativos usando resumos de patentes

Vamos criar uma tabela patents_data_gemini para armazenar os insights generativos que vamos gerar usando o modelo Gemini 1.5 Pro que criamos anteriormente.

Criar a tabela

  1. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  2. Abra uma nova guia clicando na Nova guia do editor SQL.
  3. Execute a seguinte consulta:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

Gerar insights

Para preencher a tabela com insights generativos, recomendamos usar um aplicativo que use o método de gravação ou mutações em lote. Neste codelab, vamos executar a seguinte consulta DDL até quatro vezes para preencher a tabela.

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
));

Observação:se você receber o erro "Cota excedida" nessa etapa (possível no caso de créditos livres com margem pequena), tente pular a inserção e executar apenas a consulta de seleção na seção de solução alternativa abaixo.

Seção alternativa:

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
))

Observar os insights

A tabela inclui insights que são gerados para o comando 'Identify the areas of work or keywords in this abstract', na consulta.

Observação:se você executou a consulta da seção da solução alternativa acima, em vez do DDL INSERT, pule esta parte e execute a última consulta SELECT nesta página.

Vamos executar a seguinte consulta para verificar os resultados dos insights:

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

Os seguintes resultados são vistos:

6041fab164aaab93.png

Observação:se você executou a consulta da seção de solução alternativa, substitua o nome da tabela na consulta selecionada acima pela consulta na seção de solução alternativa. Então, execute o seguinte comando:

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;

O resultado deve ser o mesmo da captura de tela acima.

8. Gerar embeddings para os insights gerados

Depois de preencher os insights na nossa tabela, podemos usá-los para gerar embeddings. Esses embeddings ajudam a não depender de correspondências exatas de palavra-chave, mas geram resultados com base em semelhanças conceituais.

Observação:se você executou a consulta da seção de solução alternativa na etapa anterior, pode pular isso e passar para a consulta da seção de solução alternativa nesta etapa também.

Execute a seguinte consulta para gerar embeddings:

  1. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  2. Abra uma nova guia clicando na Nova guia do editor SQL.
  3. Execute a consulta a seguir para criar a tabela patents_data_embeddings.
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.
  2. Execute a consulta a seguir para gerar embeddings.
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. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

Observar os resultados

A tabela inclui embeddings gerados para o título e o texto abstrato.

Vamos executar a seguinte consulta para conferir os resultados:

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

Os seguintes resultados são vistos:

a1e968bac4ab1cb.png

Seção de alternativas:

Use esta consulta se você seguiu a seção de solução alternativa em outras etapas:

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;

O resultado vai ser os mesmos mostrados na captura de tela acima.

9. Preparar-se para a pesquisa de vetores

Agora que geramos embeddings de texto, podemos preparar nosso aplicativo da Web para estar pronto para realizar pesquisas de vetores de similaridade. Neste codelab, estamos criando um aplicativo da Web que inclui a lógica para fornecer resultados de pesquisa com base no recurso de pesquisa por similaridade K-Nearest Neighbors (link em inglês). Você pode usar esse conjunto de dados preparado com um app de pesquisa para conferir como os resultados aparecem.

No nosso codelab, vamos executar um exemplo de consulta que procura um comando, gera resultados com base no contexto e limita os resultados a 10 entradas.

Execute a seguinte consulta:

  1. No menu de navegação, clique em Spanner Studio. O painel Explorer mostra uma lista dos objetos no seu banco de dados.
  2. Abra uma nova guia clicando na Nova guia do editor SQL.
  3. Execute a consulta a seguir para criar a tabela 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. Clique em Executar. Os resultados da consulta aparecem na tabela Resultados.

Observação:se você usou as consultas na seção alternativa, devido a erros de cota em uma das instruções de inserção mais antigas, pule todas as outras etapas e execute a consulta abaixo diretamente para observar os resultados da pesquisa de vizinho mais próximo em embeddings de vetores no banco de dados do 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;

Observar os resultados

A consulta anterior usa o método COSINE_DISTANCE para encontrar as 10 correspondências mais próximas para o comando.

Os seguintes resultados são vistos:

d26ca8b8238bdf25.png

os resultados gerados estão muito próximos do comando que fez parte da consulta.

10. Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir. Se você não quiser excluir o projeto, basta excluir a instância criada no Spanner.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

11. Parabéns

Parabéns! Você realizou uma pesquisa por similaridade usando a pesquisa de vetores integrada do Spanner. Além disso, você viu como é fácil trabalhar com modelos LLM e embedding para fornecer funcionalidades de IA generativa diretamente usando SQL.

A seguir

Saiba mais sobre o recurso de vizinho mais próximo exato (pesquisa de vetor KNN) do Spanner aqui: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Também é possível ler mais sobre como realizar previsões on-line com SQL usando a integração da Vertex AI do Spanner aqui: https://cloud.google.com/spanner/docs/ml