Embeddings e Bancos de Dados Vetoriais: A Dupla Dinâmica da Inteligência Artificial com OpenAI e SingleStore

Embeddings e bancos de dados vetoriais são componentes cruciais na construção de produtos de Inteligência Artificial (IA) sofisticados. Eles permitem que sistemas de IA compreendam e processem informações de maneiras que antes eram inimagináveis, desde a criação de memórias de longo prazo para chatbots até a execução de buscas semânticas em vastas coleções de documentos. Neste artigo, exploraremos a teoria por trás dessas tecnologias, seu uso prático e como integrá-las utilizando as APIs da OpenAI e o banco de dados vetorial SingleStore, conforme demonstrado por Adrian Twarog em seu vídeo sobre o tema.

O que são Embeddings? Desvendando a Teoria por Trás dos Vetores de Dados

Para entender a Inteligência Artificial moderna, é fundamental compreender o conceito de embeddings. De forma simplificada, um embedding é uma representação numérica de dados, como palavras, frases, imagens ou áudio. Esses dados são convertidos em um array de números, conhecido como vetor, que captura padrões e relações semânticas entre eles. A beleza dos embeddings reside na sua capacidade de transformar dados complexos em um formato que modelos de aprendizado de máquina podem processar e entender.

A combinação desses números no vetor atua como um mapa multidimensional. Imagine, por exemplo, as palavras "cachorro" e "filhote". Em um modelo de word embedding, essas palavras, frequentemente usadas em contextos similares, seriam representadas por vetores muito próximos nesse espaço multidimensional. Essa proximidade indica uma alta similaridade semântica. Enquanto um exemplo simples pode ser visualizado em um gráfico 2D, na realidade, esses vetores possuem centenas de dimensões, permitindo capturar as ricas e complexas relações entre as palavras ou outros tipos de dados.

Essa técnica não se limita a texto. Imagens também podem ser convertidas em vetores. Um exemplo prático é o sistema de busca por imagens similares do Google. Seções de uma imagem são decompostas em arrays numéricos, permitindo encontrar padrões de similaridade com outras imagens que possuem vetores semelhantes. Uma vez que um embedding é criado, ele pode ser armazenado em um banco de dados, nos levando ao próximo conceito fundamental.

Bancos de Dados Vetoriais: Onde os Embeddings Ganham Vida

Um banco de dados vetorial (Vector Database) é um tipo especializado de banco de dados projetado para armazenar e gerenciar eficientemente os embeddings. Após a criação dos vetores numéricos que representam dados, eles são inseridos nesse tipo de banco de dados, que se torna uma ferramenta poderosa para diversas aplicações de IA.

As principais utilidades de um banco de dados vetorial incluem:

  • Busca Semântica (Searching): Permite que os resultados de uma pesquisa sejam classificados por relevância em relação a uma string de consulta. Em vez de buscar por palavras-chave exatas, a busca semântica encontra resultados com significado similar.
  • Agrupamento (Clustering): Strings de texto ou outros dados são agrupados com base em sua similaridade vetorial.
  • Recomendações: Itens com strings de texto relacionadas (e, portanto, vetores próximos) são recomendados aos usuários.
  • Classificação: Strings de texto são classificadas de acordo com seus rótulos mais similares.

Para os propósitos deste artigo, focaremos na busca semântica, uma das aplicações mais comuns e impactantes.

Criando Embeddings com a OpenAI e suas APIs

A OpenAI, conhecida por modelos como o ChatGPT, oferece modelos de IA poderosos especificamente para criar embeddings. No entanto, é importante notar que a OpenAI não fornece uma solução de armazenamento para esses embeddings; para isso, utilizaremos um banco de dados na nuvem, como o SingleStore, mais adiante.

Acessando a OpenAI e Obtendo uma Chave de API

O primeiro passo é acessar a plataforma da OpenAI:

  1. Visite o site da OpenAI.
  2. Crie uma nova conta ou faça login em uma existente. A criação de conta é gratuita.
  3. Após o login, navegue até a seção de APIs. Lá, você encontrará a documentação detalhada, incluindo informações sobre embeddings.
  4. Para interagir com a API, você precisará de uma chave de API. Acesse a página de "API Keys" no seu painel da OpenAI.
  5. Clique em "Create new secret key", dê um nome para sua chave (por exemplo, "embeddings_tutorial") e gere a chave.
  6. Importante: Copie e guarde essa chave em um local seguro. Por motivos de segurança, a OpenAI não exibirá a chave novamente. Se você perdê-la, precisará gerar uma nova.

Utilizando o Postman para Criar Embeddings via API da OpenAI

Embora seja possível escrever código para fazer requisições à API, uma maneira fácil de testar e interagir com APIs é utilizando ferramentas como o Postman. Adrian Twarog, em seu vídeo, demonstra o uso do Postman, que também é um patrocinador do seu conteúdo.

Para criar um embedding usando o Postman e a API da OpenAI:

  1. Crie um Workspace no Postman: Organize suas requisições criando um workspace (por exemplo, "OpenAI Vector Database").
  2. Nova Requisição POST: Abra uma nova aba de requisição e configure-a como POST.
  3. URL da Requisição: Utilize o endpoint para embeddings da OpenAI: https://api.openai.com/v1/embeddings.
  4. Autorização (Authorization):
    • Selecione o tipo "Bearer Token".
    • No campo do token, insira a chave de API secreta que você gerou na plataforma da OpenAI.
  5. Corpo da Requisição (Body):
    • Selecione a opção "raw" e o formato "JSON".
    • Insira o seguinte JSON, substituindo o texto de entrada conforme necessário:
      
      {
        "model": "text-embedding-ada-002",
        "input": "Seu texto para gerar o embedding aqui"
      }
              
    • O modelo text-embedding-ada-002 é um dos mais recentes e eficientes em termos de custo da OpenAI.
    • O campo input pode conter uma única palavra, uma frase ou até mesmo um parágrafo extenso. Conforme demonstrado no vídeo, é possível inserir o conteúdo de uma página inteira de um documento legal. O modelo ada-002 suporta um máximo de aproximadamente 8191 tokens, o que equivale a cerca de 30.000 caracteres.
  6. Envie a Requisição: Clique em "Send".

A resposta da API será um objeto JSON contendo o embedding gerado. Este embedding é um array longo de números que representa vetorialmente o texto de entrada.

Armazenando e Consultando Embeddings com Bancos de Dados Vetoriais (Exemplo com SingleStore)

Como mencionado, a OpenAI cria os embeddings, mas não os armazena. Para isso, precisamos de um banco de dados vetorial. O SingleStore é uma plataforma de banco de dados distribuído SQL em tempo real que oferece funcionalidades de banco de dados vetorial integradas, ideal para aplicações de IA.

Configurando o SingleStore

  1. Crie uma Conta: Visite o site do SingleStore e crie uma conta. Eles oferecem um período de teste gratuito com créditos para uso.
  2. Crie um Workspace: No painel do SingleStore, crie um novo workspace. Você pode nomeá-lo, por exemplo, "OpenAI Vector Database Workspace". Escolha um provedor de nuvem (AWS, GCP, Azure) e uma região (de preferência, a mais próxima de você para menor latência).
  3. Crie um Banco de Dados: Dentro do seu workspace, crie um novo banco de dados. Um nome como "openaidatabase" é adequado.

Criando uma Tabela e Inserindo Dados no SingleStore

Com o banco de dados criado, utilize o SQL Editor do SingleStore para definir sua estrutura e popular os dados:

  1. Crie uma Tabela Vetorial:
    
    CREATE TABLE IF NOT EXISTS myvectortable (
      text TEXT,
      vector BLOB
    );
        

    Esta tabela, chamada myvectortable, terá duas colunas: text para armazenar o texto original e vector do tipo BLOB (Binary Large Object) para armazenar o embedding.

  2. Insira os Embeddings: Para cada embedding gerado pela API da OpenAI, você o inserirá na tabela. Por exemplo, para o embedding de "Hello World":
    
    INSERT INTO myvectortable (text, vector)
    VALUES (
      "Hello World",
      JSON_ARRAY_PACK('[seu_longo_array_de_numeros_do_embedding_aqui]')
    );
        

    A função JSON_ARRAY_PACK() é usada no SingleStore para converter o array de números do embedding (que você obtém da resposta da API da OpenAI) em um formato que pode ser armazenado na coluna BLOB e usado para cálculos vetoriais. Copie o array numérico da resposta do Postman e cole-o dentro das aspas simples de JSON_ARRAY_PACK().

    Repita este processo para todos os textos e seus respectivos embeddings que deseja armazenar. No vídeo, Adrian Twarog insere três exemplos: "Hello World", "OpenAI Vectors and Embeddings are Easy!" e um trecho de um documento.

Realizando Buscas Semânticas no SingleStore

Com os embeddings armazenados, podemos realizar buscas semânticas. O processo é o seguinte:

  1. Defina sua Consulta de Busca: Decida qual termo ou frase você deseja pesquisar (por exemplo, "OpenAI").
  2. Crie um Embedding para a Consulta: Use a API da OpenAI (via Postman ou código) para gerar o embedding do seu termo de busca.
  3. Execute a Consulta SQL no SingleStore: Utilize o embedding da sua consulta para encontrar os vetores mais similares no seu banco de dados. A consulta SQL para isso, usando a função DOT_PRODUCT (produto escalar, uma medida de similaridade entre vetores), seria:
    
    SELECT
      text,
      DOT_PRODUCT(vector, JSON_ARRAY_PACK('[embedding_da_sua_consulta_aqui]')) AS score
    FROM myvectortable
    ORDER BY score DESC
    LIMIT 5;
        

    Nesta consulta:

    • Selecionamos o texto original (text) e o DOT_PRODUCT entre o vetor armazenado (vector) e o vetor da sua consulta de busca.
    • JSON_ARRAY_PACK('[embedding_da_sua_consulta_aqui]') converte o embedding da sua consulta para o formato correto.
    • AS score nomeia o resultado do DOT_PRODUCT como "score". Um score mais alto indica maior similaridade.
    • FROM myvectortable especifica a tabela.
    • ORDER BY score DESC ordena os resultados do mais similar para o menos similar.
    • LIMIT 5 retorna os 5 resultados mais relevantes.

    Como demonstrado no vídeo, ao buscar por "OpenAI", o texto "OpenAI Vectors and Embeddings are Easy!" obtém o score mais alto. Se a busca fosse por "Hello Earth", o texto "Hello World" provavelmente teria o maior score, devido à maior similaridade semântica.

Integração Prática: JavaScript e Node.js para Automatizar o Processo

Para aplicações mais robustas, é ideal automatizar a criação de embeddings e a interação com o banco de dados usando uma linguagem de programação como JavaScript em um ambiente Node.js.

Função para Criar Embeddings via API da OpenAI em JavaScript

A seguir, um exemplo de função assíncrona em JavaScript para criar um embedding usando a API da OpenAI:


async function createEmbedding(textToEmbed) {
  const openAIHeaders = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer SEU_TOKEN_DA_OPENAI_API_AQUI' // Idealmente, use variáveis de ambiente
  };

  let response = await fetch('https://api.openai.com/v1/embeddings', {
    method: 'POST',
    headers: openAIHeaders,
    body: JSON.stringify({
      'model': 'text-embedding-ada-002',
      'input': textToEmbed
    })
  });

  if (response.ok) {
    const data = await response.json();
    console.log(data); // Para depuração
    return data; // Ou especificamente data.data.embedding para o vetor
  } else {
    console.error('Erro ao criar embedding:', response.statusText);
    return null;
  }
}

// Exemplo de uso:
// createEmbedding("Olá Mundo").then(embeddingData => {
//   if (embeddingData) {
//     // Aqui você pegaria o vetor de embeddingData.data.embedding
//     // e o inseriria no SingleStore usando uma biblioteca SQL para Node.js
//   }
// });

Nota Importante sobre Segurança: Nunca insira sua chave de API diretamente no código em aplicações de produção. Utilize variáveis de ambiente para armazenar informações sensíveis.

Com esta função, você pode programaticamente converter textos em embeddings, que podem então ser inseridos no seu banco de dados vetorial SingleStore usando bibliotecas Node.js apropriadas para interagir com bancos de dados SQL.

Aplicações Práticas e Próximos Passos com Embeddings e Bancos de Dados Vetoriais

As possibilidades com embeddings e bancos de dados vetoriais são vastas. Algumas aplicações incluem:

  • Memória de Longo Prazo para Chatbots: Permita que chatbots como o ChatGPT lembrem-se de interações passadas e contextos, tornando as conversas mais ricas e personalizadas.
  • Busca Semântica Avançada: Realize buscas inteligentes em grandes volumes de documentos (PDFs, artigos, bases de conhecimento) ou websites, encontrando informações relevantes mesmo que os termos exatos não sejam usados.
  • Sistemas de Recomendação: Sugira produtos, artigos ou conteúdos com base na similaridade com itens que o usuário já demonstrou interesse.
  • Detecção de Anomalias e Classificação de Texto: Identifique padrões incomuns ou categorize textos automaticamente.

Para aqueles que desejam aprofundar seus conhecimentos, Adrian Twarog menciona seu livro digital "Teach Me OpenAI & GPT", que cobre desde os fundamentos até o fine-tuning de modelos e a integração com APIs, apresentado de forma visual e prática.

Conclusão: O Futuro da IA é Vetorial

Embeddings e bancos de dados vetoriais representam uma evolução significativa na forma como a Inteligência Artificial interage e compreende dados. Ao dominar essas tecnologias, desenvolvedores e empresas podem criar aplicações mais inteligentes, intuitivas e poderosas. A combinação das capacidades de geração de embeddings da OpenAI com a eficiência de armazenamento e consulta de bancos de dados como o SingleStore abre um leque de oportunidades para inovar e resolver problemas complexos. O momento de explorar e construir com essas ferramentas é agora.