Partilhar via


Tutorial: Usar uma casa de eventos como um banco de dados vetorial

Neste tutorial, você aprenderá a usar uma Eventhouse como um banco de dados vetorial para armazenar e consultar dados vetoriais no Real-Time Intelligence. Para obter informações gerais sobre bancos de dados vetoriais, consulte Bancos de dados vetoriais

O cenário dado envolve o uso de pesquisas semânticas em páginas da Wikipédia para encontrar páginas com temas comuns. Você usa um conjunto de dados de exemplo disponível, que inclui vetores para dezenas de milhares de páginas da Wikipédia. Essas páginas foram incorporadas com um modelo OpenAI para produzir vetores para cada página. Os vetores, juntamente com alguns metadados pertinentes relacionados à página, são então armazenados em uma Eventhouse. Você pode usar esse conjunto de dados para localizar páginas semelhantes entre si ou para encontrar páginas semelhantes a algum tema que você deseja encontrar. Por exemplo, digamos que você queira procurar "mulheres cientistas famosas do século 19". Você codifica esta frase usando o mesmo modelo OpenAI e, em seguida, executa uma pesquisa de semelhança vetorial sobre os dados armazenados da página da Wikipédia para encontrar as páginas com a maior semelhança semântica.

Especificamente, neste tutorial você irá:

  • Prepare uma tabela na Eventhouse com Vector16 codificação para as colunas vetoriais.
  • Armazene dados vetoriais de um conjunto de dados pré-incorporado em uma Eventhouse.
  • Incorpore uma consulta de linguagem natural usando o modelo Open AI.
  • Use a função series_cosine_similarity KQL para calcular as semelhanças entre o vetor de incorporação de consulta e os das páginas wiki.
  • Veja as linhas com maior semelhança para obter as páginas wiki mais relevantes para a sua consulta de pesquisa.

Esse fluxo pode ser visualizado da seguinte forma:

Esquema do Eventhouse como fluxo de trabalho de banco de dados vetorial.

Pré-requisitos

  • Um espaço de trabalho com uma capacidade habilitada para Microsoft Fabric
  • Uma casa de eventos no seu espaço de trabalho
  • Um recurso OpenAI do Azure com o modelo text-embedding-ada-002 (Versão 2) implantado. Atualmente, este modelo só está disponível em determinadas regiões. Para obter mais informações, consulte Criar um recurso.
    • Certifique-se de que a autenticação local está habilitada em seu recurso do Azure OpenAI.
  • Baixe o bloco de anotações de exemplo do repositório GitHub

Nota

Embora este tutorial use o Azure OpenAI, você pode usar qualquer provedor de modelo de incorporação para gerar vetores para dados de texto.

Prepare seu ambiente de Eventhouse

Nesta etapa de configuração, você cria uma tabela em uma Eventhouse com as colunas e políticas de codificação necessárias para armazenar os dados vetoriais.

  1. Navegue até a página inicial do seu espaço de trabalho em Inteligência em Tempo Real.

  2. Selecione a Eventhouse que você criou nos pré-requisitos.

  3. Selecione o banco de dados de destino onde deseja armazenar os dados vetoriais. Se você não tiver um banco de dados, poderá criar um selecionando Adicionar banco de dados.

  4. Selecione Explorar meus dados. Copie/cole a seguinte consulta KQL para criar uma tabela com as colunas necessárias:

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Copie/cole os seguintes comandos para definir a política de codificação das colunas vetoriais. Execute esses comandos sequencialmente.

    .alter column Wiki.title_vector policy encoding type='Vector16'
    
    .alter column Wiki.content_vector policy encoding type='Vector16'
    

Gravar dados vetoriais em uma casa de eventos

As etapas a seguir são usadas para importar os dados incorporados da Wikipédia e escrevê-los em uma Eventhouse:

Importar bloco de notas

  1. Baixe o bloco de anotações de exemplo do repositório GitHub.
  2. Navegue até o ambiente do Fabric. No seletor de experiência, escolha Desenvolver e, em seguida, seu espaço de trabalho.
  3. Selecione >Carregar e escolha o bloco de anotações que você baixou em uma etapa anterior.
  4. Quando a importação estiver concluída, abra o bloco de anotações importado do seu espaço de trabalho.

Gravar dados no Eventhouse

  1. Execute as células para configurar seu ambiente.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Execute as células para baixar as incorporações pré-calculadas.

    import wget
    
    embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip"
    
    # The file is ~700 MB so it might take some time
    wget.download(embeddings_url)
    
    import zipfile
    
    with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip","r") as zip_ref:
        zip_ref.extractall("/lakehouse/default/Files/data")
    
    import pandas as pd
    
    from ast import literal_eval
    
    article_df = pd.read_csv('/lakehouse/default/Files/data/vector_database_wikipedia_articles_embedded.csv')
    # Read vectors from strings back into a list
    article_df["title_vector"] = article_df.title_vector.apply(literal_eval)
    article_df["content_vector"] = article_df.content_vector.apply(literal_eval)
    article_df.head()
    
  3. Para gravar na casa de eventos, insira o URI do cluster, que pode ser encontrado na página de visão geral do sistema, e o nome do banco de dados. A tabela é criada no bloco de notas e posteriormente referenciada na consulta.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Execute as células restantes para gravar os dados na Eventhouse. Esta operação pode levar algum tempo para ser executada.

    kustoOptions = {"kustoCluster": KUSTO_CLUSTER, "kustoDatabase" :KUSTO_DATABASE, "kustoTable" : KUSTO_TABLE }
    
    access_token=mssparkutils.credentials.getToken(kustoOptions["kustoCluster"])
    
    #Pandas data frame to spark dataframe
    sparkDF=spark.createDataFrame(article_df)
    
    # Write data to a table in Eventhouse
    sparkDF.write. \
    format("com.microsoft.kusto.spark.synapse.datasource"). \
    option("kustoCluster",kustoOptions["kustoCluster"]). \
    option("kustoDatabase",kustoOptions["kustoDatabase"]). \
    option("kustoTable", kustoOptions["kustoTable"]). \
    option("accessToken", access_token). \
    option("tableCreateOptions", "CreateIfNotExist").\
    mode("Append"). \
    save()
    

Ver os dados no Eventhouse

Neste ponto, você pode verificar se os dados foram gravados na casa de eventos navegando até a página de detalhes do banco de dados.

  1. Navegue até a página inicial do seu espaço de trabalho em Inteligência em Tempo Real.
  2. Selecione o item de banco de dados fornecido na seção anterior. Você deve ver um resumo dos dados que foram escritos na tabela "Wiki".

Gerar incorporação para o termo de pesquisa

Agora que você armazenou os dados wiki incorporados em sua casa de eventos, você pode usar esses dados como uma referência para encontrar páginas em um artigo específico. Para fazer a comparação, você incorpora o termo de pesquisa e, em seguida, faz uma comparação entre o termo de pesquisa e as páginas da Wikipédia.

Para fazer uma chamada com êxito no Azure OpenAI, você precisa de um ponto de extremidade, chave e ID de implantação.

Nome da variável Value
endpoint Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso no portal do Azure. Como alternativa, você pode encontrar o valor no Azure AI Foundry> Playground > na Exibição de Código. Um exemplo de ponto de extremidade é: https://docs-test-001.openai.azure.com/.
Chave de API Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso no portal do Azure. Você pode usar KEY1 ou KEY2.
ID de implantação Esse valor pode ser encontrado na seção Implementações noAzure AI Foundry.

Use as informações na tabela ao executar as células do Azure OpenAI.

Importante

A autenticação local deve ser habilitada em seu recurso de IA aberta do Azure para usar a chave de API.

import openai
openai.api_version = '2022-12-01'
openai.api_base = 'endpoint' # Add your endpoint here
openai.api_type = 'azure'
openai.api_key = 'api key'  # Add your api key here

def embed(query):
  # Creates embedding vector from user query
  embedded_query = openai.Embedding.create(
          input=query,
          deployment_id="deployment id", # Add your deployment id here
          chunk_size=1
  )["data"][0]["embedding"]
  return embedded_query
searchedEmbedding = embed("most difficult gymnastics moves in the olympics")
#print(searchedEmbedding)

Consultar a semelhança

A consulta é executada diretamente do bloco de anotações e usa a incorporação retornada da etapa anterior em uma comparação com as páginas da Wikipédia incorporadas armazenadas em sua casa de eventos. Esta consulta usa a função de semelhança cosseno e retorna os 10 principais vetores mais semelhantes.

Execute as células no bloco de notas para ver os resultados da consulta. Você pode alterar o termo de pesquisa e executar novamente a consulta para ver resultados diferentes. Você também pode comparar uma entrada existente no banco de dados Wiki para encontrar entradas semelhantes.

kustoQuery = "Wiki | extend similarity = series_cosine_similarity(dynamic("+str(searchedEmbedding)+"), content_vector) | top 10 by similarity desc" 
accessToken = mssparkutils.credentials.getToken(KUSTO_CLUSTER)
kustoDf  = spark.read\
    .format("com.microsoft.kusto.spark.synapse.datasource")\
    .option("accessToken", accessToken)\
    .option("kustoCluster", KUSTO_CLUSTER)\
    .option("kustoDatabase", KUSTO_DATABASE)\
    .option("kustoQuery", kustoQuery).load()

# Example that uses the result data frame.
kustoDf.show()

Captura de tela da célula em execução de resultados de similaridade.

Clean up resources (Limpar recursos)

Ao terminar o tutorial, você pode excluir os recursos criados para evitar incorrer em outros custos. Para eliminar os recursos, siga estes passos:

  1. Navegue até a página inicial do seu espaço de trabalho.
  2. Exclua o bloco de anotações criado neste tutorial.
  3. Exclua a Eventhouse ou o banco de dados usado neste tutorial.