Acerca de este codelab
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 licencias, y evitar infringir patentes existentes.
La investigación de patentes es vasta y compleja. Revisar innumerables resúmenes técnicos para encontrar innovaciones pertinentes es una tarea desalentadora. 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 la comprensión rápida de la idea principal. Esto puede provocar que los investigadores no encuentren patentes clave o pierdan tiempo con resultados irrelevantes.
El ingrediente secreto detrás de esta revolución es la Búsqueda vectorial. En lugar de depender de la coincidencia simple de palabras clave, la búsqueda de vectores transforma el texto en representaciones numéricas (embeddings). Esto nos permite buscar en función del significado de la búsqueda, no solo de las palabras específicas que se usan. En el mundo de las búsquedas bibliográficas, esto es revolucionario. Imagina que encuentras una patente para un "monitor de frecuencia cardíaca wearable" incluso si la frase exacta no se usa en el documento.
Objetivo
En este codelab, trabajaremos para que el proceso de búsqueda de patentes sea más rápido, intuitivo y preciso aprovechando AlloyDB, la extensión pgvector y Gemini 1.5 Pro, Embeddings y Vector Search integrados.
Qué compilarás
Como parte de este lab, realizarás las siguientes tareas:
- Crea una instancia de AlloyDB y carga datos del conjunto de datos públicos de patentes
- Habilita las extensiones de pgvector y del modelo de IA generativa en AlloyDB
- Genera embeddings 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 autenticaste y que el proyecto se configuró con el ID de tu proyecto 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 de 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 de gcloud es a través de la consola, buscando cada producto o usando este vínculo.
Consulta la documentación para ver los comandos y el uso de gcloud.
3. Prepara tu base de datos de AlloyDB
Crearemos 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
", compatible con PostgreSQL 15 y la región como "us-central1
", y la configuración de red como "default
". Establece el ID de instancia en "patent-instance
". Haz clic en CREAR CLÚSTER. 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 instrucción 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) ;
Habilitar 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. Habilita estas extensiones ejecutando los siguientes DDL:
CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;
Otorgar permiso
Ejecuta la siguiente instrucción para otorgar permiso de 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 así: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) acceso al rol "Usuario de Vertex AI". PROJECT_NUMBER tendrá tu número de proyecto.
También puedes otorgar el acceso con el comando de 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 Vector para almacenar los embeddings
Ejecuta el siguiente DDL para agregar el campo abstract_embeddings a la tabla que acabamos de crear. Esta columna permitirá almacenar los valores vectoriales del texto:
ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);
4. Carga datos de patentes en la base de datos
Usaremos los conjuntos de datos públicos de patentes de Google en BigQuery como nuestro conjunto de datos. Usaremos AlloyDB Studio para ejecutar nuestras consultas. El repositorio alloydb-pgvector incluye el script 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.
- Haz clic en el ícono Pestaña nueva a la derecha para abrir una pestaña nueva.
- Copia la instrucción 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 embeddings para los datos de patentes
Primero, probemos la función de incorporación ejecutando la siguiente consulta de muestra:
SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Esto debería devolver el vector de embeddings, que se ve como un array de números de punto flotante, para el texto de ejemplo en la búsqueda. Se verá de la siguiente manera:
Actualiza el campo Vector de abstract_embeddings
Ejecuta el siguiente DML para actualizar los resúmenes de patentes en la tabla con las incorporaciones correspondientes:
UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);
6. Realiza una búsqueda de vectores
Ahora que la tabla, los datos y los embeddings 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('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
En esta búsqueda,
- 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 embeddings en el método embedding() con el modelo gemini-embedding-001.
- "<=>" representa el uso del método de distancia COSINE SIMILARITY.
- Convertimos el resultado del método de incorporación al 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 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 actual de Google Cloud 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 New Application y, en la ventana emergente Create New Application, selecciona la aplicación de Cloud Functions:
En la página 2/2 de la ventana emergente Create New Application, selecciona Java: Hello World, ingresa el nombre de tu proyecto como "alloydb-pgvector" en la ubicación que prefieras y haz clic en OK:
- En la estructura del proyecto resultante, busca pom.xml y reemplázalo por el contenido del archivo del repo. 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 devolvemos la 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('tgemini-embedding-001', '" + 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 Cloud Function 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 siguiente 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:
- Ir 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 Configuración de salida, haz clic en el menú desplegable Red, selecciona la opción "Agregar conector de VPC nuevo" y 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 la red como predeterminado y establece la subred como rango de IP personalizado con el rango de IP 10.8.0.0 o uno similar que esté disponible.
- Expande SHOW SCALING SETTINGS y asegúrate de que la configuración sea exactamente la siguiente:
- Haz clic en CREAR. Este conector ahora debería aparecer en la configuración de salida.
- Selecciona el conector recién creado.
- Opta por 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 con 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 verás el resultado en el lado derecho de la página:
Eso es todo. Así de simple es realizar una 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 .
- página de 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 Vector Search, dimos un gran paso para que las búsquedas de literatura sean accesibles, eficientes y verdaderamente basadas en el significado.