Exact vs Approximate Search no Oracle Database
Nas consultas vetoriais, o que pretendemos é encontrar os top-K vetores mais próximos daquele vetor usado na consulta, usando um algoritmo de distância vetorial, como a distância euclidiana, hamming, dentre outras. Para para realizar essa consulta, temos duas abordagens: Exact Search (busca exata) e Approximate Search (busca aproximada).
Exact Searwech
Em uma exact search, o vetor passado na consulta é comparado com todos os vetores da tabela, e então apenas os top-K vetores mais próximos são retornados. No Oracle 23ai ( agora 26ai) podemos usar a seguinte sintaxe para uma exact search retornando os top 5 vetores mais próximos:
SELECT id FROM ORACLE_DOCS ORDER BY vector_distance(embedding, TO_VECTOR(:vec), EUCLIDEAN) FETCH EXACT FIRST 5 ROWS ONLY
Para a consulta anterior estamos calculando a distância euclidiana entre o vetor passado na bind variable :vec com todos os vetores da coluna embedding da tabela ORACLE_DOCS, retornando os top 5 vetores mais próximos. De maneira geral, um FULL TABLE SCAN é feito na tabela de vetores, calculando as ditâncias vetorias, retornando os mais próximos do vetor passado por parâmetro.
Uma representação visual pode ser vista abaixo, onde vq é o vetor gerado por TO_VECTOR(:vec):
O Exact Search é utilizado quando a precisão do resultado é mais importante que a performance da consulta.
Approximate Search
Consultas realizadas em índices vetoriais são chamadas de approximate searches. Elas levam esse nome porque as estruturas usadas pelos índices vetoriais visam melhorar a performance da consulta, diminuindo o consumo de recurso, ao custo de diminuir a precisão da consulta.
No Oracle, a sintaxe usada para a approxima search é:
SELECT id FROM ORACLE_DOCS ORDER BY vector_distance(embedding, TO_VECTOR(:vec), EUCLIDEAN) FETCH APPROX FIRST 5 ROWS ONLY WITH TARGET ACCURACY 80;
O TARGET ACCURACY é opcional, e caso não seja especificado, o Oracle irá utilizar a accuracy do índice. A accuracy nada mais é que a precisão alvo. Digamos que para a consulta acima, o seguinte conjunto de vetores foi retornado:
Para esta consulta, nossa precisão (accuracy) foi de 80%, pois dos cinco vetores retornados na Exact Search, quatro foram retornados pela Approximate Search:
Vale citar que caso a sintaxe FETCH APPROX FIRST seja utilizada na consulta, mas a coluna não tenha um índice vetorial, uma Exact Search será executada (FULL TABLE SCAN).
Conclusão
Um ponto interessante aqui é que devemos tomar bastante cuidado em manter a precisão do nosso índice elevada. Uma precisão baixa significa que vetores mais distantes do vetor passado na consulta serão retornados, o que significa que informações menos relevantes serão enviadas para a LLM, o que pode acarretar em informações menos precisas ou alucinações sendo repassadas por ela. Em outras palavras, a falta de indexação vetorial pode levar a problemas de performance, mas a indexação com uma baixa precisão pode afetar a qualidade de resposta da LLM.
É como na piada:
Entrevistador: Li no seu currículo que você é extremamente rápido em cálculos matemáticos.
Candidato: Sim, de fato sou.
Entrevistador: Então quanto é 14 x 27?
Candidato: 49!
Entrevistador: Está errado, não passou nem perto!
Candidato: Sim, mas eu fui rápido.
No nosso contexto, um índice vetorial com baixa precisão é como o candidato: extremamente rápido, porém pouco preciso.



1 comentário