Partilhar via


Pesquisa semântica com o Banco de Dados do Azure para PostgreSQL - Servidor flexível e Azure OpenAI

APLICA-SE A: Banco de Dados do Azure para PostgreSQL - Servidor Flexível

Este tutorial prático mostra como criar um aplicativo de pesquisa semântica usando o Banco de Dados do Azure para servidor flexível PostgreSQL e o Serviço OpenAI do Azure. A pesquisa semântica faz pesquisas baseadas na semântica; A pesquisa lexical padrão faz pesquisas com base em palavras-chave fornecidas em uma consulta. Por exemplo, seu conjunto de dados de receita pode não conter rótulos como sem glúten, vegano, sem laticínios, sem frutas ou sobremesa, mas essas características podem ser deduzidas dos ingredientes. A ideia é emitir essas consultas semânticas e obter resultados de pesquisa relevantes.

A criação de recursos de pesquisa semântica em seus dados usando o GenAI e o Flexible Server envolve as seguintes etapas:

  • Identifique os cenários de pesquisa. Identificar os campos de dados que estarão envolvidos na pesquisa.
  • Para cada campo de dados envolvido na pesquisa, crie um campo vetorial correspondente para armazenar as incorporações do valor armazenado no campo de dados.
  • Gere incorporações para os dados nos campos de dados selecionados e armazene as incorporações em seus campos vetoriais correspondentes.
  • Gere a incorporação para qualquer consulta de pesquisa de entrada.
  • Procure o campo de dados vetoriais e liste os vizinhos mais próximos.
  • Execute os resultados através de modelos adequados de relevância, classificação e personalização para produzir a classificação final. Na ausência de tais modelos, classifique os resultados em ordem decrescente de ponto-produto.
  • Monitore o modelo, a qualidade dos resultados e as métricas de negócios, como CTR (taxa de seleção) e tempo de permanência. Incorpore mecanismos de feedback para depurar e melhorar a pilha de pesquisa, desde a qualidade dos dados, atualização e personalização dos dados até a experiência do usuário.

Pré-requisitos

  1. Crie uma conta OpenAI e solicite acesso ao Serviço OpenAI do Azure.
  2. Conceda acesso ao Azure OpenAI na assinatura desejada.
  3. Conceda permissões para criar recursos do Azure OpenAI e implantar modelos.

Crie e implante um recurso do Serviço OpenAI do Azure e um modelo, implante o modelo de incorporação text-embedding-ada-002. Copie o nome da implantação conforme necessário para criar incorporações.

Habilite o azure_ai e pgvector extensões

Antes de habilitar azure_ai e pgvector em sua instância de servidor flexível do Banco de Dados do Azure para PostgreSQL, você precisa adicioná-los à sua lista de permissões, conforme descrito em Como usar extensões do PostgreSQL e verificar se foram adicionados corretamente executando SHOW azure.extensions;o .

Em seguida, você pode instalar a extensão, conectando-se ao seu banco de dados de destino e executando o comando CREATE EXTENSION . Você precisa 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 vector;

Configurar o ponto de extremidade e a chave do OpenAI

Nos serviços de IA do Azure, em Chaves e Pontos de Extremidade de Gerenciamento de>Recursos, você pode encontrar o ponto de extremidade e as chaves para seu recurso de IA do Azure. Use o ponto de extremidade e uma das chaves para habilitar azure_ai a extensão para 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>');

Download & Importar os dados

  1. Faça o download dos dados do Kaggle.
  2. Conecte-se ao seu servidor e crie um test banco de dados e, nele, crie uma tabela na qual você importará os dados.
  3. Importar os dados.
  4. Adicione uma coluna de incorporação à tabela.
  5. Gere as incorporações.
  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 seguinte variável de ambiente na janela do cliente, para definir a codificação como utf-8. Esta 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

Importar os dados para a tabela criada; Observe que esse 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 incorporações

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Gerar incorporações

Gere incorporaçõ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 para processar.

Gorjeta

Brinque com o LIMIT. Com um valor alto, a instrução pode falhar no meio do caminho devido à limitação imposta pelo Azure OpenAI. Se falhar, aguarde pelo menos um minuto e execute o comando novamente.

Crie uma função de pesquisa na sua base de dados para conveniência:

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;

Agora é só invocar a função para pesquisar:

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

E explore os 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)