Compartir a través de


Búsqueda semántica con Azure Database for PostgreSQL: servidor flexible y Azure OpenAI

SE APLICA A: Azure Database for PostgreSQL con servidor flexible

En este tutorial práctico se muestra cómo compilar una aplicación de búsqueda semántica mediante el servidor flexible de Azure Database for PostgreSQL y Azure OpenAI Service. La búsqueda semántica realiza búsquedas basadas en la semántica; la búsqueda léxica estándar realiza búsquedas basadas en palabras clave proporcionadas en una consulta. Por ejemplo, el conjunto de datos de recetas podría no contener etiquetas como sin gluten, vegano, sin lácteos, sin frutas o postres, pero estas características se pueden deducir de los ingredientes. La idea es emitir estas consultas semánticas y obtener resultados de búsqueda relevantes.

La creación de la funcionalidad de búsqueda semántica en los datos mediante GenAI y Servidor flexible implica los pasos siguientes:

  • Identifique los escenarios de búsqueda. Identifique los campos de datos implicados en la búsqueda.
  • Para cada campo de datos incluido en la búsqueda, cree un campo vectorial correspondiente para almacenar las inserciones del valor almacenado en el campo de datos.
  • Genere inserciones para los datos de los campos de datos seleccionados y almacene las inserciones en los campos vectoriales correspondientes.
  • Genere la inserción para cualquier consulta de búsqueda de entrada determinada.
  • Busque el campo de datos vectoriales y enumere los vecinos más próximos.
  • Ejecute los resultados a través de los modelos de relevancia, clasificación y personalización adecuados para generar la clasificación final. En ausencia de estos modelos, clasifique los resultados en orden decreciente de producto escalar.
  • Supervise el modelo, la calidad de los resultados y las métricas empresariales, como CTR (velocidad de selección) y el tiempo de permanencia. Incorpore mecanismos de comentarios para depurar y mejorar la pila de búsqueda desde la calidad de los datos, la actualización y la personalización, hasta la experiencia del usuario.

Requisitos previos

  1. Cree una cuenta de OpenAI y soliciteAcceso a Azure OpenAI Service.
  2. Conceda acceso a Azure OpenAI en la suscripción deseada.
  3. Conceda permisos para crear recursos de Azure OpenAI e implementar modelos.

Cree e implemente un recurso de Azure OpenAI Service y un modelo, e implemente el modelo de inserciones text-embedding-ada-002. Copie el nombre de implementación según sea necesario para crear inserciones.

Habilitación de las extensiones azure_ai y pgvector

Para poder habilitar azure_ai y pgvector en la instancia de servidor flexible de Azure Database for PostgreSQL, debe agregarlos a la lista de permitidos, tal como se describe en cómo usar extensiones de PostgreSQL y comprobar si se han agregado correctamente mediante la ejecución de SHOW azure.extensions;.

A continuación, puede instalar la extensión mediante la conexión a la base de datos de destino y la ejecución del comando CREATE EXTENSION. Debe repetir el comando por separado para cada base de datos en la que quiera que la extensión esté disponible.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Configuración del punto de conexión y la clave de OpenAI

En los servicios de Azure AI en Administración de recursos>Claves y puntos de conexión puede encontrar el punto de conexión y las claves del recurso de Azure AI. Use el punto de conexión y una de las claves para habilitar la extensión azure_ai para invocar la implementación de modelo.

select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');

Descarga e importación de los datos

  1. Descargue los datos de Kaggle.
  2. Conéctese al servidor y cree una base de datos test, y en ella cree una tabla en la que importará los datos.
  3. Importación de los datos.
  4. Agregue una columna de inserción a la tabla.
  5. Genere las incrustaciones.
  6. de búsqueda.

Creación de la tabla

CREATE TABLE public.recipes(
    rid integer NOT NULL,
    recipe_name text,
    prep_time text,
    cook_time text,
    total_time text,
    servings integer,
    yield text,
    ingredients text,
    directions text,
    rating real,
    url text,
    cuisine_path text,
    nutrition text,
    timing text,
    img_src text,
    PRIMARY KEY (rid)
);

Importación de los datos

Establezca la siguiente variable de entorno en la ventana de cliente para establecer la codificación en utf-8. Este paso es necesario porque este conjunto de datos determinado usa la codificación WIN1252.

Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8

Importe los datos en la tabla creada. Tenga en cuenta que este conjunto de datos contiene una fila de encabezado:

psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"

Adición de una columna para almacenar las inserciones

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generación de inserciones

Genere inserciones para los datos mediante la extensión azure_ai. A continuación, vectorizamos algunos campos diferentes, concatenados:

WITH ro AS (
    SELECT ro.rid
    FROM
        recipes ro
    WHERE
        ro.embedding is null
        LIMIT 500
)
UPDATE
    recipes r
SET
    embedding = azure_openai.create_embeddings('text-embedding-ada-002', r.recipe_name||' '||r.cuisine_path||' '||r.ingredients||' '||r.nutrition||' '||r.directions)
FROM
    ro
WHERE
    r.rid = ro.rid;

Repita el comando hasta que no haya más filas que procesar.

Sugerencia

Practique con LIMIT. Con un valor alto, la instrucción puede producir un error a mitad de camino debido a la limitación impuesta por Azure OpenAI. Si esto sucede, espere al menos un minuto y vuelva a ejecutar el comando.

Cree una función de búsqueda en la base de datos para mayor comodidad:

create function
    recipe_search(searchQuery text, numResults int)
returns table(
            recipeId int,
            recipe_name text,
            nutrition text,
            score real)
as $$
declare
    query_embedding vector(1536);
begin
    query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
    return query
    select
        r.rid,
        r.recipe_name,
        r.nutrition,
        (r.embedding <=> query_embedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

Ahora simplemente invoque la función para buscar:

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

Y explore los resultados:

 recipeid |                         recipe_name                          |   score
----------+--------------------------------------------------------------+------------
      829 | Avocado Toast (Vegan)                                        | 0.15672222
      836 | Vegetarian Tortilla Soup                                     | 0.17583494
      922 | Vegan Overnight Oats with Chia Seeds and Fruit               | 0.17668104
      600 | Spinach and Banana Power Smoothie                            |  0.1773768
      519 | Smokey Butternut Squash Soup                                 | 0.18031077
      604 | Vegan Banana Muffins                                         | 0.18287598
      832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
      617 | Hearty Breakfast Muffins                                     | 0.18737361
      946 | Chia Coconut Pudding with Coconut Milk                       |  0.1884186
      468 | Spicy Oven-Roasted Plums                                     | 0.18994217
(10 rows)