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

Publicar comentário