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).
Tópicos
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
COSINEpara 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). EscolhaDOT_PRODUCTquando 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_PRODUCTclassifica os resultados da mesma forma queCOSINE. 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:
-
COSINEignora a magnitude. Ele pontua[1, 0, 0, 0]e[10, 0, 0, 0]de forma idêntica (ambos0.0) porque apontam na mesma direção.EUCLIDEANocupa 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_PRODUCTpodem 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
CategoryouCountry. 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
SearchConditionExpressionao chamarSearchVectors.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
SearchVectorstem 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 (
=) emSearchConditionExpression. 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 atributosKEYS_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
StreamSpecificationao criar a tabela ou por meio deUpdateTable. 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,
SearchVectorsem 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 deSearchVectorsem 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
IndexStatussejaACTIVEeBackfillingsejafalseno índice restaurado antes de executarSearchVectors. - 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
SearchVectorsapó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 deSearchVectorsdiretamente 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.