Search Embeddings#

Vamos considerar o exemplo de um robô que é a segunda parte do projeto “AI Chat With Own Document” (na primeira parte o robô calculou os embeddings a partir de fragmentos do arquivo de texto especificado e os gravou em um arquivo no formato CSV). Este robô utiliza os embeddings previamente obtidos e a rede neural ChatGPT para responder a quaisquer perguntas sobre o conteúdo do documento. Ou seja, ao operar este robô, é possível inserir quaisquer consultas em linguagem natural, e a rede neural fornecerá uma resposta com base no conteúdo do documento.

O projeto do robô consiste em um diagrama. Assim, se descrevermos passo a passo, este robô funciona da seguinte maneira:

  1. Carrega o arquivo CSV criado na primeira parte do projeto com fragmentos de texto e seus respectivos embeddings.
  2. Abre uma janela para entrada de consulta.
  3. Executa a consulta do usuário.
  4. Caso o usuário tenha inserido uma string (palavra), obtém os embeddings para essa string (palavra).
  5. Envia a consulta para o modelo GPT.
  6. Abre uma janela com a resposta à consulta do modelo GPT.
  7. Após isso, abre uma janela para entrada de consulta e executa a consulta do usuário.

O diagrama do projeto é assim (para conveniência, os blocos do diagrama estão numerados):

  1. Bloco “Início” (a partir deste bloco começa qualquer diagrama).
  2. O bloco “Carregar do CSV” permite carregar a Tabela de Dados de um documento CSV. Para este bloco, as seguintes propriedades são especificadas:
  • Caminho do arquivo (caminho do arquivo do qual a Tabela de Dados deve ser carregada);
  • Delimitador (símbolo delimitador);
  • Codificação (codificação do arquivo).
  1. Bloco “Janela para entrada de texto” mostra uma janela modal destinada a receber informações do usuário. Para este bloco, as seguintes propriedades são especificadas:
  • Título (texto que será exibido no título da janela de diálogo);
  • Mensagem (texto que será exibido dentro da janela de diálogo).
  1. Bloco “Condição” verifica a condição especificada para veracidade, após o que a execução do cenário continua em direção à saída “Sim” (se a condição for atendida) ou em direção à saída “Não” (se a condição não for atendida).

A condição é registrada no formato: “variável” igual (==)/ maior (>)/ menor (<) “valor”.

Por exemplo: $a == “Olá”, ou seja, se o valor da variável $a for igual a “Olá”, então a saída é “Sim”, caso contrário – a saída é “Não”.

$Result > 5, ou seja, se o valor da variável $Result for menor que 5, então a saída é “Sim”, caso contrário – a saída é “Não”.

Neste caso, a condição estabelecida é: $TextQuery.Length == 0. Ou seja, se o comprimento da string for igual a zero, então a saída é “Sim”.

  1. Bloco “Obter embeddings” permite obter embeddings para uma string ou lista de strings utilizando o serviço Open AI. Para este bloco, as seguintes propriedades são especificadas:
  • Texto (texto de entrada para o qual os embeddings serão calculados);
  • Modelo (modelo da rede neural para geração de resposta);
  • Timeout (tempo máximo de espera pela resposta em segundos).
  1. Bloco “Log” permite registrar mensagens e/ou valores de variáveis no log durante a execução do cenário do robô. Para este bloco, a propriedade “Valor” é especificada. Entre aspas, é indicada uma constante textual, e o nome da variável começa com o símbolo $. Ou seja, este bloco registra no log do robô os embeddings obtidos a partir da string do usuário, obtidos no bloco anterior.
  1. Bloco “Encontrar embeddings” para um determinado embedding de consulta encontra na base de conhecimento, que consiste em uma tabela de objetos e seus embeddings, as strings mais semelhantes e retorna os índices dessas strings em forma de lista, ordenada em ordem decrescente de similaridade. Os embeddings tanto para a consulta quanto para a tabela de embeddings, na qual a busca é realizada, podem ser obtidos através do bloco Obter embeddings. Na primeira utilização do bloco, ocorre a construção da base de dados de vetores e isso pode levar um tempo considerável. Em chamadas subsequentes do bloco com o mesmo "ID da base", a base de dados de vetores já criada será utilizada e a velocidade de operação do bloco aumenta consideravelmente. Para este bloco, as seguintes propriedades são especificadas:
  • Embedding da consulta (embedding para o qual é necessário encontrar strings semelhantes na tabela);
  • Base de conhecimento (tabela na qual a busca será realizada, uma das colunas deve conter embeddings, outras colunas da tabela podem conter quaisquer dados do usuário);
  • Coluna de embeddings (índice da coluna da tabela (por padrão, o valor é 1), indicada na propriedade "Base de conhecimento", onde os embeddings estão localizados);
  • Número de resultados (Número máximo de linhas de resultados retornadas pelo bloco da base de conhecimento (por padrão, o valor é 5).
  1. Bloco “Atribuir valor à variável” estabelece novos valores para uma ou mais variáveis. Neste caso, nas propriedades, são especificados dois valores que devem ser atribuídos às variáveis: à variável $AIQuery deve ser atribuído o valor “Answer the question using only knowledge base listed below.`nQuestion: {query}`nKnowledge base: `n{strresult}", e à variável $strresult – um valor vazio (para posterior gravação na variável da resposta à consulta do usuário).
  1. Bloco “Laço Para cada (Lista)” percorre ciclicamente todos os elementos em uma lista especificada.

  2. Bloco “Atribuir valor à variável” estabelece novos valores para uma ou mais variáveis. Neste caso, nas propriedades, está indicado um valor que deve ser atribuído à variável.

  1. Bloco “Atribuir valor à variável” estabelece novos valores para uma ou mais variáveis. Neste caso, nas propriedades, estão indicados dois valores que devem ser atribuídos às variáveis especificadas.
  1. Bloco “Log” permite registrar mensagens arbitrárias e/ou valores de variáveis no log durante a execução do script do robô. Para este bloco, está especificada a propriedade “Valor”. Entre aspas, está uma constante de texto, e o nome da variável começa com o símbolo $. Ou seja, este bloco registra no log do robô o valor da variável $AIQuery (a consulta resultante ao GPT). Por sua vez, a variável $AIQuery inclui o texto do usuário e a Base de Conhecimento.
  1. Bloco “Solicitação ao modelo GPT” permite enviar solicitações para os modelos generativos clássicos da Open AI antes do ChatGPT e receber respostas. Para este bloco, estão especificadas as seguintes propriedades:
  • Solicitação (solicitação em linguagem natural);
  • Modelo (modelo para geração de texto);
  • Temperatura (número decimal entre 0 e 1, que indica o grau de "aleatoriedade" ou "criatividade" do resultado, onde 0 é o resultado menos criativo e 1 é o mais aleatório);
  • Timeout (tempo máximo de espera pela resposta em segundos).
  1. Bloco “Janela de mensagem” mostra ao usuário uma janela de diálogo modal, com um título, texto e um conjunto de botões definidos. Para este bloco, estão especificadas as seguintes propriedades:
  • Título (texto que será exibido no título da janela de diálogo);
  • Mensagem (variável que será exibida dentro da janela de diálogo, neste caso, é a variável $Response, que é a resposta do modelo generativo à solicitação);
  • Botões (botões que estarão disponíveis para o usuário clicar).


15. Bloco “Fim” (este bloco encerra a execução do script ou retorna o diagrama do subprocesso ao processo principal).