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:
- Carrega o arquivo CSV criado na primeira parte do projeto com fragmentos de texto e seus respectivos embeddings.
- Abre uma janela para entrada de consulta.
- Executa a consulta do usuário.
- Caso o usuário tenha inserido uma string (palavra), obtém os embeddings para essa string (palavra).
- Envia a consulta para o modelo GPT.
- Abre uma janela com a resposta à consulta do modelo GPT.
- 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):
- Bloco “Início” (a partir deste bloco começa qualquer diagrama).
- 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).
- 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).
- 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”.
- 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).
- 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.
- 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).
- 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).
Bloco “Laço Para cada (Lista)” percorre ciclicamente todos os elementos em uma lista especificada.
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.
- 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.
- 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.
- 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).
- 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).