En esta página, se describe cómo configurar y generar instrucciones SQL con el lenguaje natural de AlloyDB AI. El lenguaje natural te permite crear aplicaciones de IA generativa orientadas al usuario con lenguaje natural para consultar bases de datos.
Para habilitar la extensión alloydb_ai_nl
, que es la API de compatibilidad con lenguaje natural de AlloyDB para PostgreSQL, sigue estos pasos generales:
- Instala la extensión de
alloydb_ai_nl
. - Define una configuración de lenguaje natural para tu aplicación.
- Registra un esquema.
- Agrega contexto.
- Se agregaron plantillas de búsqueda.
- Define los tipos de conceptos y crea un índice de valores.
- Generar instrucciones en SQL con una interfaz de lenguaje natural
Antes de comenzar
- Solicita acceso al lenguaje natural de AlloyDB AI y espera a recibir la confirmación de habilitación antes de seguir las instrucciones de esta página.
- Comprende cómo conectarte a la base de datos de AlloyDB y ejecutar comandos de PostgreSQL. Para obtener más información, consulta la Descripción general de la conexión.
- Propaga la base de datos con los datos y el esquema a los que el usuario final desea acceder.
Crea un clúster y habilita la integración en Vertex AI
- Crea un clúster y una instancia de AlloyDB. Usarás la instancia de AlloyDB para crear la base de datos y el esquema de la aplicación.
- Habilita la integración en Vertex AI. Para obtener más información, consulta Integración con Vertex AI.
Roles requeridos
Para instalar la extensión de alloydb_ai_nl
y otorgar acceso a otros usuarios, debes tener el siguiente rol de Identity and Access Management (IAM) en el proyecto de Google Cloud que estás usando:
roles/alloydb.admin
: Rol de IAM predefinido de AlloyDB Admin
Para obtener más información, consulta Administra usuarios de PostgreSQL con autenticación integrada.
Prepara el entorno
Para prepararte para generar consultas en lenguaje natural, debes instalar la extensión requerida, crear una configuración y registrar un esquema.
Instala la extensión de alloydb_nl_ai
La extensión alloydb_ai_nl
usa la extensión google_ml_integration
, que interactúa con modelos de lenguaje grandes (LLM), incluidos los modelos de Gemini en Vertex AI.
Para instalar la extensión alloydb_ai_nl
, conéctate a la base de datos y ejecuta el siguiente comando:
CREATE EXTENSION alloydb_ai_nl cascade;
Crea una configuración de lenguaje natural y registra un esquema
El lenguaje natural de AlloyDB AI usa nl_config
para asociar aplicaciones a ciertos esquemas, plantillas de consultas y extremos de modelos.
nl_config
es una configuración que asocia una aplicación a un esquema, plantillas y otros contextos. Una aplicación grande también puede usar diferentes configuraciones para diferentes partes de la aplicación, siempre y cuando especifiques la configuración correcta cuando se envíe una pregunta desde esa parte de la aplicación. Puedes registrar un esquema completo o registrar objetos de esquema específicos, como tablas, vistas y columnas.
Para crear una configuración de lenguaje natural, usa el siguiente ejemplo:
SELECT alloydb_ai_nl.g_create_configuration( 'my_app_config' -- configuration_id );
gemini-2.0-flash:generateContent
es el extremo del modelo.Para registrar un esquema para una configuración especificada, usa el siguiente ejemplo:
SELECT alloydb_ai_nl.g_manage_configuration( operation => 'register_schema', configuration_id_in => 'my_app_config', schema_names_in => '{my_schema}' );
Agregar contexto
El contexto incluye cualquier tipo de información que puedas usar para responder la pregunta de un usuario final. El contexto incluye la estructura y las relaciones del esquema, los resúmenes y las descripciones de las columnas, los valores de las columnas y su semántica, y las reglas o las declaraciones de la lógica empresarial específicas de la aplicación o el dominio.
Agrega contexto general para las reglas específicas de la aplicación
Los elementos de contexto general incluyen reglas específicas de la aplicación, declaraciones de lógica empresarial o cualquier terminología específica de la aplicación y el dominio que no esté vinculada a un objeto de esquema específico.
Para agregar contexto general a las reglas específicas de la aplicación y a la terminología específica de la aplicación o el dominio, sigue estos pasos:
Para agregar un elemento de contexto general para la configuración especificada, usa el siguiente ejemplo:
SELECT alloydb_ai_nl.g_manage_configuration( 'add_general_context', 'my_app_config', general_context_in => '{"If the user asks for a good seat, assume that means a window or aisle seat."}' );
La instrucción anterior ayuda a que el lenguaje natural de AlloyDB AI proporcione respuestas de mayor calidad a las preguntas en lenguaje natural de los usuarios.
Para ver los contextos generales de la configuración especificada, ejecuta la siguiente instrucción:
SELECT alloydb_ai_nl.list_general_context(nl_config TEXT);
Genera y revisa el contexto del esquema
El contexto del esquema describe los objetos del esquema, que incluyen tablas, vistas, vistas materializadas y columnas. Este contexto se almacena como el COMMENT
de cada objeto de esquema.
Para generar contextos para objetos de esquema, llama a las siguientes APIs. Para obtener los mejores resultados, asegúrate de que las tablas de la base de datos contengan datos representativos.
-- For all schema objects (tables, views, materialized views and columns) -- within the scope of a provided nl_config. SELECT alloydb_ai_nl.generate_schema_context( 'my_app_config' -- nl_config );
Para revisar los contextos del esquema generados, ejecuta la siguiente instrucción:
SELECT schema_object, object_context FROM alloydb_ai_nl.generated_schema_context_view;
Los contextos de esquema generados se almacenan en la vista anterior.
Opcional: Para actualizar los contextos del esquema generados, ejecuta la siguiente instrucción:
SELECT alloydb_ai_nl.update_generated_relation_context( 'my_schema.my_table', 'This table contains archival records, if you need latest records use records_new table.' ); SELECT alloydb_ai_nl.update_generated_column_context( 'my_schema.my_table.column1', 'The seat_class column takes single letters like "E" for economy, "P" for premium economy, "B" for business and "F" for First.' );
Aplica el contexto. Cuando aplicas el contexto, este entra en vigencia de inmediato y se borra de
generated_schema_context_view
. Ejecuta lo siguiente:-- For all schema objects (tables, views, materialized views and columns) -- within the scope of nl_config. SELECT alloydb_ai_nl.apply_generated_schema_context( 'my_app_config' --nl_config );
Opcional: Verifica el contexto generado. La siguiente API te permite verificar los contextos del esquema, que se usan cuando generas instrucciones de SQL:
-- For table, view or materialized view. SELECT alloydb_ai_nl.get_relation_context( 'my_schema.my_table' ); -- For column. SELECT alloydb_ai_nl.get_column_context( 'my_schema.my_table.column1' );
Opcional: Para establecer manualmente el contexto del esquema, ejecuta la siguiente instrucción:
-- For table, view or materialized view. SELECT alloydb_ai_nl.set_relation_context( 'my_schema.my_table', 'One-to-many mapping from product to categories' ); -- For column. SELECT alloydb_ai_nl.set_column_context( 'my_schema.my_table.column1', 'This column provides additional tagged info for the product in Json format, e.g., additional color or size information of the product - tags: { "color": "red", "size": "XL"}' );
Crea plantillas de consultas
Para mejorar la calidad de las aplicaciones de IA generativa creadas con LLM, puedes agregar plantillas. Una plantilla de consulta es un conjunto seleccionado de preguntas representativas o comunes en lenguaje natural, con las consultas en SQL correspondientes, así como explicaciones para proporcionar una justificación declarativa para la generación de lenguaje natural a SQL (NL2SQL). Las plantillas están diseñadas principalmente para que las especifique la aplicación, pero la extensión alloydb_ai_nl
también puede generarlas automáticamente en función de las consultas de SQL que se usan con frecuencia. Cada plantilla debe estar asociada a un nl_config
.
La extensión alloydb_ai_nl
usa un template_store
para incorporar de forma dinámica plantillas de SQL pertinentes en el proceso de generación de una instrucción de SQL para responder la pregunta del usuario. El template_store
identifica plantillas con intenciones similares a la pregunta en lenguaje natural que se formuló, identifica la instrucción de SQL parametrizada correspondiente y sintetiza una instrucción de SQL con la instancia de parámetros con valores de la pregunta en lenguaje natural. Sin embargo, si no hay una plantilla con la misma intención que la pregunta que hizo el usuario, alloydb_ai_nl
usa todas las plantillas y el contexto pertinentes para componer una instrucción SQL.
Para agregar plantillas, debes especificar la pregunta (con un parámetro llamado intent
) y la consulta en SQL.
Para agregar una plantilla al almacén de plantillas, ejecuta la siguiente instrucción:
SELECT
alloydb_ai_nl.add_template(
nl_config => 'my_app_config',
intent => 'How many accounts associated with loans are located in the Prague region?',
sql => 'SELECT COUNT(T1.account_id)
FROM bird_dev_financial.account AS T1
INNER JOIN bird_dev_financial.loan AS T2
ON T1.account_id = T2.account_id
INNER JOIN bird_dev_financial.district AS T3
ON T1.district_id = T3.district_id
WHERE T3."A3" = ''Prague''',
check_intent => TRUE
);
Cuando check_intent
es TRUE
, alloydb_ai_nl
realiza una verificación semántica para confirmar que la intención proporcionada coincide con la instrucción de SQL que se pasó. Si la intención no coincide con la instrucción de SQL, no se agrega la plantilla.
Genera plantillas automáticamente
Después de tener un conjunto de datos representativo en tus tablas, te recomendamos que ejecutes consultas de SQL que correspondan a las preguntas comunes que es probable que hagan tus usuarios finales. Es importante que te asegures de que las consultas tengan buenos planes de consulta y que tengan un buen rendimiento.
Después de ejecutar las consultas, el lenguaje natural de AlloyDB AI puede generar automáticamente plantillas basadas en el historial de consultas. Puedes llamar a las siguientes APIs para generar plantillas. Debes revisar y aplicar las plantillas generadas antes de que entren en vigencia.
La generación automática de plantillas se basa en las búsquedas que se usan con mayor frecuencia en el registro de búsquedas, google_db_advisor_workload_statements
.
Las búsquedas se filtran según los siguientes criterios:
- Declaraciones
SELECT
- Ejecutables: El comando
EXPLAIN
procesa la consulta correctamente. - Sin duplicación: La búsqueda no se usó anteriormente para generar plantillas.
- Todas las tablas y vistas a las que se hace referencia están dentro del alcance de
nl_config
.
Para generar, revisar y aplicar plantillas automáticamente, sigue estos pasos:
Solicita a AlloyDB que genere plantillas basadas en tu historial de búsquedas:
SELECT alloydb_ai_nl.generate_templates( 'my_app_config', );
Usa la vista proporcionada,
alloydb_ai_nl.generated_templates_view
, para revisar elgenerated_templates
.En el siguiente resultado, se muestra la cantidad de plantillas generadas:
-[ RECORD 1 ]------+-- generate_templates | 1
Revisa las plantillas generadas con la vista
generated_templates_view
.SELECT * FROM alloydb_ai_nl.generated_templates_view;
A continuación, se muestra un ejemplo del resultado devuelto:
-[ RECORD 1 ]---------------------------------------------------------------- id | 1 config | my_app_config type | Template manifest | How many clients have a birth year of a given number? nl | How many clients have a birth year of 1997? sql | select count(*) from public.client as T where to_char(T.birth_date::timestamp, 'YYYY') = '1997'; intent | How many clients have a birth year of 1997? psql | select count(*) from public.client as T where to_char(T.birth_date::timestamp, 'YYYY') = $1; pintent | How many clients have a birth year of $1? comment | explanation | weight | 1
El
manifest
en el resultado devuelto es una plantilla general o una descripción amplia del tipo de pregunta o la operación que se puede realizar.pintent
es una versión parametrizada deintent
y generalizaintent
reemplazando el valor específico (1997
) por un marcador de posición ($1
).Para actualizar una plantilla generada, ejecuta la siguiente sentencia de ejemplo:
SELECT alloydb_ai_nl.update_generated_template( id => 1, manifest => 'How many clients are born in a given year?', nl => 'How many clients are born in 1997?', intent => 'How many clients are born in 1997?', pintent => 'How many clients are born in $1?' );
Aplica las plantillas. Las plantillas que aplicas se agregan de inmediato a la tienda de plantillas y se borran de la vista de revisión.
-- For all templates generated under the nl config. SELECT alloydb_ai_nl.apply_generated_templates('my_app_config');
Configura la seguridad para el lenguaje natural
Para configurar la seguridad del lenguaje natural de AlloyDB AI, consulta Administra la seguridad de las aplicaciones de datos con vistas seguras parametrizadas.
Cómo definir tipos de conceptos y el índice de valores
Defines tipos de conceptos y valores de índice para comprender mejor las preguntas que se realizan. Un tipo de concepto es una categoría o clase de entidades que identifica el significado semántico de las palabras y las frases en lugar de solo su forma literal.
Por ejemplo, dos nombres de países pueden ser iguales, incluso si uno está en mayúsculas, como USA
, y el otro está en minúsculas, como usa
. En este caso, el nombre del país es el tipo de concepto. Otros ejemplos de tipos de conceptos incluyen el nombre de una persona, el nombre de una ciudad y una fecha.
Un índice de valores es un índice sobre los valores de las columnas que forman parte de la configuración en lenguaje natural nl_config
, basado en los tipos de conceptos asociados a cada columna. Un índice de valores permite la coincidencia eficiente de frases de valores para la pregunta que se hace y los valores de la base de datos.
Para definir tipos de conceptos y un índice de valores, sigue estos pasos con los ejemplos proporcionados. En los ejemplos, se asocia una columna a un tipo de concepto, se crea y actualiza un índice de valores, y se usa un conjunto de sinónimos para realizar una búsqueda de valores.
Para asociar una columna con un tipo de concepto, ejecuta la siguiente consulta:
SELECT alloydb_ai_nl.associate_concept_type( column_names_in => 'my_schema.country.country_name', concept_type_in => 'country_name', nl_config_id_in => 'my_app_config' );
Para crear un índice de valores basado en todas las columnas que forman parte de una configuración en lenguaje natural y que están asociadas a un tipo de concepto, ejecuta la siguiente instrucción:
SELECT alloydb_ai_nl.create_value_index( nl_config_id_in => 'my_app_config' );
Cuando asocies tipos de conceptos a columnas nuevas, actualiza el índice de valores para reflejar los cambios. Usa la siguiente instrucción:
SELECT alloydb_ai_nl.refresh_value_index( nl_config_id_in => 'my_app_config' );
Para habilitar el lenguaje natural de AlloyDB AI para que coincida con los sinónimos de un valor, ejecuta la siguiente instrucción de ejemplo:
SELECT alloydb_ai_nl.insert_synonym_set( ARRAY [ 'USA', 'US', 'United States', 'United States of America' ] );
Aunque los datos de tus tablas pueden usar un valor específico (por ejemplo, si
United States
se usa para identificar un país), puedes definir un conjunto de sinónimos que contenga todos los sinónimos deUnited States
. Si alguno de los sinónimos aparece en la pregunta en lenguaje natural, AlloyDB AI los correlaciona con los valores de tus tablas.Realiza una búsqueda de valores para encontrar los valores correctos de la base de datos, dado un array de frases de valores, con la siguiente instrucción:
SELECT alloydb_ai_nl.get_concept_and_value( value_phrases_in => ARRAY['United States'], nl_config_id_in => 'my_app_config' );
Por ejemplo, si un usuario hace una pregunta como "¿Cuál es la población de Estados Unidos?" que usa la siguiente consulta de
get_sql
, el lenguaje natural de AlloyDB AI usa la funciónget_concept_and_value
con la frase de valorUnited States
para realizar una búsqueda aproximada en los índices de valores. La búsqueda parcial es una técnica de búsqueda que encuentra coincidencias incluso cuando la búsqueda no coincide exactamente con los datos correspondientes.El lenguaje natural encuentra un resultado (el valor
USA
) que se acerca a la búsqueda y lo usa para generar la consulta en SQL.SELECT alloydb_ai_nl.get_sql( nl_config_id => 'my_app_config', nl_question => 'What is the population of the United States?', additional_info => json_build_object('enrich_nl_question', TRUE) ) ->> 'sql';
En la siguiente tabla, se enumeran los tipos de conceptos integrados definidos por el lenguaje natural de AlloyDB AI:
Nombre del concepto Descripción generic_entity_name
Se puede usar una sola columna de tipo de cadena para un nombre de entidad genérico. Por ejemplo:
SELECT alloydb_ai_nl.associate_concept_type('public.item.item_name', 'generic_entity_name')
country_name
,city_name
,region_name
Nombres de países, ciudades y regiones El uso es exactamente el mismo que el del tipo de concepto generic_entity_name
.full_person_name
Nombre de la persona, que incluye el nombre de pila, el segundo nombre y el apellido. Se pueden usar hasta tres columnas de tipo cadena para el nombre completo de una persona. Se puede omitir cualquiera de las columnas cuando se asocian columnas de nombres al full_person_name
. Por ejemplo:
SELECT alloydb_ai_nl.associate_concept_type('public.person.last_name,public.person.first_name,public.person.middle_name','full_person_name')
ssn
Es una sola columna de cadena que contiene un número de seguridad social. Por ejemplo:
SELECT alloydb_ai_nl.associate_concept_type('public.person.ssn','ssn')
date
Una fecha o una marca de tiempo Por ejemplo:
SELECT alloydb_ai_nl.associate_concept_type('public.person.date_col','date')
Genera instrucciones en SQL a partir de entradas en lenguaje natural
Puedes usar el lenguaje natural de AlloyDB AI para generar sentencias en SQL a partir de entradas en lenguaje natural. Cuando ejecutas la instrucción de SQL generada, se proporcionan los datos de la base de datos que necesitas para responder la pregunta de lenguaje natural.
Para usar el lenguaje natural y obtener resultados de tu base de datos con la función
alloydb_ai_nl.get_sql
, usa el siguiente ejemplo:SELECT alloydb_ai_nl.get_sql( 'my_app_config', -- nl_config 'What is the sum that client number 4''s account has following transaction 851?' -- nl question );
Se muestra el siguiente resultado de JSON:
{ "sql": "SELECT T3.balance FROM public.client AS T1 INNER JOIN public.account AS T2 ON T1.district_id = T2.district_id INNER JOIN public.trans AS T3 ON T2.account_id = T3.account_id WHERE T1.client_id = 4 AND T3.trans_id = 851", "prompt": "", "retries": 0, "error_msg": "", "nl_question": "What is the sum that client number 4's account has following transaction 851?" }
Opcional: Para extraer la consulta en SQL generada como una cadena de texto, agrega
->>'sql'
:SELECT alloydb_ai_nl.get_sql( 'my_app_config', -- nl_config 'What is the sum that client number 4''s account has following transaction 851?' -- nl question ) ->> 'sql';
El operador
->>
se usa para extraer un valor JSON como texto. La funciónalloydb_ai_nl.get_sql
devuelve un objeto JSON, que es la parte de la instrucción que recupera el valor asociado con la clavesql
. Este valor es la consulta en SQL generada.
Prueba y perfecciona
Para obtener consultas autogeneradas mejoradas, modifica o agrega un mejor contexto, plantillas de consultas y índices de valores, y, luego, itera hasta que obtengas los resultados que deseas.
¿Qué sigue?
- Obtén información sobre los casos de uso y las capacidades clave del lenguaje natural de AlloyDB AI.
- Usa el lenguaje natural de AlloyDB AI para generar código SQL.
- Aprende a buscar tus datos relacionales almacenados en AlloyDB en Google Agentspace con el lenguaje natural de AlloyDB AI (versión preliminar).