A Voyage AI se une ao MongoDB para impulsionar aplicativos de AI mais precisos e confiáveis no Atlas.

Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Desenvolvedor do MongoDB
Centro de desenvolvedores do MongoDB
chevron-right
Produtos
chevron-right
Atlas
chevron-right

Descubra a estrutura semântica latente com o cluster vetorial

SK
Scott Kurowski10 min read • Published Sep 11, 2024 • Updated Oct 11, 2024
IAAtlasPesquisa vetorialPython
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Pode haver conhecimento comercial oculto em seu banco de banco de dados vetorial do MongoDB .
Quando os dados corporativos são vetorizados, sua incorporação permite a geração aumentada de recuperação (RAG) ou a pesquisa de documento . Os dados de exemplo podem ser entradas de texto do cliente , strings de anotação de classificação do grandes modelos de linguagem (LLM) ou arrays de string ou outro conteúdo de texto variável. Os aplicativos que armazenam o conteúdo de banco de dados de dados de vetores incorporado em constante mudança ou cumulativo podem desenvolver conhecimento semântica latente estratégico como uma população, e este artigo mostra um método para extraí-lo.
Você provavelmente está familiarizado com a incorporação vetorial de texto usando um modelo de incorporação. OpenAI text-embedding-3-small e text-embedding-ada-002 codificam semanticamente o significado do texto de entrada de um vetor , não apenas sua sequência de tokens. Dado uma string de texto com menos de 8 kt (kilotokens) de comprimento, o text-embedding-ada-002 retorna um vetor de array de 1536 floats ou doubles, cada um valorizado na faixa [-.,.].1 010Cada vetor é a saída do peso da rede causal das primeiras camadas de um modelo LLM parcial. O vetor codificado pelo modelo mapeia um ponto específicono vetor conceitual normalizado (Hiper)espaço do modelo para seu texto incorporado — e esse mapa é específico do modelo: Não podemos misturar vetores incorporados por text-embedding-ada-002 e texto -embedding-3-small na mesma análise.
Mapeie strings de texto no "espaço semântica" do LLM
O espaço vetorial de incorporação de um modelo é normalizado no intervalo de valores [-1.0, 1.0], dimensionado para seu desvio padrão (sagma) como unidade 1.0, tornando a geometria analítica à moda antiga uma caixa de ferramentas conveniente. No entanto, é o modelo que dá ao espaço vetorial seu significado. Para nosso modelo de incorporação de AI , a localização do vetor (ponto) indica (mapas) conteúdo semântica específico. A transmissão desse significado por meio de nossa caixa de ferramentas nos informa ainda que a proximidade do vetor indica similaridade semântica e que os vetores separados por um valor maior ou igual a 3.0 (3 sigmas de unidade) podem ser considerados não correspondentes ("distinct "conteúdo semático) com uma confiança de 99.7%.
A agregação $vectorSearch do MongoDB aproveita a proximidade semântica dos pontos vetoriais da localização de um ponto vetorial da entrada para retornar resultados "nearby ", efetivamente até uma distância de limite no espaço vetorial (uma função inversa da pontuação de correspondência) ou contagem max_k limite.

Agrupamento de vetores: classificação de vetores não supervisada e imparcial

Vamos ver como isso se aplica ainda mais aos conjuntos de vetores semântica. Suponha que, de alguma forma, observamos um possível padrão nos textos de origem incorporados como vetores e queremos tentar um autoagrupamento de densidade semântica não supervisado de seus vetores.
Um exemplo de estratégia poderosa para descobrir uma estrutura semântica não supervisada e enviesada em um banco de banco de dados de vetores é agrupar os vetores em uma hierarquia de clusters de conceitos centrais, aproveitando a geometria analítica e as propriedades estatísticas de espaços vetoriais de modelos de AI incorporados. Em outras palavras, o modelo torna o espaço vetorial semanticamente significativo. Observe que é o tratamento matemático dos dados do espaço vetorial que é imparcial, não a codificação de incorporação do modelo que, por definição, deve refletir seus vieses de treinamento intrínsecos.
No Python,3.11 pode-se usar a classe de cluster de densidade sklearn.scikit.org OPTCS1[]. O cluster é uma técnica de IA pré-LLM não supervisada. O parâmetro ajustável principal, min_per_cluster,granularity, que chamei de " " ajusta o número mínimo de vetores (ponto) membros para um agrupamento semântica para configurar o quão generalizado para o conceito de agrupamento distinto os centroide se tornam — um mínimo mais baixo agrupa muitos clusters menores distintos, um mínimo de grupos mais alto menos clusters maiores generalizados. Os outros ajustáveis são quantos vetores totais devem ser agrupados e seu comprimento de vetor comum.
1sklearn.cluster.OPTICS(
2 vectors,
3 min_per_cluster=512
4)
Foram necessários cerca de seis horas para cluster N = 100K vetores de incorporação 1536 comprimento no silício da Apple, refletindo seu desempenho O(N^2).
Exemplo de árvore de conceitos agrupados de densidade vetorial semântica. Python networkx circular digraph com mapploglib
O resultado do agrupamento OPTCS é uma árvore hierárquica de vetores agrupados por densidade (conceitos semânticas), onde cada agrupamento tem uma lista de associação de vetores. Além dos conceitos de cluster "leaf ", identificado é como eles ramificam de um conceito mais geral (também com uma lista de associação de vetores) para um cluster de conceitos "root " na raiz da árvore.
Ele revela diretamente a estrutura semântica dentro do conjunto de vetores. Agora, tendo a associação de quais vetores formam quais clusters conceitual da árvore, finalmente temos os dados para criar um centroide semântica de cada cluster identificado.
Quase que milagricamente, aproveitamos novamente as propriedades matemáticas do espaço vetorial incorporado para derivá-las simplesmente calculando a média dos vetores da lista de membros de um cluster, criando ovetor de conceito de centroide do cluster .
A codificação do vetor centroide resultante "describes " todo o cluster como um grupo. Mas exatamente que texto cada vetor centroide representa?

Invertendo vetores de conceito em cluster semântica de volta ao texto

Precisamos do texto que o vetor de conceito de centroide de média agrupada representa. Isso é um pouco mais difícil do que incorporar o vetor de um texto.
Três métodos básicos de reverter um vetor de incorporação de centroide clusterizado de volta ao seu texto de origem conceitual foram eficazes em meus testes limitados:
  1. Erro iterativo de força bruta na descida do gradiente de incorporação + chamadas LLM
    1. Muito lento, caro $$$$$, ~20iterações K, algumas horas
    2. Muito simples, próxima suposição do LLM + incorpore e diferencie sua suposição de erro
    3. Mais rápido quando o texto inicial da suposição é um tanto “close” para o alvo
    4. Mais rápido quando o LLM fornece as melhores três suposições+erros, últimas oito suposições+erros
Des mapeie o vetor "espaço semântica" LLM em uma string de texto
  1. Modelo de sonda de dicionário de incorporação formado (vec2text)
    1. Rápido, ~1 minuto para reverter um vetor em texto gerado pelo modelo
    2. Módulo Python em Pytorch + GBPs
    3. Pré-treinado em text-embedding-ada-002 espaço vetorial semântica
    4. Re-treinável em outros modelos de incorporação e conteúdo semântica
    5. Até algumas dezenas de chamadas de modelo text-embedding-ada-002
    6. Ideal sem textos de origem vetorial para o método 3
    7. Não muito bom quando apenas alguns vetores são calculados como centroide
  1. Fusão LLM dos textos fonte de vetores embarcados agrupados
    1. Rápido, 1x chamada LLM, US$ barato, no máximo alguns segundos
    2. Tabela de frequência de texto de textos de vetor de membros agrupados + prompt
    3. Testado qualitativamente superior ao Método 1
    4. Em média, forneceu mais detalhes e menos erros do que o método 2
Os métodos e 1 2 geram um novo texto de linguagem conceitual (específico do modelo) diretamente de um vetorde incorporação do texto de origem computado ou desconhecido. O método 1 não é muito prático, mas demonstra 2 2uma reversão de texto eficaz, embora tediosa/dispendiosa. O método2 3.
Quando os textos de origem incorporados estão disponíveis para vetores agrupados, o Método 3 ignora a inversão do vetor de centroide do cluster simplesmente solicitando a um LLM que mescle uma tabela de frequência de texto dos textos de origem dos membros do cluster em um novo texto de centroide único. Qualitativamente, na minha experiência, este método gerou textos centroid superiores Métodos relativos 1 e 2. Testei o Método 2 usando seu modelo pré-treinado, mas com o treinamento de conteúdo de domínio de assunto, ele pode ser concorrente do Método 3.

Exemplo de demonstração de extração de estrutura semântica

Vamos dar uma olhada em um exemplo real de incorporação de cluster de vetor com um conjunto "toy-sized " de 26 textos curtos selecionados por seu agrupamento conceitual semanticamente distinto em cinco tópicos mais amplos, com dois (os tópicos do MongoDB e G5) ricos o suficiente para potencialmente divisão em subgrupos semântica. Você mesmo pode executá-lo no Python 3.11 usando o código de demonstração do link abaixo.
Aqui estão os textos de entrada de demonstração, que são vetorizados e depois agrupados como centroids:
1TEXTS = [
2 "Be at one with your power, joy and peace.",
3 "Know the flow of the much greater oneness we share.",
4 "Let one's superpower be considered choices in the network of life.",
5
6 "MongoDB Ops Manager",
7 "MongoDB Cloud Manager",
8 "MongoDB Cloud Manager Backups",
9 "MongoDB Atlas Database",
10 "MongoDB Atlas Stream Processing",
11 "MongoDB Atlas Vector Search",
12 "MongoDB Atlas Data Lake",
13 "MongoDB Enterprise Database Server",
14
15 "Gödel, Escher, Bach: An Eternal Golden Braid",
16 "How Gödel's Theorems Shape Quantum Physics as explored by Wheeler and Hawking",
17 "Bach, Johann Sebastian - Six Partitas BWV 825-830 for Piano",
18 "M.C. Escher, the Graphic Work",
19 "Bach's baroque style features recursion or self-referencing iterated functions like the artwork of Escher.",
20 "In 1931, Gödel proved the profound duality that formal systems cannot be both self-consistent and complete.",
21 "John Von Neumann was able to derive Gödel's 2nd theorem from his 1st before Gödel published it.",
22
23 "My cat is a fun black and white half-sized tuxedo.",
24 "Some people prefer the company of dogs instead of cats.",
25 "My friend has a large saltwater aquarium with colorful and exotic tropical fish.",
26 "My clever dog opens locked windows and doors to follow me.",
27
28 "Mesopotamian tablets record a fantastic version of human history.",
29 "North American burial mounds often held deceased local royal families.",
30 "Mayan pyramids predated most Aztec pyramids.",
31 "The Aztecs Quetzalcoatl closely resembles the Egyptian god Thoth.",
32]
O modelo de incorporação específico e o comprimento do vetor podem ser variados; a demonstração usa text-embedding-ada-002 em 1536 dimensões.
Ele consegue encontrar e descrever a estrutura semântica esperada? Sim! Aqui está a árvore gerada, pós-anotada com seus textos centroid mesclados com LLM (Método 3):
Árvore gerada, pós-anotada com seus textos centroid mesclados com LLM (Método 3)
A árvore e os textos de centroid clusterizados revelam de forma bonita a estrutura semântica dos conceitos dos textos de entrada em um clustering “granularity” mínimo de dois vetores.
Para um conjunto de vetores maior com metadados adicionais associados, pode ser de maior interesse examinar aqueles em cada vetor de membros do cluster, como agrupados, para obter quaisquer insights relacionados.
Para uma consideração final, deve ser lógico que o Atlas Vector Search e o agrupamento de vetores em escala normalizados de qualquer modelo de dados (não apenas modelos de IA) funcionam da mesma maneira. Um mundo de possibilidades.

E agora

Pronto para experimentar o clustering de vetores semânticas? Encontre o código de demonstração.
Para a manipulação eficaz dos dados vetoriais, é de crucial importância que os textos fonte incorporados sejam strings ou arrays de strings "cleaned " omitindo qualquer sintaxe de formatação e novas linhas, mantendo apenas separadores de frases.
Ao agrupar vetores, pode ser útil testar uma faixa de "granularities ", começando com um número mínimo grande de vetores por configuração de agrupamento (por exemplo, 512), depois diminuindo-o em grandes etapas até que o agrupamento produza um equilíbrio útil entre a generalidade e distinção dos textos de centroide invertidos e quantos centroide foram classificados. Se apenas um cluster (a raiz hierárquica) se desenvolver, use um mínimo inferior. Se mais de algumas dezenas de clusters se formarem, tente um mínimo mais alto.
O código de demonstração usa o módulo API Python 1.36 22openai ou posterior e é configurado com (Método) vec text desativado, pois há muito poucos e vetores diferentes por cluster nesta demonstração para criar um vetor centroide média significativo para reverso. Para ativá-lo, defina CONFIGURE_VEC2TEXT = True em demo_vector_clustering.py. Quando habilitados na demonstração,2os textos vec text centroid são um tanto sem sentido devido aos escassos textos de nós de palavras e tempos diferentes entre os textos de cada cluster. Uma associação centroide maior deve convergir melhor para um texto de conceito central perfeitamente válido usando2texto vec.
Para adaptar a demonstração a uma collection em um banco de banco de dados vetorial MongoDB existente, siga estas etapas:
  1. Verifique se a demonstração está funcionando com resultados altamente semelhantes aos mostrados acima antes de prosseguir. Talvez seja necessário executar a etapa (3)(e) abaixo para isso.
  2. Ignorar usando `load_vector_db.py' já que estamos usando um banco de banco de dados vetorial existente .
    1. Edite a string URI da instância do MongoDB , incluindo as credenciais de autenticação necessárias, o nome do banco de banco de dados vetorial de destino e o nome da collection nas linhas 39, 40 e 43:
    2. Edite o nome do campo de texto de origem incorporado e seu nome de campo de incorporação para agrupar como um objeto de dicionário *{ "text_field_name": "embedding_field_name" }* na linha 49. Você pode obter essas informações usando *db.collection.getSearchIndexses()* em um shell *mongosh*. Adicione mais de um se houver vários campos incorporados para cluster em passagens separadas em cada vetor. Aqui, o nome do campo de texto de vetor único é *text* e seu vetor de incorporação é armazenado no campo de array *embedding*
    3. Edite o nome da coleção de centroids do cluster ajustado de saída (no mesmo banco de banco de dados vetorial), linha 53. Não precisa começar com *VECTOR_COLLECTION* como prefixo
    4. Para usar o texto *vec2* para uma segunda versão de cada texto de centroide semântica, além dos textos de centroide mesclados com LLM, primeiro verifique se ele funciona corretamente usando os dados de demonstração e, em seguida, edite ```CONFIGURE_VEC2Text = true ``` na linha 57 aqui.
    5. Edite o modelo de conclusão OpenAI para mesclar textos centroid, linha 62. gpt35-turbo pode funcionar bem, mas eu recomendamos gpt-4, gpt-4o ou gpt-4o-mini. Para modelos Azure OpenAI, este é o nome do sistema.
    6. Edite o orçamento de token do modelo de conclusão OpenAI, linha 63. Isso limita o tamanho da tabela de frequência de texto para mesclagem de texto centroide. Você pode considerar aumentá-lo acima 16000; Recomendamos tentar 16000 primeiro.
    7. Edite o modelo de incorporação do campo de caminho do índice do vetor de coleção usado, linha 67. Verifiquei que *"text-embedding-3-small"* funciona bem também, se é nisso que o índice de pesquisa está incorporado. No entanto, se estiver usando o texto vec2 , você deverá usar *text-embedding-ada-002*.
    8. Editar as configurações de "granularidade" do agrupamento de clusters, onde cada valor inteiro da lista *MINIMUM_VECTORS_PER_CLUSTER* é agrupado um de cada vez em um loop externo (linha 72); aqui está uma suposição que começa com granularidade grosseira em 512 e logicamente agrupa granularidades cada vez mais fina. Se apenas um cluster semântica for descoberto, a granularidade será muito alta; corte-o ao meio e tente novamente até começar a ver centroide agrupados em um nível útil de detalhes. ```MINIMUM_VECTORS_PER_CLUSTER = [512,256,128,64,32,16]```
    9. Se quiser manter os dados centroids entre execuções repetidas de código de cluster, comente a linha 81: ```vector_db[filted_collection].delete_many({{})```
    10. A menos que você esteja usando a variável de ambiente *OPENAI_API_KEY* para a declaração de instância de classe *OpenAI()* na linha 84, edite-a com seu parâmetro e valor api_key. Se estiver usando *AzureOpenAI()*, use essa classe e preencha quaisquer outros parâmetros necessários. Se ```CONFIGURE_VEC2Text = true```, repita isso em *reverse_vector_vec2text.py* na linha 56, também: ```model_client = OpenAI(api_key="my API key string " )```
    11. Edite e comente *load_demo_vectors()* na linha 260.
  1. Execute o código de clustering do vetor semântica. Para ~100K comprimento dos vetores 1536, um M2 Apple exigiu pouco mais de seis horas. E metade dos vetores (~50K) levaria um quarto do tempo, ~1.5 horas, porque o agrupamento de escalas de tempo O(N^2):
1$ python demo_vector_clustering.py
  1. Inspecione os dados de saída entre cada iteração de cluster de valores em *MINIMUM_VECTORS_PER_CLUSTER* para obter o nível de detalhes em seus textos centroid e interrompa a execução do código quando houver detalhes "too much ". Em um *mongosh*, tente:
1db.<your_fitted_semanatic_clusters_collection>.find({
2 min_vectors_per_cluster: 512 // etc.
3 },{centroid_embedding:0,_id:0});
  1. Inspecione cada arquivo de gráfico de estrutura hierárquica de cluster gerado, que tende a se ramificar cada vez mais à medida que *min_vectors_per_cluster* fica mais baixo:
1demo_vectors_clustered_<<source_text_field_name>>_<<min_vectors_per_cluster>>minPerCluster.png
  1. Opcional: Se houver outro campo de metadados no vetor de membros de cada cluster para o qual haja valor adicional para acumulá-los em uma lista para cada análise externa adicional do centroide ajustado, conclua estas etapas também:
    1. Editar e descomentar as linhas de código que se referem a um campo não vetorial *field_to_accumulate* nas linhas 221, 243, 249, 273, 279, 295, 357 e 388.
    2. Edite e substitua *field_to_accumulate* para usar o nome real do campo de metadados em todos os lugares em que ele for referenciado no código não comentado.

Resumo

As propriedades matemáticas dos vetores de incorporação de AI nos permitem usar diretamente técnicas de cluster "old school AI" no conteúdo semântica. Ao modificar o código de demonstração, você pode aplicar experimentalmente esta técnica aos seus próprios bancos de dados de vetor de incorporação. Você pode revelar uma nova estrutura e inteligência ocultas em seus dados comerciais.
Se você tiver dúvidas, quiser compartilhar o que está criando ou quiser ver o que outros desenvolvedores estão fazendo, visite a MongoDB Developer Community seguir.

Para leitura adicional:

Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Adicionando cache semântico e memória ao seu aplicativo RAG usando MongoDB e LangChain


Aug 13, 2024 | 16 min read
Tutorial

Como utilizar funções do Azure com MongoDB Atlas em Java


Apr 14, 2023 | 8 min read
Artigo

Pausar automaticamente clusters inativos


Sep 09, 2024 | 10 min read
Tutorial

​​Reinventando a pesquisa multimodal com MongoDB e Anyscale


Sep 18, 2024 | 20 min read
Sumário