Um artefato de código aberto que é mais um banco de dados vetorial do que um banco de dados vetorial!

ChatGPT tornou populares modelos grandes e também popularizou bancos de dados vetoriais. O custo de treinamento de modelos grandes é alto e o ciclo de aprendizagem de novos conhecimentos é muito longo. O banco de dados vetorial pode servir apenas como módulo de "memória" do modelo grande. Ele pode encontrar problemas antigos semelhantes a novos problemas e entregá-los para o grande modelo de processamento, o que expande muito a aplicação do grande modelo. Escopo, esta é a razão desta rodada de popularidade dos bancos de dados vetoriais.

Na verdade, bancos de dados vetoriais têm sido usados ​​em cenários tradicionais de IA e aprendizado de máquina, como reconhecimento facial, pesquisa de imagens, reconhecimento de fala, etc.

A principal tarefa do banco de dados vetorial é encontrar vetores semelhantes ao vetor alvo a partir de dados vetoriais massivos. Isso não é logicamente difícil, é apenas uma consulta TopN. É fácil escrever esse tipo de consulta usando SQL de bancos de dados relacionais tradicionais.

No entanto, a ordem dos vetores de alta dimensão não pode ser definida, por isso é impossível criar índices antecipadamente. Os bancos de dados tradicionais só podem realizar travessias difíceis, o que requer uma enorme quantidade de cálculos e baixo desempenho. O banco de dados de vetores fez otimizações especiais para esse assunto, fornecendo alguns métodos eficientes para encontrar vetores semelhantes, melhorando bastante o desempenho.

Parece que o banco de dados vetorial é um banco de dados para fins especiais, desde que os dados vetoriais sejam carregados nele, a pesquisa vetorial pode ser realizada. Afinal, é assim que usamos bancos de dados relacionais. Colocamos dados estruturados neles e depois os consultamos com SQL. Geralmente não precisamos nos preocupar com como o SQL é analisado e otimizado pelo banco de dados.

No entanto, o banco de dados vetorial não é tão simples e o processo de usá-lo para implementar a pesquisa vetorial é complexo e personalizado.

1. Os bancos de dados vetoriais geralmente não possuem a sintaxe SQL simples e fácil de usar, como os bancos de dados relacionais. Eles possuem apenas APIs para algoritmos básicos. Você precisa usar linguagens de programação mais básicas (C/C++, Java e de preferência interfaces Python) para chamar essas APIs para completar o vetor sozinho. Para tarefas de pesquisa, essas linguagens, exceto Python, não possuem tipos de dados vetoriais maduros e populares e não é conveniente desenvolver cálculos relacionados a vetores.

Embora Python tenha tipos de dados vetoriais, ele é limitado por suas capacidades limitadas de processamento de big data e capacidades paralelas, e há muitas dificuldades em fazer cálculos vetoriais. Os bancos de dados relacionais não apresentam esse problema. Você pode consultar os dados diretamente usando SQL e geralmente não precisa depender do poder computacional da linguagem de programação básica.

2. O cálculo vetorial requer pré-processamento personalizado de dados. Sem esse processo, as operações subsequentes não terão sentido. Por exemplo, vetores de ponto flutuante requerem normalização, redução de dimensionalidade, transformação, etc.; vetores binários requerem conversão de dados, classificação e seleção de dimensões, etc.

Mesmo para dados no mesmo formato, os métodos de pré-processamento podem ser diferentes. Por exemplo, os vetores de texto podem exigir apenas a redução normal da dimensionalidade, enquanto os dados de imagem também podem exigir convolução. Esses métodos de pré-processamento não só possuem muitos métodos, mas também possuem muitos parâmetros que precisam ser ajustados, muitas vezes relacionados a dados específicos e altamente personalizados.

Os bancos de dados vetoriais gerais não fornecem tais métodos de pré-processamento ou, mesmo que forneçam, existem apenas alguns métodos fixos que não podem atender às necessidades individuais. Como resultado, este trabalho só pode ser concluído contando com linguagens de programação periféricas ou introduzindo tecnologias de terceiros. Em contraste, usar dados estruturados em bancos de dados relacionais é muito mais simples. O pré-processamento geralmente não é necessário e, mesmo que seja, é muito simples. Nada mais é do que codificação e conversão de tipo de dados, etc., que o próprio SQL pode fazer.

3. Você precisa escolher um algoritmo para criar um índice ou até mesmo um banco de dados vetorial. A chave para encontrar vetores com eficiência é ter um índice que se adapte às características da distribuição de dados.No entanto, existem muitos algoritmos de índice, como agrupamento k-means, algoritmo IVF-PQ, algoritmo Faiss, algoritmo HNSW, algoritmo LSH , etc. Apenas entender esses métodos requer um esforço considerável. É necessário conhecimento matemático e geralmente é necessário ajustar repetidamente os parâmetros do algoritmo (como o parâmetro k de k-means. É quase impossível para desenvolvedores que não entendem os dados ou ter inexperiência para definir um k) adequado para obter alta eficiência de pesquisa e maior precisão. Algoritmo de alto agrupamento.

Há notícias ainda piores. Os bancos de dados vetoriais geralmente fornecem apenas alguns algoritmos de indexação, e esses métodos não são "tamanho único" e precisam ser determinados de acordo com as características de distribuição dos dados. Se você escolher um banco de dados vetorial à vontade Depois de ajustar o parâmetros do algoritmo por um longo tempo, descobri que o índice do banco de dados vetorial não era adequado para meus dados (a eficiência ou a precisão da pesquisa não atendiam aos requisitos).Neste momento, alterar o banco de dados provavelmente seria um desastre. A figura abaixo mostra os métodos de criação de índice de vários bancos de dados vetoriais de primeira linha:

4633de6795d5b3112c335dd5a9903f6f.png

4. Não há conclusão sobre o método de avaliação de similaridade. Os bancos de dados vetoriais podem fornecer vários métodos comumente usados. Por exemplo, Pinecone, o banco de dados vetorial mais popular atualmente, fornece apenas distância euclidiana, similaridade de cosseno e similaridade de produto escalar. Contudo, o método para avaliar a similaridade precisa ser definido com base no cenário de aplicação e nas características dos dados.

Os métodos comumente usados ​​incluem coeficiente de correlação de Pearson, distância XOR, etc. Cada método de avaliação tem diferentes cenários aplicáveis, e os métodos de criação de índice correspondentes também podem ser diferentes.Por exemplo, para vetores de números de ponto flutuante, a distância euclidiana ou a similaridade de cosseno são geralmente usadas para avaliar a similaridade, e o algoritmo HNSW é usado para criar índices , mas os vetores binários podem precisar ser avaliados quanto à similaridade usando a distância XOR e indexados usando o algoritmo de fertilização in vitro.

A escolha da avaliação de similaridade afeta diretamente a eficiência e precisão da pesquisa vetorial, por isso geralmente é necessário combinar e ajustar repetidamente os parâmetros para esses métodos de criação de índice e métodos de avaliação de similaridade até que o efeito de consulta desejado seja alcançado (semelhante a quando se cria um índice, e às vezes pode ser necessário tentar outro banco de dados vetorial).

Quando usamos bancos de dados relacionais para testes de desempenho, geralmente só precisamos gerar aleatoriamente uma quantidade suficiente de dados. No máximo, consideramos apenas o tipo de dados e o intervalo de valores dos campos. Mas o cálculo vetorial não é possível. O espaço onde vivem os vetores de alta dimensão é muito grande e os dados gerados de forma completamente aleatória quase não têm agregação. Se você usar o método de agrupamento para criar um índice, o número de cada categoria não será muito grande, dificultando a criação de um índice. Com o efeito de reduzir a quantidade de travessias, é impossível melhorar a eficiência da pesquisa.

Os dados vetoriais reais (como dados de impressões digitais e dados faciais) geralmente são coletados em determinados locais no espaço de alta dimensão, o que facilita a criação de índices eficazes para garantir a eficiência e a precisão da consulta de vetores semelhantes. Estes O teste só pode ser concluído depois de obter os dados reais. Este fenômeno também pode ilustrar a personalização lateral dos cálculos vetoriais.

Deste ponto de vista, o banco de dados vetorial não é um produto pronto para uso como o banco de dados relacional.O processo de conclusão da tarefa é acompanhado de muita personalização e experimentação, e é mais como uma prática de programação. Dessa forma, o banco de dados vetorial se parece mais com um projeto de implementação do que com um produto diretamente utilizável .

Como você está programando em uma biblioteca de classes básica, basta escolher uma linguagem de programação que seja fácil de desenvolver e que tenha bibliotecas de algoritmos relacionadas. Não há muita necessidade de adquirir um banco de dados vetorial específico.

SPL é uma linguagem de programação que pode executar esta função.

Comparado com linguagens host comumente usadas para bancos de dados vetoriais (C++, Python, etc.), o SPL tem vantagens óbvias na lógica do programa, na escrita de programas e no armazenamento de dados. Contanto que haja bibliotecas de classes básicas suficientes, será mais conveniente implementar essas tarefas de pesquisa vetorial.

1. Cálculo e pré-processamento de vetores

O próprio SPL fornece métodos de cálculo vetorial e métodos de pré-processamento ricos e flexíveis, que podem realizar operações rapidamente entre vetores.

Por exemplo, o produto de vetores:

UMA=[[1,2],[2,3],[3,4]]

B=[[1],[2]]

M=mul(A,B)

Distância euclidiana dos vetores:

A1=10.(linha())

A2=10.(rand())

D = dis(A1, A2)

Semelhança de cosseno após normalização vetorial:

C=(A1** A2).soma()

Redução da dimensionalidade do PCA:

UMA=[[1,2,3,4],[2,3,1,2],[1,1,1,-1],[1,0,-2,-6]]

A'=pca(A,2)

2. Lógica do programa correspondente ao tipo de dados vetoriais

Os algoritmos básicos dos bancos de dados vetoriais atuais geralmente exigem que linguagens de programação host (C++, Python, etc.) sejam acionadas, resultando em baixa eficiência de desenvolvimento. SPL possui lógica de programa completa, que é integrada a tipos de dados vetoriais e algoritmos básicos, tornando o desenvolvimento mais eficiente. Porém, C++ e Java não possuem tipos de dados vetoriais no sentido estrito e fornecem apenas bibliotecas de classes para algoritmos básicos. Esta linguagem de classe ​​são difíceis de usar ao fazer cálculos vetoriais.

3. Desenvolvimento e depuração convenientes

SPL é uma linguagem de programação em grade, o que torna o código muito simples e intuitivo. Os resultados de cada cálculo de grade serão salvos e poderão ser visualizados no painel de resultados no lado direito do IDE. Os programadores podem clicar em uma grade para visualizar os resultados do cálculo dessa etapa (grade) em tempo real. Se o cálculo é correto ou não fica claro à primeira vista (não há outros programas que imprimam problemas do Dafa). SPL também possui funções de depuração muito convenientes, incluindo execução, execução de depuração, execução no cursor, execução em etapa única e funções posteriores, como configuração de pontos de interrupção e cálculo da grade atual, que podem atender totalmente às necessidades de edição e depuração de programas. A imagem abaixo é a interface IDE do SPL:

f603d24608f0da7fde7542eb3f849ad9.png

A caixa vermelha é o botão de função de depuração do SPL, a caixa azul é o painel de resultados e a imagem mostra os dados do resultado do A3.

4. Além dos cálculos vetoriais

A pesquisa vetorial semelhante não é apenas uma coisa, geralmente requer algum outro trabalho, como associar outros dados estruturados ou processar outros dados de texto. A SPL tem um entendimento único neste aspecto, que não é apenas simples de manusear, mas também muito eficiente. Para este aspecto, você pode consultar os documentos relevantes na Qian Academy (https://c.raqsoft.com.cn/) . No entanto, os bancos de dados vetoriais gerais não possuem essas funções, eles ainda precisam usar a linguagem host e, às vezes, até mesmo a cooperação de um banco de dados relacional para concluir essas tarefas, o que é muito problemático.

5. Armazenamento e alto desempenho

SPL possui recursos completos de armazenamento e pode concluir tarefas de armazenamento que conduzem a consultas eficientes de acordo com requisitos de dados personalizados. SPL fornece um formato especializado de armazenamento de arquivos binários e mecanismos como compactação, armazenamento de colunas, ordenação e segmentação paralela para garantir totalmente o desempenho da computação. O armazenamento desses arquivos binários é muito flexível. O armazenamento pode ser projetado de acordo com qualquer algoritmo. Ele pode não apenas aproveitar as vantagens do armazenamento de arquivos em si, mas também ajustar de acordo com o algoritmo. Não é de surpreender que possa alcançar alta performance.

Falando em alto desempenho, a linguagem que você usa deve ser conveniente para o paralelismo. Isso é difícil para o Python conseguir. Devido à existência de bloqueios interpretativos globais, o paralelismo do Python é na verdade pseudo-paralelismo. Se o paralelismo for necessário, só pode ser possível para executar vários processos em paralelo., esse tipo de sobrecarga não é comparável ao multithreading. SPL possui recursos paralelos completos e, em muitos casos, o método de escrita é semelhante ao de thread único, exceto que a opção @m é adicionada. Por exemplo, calcule a distância euclidiana entre 100 vetores e 1 vetor.


A
1 =100.(10.(rand()))
2 =10.(rand())
3 =A1.(des(~,A2))
4 =A1.@m(des(~,A2))

Entre eles, A3 é um método de escrita de thread único e A4 é um método de escrita multithread.A diferença entre os dois métodos de escrita é apenas @m, mas a eficiência da computação é melhorada várias vezes.

" Prática SPL: Pesquisa vetorial binária de alta dimensão " (doravante denominada "Prática") é um caso sobre pesquisa vetorial semelhante que usamos recentemente para fazer SPL. A partir desta prática, não é difícil ver que o grau de personalização da pesquisa vetorial de alta dimensão é muito alto. Em primeiro lugar, a seleção do método de agrupamento é um problema difícil. O algoritmo k-means comumente usado precisa determinar o parâmetro K. Neste caso, este parâmetro não pode ser Certo;

No processo de agrupamento, há também um processo de movimentação do centro de massa, e o centro de massa de um vetor binário não é fácil de definir. Para criar um índice mais eficaz, só podemos personalizar um algoritmo de clustering personalizado para estes dados de exemplo - clustering dividido e clustering passo a passo. A segunda é a escolha do método de avaliação de similaridade. O método mais comumente usado na indústria é a similaridade de cosseno. No entanto, para o vetor binário neste exemplo, a similaridade de cosseno violará os sentimentos intuitivos das pessoas. Por exemplo, quando há muitos 1's, se apenas algumas dimensões são diferentes, a similaridade cos calculada será muito grande;

Quando há muitos zeros ou um pequeno número de dimensões diferentes, a similaridade cos calculada será muito menor. Portanto, optamos por utilizar a distância XOR para avaliar a similaridade.A similaridade calculada está mais de acordo com os sentimentos intuitivos das pessoas, e também traz outro benefício, ou seja, o valor do cálculo da distância XOR é menor.

Todo o processo prático demonstra perfeitamente a conveniência da programação SPL. Em termos de algoritmos básicos, SPL fornece a função bits() para converter uma sequência binária em um inteiro longo (long) armazenado em bit a bit. É esta etapa que faz com que o cálculo se torne As operações bit a bit são eliminadas, o que melhora muito a eficiência da computação (incluindo a criação de índices e processos de comparação de vetores); a função bit1() é usada para calcular a distância XOR de dois vetores, o que melhora ainda mais a eficiência da computação.

Além desses algoritmos básicos, o SPL também completa facilmente dois métodos de clustering - clustering dividido e clustering passo a passo.A lógica dos dois algoritmos de clustering é relativamente complexa, e o código principal do SPL só usa Se você usar C++ ou Java para completar mais de uma dúzia de grades de código, infelizmente não será possível sem centenas ou milhares de linhas de código.

Em termos de alto desempenho, esta prática utiliza métodos de cálculo eficientes fornecidos pela SPL, como group@n(), onde a opção @n agrupa por número de sequência, que é muito mais rápido que o agrupamento hash comum. Na verdade, o SPL possui muitos outros algoritmos eficientes, como método de bissecção, cálculo ordenado, etc., e também são muito convenientes de usar.Geralmente, você só precisa adicionar a opção @b ou @o.

Em termos de paralelismo, o paralelismo é usado em muitos lugares durante o processo de clustering. SPL pode alcançar o paralelismo adicionando a opção @m às funções comuns (como group@nm()), aproveitando ao máximo os recursos de computação do multi-core CPU. Falta em Python neste aspecto, por isso não é tão fácil de usar quanto se imagina.

Embora o big data não esteja envolvido na prática, na verdade, mesmo para operações de big data, o SPL não é um problema, pois possui um mecanismo de cursor completo, combinado com uma solução de armazenamento eficiente, e pode facilmente escrever programas eficientes de cálculo vetorial.

Através deste processo prático, a sensação mais intuitiva é que o processo de busca de vetores semelhantes não é tão simples. Geralmente não é realizado por permutações e combinações de APIs de algoritmos fornecidas por bancos de dados de vetores (na verdade, mesmo permutações e combinações de APIs requerem considerável estatística).conhecimento e matemática, e só pode ser implementado após tentativa e erro), neste caso, pode ser uma escolha melhor usar SPL para completá-lo.

Quando implantados, os bancos de dados vetoriais gerais são geralmente muito pesados ​​e complicados de implantar, depurar e manter. Alguns deles devem ser usados ​​na nuvem, mas os dados em muitos cenários não podem ser carregados na nuvem por razões de segurança. O SPL é muito leve, facilitando a implantação, a depuração e a manutenção. Ele pode até ser incorporado em aplicativos e os recursos de computação vetorial podem ser encontrados em qualquer lugar.

Atualmente, o SPL não é rico o suficiente na integridade dos algoritmos de cluster, mas à medida que o SPL continua a complementar esses algoritmos básicos, o SPL será mais bancos de dados vetoriais do que os bancos de dados vetoriais existentes .

GitHub: https://github.com/SPLWare/esProc

bb00ac31fc37830ce160b808ab880a38.png

Pesado! O grupo de troca SPL de código aberto foi estabelecido

O SPL simples e fácil de usar é de código aberto!

A fim de fornecer uma plataforma para o pessoal técnico interessado se comunicar entre si,

Um grupo de comunicação especialmente aberto (o grupo é totalmente gratuito, sem publicidade, sem venda de cursos)

Amigos que desejam ingressar no grupo podem manter pressionado e escanear o código QR abaixo

ed33187f2507657ac712d82a1d737d02.png

Amigos interessados ​​neste artigo, por favor leiam o texto original e salvem-no ^_^

Acho que você gosta

Origin blog.csdn.net/weixin_47080540/article/details/132680494
Recomendado
Clasificación