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.
El ingrediente secreto detrás de esta revolución se encuentra en la Búsqueda de vectores. En lugar de depender de la coincidencia de palabras clave simple, la búsqueda de vectores transforma el texto en representaciones numéricas (incorporaciones). Esto nos permite realizar búsquedas en función del significado de la consulta, no solo de las palabras específicas que se usan. En el mundo de las búsquedas de literatura, esto es un cambio radical. Imagina que encuentras una patente para un “monitor de frecuencia cardíaca portátil”, incluso si no se usa la frase exacta en el documento.
Objetivo
En este codelab, trabajaremos para que el proceso de búsqueda de patentes sea más rápido, intuitivo y muy preciso aprovechando AlloyDB, la extensión pgvector y Gemini 1.5 Pro, las incorporaciones y la búsqueda vectorial en el lugar.
Qué compilarás
Como parte de este lab, harás lo siguiente:
- Crea una instancia de AlloyDB y carga datos del conjunto de datos públicos de Patents
- Habilita las extensiones de modelos de IA generativa y pgvector en AlloyDB
- Genera incorporaciones a partir de las estadísticas
- Realiza una búsqueda de similitud de coseno en tiempo real para el texto de búsqueda del usuario
- Implementa la solución en Cloud Functions sin servidores
En el siguiente diagrama, se representa el flujo de datos y los pasos involucrados en la implementación.
High level diagram representing the flow of the Patent Search Application with AlloyDB
Requisitos
2. Antes de comenzar
Crea un proyecto
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
- 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 .
- 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.
- 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
- En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
- Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
- Habilita las API necesarias. Puedes usar un comando gcloud en la terminal de 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
La alternativa al comando gcloud es buscar cada producto en la consola o usar este vínculo.
Consulta la documentación para ver los comandos y el uso de gcloud.
3. Prepara tu base de datos de AlloyDB
Crear un clúster, una instancia y una tabla de AlloyDB en los que se cargará el conjunto de datos de patentes
Crea objetos de AlloyDB
Crea un clúster y una instancia con el ID de clúster “patent-cluster
”, la contraseña “alloydb
”, la compatibilidad con PostgreSQL 15 y la región “us-central1
”, y la configuración de red establecida en “default
”. Establece el ID de instancia en “patent-instance
”. Haz clic en CREATE CLUSTER. Los detalles para crear un clúster se encuentran en este vínculo: https://cloud.google.com/alloydb/docs/cluster-create.
Crea una tabla
Puedes crear una tabla con la siguiente sentencia DDL en 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) ;
Habilita las extensiones
Para compilar la app de búsqueda de patentes, usaremos las extensiones pgvector y google_ml_integration. La extensión pgvector te permite almacenar y buscar embeddings de vectores. La extensión google_ml_integration proporciona funciones que usas para acceder a los extremos de predicción de Vertex AI y obtener predicciones en SQL. Para habilitar estas extensiones, ejecuta los siguientes DDL:
CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;
Otorgar permiso
Ejecuta la siguiente sentencia para otorgar la ejecución en la función "embedding":
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Otorga el rol de usuario de Vertex AI a la cuenta de servicio de AlloyDB
En la consola de IAM de Google Cloud, otorga a la cuenta de servicio de AlloyDB (que se ve de la siguiente manera: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) acceso al rol "Usuario de Vertex AI". PROJECT_NUMBER tendrá el número de tu proyecto.
Como alternativa, también puedes otorgar el acceso con el comando 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"
Modifica la tabla para agregar una columna de vectores para almacenar las incorporaciones
Ejecuta el siguiente DDL para agregar el campo abstract_embeddings a la tabla que acabamos de crear. Esta columna permitirá el almacenamiento de los valores vectoriales del texto:
ALTER TABLE patents_data ADD column abstract_embeddings vector(768);
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 AlloyDB Studio para ejecutar nuestras consultas. El repositorio alloydb-pgvector incluye la secuencia de comandos insert_into_patents_data.sql
que ejecutaremos para cargar los datos de patentes.
- En la consola de Google Cloud, abre la página AlloyDB.
- Selecciona el clúster que acabas de crear y haz clic en la instancia.
- En el menú de navegación de AlloyDB, haz clic en AlloyDB Studio. Accede con tus credenciales.
- Para abrir una pestaña nueva, haz clic en el ícono Nueva pestaña que se encuentra a la derecha.
- Copia la sentencia de consulta
insert
de la secuencia de comandosinsert_into_patents_data.sql
mencionada anteriormente en el editor. Puedes copiar entre 50 y 100 instrucciones de inserción para una demostración rápida de este caso de uso. - Haz clic en Ejecutar. Los resultados de tu consulta aparecen en la tabla Resultados.
5. Crea incorporaciones para datos de patentes
Primero, probemos la función de incorporación ejecutando la siguiente consulta de muestra:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Se debería mostrar el vector de incorporaciones, que parece un array de números de punto flotante, para el texto de muestra en la consulta. Se ve de la siguiente manera:
Actualiza el campo de vector abstract_embeddings
Ejecuta la siguiente DML para actualizar los resúmenes de patentes en la tabla con las incorporaciones correspondientes:
UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);
6. Realiza una búsqueda de vectores
Ahora que la tabla, los datos y las incorporaciones están listos, realicemos la Búsqueda de vectores en tiempo real para el texto de búsqueda del usuario. Para probarlo, ejecuta la siguiente consulta:
SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
En esta consulta,
- El texto de búsqueda del usuario es: "Un nuevo modelo de aprendizaje automático relacionado con el procesamiento de lenguaje natural".
- Lo convertimos en incorporaciones en el método embedding() con el modelo textembedding-gecko@003.
- "<=>" representa el uso del método de distancia SIMILARITY DE COSINE.
- Convertimos el resultado del método de incorporación en un tipo de vector para que sea compatible con los vectores almacenados en la base de datos.
- LIMIT 10 representa que seleccionamos las 10 coincidencias más cercanas del texto de búsqueda.
El resultado aparece a continuación:
Como puedes observar en los resultados, las coincidencias son bastante cercanas al texto de la búsqueda.
7. Lleva la aplicación a la Web
¿Todo listo para llevar esta app a la Web? Siga los pasos que se indican a continuación:
- Ve al editor de Cloud Shell y haz clic en el ícono “Cloud Code — Acceder” en la esquina inferior izquierda (barra de estado) del editor. Selecciona tu proyecto de Google Cloud actual que tenga habilitada la facturación y asegúrate de haber accedido al mismo proyecto desde Gemini (en la esquina derecha de la barra de estado).
- Haz clic en el ícono de Cloud Code y espera a que aparezca el diálogo de Cloud Code. Selecciona Nueva aplicación y, en la ventana emergente Crear nueva aplicación, elige la aplicación de Cloud Functions:
En la página 2/2 de la ventana emergente Crear nueva aplicación, selecciona Java: Hello World, ingresa el nombre de tu proyecto como "alloydb-pgvector" en la ubicación que prefieras y haz clic en Aceptar:
- En la estructura del proyecto resultante, busca pom.xml y reemplázalo por el contenido del archivo del repositorio. Debe tener estas dependencias, además de algunas más:
- Reemplaza el archivo HelloWorld.java por el contenido del archivo repo.
Ten en cuenta que debes reemplazar los siguientes valores por los reales:
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
Ten en cuenta que la función espera el texto de búsqueda como parámetro de entrada con la clave "search" y, en esta implementación, solo mostramos una coincidencia más cercana de la base de datos:
// 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('textembedding-gecko@003', '" + 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);
}
- Para implementar la función de Cloud Functions que acabas de crear, ejecuta el siguiente comando desde la terminal de Cloud Shell. Recuerda navegar primero a la carpeta del proyecto correspondiente con el comando:
cd alloydb-pgvector
Luego, ejecuta el siguiente comando:
gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
PASO IMPORTANTE:
Una vez que hayas configurado la implementación, deberías poder ver las funciones en la consola de Cloud Run Functions de Google. Busca la función recién creada y ábrela. Edita la configuración y cambia lo siguiente:
- Ve a Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad
- Aumenta el tiempo de espera a 180 segundos
- Ve a la pestaña CONEXIONES:
- En la configuración de entrada, asegúrate de que esté seleccionada la opción "Permitir todo el tráfico".
- En la configuración de salida, haz clic en el menú desplegable Red y selecciona la opción "Agregar nuevo conector de VPC". Luego, sigue las instrucciones que aparecen en el cuadro de diálogo emergente:
- Proporciona un nombre para el conector de VPC y asegúrate de que la región sea la misma que la de tu instancia. Deja el valor de red como predeterminado y establece la subred como rango de IP personalizado con el rango de IP 10.8.0.0 o algo similar que esté disponible.
- Expande MOSTRAR LA CONFIGURACIÓN DE ESCALA y asegúrate de que la configuración sea exactamente la siguiente:
- Haz clic en CREATE y este conector debería aparecer en la configuración de salida.
- Selecciona el conector recién creado
- Elige que todo el tráfico se enrute a través de este conector de VPC.
8. Prueba la aplicación
Una vez que se implemente, deberías ver el extremo en el siguiente formato:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search
Para probarlo desde la terminal de Cloud Shell, ejecuta el siguiente comando:
gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'
Resultado:
También puedes probarla desde la lista de Cloud Functions. Selecciona la función implementada y navega a la pestaña "TESTING". En el cuadro de texto de la sección Configurar evento de activación para la solicitud JSON, ingresa lo siguiente:
{"search": "A new Natural Language Processing related Machine Learning Model"}
Haz clic en el botón PROBAR LA FUNCIÓN y podrás ver el resultado en el lado derecho de la página:
Eso es todo. Es así de simple realizar la búsqueda de vectores de similitud con el modelo de embeddings en los datos de AlloyDB.
9. 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:
- En la consola de Google Cloud, ve a Administrar .
- Recursos.
- En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
10. Felicitaciones
¡Felicitaciones! Realizaste correctamente una búsqueda de similitud con AlloyDB, pgvector y la búsqueda de vectores. Combinando las capacidades de AlloyDB, Vertex AI y Búsqueda de vectores, dimos un gran paso adelante para que las búsquedas de literatura sean accesibles, eficientes y realmente significativas.