Compila una aplicación de búsqueda de patentes con Spanner, búsqueda de vectores y Gemini 1.0 Pro

1. Descripción general

En diferentes industrias, la investigación de patentes es una herramienta fundamental para comprender el panorama competitivo, identificar posibles oportunidades de adquisición o licenciamiento, y evitar infringir patentes existentes.

La investigación de patentes es vasta y compleja. Examinar incontables resúmenes técnicos para encontrar innovaciones relevantes es una tarea abrumadora. Las búsquedas tradicionales basadas en palabras clave suelen ser imprecisas y llevar mucho tiempo. Los resúmenes son largos y técnicos, lo que dificulta comprender la idea principal con rapidez. Esto puede provocar que los investigadores pierdan patentes clave o pierdan tiempo en resultados irrelevantes.

Objetivo

En este codelab, trabajaremos para que el proceso de búsqueda de patentes sea más rápido, intuitivo y muy preciso aprovechando Spanner y Gemini 1.0 Pro, las incorporaciones y la búsqueda vectorial en las instalaciones.

Qué compilarás

Como parte de este lab, harás lo siguiente:

  1. Crear una instancia de Spanner
  2. Carga un conjunto de datos públicos de Google Patents
  3. Crea un modelo remoto para las incorporaciones de texto con el modelo Gemini 1.0 Pro
  4. Crea estadísticas generativas a partir del conjunto de datos cargado
  5. Genera incorporaciones a partir de las estadísticas
  6. Realiza consultas de búsqueda de similitud en el conjunto de datos

En el siguiente diagrama, se representa el flujo de datos y los pasos involucrados en la implementación.

14cfdde5e24258a.png

Requisitos

  • Un navegador, como Chrome o Firefox.
  • Un proyecto de Google Cloud con facturación habilitada.

2. Antes de comenzar

Crea un proyecto

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información para verificar si la facturación está habilitada en un proyecto .
  3. Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq. Haz clic en Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Imagen del botón Activar Cloud Shell

  1. Una vez que te conectes a Cloud Shell, verifica que ya te hayas autenticado y que el proyecto esté configurado con tu ID con el siguiente comando:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
  1. Busca las APIs de Vertex AI y Spanner en la consola para asegurarte de que estén habilitadas. Como alternativa, también puedes usar el siguiente comando en la terminal de Cloud Shell:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

Otra alternativa es usar este vínculo.

Consulta la documentación para ver los comandos y el uso de gcloud.

3. Prepara tu base de datos de Spanner

Crear una instancia, una base de datos y una tabla de Spanner en las que se cargará el conjunto de datos de patentes

Crear una instancia de Spanner

  1. Crea una instancia de Spanner llamada spanner-vertex.
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

Crea una base de datos

  1. En la consola de Google Cloud, abre la página Spanner.
  2. Selecciona la instancia de spanner-vertex de la lista.
  3. En Bases de datos, haz clic en Crear base de datos.
  4. Establece el nombre de la base de datos como patents.
  5. Haz clic en Crear para crear la base de datos.

Crea una tabla

  1. En la consola de Google Cloud, abre la página Spanner.
  2. Selecciona la instancia de spanner-vertex de la lista.
  3. Selecciona la base de datos patents.
  4. En la pestaña Tablas, haz clic en Crear tabla. Se abrirá la página de Spanner Studio.
  5. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  6. Ejecute la siguiente 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. Carga datos de patentes en la base de datos

Los conjuntos de datos públicos de Google Patents en BigQuery se usarán como nuestro conjunto de datos. Usaremos Spanner Studio para ejecutar nuestras consultas. El repositorio spanner-gemini-search incluye la secuencia de comandos insert_into_patents_data.sql que ejecutaremos para cargar los datos de patentes.

  1. En la consola de Google Cloud, abre la página Spanner.
  2. Selecciona la instancia de spanner-vertex de la lista.
  3. Selecciona la base de datos patents.
  4. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  5. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  6. Copia la sentencia de consulta insert de la secuencia de comandos insert_into_patents_data.sql en el editor. Puedes copiar entre 50 y 100 instrucciones de inserción para una demostración rápida de este caso de uso.
  7. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

5. Crea un modelo remoto para Gemini 1.0 Pro

Después de cargar los datos de las patentes en la base de datos, crearemos un modelo remoto que use el modelo de Vertex AI Gemini 1.0 Pro para generar un conjunto resumido de títulos y palabras clave.

Ejecuta el siguiente comando DDL en el editor de Spanner Studio:

  1. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  2. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  3. Ejecute la siguiente 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. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

6. Crea un modelo remoto para las incorporaciones de texto

El resultado del paso anterior incluye un resumen consolidado que consta de un título y palabras clave. Convertiremos esta respuesta en incorporaciones que nos ayudarán a generar coincidencias adecuadas cuando ejecutemos una consulta. Usaremos el Text Embedding Gecko 003 model de Vertex AI de forma remota desde Spanner.

  1. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  2. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  3. Ejecute la siguiente 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. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

7. Crea estadísticas generativas a partir de resúmenes de patentes

Crearemos una tabla patents_data_gemini para almacenar las estadísticas generativas que generaremos con el modelo de Gemini 1.5 Pro que creamos antes.

Crea la tabla

  1. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  2. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  3. Ejecute la siguiente consulta:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

Generar estadísticas

Para propagar la tabla con estadísticas generativas, se recomienda que uses una aplicación que use el método de escritura por lotes o mutaciones. En este codelab, ejecutaremos la siguiente consulta DDL hasta 4 veces para propagar la tabla.

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

Nota: Si recibes el error Se excedió la cuota en este paso (posible en el caso de los créditos gratuitos con margen pequeño), intenta omitir la inserción y ejecuta solo la consulta de selección en la sección de solución que se indica a continuación.

Sección de solución 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
))

Observa las estadísticas

La tabla incluye las estadísticas que se generan para la instrucción 'Identify the areas of work or keywords in this abstract', en la consulta.

Nota: Si ejecutaste la consulta de la sección de solución anterior en lugar de la DDL INSERT, omite esta parte y ejecuta la última consulta SELECT de esta página.

Ejecutemos la siguiente consulta para verificar los resultados de las estadísticas:

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

Se muestran los siguientes resultados:

6041fab164aaab93.png

Nota: Si ejecutaste la consulta de la sección de solución alternativa, reemplaza el nombre de la tabla en la consulta de selección anterior por la consulta de la sección de solución alternativa. Por lo tanto, ejecutarías lo siguiente:

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;

El resultado debería ser el mismo que el de la captura de pantalla anterior.

8. Genera incorporaciones para las estadísticas generadas

Después de completar las estadísticas en nuestra tabla, ahora podemos usarlas para generar incorporaciones. Estas incorporaciones nos ayudan a no depender de las coincidencias exactas de palabras clave, sino a generar resultados en función de las similitudes conceptuales.

Nota: Si ejecutaste la consulta de la sección de solución alternativa en el paso anterior, puedes omitirla y pasar a la consulta de la sección de solución alternativa en este paso.

Ejecuta la siguiente consulta para generar incorporaciones:

  1. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  2. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  3. Ejecuta la siguiente consulta para crear la tabla patents_data_embeddings.
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.
  2. Ejecuta la siguiente consulta para generar incorporaciones.
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. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

Observa los resultados

La tabla incluye las incorporaciones generadas para el título y el texto resumido.

Ejecutemos la siguiente consulta para verificar los resultados:

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

Se muestran los siguientes resultados:

a1e968bac4ab1cb.png

Sección de solución alternativa:

Usa esta consulta si realizaste la sección de solución alternativa en otros pasos:

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;

Esto debería generar los mismos resultados que se muestran en la captura de pantalla anterior.

9. Prepárate para la búsqueda vectorial

Ahora que generamos incorporaciones de texto, podemos preparar nuestra aplicación web para que esté lista para realizar búsquedas de vectores de similitud. En este codelab, crearemos una aplicación web que incluya la lógica para mostrar resultados de la búsqueda en función de la función de búsqueda de similitud de vecino más cercano. Puedes usar este conjunto de datos preparado con una app de búsqueda para visualizar cómo aparecen los resultados de la búsqueda.

En nuestro codelab, ejecutaremos una consulta de muestra que busque una instrucción, genere resultados en función del contexto y limite los resultados a 10 entradas.

Ejecute la siguiente consulta:

  1. En el menú de navegación, haz clic en Spanner Studio. En el panel Explorador, se muestra una lista de los objetos de tu base de datos.
  2. Para abrir una pestaña nueva, haz clic en la Nueva pestaña del editor de SQL.
  3. Ejecuta la siguiente consulta para crear la tabla 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. Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.

Nota: Si usaste las consultas de la sección de solución alternativa, debido a errores de cuota en una de las primeras instrucciones de inserción, puedes omitir todos los demás pasos y ejecutar directamente la siguiente consulta para observar los resultados de realizar una búsqueda de vecino más cercano en las incorporaciones de vectores en la base de datos de 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;

Observa los resultados

La consulta anterior usa el método COSINE_DISTANCE para encontrar las 10 coincidencias más cercanas para nuestra instrucción.

Se muestran los siguientes resultados:

d26ca8b8238bdf25.png

Los resultados que se generan son bastante cercanos contextualmente a la instrucción que formaba parte de la consulta.

10. Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.
  2. En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar. Si no quieres borrar el proyecto, simplemente borra la instancia que creaste en Spanner.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.

11. Felicitaciones

¡Felicitaciones! Realizaste correctamente una búsqueda de similitud con la búsqueda vectorial integrada de Spanner. Además, viste lo fácil que es trabajar con modelos de inserción y LLM para proporcionar funciones de IA generativa directamente con SQL.

Próximos pasos

Obtén más información sobre la función de vecino más cercano exacto (búsqueda vectorial de KNN) de Spanner aquí: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors.

También puedes obtener más información para realizar predicciones en línea con SQL mediante la integración de VertexAI de Spanner aquí: https://cloud.google.com/spanner/docs/ml