View a markdown version of this page

Uso de índices vetoriais no DynamoDB - Amazon DynamoDB

Uso de índices vetoriais no DynamoDB

Os índices vetoriais são um tipo de índice no Amazon DynamoDB que permite a pesquisa por similaridade em incorporações vetoriais armazenadas nos itens da tabela. Ao contrário dos índices secundários globais e dos índices secundários locais, que oferecem suporte a consultas de correspondência exata e de intervalo usando as operações Query e Scan, os índices vetoriais usam a pesquisa de vizinho mais próximo aproximado (ANN) para encontrar itens cujos vetores são mais semelhantes a um vetor de consulta fornecido por você. Você realiza essas pesquisas por similaridade chamando a API SearchVectors, que retorna os itens mais semelhantes classificados por uma pontuação de similaridade.

Com os índices vetoriais, você pode armazenar incorporações vetoriais junto com seus dados operacionais no DynamoDB e realizar pesquisas por similaridade sem precisar de um banco de dados de vetores separado. Isso elimina a necessidade de pipelines complexos de replicação de dados entre o DynamoDB e os armazenamentos vetoriais externos.

Os índices vetoriais são gerenciados por meio das mesmas APIs CreateTable e UpdateTable que você já usa, com o parâmetro VectorIndexes (para CreateTable) e o parâmetro VectorIndexUpdates (para UpdateTable).

Casos de uso de índices vetoriais

Os índices vetoriais oferecem suporte a diversos casos de uso que envolvem encontrar itens semelhantes com base em representações vetoriais:

  • Pesquisa semântica: crie mecanismos de pesquisa que entendam o significado das consultas em vez de combinar palavras-chave. Armazene incorporações de texto geradas por modelos de machine learning e encontre conteúdo semanticamente semelhante.

  • Geração aumentada via recuperação (RAG): conecte grandes modelos de linguagem (LLMs) com bases de conhecimentos relevantes. Armazene incorporações de documentos no DynamoDB e recupere o contexto mais relevante para os prompts do LLM.

  • Sistemas de recomendação: encontre produtos, conteúdos ou usuários semelhantes com base em representações vetoriais de recursos ou comportamento.

  • Memória do agente de IA: armazene incorporações de conversas para manter o contexto entre as sessões e melhorar o desempenho do agente de IA.

  • Detecção de anomalias e fraudes: compare novos eventos com incorporações de comportamentos conhecidos como normais para identificar valores atípicos, como transações incomuns ou atividades fraudulentas.

Comparação de índices vetoriais com índices secundários

A tabela a seguir compara índices vetoriais com índices secundários globais e índices secundários locais.

Recurso índice vetorial Índice secundário global Índice secundário local
Tipo da consulta Pesquisa por similaridade Correspondência exata e intervalo Correspondência exata e intervalo
API de leitura SearchVectors Query, Scan Query, Scan
Schema Atributo vetorial, além de SearchSchema opcional (chave de partição, filtros integrados) Chaves de partição e chaves de classificação opcionais Mesma chave de partição, chave de classificação diferente
Máximo por tabela 5 20 5
Modo de capacidade Sob demanda apenas Sob demanda ou provisionado Sob demanda ou provisionado

Funções de distância

Ao criar um índice vetorial, você escolhe uma função de distância. A função de distância determina como o DynamoDB mede a similaridade entre vetores. Sua escolha afeta a qualidade da classificação e a precisão da pesquisa. O Amazon DynamoDB oferece suporte a três funções de distância.

Função de distância Interpretação de pontuação Melhor correspondência
COSINE Pontuações mais baixas indicam maior similaridade. Mede a distância do cosseno (1 menos a similaridade do cosseno) entre dois vetores. Os valores variam de 0 (direção idêntica) a 2 (direção oposta). Pontuações mais baixas
DOT_PRODUCT Pontuações mais altas indicam maior similaridade. Mede o produto escalar entre dois vetores. Pontuações mais altas
EUCLIDEAN Pontuações mais baixas indicam maior similaridade. Mede a distância em linha reta entre dois vetores. Pontuações mais baixas

Para comparar como as funções de distância classificam o mesmo vetor de consulta, consulte Como as funções de distância classificam os resultados.

As orientações a seguir ajudam você a escolher a função de distância certa para sua workload.

COSINE

Compara a direção e ignora a magnitude. Use COSINE para similaridade semântica com modelos de incorporação de texto. Esses modelos codificam o significado na direção, e o comprimento do vetor pode variar. Os exemplos incluem o Incorporador de Texto do Amazon Titan e Cohere Embed.

COSINE é ideal para os seguintes casos de uso:

  • Pesquisa semântica sobre descrições de produtos ou documentos

  • Geração Aumentada de Recuperação (RAG)

  • Correspondência de perguntas frequentes

COSINE é o padrão seguro quando você não tem certeza sobre qual função usar.

DOT_PRODUCT

DOT_PRODUCT é sensível tanto à direção quanto à magnitude (o comprimento de um vetor). Escolha DOT_PRODUCT quando a documentação do modelo de incorporação recomendar o produto escalar como medida de similaridade ou quando você quiser que o comprimento do vetor influencie a classificação.

DOT_PRODUCT é ideal para os seguintes casos de uso:

  • Sistemas de recomendação que usam pontuações de popularidade ou confiança para dimensionar incorporações e influenciar a classificação

  • Modelos cuja documentação recomenda especificamente o produto escalar como medida de similaridade

  • Classificação sensível à magnitude em que o comprimento do vetor carrega um sinal significativo

Recomendamos normalizar suas incorporações para o comprimento unitário. Quando normalizado, DOT_PRODUCT classifica os resultados da mesma forma que COSINE. Ignore a normalização somente se quiser que a magnitude afete a classificação.

Exemplo de caso de uso: um sistema de recomendação de produtos em que você dimensiona cada incorporação de produto de acordo com a pontuação de popularidade. Produtos mais populares obtêm vetores mais longos e têm uma classificação mais alta nos resultados de pesquisa.

EUCLIDEAN

Mede a distância em linha reta entre dois vetores. EUCLIDEAN é sensível à magnitude. Use-o quando a posição absoluta no espaço de incorporação for importante.

EUCLIDEAN é ideal para os seguintes casos de uso:

  • Incorporações de imagem ou áudio em que a distância espacial é importante

  • Detecção de quase duplicatas

  • Detecção de clusters e anomalias

Exemplo de caso de uso: encontrar imagens quase duplicadas a partir de incorporações de imagens.

Escolha uma função de distância que corresponda ao seu modelo de incorporação

Se você não tiver certeza sobre qual função usar, verifique a documentação do modelo de incorporação. Valide sua escolha em relação a um conjunto de dados representativo. Você não pode alterar a função de distância após a criação do índice. Para obter mais informações, consulte Combinar a função de distância com incorporações.

Como as funções de distância classificam os resultados

A função de distância que você escolhe ao criar o índice determina o valor de Score e a ordem de classificação dos resultados. A mesma consulta pode classificar os mesmos itens de forma diferente em diferentes funções de distância. O exemplo a seguir usa o vetor de consulta [1, 0, 0, 0] em relação a quatro vetores armazenados.

Vetor armazenado COSINE (menor é mais semelhante) EUCLIDEAN (menor é mais semelhante) DOT_PRODUCT (maior é mais semelhante)
[1, 0, 0, 0] 0.0 0.0 1,0
[10, 0, 0, 0] 0.0 9.0 10.0
[0.7071, 0.7071, 0, 0] 0,29 0,77 0,71
[-1, 0, 0, 0] 2.0 2.0 -1.0

Dois comportamentos são dignos de nota:

  • COSINE ignora a magnitude. Ele pontua [1, 0, 0, 0] e [10, 0, 0, 0] de forma idêntica (ambos 0.0) porque apontam na mesma direção. EUCLIDEAN ocupa o último lugar para [10, 0, 0, 0] na mesma consulta porque mede a distância absoluta, que aumenta com a magnitude de um vetor.

  • As pontuações DOT_PRODUCT podem ser negativas. Um vetor que aponta na direção oposta ([-1, 0, 0, 0]) tem pontuação -1.0. Não presuma que as pontuações sejam sempre não negativas ao classificar ou aplicar limites aos resultados.

SearchSchema

Ao criar um índice vetorial, você pode definir um SearchSchema que especifica as chaves de partição do índice vetorial e os atributos do filtro integrado.

HASH (chave de partição de índice vetorial)

Uma chave de partição de índice vetorial particiona seus dados de índice para dimensionamento independente. Quando você especifica uma chave de partição de índice vetorial, itens com o mesmo valor de chave de partição são armazenados juntos, o que permite que o sistema pesquise somente os dados relevantes. Em alta escala, isso diminui a latência da pesquisa porque a pesquisa examina somente um subconjunto do espaço vetorial em vez de todo o índice. Use atributos com cardinalidade baixa a média, como Category ou Country. Você pode especificar no máximo uma chave de partição de índice vetorial.

Se você definir uma chave de partição de índice vetorial no SearchSchema, deverá fornecer o valor na SearchConditionExpression ao chamar SearchVectors.

Usar uma chave de partição para escalar o throughput de pesquisa

Defina uma chave de partição de índice vetorial quando você esperar um índice grande ou um alto volume de pesquisa. Como cada chamada de SearchVectors tem como escopo um único valor de chave de partição, distribuir seus dados em vários valores de chave de partição permite que você execute mais operações de pesquisa por segundo e reduz a quantidade de dados que cada pesquisa examina. Consulte Escolher uma chave de partição que corresponda aos padrões de consulta.

INLINE_FILTER

Os atributos de filtro integrado são projetados no índice vetorial para que o DynamoDB possa filtrar durante a pesquisa na camada de armazenamento.

Os filtros integrados oferecem suporte ao operador de igualdade (=) em SearchConditionExpression. Os operadores de comparação, intervalo e associação por conjuntos (<>, <, <=, >, >=, IN) ainda não estão disponíveis. Diferentemente das chaves de partição de índice vetorial, os filtros integrados são opcionais durante a pesquisa.

Você pode criar um índice vetorial sem definir uma chave de partição no SearchSchema. Nesse caso, cada chamada de SearchVectors pesquisa o índice inteiro. Isso é mais simples porque você não precisa de uma SearchConditionExpression, mas ela não é dimensionada na horizontal. À medida que seu índice cresce, cada pesquisa examina mais dados, aumentando a latência e o custo. Se a workload exigir alto throughput ou se o índice contiver um grande número de vetores, defina uma chave de partição para distribuir dados entre partições e escalar de forma independente. Consulte Escolher uma chave de partição que corresponda aos padrões de consulta.

Projeções

Assim como os índices secundários globais, os índices vetoriais oferecem suporte a projeções que controlam quais atributos da tabela de base são copiados para o índice. Você especifica a projeção ao criar o índice vetorial.

  • KEYS_ONLY: somente os atributos da chave primária da tabela de base, o atributo vetorial e qualquer atributo de filtro integrado definido no SearchSchema são projetados no índice.

  • INCLUDE: além dos atributos KEYS_ONLY, você especifica atributos adicionais não essenciais para projetar. Não é possível alterar o conjunto de atributos incluídos após a criação do índice vetorial. Para projetar um conjunto diferente de atributos, exclua o índice e recrie-o com a projeção desejada.

  • ALL: todos os atributos da tabela de base são projetados no índice.

A projeção limita o que os SearchVectors podem retornar

Atributos que não são projetados no índice vetorial não podem ser retornados nas respostas de SearchVectors. Se você precisar de atributos específicos nos resultados da pesquisa, inclua-os na projeção ou use ALL.

Uso de índices vetoriais com outros recursos do DynamoDB

DynamoDB Streams

Você pode habilitar o DynamoDB Streams em uma tabela que tenha um índice vetorial, com o parâmetro StreamSpecification ao criar a tabela ou por meio de UpdateTable. O fluxo captura as alterações no nível do item na tabela de base e opera independentemente do índice vetorial.

Tabelas globais

Você pode adicionar um índice vetorial a uma tabela global e converter uma tabela que tenha um índice vetorial em uma tabela global adicionando uma réplica com UpdateTable. A definição do índice vetorial, incluindo dimensões, função de distância, SearchSchema e projeção, é replicada automaticamente para cada nova região de réplica. Você não cria o índice vetorial separadamente na região da réplica.

Os itens que você grava em qualquer região de réplica são replicados para as outras regiões e indexados lá. Após a conclusão da replicação, SearchVectors em cada região pesquisa o mesmo conjunto de vetores. Como a pesquisa vetorial usa o vizinho mais próximo aproximado (ANN), pesquisas separadas em regiões diferentes podem retornar resultados ou ordenações ligeiramente diferentes para a mesma consulta, mesmo com dados idênticos. A replicação e a indexação de vetores nas outras regiões são assíncronas, mesmo para tabelas globais de forte consistência multirregional (MRSC). Um vetor que você acabou de gravar em uma região pode ainda não aparecer nos resultados de SearchVectors em outra região até que a alteração seja propagada.

Capacidade sob demanda obrigatória

Os índices vetoriais exigem o modo de capacidade sob demanda, que também é compatível com tabelas globais. Crie o índice vetorial e a réplica em uma tabela que já usa capacidade sob demanda.

Recuperação para um ponto no tempo (PITR) e backups

Quando você restaura uma tabela a partir de uma recuperação pontual ou de um backup sob demanda, o DynamoDB restaura os dados da tabela de base e a definição do índice vetorial. Assim como nos índices secundários globais, o DynamoDB reconstrói o índice vetorial a partir dos dados restaurados da tabela de base, em vez de copiá-lo byte por byte, de modo que o índice passa pelo preenchimento antes de estar pronto para a pesquisa. Espere até que IndexStatus seja ACTIVE e Backfilling seja false no índice restaurado antes de executar SearchVectors.

Vida útil (TTL)

Você pode usar o DynamoDB TTL em uma tabela que tenha um índice vetorial. Quando o TTL exclui um item expirado da tabela de base, o DynamoDB remove a entrada correspondente do índice vetorial, da mesma forma que uma exclusão manual. Portanto, os itens expirados param de aparecer nos resultados de SearchVectors após a propagação da exclusão para o índice.

Importação e exportação de dados de tabela

Você pode exportar uma tabela que tenha um índice vetorial para o Amazon S3; a exportação contém os itens da tabela de base, incluindo os atributos vetoriais armazenados neles. Ao importar dados do Amazon S3 para uma nova tabela, defina o índice vetorial na solicitação de importação da mesma forma que você faria com CreateTable. O DynamoDB indexa os itens importados à medida que eles são gravados, e o índice vetorial fica disponível após a conclusão da importação.

DAX

O DynamoDB Accelerator (DAX) não oferece suporte à operação de SearchVectors. Envie solicitações de SearchVectors diretamente para o DynamoDB, mesmo quando seu aplicativo usa o DAX para outras operações de leitura. O cache do DAX das leituras da tabela de base não é afetado pela presença de um índice vetorial.