🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI

HomeBlogsApresentamos o Milvus 2.5: Pesquisa de texto integral, filtragem de metadados mais potente e melhorias na usabilidade!

Apresentamos o Milvus 2.5: Pesquisa de texto integral, filtragem de metadados mais potente e melhorias na usabilidade!

  • Engineering
December 17, 2024
Ken Zhang, Stefan Webb, Jiang Chen

Visão geral

Temos o prazer de apresentar a última versão do Milvus, 2.5, que introduz uma nova e poderosa capacidade: a pesquisa de texto integral, também conhecida como pesquisa lexical ou por palavras-chave. Se ainda não conhece a pesquisa, a pesquisa de texto integral permite-lhe encontrar documentos através da pesquisa de palavras ou frases específicas nos mesmos, à semelhança do que acontece no Google. Isto complementa as nossas capacidades de pesquisa semântica existentes, que compreendem o significado subjacente à sua pesquisa em vez de corresponderem apenas a palavras exactas.

Utilizamos a métrica BM25 padrão da indústria para a semelhança de documentos, e a nossa implementação baseia-se em vectores esparsos, permitindo um armazenamento e recuperação mais eficientes. Para quem não está familiarizado com o termo, os vectores esparsos são uma forma de representar texto em que a maioria dos valores são zero, tornando-os muito eficientes para armazenar e processar - imagine uma folha de cálculo enorme em que apenas algumas células contêm números e as restantes estão vazias. Esta abordagem enquadra-se bem na filosofia do produto Milvus, em que o vetor é a principal entidade de pesquisa.

Um aspeto adicional digno de nota da nossa implementação é a capacidade de inserir e consultar texto diretamente, em vez de os utilizadores terem de converter manualmente o texto em vectores esparsos. Isto faz com que o Milvus dê mais um passo em direção ao processamento completo de dados não estruturados.

Mas isto é apenas o começo. Com o lançamento da versão 2.5, actualizámos o roadmap do produto Milvus. Nas futuras iterações do produto Milvus, o nosso foco será a evolução das capacidades do Milvus em quatro direcções principais:

  • Processamento simplificado de dados não estruturados;
  • Melhor qualidade e eficiência da pesquisa;
  • Gestão de dados mais fácil;
  • Redução dos custos através de avanços algorítmicos e de conceção

O nosso objetivo é criar uma infraestrutura de dados que possa armazenar e recuperar informações de forma eficiente na era da IA.

Pesquisa de texto integral através de Sparse-BM25

Embora a pesquisa semântica tenha normalmente uma melhor consciência contextual e uma melhor compreensão da intenção, quando um utilizador precisa de pesquisar nomes próprios específicos, números de série ou uma frase completamente correspondente, a recuperação de texto integral com correspondência de palavras-chave produz frequentemente resultados mais precisos.

Para ilustrar isto com um exemplo:

  • A pesquisa semântica é excelente quando se pede: "Encontrar documentos sobre soluções de energias renováveis"
  • A pesquisa de texto integral é melhor quando é necessário: "Encontrar documentos que mencionem o Tesla Model 3 2024"

Na nossa versão anterior (Milvus 2.4), os utilizadores tinham de pré-processar o seu texto utilizando uma ferramenta separada (o módulo BM25EmbeddingFunction do PyMilvus) nas suas próprias máquinas antes de o poderem pesquisar Esta abordagem tinha várias limitações: não conseguia lidar bem com conjuntos de dados em crescimento, exigia passos de configuração adicionais e tornava todo o processo mais complicado do que o necessário. Para os mais técnicos, as principais limitações eram que só podia funcionar numa única máquina; o vocabulário e outras estatísticas do corpus utilizadas para a pontuação BM25 não podiam ser actualizadas à medida que o corpus mudava; e a conversão de texto em vectores no lado do cliente é menos intuitiva quando se trabalha diretamente com o texto.

O Milvus 2.5 simplifica tudo. Agora pode trabalhar diretamente com o seu texto:

  • Armazenar os seus documentos de texto originais tal como estão
  • Pesquisar com consultas em linguagem natural
  • Obter resultados em formato legível

Nos bastidores, o Milvus trata automaticamente de todas as conversões vectoriais complexas, facilitando o trabalho com dados de texto. É a isto que chamamos a nossa abordagem "Doc in, Doc out" - o utilizador trabalha com texto legível e nós tratamos do resto.

Implementação técnica

Para os interessados nos detalhes técnicos, o Milvus 2.5 adiciona a capacidade de pesquisa de texto completo através da sua implementação Sparse-BM25 incorporada, incluindo:

  • Um Tokenizer construído em tantivy: Milvus agora integra-se com o próspero ecossistema tantivy
  • Capacidade de ingerir e recuperar documentos em bruto: Suporte para ingestão direta e consulta de dados de texto
  • Pontuação de relevância BM25: Internalização da pontuação BM25, implementada com base num vetor esparso

Optámos por trabalhar com o ecossistema bem desenvolvido do tantivy e construir o tokenizador de texto Milvus no tantivy. No futuro, o Milvus irá suportar mais tokenizadores e expor o processo de tokenização para ajudar os utilizadores a compreender melhor a qualidade da recuperação. Também exploraremos tokenizadores baseados em aprendizado profundo e estratégias de stemmer para otimizar ainda mais o desempenho da pesquisa de texto completo. Abaixo está o código de exemplo para usar e configurar o tokenizador:

# Tokenizer configuration
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=65535,
    enable_analyzer=True, # Enable tokenizer on this column
    analyzer_params={"type": "english"},  # Configure tokenizer parameters, here we choose the english template, fine-grained configuration is also supported
    enable_match=True, # Build an inverted index for Text_Match
)

Depois de configurar o tokenizador no esquema de coleção, os utilizadores podem registar o texto na função bm25 através do método add_function. Esta função será executada internamente no servidor Milvus. Todos os fluxos de dados subsequentes, tais como adições, eliminações, modificações e consultas, podem ser completados operando sobre a cadeia de texto em bruto, por oposição à representação vetorial. Ver abaixo o exemplo de código para saber como ingerir texto e efetuar pesquisas de texto integral com a nova API:

# Define the mapping relationship between raw text data and vectors on the schema
bm25_function = Function(
    name="text_bm25_emb",
    input_field_names=["text"], # Input text field
    output_field_names=["sparse"], # Internal mapping sparse vector field
    function_type=FunctionType.BM25, # Model for processing mapping relationship
)

schema.add_function(bm25_function)
...
# Support for raw text in/out
MilvusClient.insert('demo', [
    {'text': 'Artificial intelligence was founded as an academic discipline in 1956.'},
    {'text': 'Alan Turing was the first person to conduct substantial research in AI.'},
    {'text': 'Born in Maida Vale, London, Turing was raised in southern England.'},
])

MilvusClient.search(
    collection_name='demo',
    data=['Who started AI research?'],
    anns_field='sparse',
    limit=3
)

Adoptámos uma implementação da pontuação de relevância BM25 que representa as consultas e os documentos como vectores esparsos, designada Sparse-BM25. Isto desbloqueia muitas optimizações baseadas em vectores esparsos, tais como:

O Milvus consegue capacidades de pesquisa híbridas através da sua implementação de ponta Sparse-BM25, que integra a pesquisa de texto completo na arquitetura da base de dados vetorial. Ao representar as frequências dos termos como vectores esparsos em vez dos tradicionais índices invertidos, o Sparse-BM25 permite optimizações avançadas, como a indexação gráfica, a quantização de produtos (PQ) e a quantização escalar (SQ). Estas optimizações minimizam a utilização de memória e aceleram o desempenho da pesquisa. Semelhante à abordagem de índice invertido, o Milvus suporta a utilização de texto em bruto como entrada e gera internamente vectores esparsos. Isto torna-o capaz de trabalhar com qualquer tokenizador e compreender qualquer palavra apresentada no corpus que muda dinamicamente.

Além disso, a poda baseada na heurística elimina os vectores esparsos de baixo valor, aumentando ainda mais a eficiência sem comprometer a precisão. Ao contrário da abordagem anterior que utiliza vectores esparsos, pode adaptar-se a um corpus em crescimento, e não à precisão da pontuação BM25.

  1. Construir índices gráficos no vetor esparso, que tem melhor desempenho do que o índice invertido em consultas com texto longo, uma vez que o índice invertido necessita de mais passos para terminar a correspondência dos tokens na consulta;
  2. Utilização de técnicas de aproximação para acelerar a pesquisa com um impacto mínimo na qualidade da recuperação, como a quantização do vetor e a poda baseada em heurísticas;
  3. Unificar a interface e o modelo de dados para efetuar a pesquisa semântica e a pesquisa de texto integral, melhorando assim a experiência do utilizador.
# Creating an index on the sparse column
index_params.add_index(
    field_name="sparse",
    index_type="AUTOINDEX",  # Default WAND index
    metric_type="BM25" # Configure relevance scoring through metric_type
)

# Configurable parameters at search time to speed up search
search_params = {
    'params': {'drop_ratio_search': 0.6}, # WAND search parameter configuration can speed up search
}

Em resumo, o Milvus 2.5 expandiu a sua capacidade de pesquisa para além da pesquisa semântica, introduzindo a recuperação de texto integral, facilitando aos utilizadores a criação de aplicações de IA de elevada qualidade. Estes são apenas passos iniciais no espaço da pesquisa Sparse-BM25 e prevemos que haverá mais medidas de otimização a experimentar no futuro.

Filtros de pesquisa de correspondência de texto

Uma segunda funcionalidade de pesquisa de texto lançada com o Milvus 2.5 é a Correspondência de Texto, que permite ao utilizador filtrar a pesquisa para entradas que contenham uma cadeia de texto específica. Esta funcionalidade também é construída com base na tokenização e é activada com enable_match=True.

Vale a pena notar que, com a Correspondência de texto, o processamento do texto da consulta é baseado na lógica de OU após a tokenização. Por exemplo, no exemplo abaixo, o resultado devolverá todos os documentos (utilizando o campo "texto") que contenham "vetor" ou "base de dados".

filter = "TEXT_MATCH(text, 'vector database')"

Se o seu cenário exigir a correspondência de "vetor" e "base de dados", terá de escrever duas correspondências de texto separadas e sobrepô-las com AND para atingir o seu objetivo.

filter = "TEXT_MATCH(text, 'vector') and TEXT_MATCH(text, 'database')"

Melhoria significativa no desempenho da filtragem escalar

A nossa ênfase no desempenho da filtragem escalar tem origem na nossa descoberta de que a combinação da recuperação vetorial e da filtragem de metadados pode melhorar significativamente o desempenho e a precisão das consultas em vários cenários. Estes cenários vão desde aplicações de pesquisa de imagens, tais como a identificação de casos de canto na condução autónoma, até cenários RAG complexos em bases de dados de conhecimentos empresariais. Assim, é altamente adequado para os utilizadores empresariais implementarem em cenários de aplicação de dados em grande escala.

Na prática, muitos factores, como a quantidade de dados a filtrar, a forma como os dados estão organizados e a forma como a pesquisa é efectuada, podem afetar o desempenho. Para resolver isso, o Milvus 2.5 apresenta três novos tipos de índices - Índice BitMap, Índice Invertido de Matriz e Índice Invertido após a tokenização do campo de texto Varchar. Esses novos índices podem melhorar significativamente o desempenho em casos reais de uso.

Especificamente:

  1. O índice BitMap pode ser usado para acelerar a filtragem de tags (operadores comuns incluem in, array_contains, etc.) e é adequado para cenários com menos dados de categoria de campo (cardinalidade de dados). O princípio é determinar se uma linha de dados tem um determinado valor numa coluna, com 1 para sim e 0 para não, e depois manter uma lista BitMap. O gráfico seguinte mostra a comparação do teste de desempenho que efectuámos com base no cenário comercial de um cliente. Neste cenário, o volume de dados é de 500 milhões, a categoria de dados é 20, diferentes valores têm diferentes proporções de distribuição (1%, 5%, 10%, 50%) e o desempenho sob diferentes quantidades de filtragem também varia. Com 50% de filtragem, podemos obter um ganho de desempenho de 6,8 vezes através do BitMap Index. É de salientar que, à medida que a cardinalidade aumenta, em comparação com o BitMap Index, o Inverted Index apresenta um desempenho mais equilibrado.

  1. O Text Match é baseado no Inverted Index depois que o campo de texto é tokenizado. O seu desempenho excede em muito a função Wildcard Match (ou seja, like + %) que fornecemos em 2.4. De acordo com os resultados dos nossos testes internos, as vantagens do Text Match são muito claras, especialmente em cenários de consulta simultânea, onde pode atingir um aumento de até 400 vezes no QPS.

Em termos de processamento de dados JSON, planeamos introduzir em versões subsequentes da 2.5.x a construção de índices invertidos para chaves especificadas pelo utilizador e o registo de informações de localização predefinidas para todas as chaves para acelerar a análise. Esperamos que estas duas áreas melhorem significativamente o desempenho da consulta de JSON e Dynamic Field. Planeamos apresentar mais informações em futuras notas de versão e blogues técnicos, por isso, fique atento!

Nova interface de gestão

Gerir uma base de dados não deveria exigir um diploma de informática, mas sabemos que os administradores de bases de dados precisam de ferramentas poderosas. É por isso que introduzimos a WebUI de gestão de clusters, uma nova interface baseada na Web acessível no endereço do seu cluster na porta 9091/webui. Esta ferramenta de observabilidade fornece:

  • Painéis de monitorização em tempo real que mostram as métricas de todo o cluster
  • Análise detalhada de memória e desempenho por nó
  • Informações de segmento e rastreamento de consultas lentas
  • Indicadores de integridade do sistema e status do nó
  • Ferramentas de resolução de problemas fáceis de utilizar para problemas complexos do sistema

Embora esta interface ainda esteja em fase beta, estamos a desenvolvê-la ativamente com base no feedback dos utilizadores dos administradores de bases de dados. As futuras actualizações incluirão diagnósticos assistidos por IA, funcionalidades de gestão mais interactivas e capacidades melhoradas de observabilidade do cluster.

Documentação e experiência do desenvolvedor

Renovámos completamente a nossa documentação e experiência SDK/API para tornar o Milvus mais acessível, mantendo a profundidade para utilizadores experientes. As melhorias incluem:

  • Um sistema de documentação reestruturado com uma progressão mais clara dos conceitos básicos aos avançados
  • Tutoriais interactivos e exemplos do mundo real que mostram implementações práticas
  • Referências API abrangentes com exemplos práticos de código
  • Um design de SDK mais fácil de utilizar que simplifica as operações comuns
  • Guias ilustrados que facilitam a compreensão de conceitos complexos
  • Um assistente de documentação alimentado por IA (ASK AI) para respostas rápidas

O SDK/API atualizado centra-se na melhoria da experiência do programador através de interfaces mais intuitivas e de uma melhor integração com a documentação. Acreditamos que irá notar estas melhorias quando trabalhar com a série 2.5.x.

No entanto, sabemos que o desenvolvimento da documentação e do SDK é um processo contínuo. Continuaremos a otimizar a estrutura do conteúdo e o design do SDK com base no feedback da comunidade. Junte-se ao nosso canal Discord para partilhar as suas sugestões e ajudar-nos a melhorar ainda mais.

Resumo

O Milvus 2.5 contém 13 novas funcionalidades e várias optimizações ao nível do sistema, contribuídas não só pela Zilliz mas também pela comunidade open-source. Apenas abordámos algumas delas neste post e encorajamo-lo a visitar a nossa nota de lançamento e os documentos oficiais para mais informações!

Like the article? Spread the word

Continue Lendo