Sistema de recomendação com o Banco de Dados do Azure para PostgreSQL – Servidor Flexível e OpenAI do Azure
APLICA-SE A: Banco de Dados do Azure para PostgreSQL – Servidor Flexível
Este tutorial prático mostra como criar um aplicativo recomendador usando o servidor flexível do Banco de Dados do Azure para PostgreSQL e o Serviço OpenAI do Azure. As recomendações têm aplicativos em domínios diferentes – os provedores de serviços frequentemente tendem a fornecer recomendações para produtos e serviços que oferecem com base no histórico anterior e nas informações contextuais coletadas do cliente e do ambiente.
Há diferentes maneiras de modelar os sistemas de recomendação. Este artigo explora a maneira mais simples – a recomendação baseada em um produto correspondente a, digamos, uma compra anterior. Este tutorial usa o conjunto de dados de receita usado no artigo Pesquisa Semântica e a recomendação é para receitas baseadas em algo que um cliente gostou ou pesquisou antes.
Pré-requisitos
- Crie uma conta do OpenAI e solicite acesso ao Serviço OpenAI do Azure.
- Conceda acesso ao OpenAI do Azure na assinatura desejada.
- Conceda permissões para criar recursos do OpenAI do Azure e implantar modelos.
Crie e implante um recurso e um modelo do Azure OpenAI Service, implante o modelo de embeddings text-embedding-ada-002. Copie o nome da implantação conforme necessário para criar inserções.
Habilitar as extensões azure_ai
e pgvector
Antes de habilitar as extensões azure_ai
e pgvector
na instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, você precisará adicioná-las à lista de permitidos, conforme descrito em como usar extensões do PostgreSQL e verificar se foram adicionadas corretamente executando SHOW azure.extensions;
.
Em seguida, instale a extensão conectando-se ao banco de dados de destino e executando o comando CREATE EXTENSION. Você precisará repetir o comando separadamente para cada banco de dados no qual deseja que a extensão esteja disponível.
CREATE EXTENSION azure_ai;
CREATE EXTENSION pgvector;
Configurar o ponto de extremidade e a chave do OpenAI
Nos serviços de IA do Azure em Gerenciamento de Recursos>Chaves e Pontos de Extremidade, você poderá encontrar o ponto de extremidade e as chaves para o seu recurso de IA do Azure. Use o ponto de extremidade e uma das chaves para habilitar a extensão azure_ai
e invocar a implantação do 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>');
Baixar e importar os dados
- Baixe os dados do Kaggle.
- Conecte-se ao seu servidor e crie um banco de dados
test
e, nele, crie uma tabela para a qual você importará os dados. - Importar os dados.
- Adicione uma coluna de inserção à tabela.
- Gerar os embeddings.
- Pesquisar.
Criar a tabela
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)
);
Importar os dados
Defina a variável de ambiente a seguir na janela do cliente para definir a codificação como utf-8. Essa etapa é necessária porque esse conjunto de dados específico usa a codificação WIN1252.
Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8
Importe os dados para a tabela criada; observe que este conjunto de dados contém uma linha de cabeçalho:
psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"
Adicionar uma coluna para armazenar as inserções
ALTER TABLE recipes ADD COLUMN embedding vector(1536);
Gerar inserções
Gere inserções para seus dados usando a extensão azure_ai. A seguir, vetorizamos alguns 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 o comando até que não haja mais linhas a serem processadas.
Dica
Brinque com o LIMIT
. Com um valor alto, a instrução pode falhar no meio do caminho devido à limitação imposta pelo OpenAI do Azure. Se falhar, aguarde pelo menos um minuto e execute o comando novamente.
Crie uma função de pesquisa em seu banco de dados para fins de conveniência:
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;
Agora basta invocar a função para pesquisar a recomendação:
select out_recipename, out_similarityscore from recommend_recipe(1, 20); -- search for 20 recipe recommendations that closest to recipeId 1
E explore os 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)
Próximas etapas
Você aprendeu a executar a pesquisa semântica com o servidor flexível do Banco de Dados do Azure para PostgreSQL e o serviço OpenAI do Azure.