Compartir a través de


Sistema de recomendaciones 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 crear una aplicación de recomendación mediante el servidor flexible de Azure Database for PostgreSQL y Azure OpenAI Service. Las recomendaciones tienen aplicaciones en dominios diferentes: los proveedores de servicios suelen proporcionar recomendaciones para productos y servicios que ofrecen en función del historial anterior y la información contextual recopilada del cliente y el entorno.

Hay diferentes maneras de modelar sistemas de recomendación. En este artículo se explora la forma más sencilla: recomendación basada en un producto correspondiente, por ejemplo, a una compra anterior. En este tutorial se usa el conjunto de datos de recetas usado en el artículo Búsqueda semántica y la recomendación es para las recetas basadas en una receta que le ha gustado a un cliente o que ha buscado antes.

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.

Habilitar 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 se produce un error, 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
    recommend_recipe(sampleRecipeId int, numResults int)
returns table(
            out_recipeName text,
            out_nutrition text,
            out_similarityScore real)
as $$
declare
    queryEmbedding vector(1536);
    sampleRecipeText text;
begin
    sampleRecipeText := (select
                            recipe_name||' '||cuisine_path||' '||ingredients||' '||nutrition||' '||directions
                        from
                            recipes where rid = sampleRecipeId);

    queryEmbedding := (azure_openai.create_embeddings('text-embedding-ada-002',sampleRecipeText));

    return query
    select
        distinct r.recipe_name,
        r.nutrition,
        (r.embedding <=> queryEmbedding)::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 la recomendación:

select out_recipename, out_similarityscore from recommend_recipe(1, 20); -- search for 20 recipe recommendations that closest to recipeId 1

Y explore los resultados:

            out_recipename             | out_similarityscore
---------------------------------------+---------------------
 Apple Pie by Grandma Ople             |                   0
 Easy Apple Pie                        |          0.05137232
 Grandma's Iron Skillet Apple Pie      |         0.054287136
 Old Fashioned Apple Pie               |         0.058492836
 Apple Hand Pies                       |          0.06449003
 Apple Crumb Pie                       |          0.07290977
 Old-Fashioned Apple Dumplings         |         0.078374185
 Fried Apple Pies                      |          0.07918481
 Apple Pie Filling                     |         0.084320426
 Apple Turnovers                       |          0.08576391
 Dutch Apple Pie with Oatmeal Streusel |          0.08779895
 Apple Crisp - Perfect and Easy        |          0.09170883
 Delicious Cinnamon Baked Apples       |          0.09384012
 Easy Apple Crisp with Pie Filling     |          0.09477234
 Jump Rope Pie                         |          0.09503954
 Easy Apple Strudel                    |         0.095167875
 Apricot Pie                           |          0.09634114
 Easy Apple Crisp with Oat Topping     |          0.09708358
 Baked Apples                          |          0.09826993
 Pear Pie                              |         0.099974394
(20 rows)