Compartilhar via


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

  1. Crie uma conta do OpenAI e solicite acesso ao Serviço OpenAI do Azure.
  2. Conceda acesso ao OpenAI do Azure na assinatura desejada.
  3. 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

  1. Baixe os dados do Kaggle.
  2. Conecte-se ao seu servidor e crie um banco de dados test e, nele, crie uma tabela para a qual você importará os dados.
  3. Importar os dados.
  4. Adicione uma coluna de inserção à tabela.
  5. Gerar os embeddings.
  6. 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.