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 violações de patentes existentes.

A pesquisa de patentes é vasta e complexa. Analisar inúmeros resumos técnicos para encontrar inovações relevantes é uma tarefa difícil. As pesquisas tradicionais baseadas em palavras-chave costumam ser imprecisas e demoradas. Os resumos são longos e técnicos, o que dificulta a compreensão rápida da ideia principal. Isso pode fazer com que os pesquisadores percam patentes importantes ou percam tempo com resultados irrelevantes.

Objetivo

Neste codelab, vamos trabalhar para tornar o processo de pesquisa de patentes mais rápido, intuitivo e incrivelmente preciso usando o Spanner e o Gemini 1.0 Pro, incorporações e pesquisa vetorial no local.

O que você vai criar

Neste laboratório, você vai:

  1. Criar uma instância do Spanner
  2. Carregar um conjunto 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 com base nos insights
  6. Emitir consultas de pesquisa por similaridade 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ê vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud que vem pré-carregado com 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 sua conta já está autenticada 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 se o comando gcloud sabe sobre 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 por elas no console. Como alternativa, use 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. Preparar 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 "patents".
  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 em Nova guia do editor de 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

Os conjuntos de dados públicos do Google Patentes no BigQuery serão usados como nosso conjunto de dados. 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 patentes.

  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 em Nova guia do editor de 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 instruçõ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 de patentes forem carregados no banco de dados, vamos criar um modelo remoto que usa o modelo Gemini 1.0 Pro da Vertex AI para gerar um conjunto resumido de título 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 em Nova guia do editor de 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 com um título e palavras-chave. Vamos converter essa resposta em incorporações que nos ajudarão a gerar correspondências adequadas 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 em Nova guia do editor de 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 com resumos de patentes

Vamos criar uma tabela patents_data_gemini para armazenar insights generativos que serão gerados usando o modelo Gemini 1.5 Pro criado 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 em Nova guia do editor de 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 em lote ou mutações. 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 um erro de cota excedida nesta etapa (possível no caso de créditos sem custo financeiro com pequena margem), tente pular a inserção e execute apenas a consulta de seleção na seção de solução alternativa abaixo.

Seção de alternativas:

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 insights

A tabela inclui insights 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 de solução alternativa acima em vez da DDL INSERT, pule esta parte e execute a última consulta SELECT nesta página.

Vamos executar a consulta a seguir 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 exibidos:

6041fab164aaab93.png

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

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 será igual ao da captura de tela acima.

8. Gerar embeddings para os insights gerados

Depois de preencher os insights na tabela, podemos usar esses insights para gerar embeddings. Esses embeddings nos ajudam a não depender de correspondências exatas de palavras-chave, mas a gerar resultados com base em semelhanças conceituais.

Observação:se você executou a consulta da seção de solução alternativa na etapa anterior, pule esta e vá para a consulta da seção de solução alternativa nesta etapa também.

Execute a consulta a seguir 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 em Nova guia do editor de 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 resultados

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

Execute a consulta a seguir para verificar 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 exibidos:

a1e968bac4ab1cb.png

Seção de alternativas:

Use esta consulta se você fez 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;

Isso vai gerar os mesmos resultados mostrados na captura de tela acima.

9. Preparar para a pesquisa vetorial

Agora que geramos embeddings de texto, podemos preparar nosso aplicativo da Web para realizar pesquisas vetoriais de similaridade. Neste codelab, vamos criar um aplicativo da Web que inclui a lógica para fornecer resultados de pesquisa com base na capacidade de pesquisa de similaridade de K-Nearest Neighbors. Você pode usar esse conjunto de dados preparado com um app de pesquisa para visualizar como os resultados da pesquisa aparecem.

No nosso codelab, vamos executar uma consulta de exemplo que pesquisa 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 em Nova guia do editor de 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 de solução alternativa devido a erros de cota em uma das primeiras instruções de inserção, pule todas as outras etapas e execute diretamente a consulta abaixo para observar os resultados da pesquisa do vizinho mais próximo em embeddings de vetor 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 resultados

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

Os seguintes resultados são exibidos:

d26ca8b8238bdf25.png

Os resultados gerados são contextualmente muito próximos ao comando que fazia 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 de similaridade usando a pesquisa vetorial integrada do Spanner. Além disso, você viu como é fácil trabalhar com modelos de embedding e LLM para oferecer funcionalidade de IA generativa diretamente usando SQL.

A seguir

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

Leia mais sobre como fazer previsões on-line com SQL usando a integração do Spanner com a Vertex AI: https://cloud.google.com/spanner/docs/ml