Banco de dados vetoriais são uma das principais ferramentas que estão impulsionando a maneira como estamos processando dados com inteligência artificial. Neste artigo quero apresentar alguns conceitos chaves e como estamos utilizando no AppCívico.
Vetores são estruturas matemáticas que representam uma informação que possui tanto magnitude quanto direção. Eles são frequentemente usados para representar informações em várias dimensões, como pontos no espaço ou características de um objeto. Em ciência da computação e aprendizado de máquina, os vetores são comumente usados para representar dados de forma compacta e eficiente.
No contexto sobre bancos de dados, vetores são armazenados de maneira otimizada para permitir operações eficientes de busca e recuperação. Existem várias abordagens para armazenar vetores em bancos de dados, incluindo:
Armazenamento denso: Os vetores são armazenados como arrays contíguos de números, geralmente em formato binário para economizar espaço e melhorar a eficiência. Essa abordagem é adequada para vetores com muitos componentes não nulos.
Armazenamento esparso: Para vetores com muitos componentes nulos, o armazenamento esparso pode ser mais eficiente. Nesse caso, apenas os componentes não nulos e suas posições são armazenados, economizando espaço e melhorando o desempenho.
Indexação: Para facilitar buscas rápidas e eficientes, os bancos de dados podem criar índices que mapeiam vetores para seus locais de armazenamento. Esses índices podem ser baseados em técnicas como árvores de busca, hashing ou particionamento de espaço.
Compressão: Os bancos de dados podem empregar algoritmos de compressão para reduzir o tamanho dos vetores armazenados, economizando espaço e melhorando a eficiência na transmissão e recuperação dos dados.
Essas técnicas de armazenamento permitem que os bancos de dados baseados em vetores manipulem grandes volumes de dados de maneira eficiente, tornando-os ideais para aplicações de aprendizado de máquina e processamento de linguagem natural, como o ChatGPT.
Soluções de bancos de dados utilizando vetores em alta
Os bancos de dados baseados em vetores - e também bancos de dados tradicionais que conseguem trabalhar com grandes vetores - estão em alta devido à crescente difusão de modelos de linguagem avançados, como o ChatGPT da OpenAI. Essa popularidade pode ser atribuída a várias razões, entre elas:
Representação eficiente de informações: Vetores podem representar informações de maneira mais compacta e eficiente, facilitando o armazenamento e a recuperação de dados em larga escala. Isso é particularmente útil para modelos de linguagem como o ChatGPT, que lidam com grandes volumes de dados textuais.
Compatibilidade com aprendizado de máquina: Vetores são amplamente utilizados em algoritmos de aprendizado de máquina, incluindo redes neurais profundas, como o ChatGPT. Vetores facilitam a integração de dados com esses algoritmos, permitindo um desempenho melhor e mais rápido.
Escalabilidade: Os bancos de dados baseados em vetores são altamente escaláveis, o que os torna ideais para lidar com a crescente quantidade de dados gerados por modelos de linguagem como o ChatGPT. Isso permite que os desenvolvedores e pesquisadores expandam continuamente a capacidade e o desempenho desses modelos.
Estes motivos não explicam sozinhos o incrível resultado do ChatGPT, uma das partes mais importantes deste processo, que é, em partes, viabilizado pela utilização de vetores, é a busca semântica.
Buscas semânticas
As buscas semânticas utilizando vetores envolvem a representação de palavras, frases ou documentos como vetores numéricos em um espaço multidimensional. Essa representação captura o significado e o contexto das palavras e permite a comparação e a recuperação de informações semânticas. Os passos típicos para realizar uma busca semântica usando vetores são:
Incorporação de palavras: Primeiro, as palavras, frases ou documentos são convertidos em vetores numéricos usando técnicas de incorporação de palavras, como Word2Vec, GloVe, FastText ou BERT. Essas técnicas geram vetores que capturam o contexto e as relações semânticas entre as palavras.
Indexação: Os vetores gerados são armazenados em um banco de dados ou estrutura de dados otimizada para buscas semânticas. Essa estrutura pode incluir árvores de busca, tabelas de hash ou particionamento de espaço, permitindo a busca eficiente de vetores similares.
Consulta: Quando um usuário faz uma consulta, a consulta é processada e convertida em um vetor usando a mesma técnica de incorporação de palavras aplicada aos dados armazenados. Esse vetor de consulta representa a intenção semântica do usuário.
Cálculo de similaridade: A similaridade entre o vetor de consulta e os vetores armazenados no banco de dados é calculada usando medidas de distância, como a distância de cosseno, a distância euclidiana ou a similaridade de Jaccard. Essas medidas quantificam o quão próximos estão os vetores em termos de significado e contexto.
Classificação e recuperação: Os vetores armazenados são classificados com base em suas similaridades com o vetor de consulta. Os vetores mais similares (ou seja, aqueles com menor distância ou maior similaridade) são considerados mais relevantes para a consulta e são recuperados como resultados.
Pós-processamento: Os resultados recuperados podem ser pós-processados para melhorar a qualidade e a relevância das informações retornadas. Isso pode incluir a remoção de duplicatas, a aplicação de filtros ou a combinação de resultados de várias fontes.
Ao utilizar vetores para buscas semânticas, é possível encontrar informações relevantes com base no significado e no contexto, em vez de simplesmente se concentrar em palavras-chave ou termos exatos. Essa abordagem é particularmente útil em aplicações de processamento de linguagem natural e aprendizado de máquina, como o ChatGPT, onde a compreensão do contexto é essencial para fornecer respostas precisas e úteis.
Utilização de soluções baseadas em vetores no AppCívico
No AppCívico, já fazemos a utilização de tecnologias que permitem a implementação de vetores. Utilizamos o Postgresql com a extensão pgvector. Essa extensão foi projetada para simplificar e otimizar o armazenamento e a manipulação de vetores numéricos de alta dimensão.
Esta é uma extensão bem completa e conta com estas funcionalidades, entre outras:
Tipo de dado vetor: A extensão introduz um novo tipo de dado chamado vector, que permite armazenar e gerenciar vetores numéricos de forma eficiente no PostgreSQL. Esses vetores podem ser usados para representar informações multidimensionais, como incorporações de palavras ou características de objetos.
Funções e operadores: A extensão fornece uma variedade de funções e operadores para manipular vetores, como adição, subtração, multiplicação por escalar e normalização. Essas funções facilitam o cálculo e a manipulação de vetores diretamente no banco de dados, sem a necessidade de processamento adicional do lado do cliente.
Cálculo de similaridade: A extensão inclui funções para calcular a similaridade entre vetores, como a distância de cosseno e a distância euclidiana. Essas funções podem ser usadas para realizar buscas semânticas e recuperar informações com base na similaridade de vetores.
Indexação: Suporta a criação de índices para acelerar consultas envolvendo vetores. Isso permite que os usuários realizem buscas rápidas e eficientes em grandes conjuntos de dados com base na similaridade de vetores.
Em resumo, a extensão facilita o armazenamento e a manipulação de vetores numéricos em bancos de dados, permitindo que os desenvolvedores aproveitem as vantagens das buscas semânticas e das técnicas de aprendizado de máquina em suas aplicações, sem que seja necessário passar pela curva de aprendizado que acompanha a utilização de uma nova tecnologia, como bancos de vetores nativos, por exemplo: Conepine, Weaviate e TypeSense.
Chatbots personalizados e eficientes com Bottender
Utilizando frameworks de software livre a manutenção de integrações pode oferecer mais possibilidades e sustentabilidade ao longo de um projeto cívico.