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
- Cree una cuenta de OpenAI y soliciteAcceso a Azure OpenAI Service.
- Conceda acceso a Azure OpenAI en la suscripción deseada.
- 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
- Descargue los datos de Kaggle.
- Conéctese al servidor y cree una base de datos
test
y, en ella, cree una tabla en la que importará los datos. - Importación de los datos.
- Agregue una columna de inserción a la tabla.
- Genere las incrustaciones.
- 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)
Contenido relacionado
- Integración del Servidor flexible de Azure Database for PostgreSQL con Azure Cognitive Services.
- Generación de incrustaciones de vectores en el Servidor flexible de Azure Database for PostgreSQL con LLM implementado localmente (versión preliminar).
- Integrar Azure Database for PostgreSQL con Azure Machine Learning Services.
- Generación de incrustaciones de vectores con Azure OpenAI en el Servidor flexible de Azure Database for PostgreSQL.
- Extensión de Azure AI en el Servidor flexible de Azure Database for PostgreSQL.
- IA generativa con el Servidor flexible de Azure Database for PostgreSQL.
- Búsqueda semántica con el Servidor flexible de Azure Database for PostgreSQL y Azure OpenAI.
- Habilitación y uso de pgvector en el Servidor flexible de Azure Database for PostgreSQL.