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:
Fluxo de trabalho de correspondência de frases
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.
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.
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
slopcontrola 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 campoVARCHARno 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:
|
|
|---|---|
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:
|
|
|---|---|
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:
|
|
|---|---|
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:
|
|
|---|---|
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:
|
|
|---|---|
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_analyzerpara 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\,\\tpara representar um separador\t, e\\npara 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\\"".