Tabelas Vetoriais 101: Entenda de uma vez por todas o que é Vector e PGVector
Com certeza você já ouviu falar sobre pgvector, vetores e que isso tudo parece algo bem complicado. Bem... E é mesmo! Mas você não precisa saber como fazer o motor do carro do zero só para mexer nele. Se você estava até agora jogando jogos duvidosos em um PC-88, vetores são usados por inteligência artificial, esse artigo então é obviamente sobre isso.
Nesse post vou tentar explicar, de forma extremamente didática e prática, que raios é esse tal vetor e por que isso vai ter uma importância cada vez maior no futuro. Para entender pgvector você não precisa entender álgebra linear, nem machine learning.

O básico sobre vector
Um vetor (ou vector) é basicamente uma array ordenada de números:
[1, 2, 3, 4, 5]
[0.002, 0.887, -0.134, 0.552, ...]
Até aí nenhuma novidade, mas matematicamente, podemos imaginar esse vetor como um ponto em um espaço:
- Com 2 números, existe em um espaço 2d
- Com 3 números, existe em um espaço 3d
- Com 768 números, existe em um espaço de 768 dimensões
E por aí vai. É aqui que a coisa complica.
Por que não usar um simples TEXT?
Porque texto puro não permite busca por significado, e é aqui que o vector se destaca. Imagina comigo, que seu banco possui:
"Como configurar PostgreSQL"
E o usuário pesquisa:
"tutorial de setup do banco Postgres"
Dessa forma, os embeddings posicionam (ou deveriam) essas frases próximas em um espaço vetorial, com proximidades. É possível afirmar, mesmo sem compartilhar as mesmas palavras:
"Esses textos falam sobre praticamente a mesma coisa."
Se fosse um registro TEXT seria inviável, com a quantidade de informação armazenada, fazer essa correlação de forma prática e rápida.
Entendendo Embedding e Proximidade
É a representação numérica de alguma informação armazenada. Essa informação pode ser text, imagem, áudio, vídeo... O que for necessário. O modelo de IA vai pegar esse conteúdo e converter integralmente para um vector. Por exemplo: a palavra gato vai virar [0.12, -0.44, 0.88, ...] no banco de dados, enquanto cachorro pode virar [0.09, -0.41, 0.85, ...].
O que importa nisso não são os números sozinhos, mas a posição relativa desses vetores. E como a IA entende isso? Pois é meu caro leitor, ela não entende! O modelo aprende a posicionar conceitos semanticamente próximos em regiões próximas do espaço vetorial. Não é mágica, nem bruxaria, é uma matemática extremamente complexa, que eu não tenho (no dia que escrevo isso) tempo e nem vontade de me intrometer.
Visualmente, dentro da lógica interpretativa, e de uma forma extremamente simples, fica assim:
gato
*
*
cachorro
PostgreSQL
*
*
Kubernetes
Agora pegue esse exemplo faça ele vezes milhões. É assim que fica armazenado.
Como a Proximidade é medida?
Já que tudo é vetor, precisamos entender o que está mais próximo de que. Existem três métricas comuns usadas, essa é a única parte desse post que você vai encontrar termos técnicos diferentes (ou nem tanto):
- Distância Euclidiana mede a distância geométrica tradicional, quanto menor a distância, mais semelhantes os vetores são.
- Produto Interno mede o alinhamento entre vetores, bem usado em sistemas de busca e recomendação.
- Similaridade de Cosseno mede o ângulo entre vetores, embeddings semanticamente semelhantes tendem a apontar para direções parecidas.
A importância da Dimensionalidade
Você já sabe que o tamanho da dimensionalidade é definido pela quantidade de arrays dentro de cada valor: [1, 2] tem duas dimensões, [1, 2, 3, 4] tem quatro. Embeddings podermos podem passar de 3 mil dimensões.
Quanto maior a dimensionalidade, maior a capacidade de representar nuances semânticas, o tamanho da dimensionalidade define o tamanho do armazenamento, da memória e do custo operacional. Exemplos reais: OpenAI text-embedding-3-small tem 1536 dimensões; OpenAI text-embedding-3-large tem até 3072 dimensões; diversos modelos open source possuem 384 ou 768 dimensões.
Normalização
A normalização ajusta o comprimento, ela faz com que todos fiquem igual a 1. Como, por exemplo, [67, 0] ficaria [1, 0], e [42, 0] ficaria [1, 0]. Essa abordagem está sendo bastante usada em pipelines de embeddings atuais, deixando a similaridade do cosseno mais eficiente e previsível (por que passamos a comparar apenas a direção do vetor, não a magnitude). Casos simples pode ter soluções simples.

A busca vetorial
Em uma situação real, imagine a tabela :
id | content | embedding
1 | Como usar Docker | [0.12, ...]
2 | Introdução ao PostgreSQL | [0.98, ...]
3 | Kubernetes para iniciantes | [-0.31, ...]
Quando o usuário faz a pergunta "Como começar com containers?", é gerado um embedding dessa consulta, que em seguida procura os vetores mais próximos, resultando na row 1 | Como usar Docker. Mesmo que a palavra container não exista no content original. Isso é o que chamamos de busca semântica.
A extensão PGVector
Ufa! Finalmente vamos falar de coisa familiar aqui, o PostgreSQL tem uma extensão chamada PGVector, que adiciona suporte 100% nativo para vetores. Você tem o melhor dos mundos, sua tabela velha de guerra com esteroides (o suco!), pronta pra armazenar os embeddings direto nela.
É mais fácil que parece:
CREATE TABLE articles (
id BIGSERIAL PRIMARY KEY,
title TEXT,
embedding VECTOR(1536)
);
No SQL, a consulta de vetores acontece assim:
SELECT *
FROM articles
ORDER BY embedding <-> '[...]'
LIMIT 10;
O operador <-> calcula a euclidian distance. Existem operadores para cosine similarity e inner product também, cada um com seu propósito.
Quando começa a dar problema?
Comparar vetores é caro, para um caso de uso normal, dificilmente vamos sentir isso na pele (ou na placa), mas para situações de 10 milhões de embeddings, a performance começa a cair drasticamente. Nesse caso aprofunde-se em conhecer os índices especializados para o PGVector como IVFFlat e HNSW.
Não preciso dizer muito, mas o PGVector não substitui bancos vetoriais de larga escala, ele continua sendo uma opção ótima para você ter tecnologias de ponta no seu sistema, como RAG, busca semântica, recomendações, memória para agentes, FAQ inteligente... Tudo isso sem adicionar nada na sua estrutura atual. Essa simplicidade faz ele ficar tão famoso atualmente: para a maioria dos casos, ele atende muito bem.
Resumindo
Na prática, RAG e a busca semântica gira em torno dessa transformação simples:
Conteúdo
└── Embedding
└── Vetor
└── Comparação vetorial
Quando você entende que um embedding é só um ponto em um espaço de alta dimensionalidade, quase toda a bruxaria dos sistemas modernos de IA passa a parecer muito mais uma questão de geometria do que de inteligência artificial.