Correspondência de frasesCompatible with Milvus 2.5.17+

A correspondência de frases permite-lhe procurar documentos que contenham os termos da sua consulta como uma frase exacta. Por predefinição, as palavras devem aparecer na mesma ordem e diretamente adjacentes umas às outras. Por exemplo, uma consulta para "aprendizagem automática de robótica" corresponde a texto como "...modelos típicos de aprendizagem automática de robótica...", onde as palavras "robótica", "máquina" e "aprendizagem" aparecem em sequência sem outras palavras entre elas.

No entanto, em cenários do mundo real, a correspondência estrita de frases pode ser demasiado rígida. Poderá querer fazer corresponder texto como "...modelos de aprendizagem automática amplamente adoptados na robótica...". Aqui, as mesmas palavras-chave estão presentes, mas não lado a lado ou na ordem original. Para lidar com isto, a correspondência de frases suporta um parâmetro slop, que introduz flexibilidade. O valor slop define quantas mudanças de posição são permitidas entre os termos da frase. Por exemplo, com um slop de 1, uma consulta para "machine learning" pode corresponder a texto como "...machine deep learning...", em que uma palavra ("deep") separa os termos originais.

Visão geral

Com base na biblioteca do motor de pesquisa Tantivy, a correspondência de frases funciona através da análise das informações de posição das palavras nos documentos. O diagrama abaixo ilustra o processo:

Phrase Match Workflow Fluxo de trabalho de correspondência de frases

  1. Tokenização de documentos: Quando insere documentos no Milvus, o texto é dividido em tokens (palavras ou termos individuais) utilizando um analisador, com informação posicional registada para cada token. Por exemplo, doc_1 é tokenizado em ["machine" (pos=0), "learning" (pos=1), "boosts" (pos=2), "efficiency" (pos=3)]. Para obter mais informações sobre analisadores, consulte Visão geral do analisador.

  2. Criação de índice invertido: Milvus constrói um índice invertido, mapeando cada token para o(s) documento(s) em que aparece e as posições do token nesses documentos.

  3. Correspondência de frases: Quando uma consulta de frase é executada, o Milvus procura cada token no índice invertido e verifica as suas posições para determinar se aparecem na ordem e proximidade corretas. O parâmetro slop controla o número máximo de posições permitidas entre os tokens correspondentes:

    • slop = 0 significa que os tokens têm de aparecer na ordem exacta e imediatamente adjacentes (ou seja, sem palavras extra pelo meio).

      • No exemplo, apenas doc_1 ("machine" na pos=0, "learning" na pos=1) corresponde exatamente.
    • slop = 2 permite até duas posições de flexibilidade ou rearranjos entre tokens correspondentes.

      • Isto permite uma ordem invertida ("máquina de aprendizagem") ou um pequeno intervalo entre os símbolos.

      • Consequentemente, doc_1, doc_2 ("aprendizagem" na pos=0, "máquina" na pos=1) e doc_3 ("aprendizagem" na pos=1, "máquina" na pos=2) correspondem todos.

Ativar a correspondência de frases

A correspondência de frases funciona com o tipo de campo VARCHAR, o tipo de dados de cadeia de caracteres no Milvus. Para ativar a correspondência de frases, configure o seu esquema de coleção definindo os parâmetros enable_analyzer e enable_match para True, semelhante à correspondência de texto.

Defina enable_analyzer e enable_match

Para ativar a correspondência de frases para um campo VARCHAR específico, defina os parâmetros enable_analyzer e enable_match para True ao definir o esquema do campo. Esta configuração dá instruções ao Milvus para tokenizar o texto e criar um índice invertido com a informação posicional necessária para uma correspondência de frases eficiente.

Aqui está um exemplo de definição de esquema para ativar a correspondência de frases:

from pymilvus import MilvusClient, DataType

# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
    field_name="id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR (string)
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis (tokenization)
    enable_match=True                  # Enables inverted indexing for phrase matching
)
schema.add_field(
    field_name="embeddings",
    datatype=DataType.FLOAT_VECTOR,
    dim=5
)

Opcional: Configurar um analisador

A precisão da correspondência de frases depende significativamente do analisador utilizado para tokenizar os seus dados de texto. Diferentes analisadores adaptam-se a diferentes idiomas e formatos de texto, afectando a tokenização e a precisão posicional. A seleção de um analisador adequado para o seu caso de utilização específico irá otimizar os resultados da correspondência de frases.

Por predefinição, o Milvus utiliza o analisador padrão, que tokeniza o texto com base em espaços em branco e pontuação, remove tokens com mais de 40 caracteres e converte o texto para minúsculas. Não são necessários parâmetros adicionais para o uso padrão. Consulte Analisador padrão para obter detalhes.

Se o seu aplicativo exigir um analisador específico, configure-o usando o parâmetro analyzer_params. Por exemplo, veja como configurar o analisador english para correspondência de frases em texto em inglês:

# Define analyzer parameters for English-language tokenization
analyzer_params = {
    "type": "english"
}

# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis
    analyzer_params=analyzer_params,   # Specifies the analyzer configuration
    enable_match=True                  # Enables inverted indexing for phrase matching
)

O Milvus suporta vários analisadores adaptados a diferentes idiomas e casos de utilização. Para obter informações detalhadas, consulte Visão geral do analisador.

Utilizar a correspondência de frases

Depois de ativar a correspondência para um campo VARCHAR no seu esquema de coleção, pode efetuar correspondências de frases utilizando a expressão PHRASE_MATCH.

A expressão PHRASE_MATCH não diferencia maiúsculas de minúsculas. Pode utilizar PHRASE_MATCH ou phrase_match.

Sintaxe da expressão PHRASE_MATCH

Utilize a expressão PHRASE_MATCH para especificar o campo, a frase e a flexibilidade opcional (slop) durante a pesquisa. A sintaxe é a seguinte:

PHRASE_MATCH(field_name, phrase, slop)
  • field_name: O nome do campo VARCHAR no qual efectua correspondências de frases.

  • phrase: A frase exacta a procurar.

  • slop (opcional): Um número inteiro que especifica o número máximo de posições permitidas em tokens correspondentes.

    • 0 (predefinição): Corresponde apenas a frases exactas. Exemplo: Um filtro para "aprendizagem automática" corresponderá exatamente a "aprendizagem automática", mas não a "máquina aumenta a aprendizagem" ou "máquina de aprendizagem".

    • 1: Permite pequenas variações, como um termo extra ou uma pequena mudança de posição. Exemplo: Um filtro para "machine learning" corresponderá a "machine boosts learning" (um token entre "machine" e "learning") mas não a "learning machine" (termos invertidos).

    • 2: Permite mais flexibilidade, incluindo a ordem invertida dos termos ou até dois tokens entre eles. Exemplo: Um filtro para "machine learning" corresponderá a "learning machine" (termos invertidos) ou "machine quickly boosts learning" (dois tokens entre "machine" e "learning").

Exemplo de conjunto de dados

Suponha que tem uma coleção chamada tech_articles que contém as cinco entidades seguintes:

doc_id

text

1

"A aprendizagem automática aumenta a eficiência na análise de dados em grande escala"

2

"Aprender uma abordagem baseada em máquinas é vital para o progresso da IA moderna"

3

"As arquitecturas de máquinas de aprendizagem profunda optimizam as cargas computacionais"

4

"A máquina melhora rapidamente o desempenho do modelo para a aprendizagem contínua"

5

"A aprendizagem de algoritmos de máquina avançados expande as capacidades de IA"

Consulta com correspondência de frases

Ao utilizar o método query(), PHRASE_MATCH actua como um filtro escalar. Apenas são devolvidos os documentos que contêm a frase especificada (sujeita à inclinação permitida).

Exemplo: slop = 0 (correspondência exacta)

Este exemplo devolve documentos que contêm a frase exacta "machine learning" sem quaisquer tokens extra pelo meio.

# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"

result = client.query(
    collection_name="tech_articles",
    filter=filter,
    output_fields=["id", "text"]
)

Resultados de correspondência esperados:

doc_id

text

1

"A aprendizagem automática aumenta a eficiência na análise de dados em grande escala"

Apenas o documento 1 contém a frase exacta "aprendizagem automática" na ordem especificada, sem tokens adicionais.

Pesquisa com correspondência de frases

Nas operações de pesquisa, PHRASE_MATCH é utilizado para filtrar documentos antes de aplicar a classificação por semelhança de vectores. Esta abordagem em duas etapas limita primeiro o conjunto de candidatos através da correspondência textual e, em seguida, volta a classificar esses candidatos com base em incorporações vectoriais.

Exemplo: slop = 1

Aqui, permitimos uma inclinação de 1. O filtro é aplicado a documentos que contêm a frase "máquina de aprendizagem" com uma ligeira flexibilidade.

# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"

result_slop1 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",
    data=[query_vector],
    filter=filter_slop1,
    search_params={"params": {"nprobe": 10}},
    limit=10,
    output_fields=["id", "text"]
)

Resultados da correspondência:

doc_id

text

2

"Aprender uma abordagem baseada em máquinas é vital para o progresso da IA moderna"

3

"As arquitecturas de máquinas de aprendizagem profunda optimizam as cargas computacionais"

5

"A aprendizagem de algoritmos de máquina avançados expande as capacidades da IA"

Exemplo: inclinação = 2

Este exemplo permite um slop de 2, o que significa que são permitidos até dois tokens extra (ou termos invertidos) entre as palavras "machine" e "learning".

# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop2,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Resultados da correspondência:

doc_id

text

1

"A aprendizagem automática aumenta a eficiência da análise de dados em grande escala"

3

"Arquitecturas de máquinas de aprendizagem profunda optimizam as cargas computacionais"

Exemplo: slop = 3

Neste exemplo, um slop de 3 proporciona ainda mais flexibilidade. O filtro procura "machine learning" com um máximo de três posições de token permitidas entre as palavras.

# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop3,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Resultados da correspondência:

doc_id

text

1

"A aprendizagem automática aumenta a eficiência na análise de dados em grande escala"

2

"Aprender uma abordagem baseada em máquinas é vital para o progresso da IA moderna"

3

"As arquitecturas de máquinas de aprendizagem profunda optimizam as cargas computacionais"

5

"A aprendizagem de algoritmos de máquina avançados expande as capacidades da IA"

Considerações

  • A ativação da correspondência de frases para um campo desencadeia a criação de um índice invertido, que consome recursos de armazenamento. Considere o impacto no armazenamento quando decidir ativar esta funcionalidade, uma vez que este varia em função do tamanho do texto, dos tokens únicos e do analisador utilizado.

  • Depois de definir um analisador no seu esquema, as suas definições tornam-se permanentes para essa coleção. Se decidir que um analisador diferente se adequa melhor às suas necessidades, pode considerar eliminar a coleção existente e criar uma nova com a configuração de analisador pretendida.

  • O desempenho da correspondência de frases depende de como o texto é tokenizado. Antes de aplicar um analisador a toda a sua coleção, use o método run_analyzer para revisar a saída da tokenização. Para obter mais informações, consulte Visão geral do analisador.

  • Regras de escape em expressões filter:

    • Os caracteres entre aspas duplas ou aspas simples em expressões são interpretados como constantes de cadeia de caracteres. Se a constante de cadeia de caracteres incluir caracteres de escape, os caracteres de escape devem ser representados com a sequência de escape. Por exemplo, utilize \\ para representar \, \\t para representar um separador \t, e \\n para representar uma nova linha.

    • Se uma constante de cadeia de caracteres estiver entre aspas simples, uma aspa simples dentro da constante deve ser representada como \\', enquanto uma aspa dupla pode ser representada como " ou \\". Exemplo: 'It\\'s milvus'.

    • Se uma constante de cadeia de caracteres estiver entre aspas duplas, uma aspa dupla dentro da constante deve ser representada como \\", enquanto uma aspa simples pode ser representada como ' ou \\'. Exemplo: "He said \\"Hi\\"".