Campo de textoCompatible with Milvus 3.0.x
Nas aplicações de pesquisa com IA, a pesquisa vetorial ajuda a encontrar entidades semanticamente semelhantes, mas a aplicação muitas vezes também necessita do texto original subjacente a cada correspondência. Um LLM ou agente pode utilizar esse texto como contexto para ler, citar, resumir ou incluir o resultado num prompt.
O Milvus disponibiliza o tipo de campo escalar « TEXT » para armazenar texto-fonte extenso diretamente com as entidades. Os valores típicos incluem passagens, documentos longos, corpos de artigos, tickets e registos. Ao contrário do « VARCHAR », que requer um comprimento máximo fixo de bytes ( max_length), o « TEXT » não exige que se defina um comprimento máximo de bytes no esquema da coleção.
Para definir um campo « TEXT », defina « datatype » como « DataType.TEXT ».
Esta funcionalidade requer o Storage V3. Para obter instruções de ativação e considerações de compatibilidade, consulte Storage V3.
common.storage.useLoonFFI O valor predefinido é « false », o que significa que o Storage V3 está desativado por predefinição. Antes de criar uma coleção que contenha um campo « TEXT », defina este parâmetro como « true »; caso contrário, o Milvus rejeitará o esquema da coleção.
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
)
Após a definição do campo, cada entidade pode incluir um valor de cadeia nesse campo. Os valores de « TEXT » são inseridos tal como noutros campos escalares e devolvidos nos resultados de consultas ou pesquisas, listando o campo em « output_fields ».
TEXT Os campos suportam valores nulos. Para ativar esta funcionalidade, defina « nullable » como « True ». Para mais detalhes, consulte «Campo nulo».
Limitações
- Um campo «
TEXT» não pode ser um campo primário, uma chave de partição ou uma chave de agrupamento. TEXTnão pode ser utilizado como tipo de elemento de um campo «ARRAY», incluindo um subcampo escalar num «StructArray».- No Milvus 3.0.0, os campos «
TEXT» não suportam valores por predefinição. - No Milvus 3.0.0, os campos «
TEXT» não são suportados em coleções externas. - Os utilizadores não podem criar um índice escalar num campo «
TEXT». Quando «enable_match=True», o Milvus cria um índice de texto gerido pelo sistema para a correspondência de texto. Este índice interno não é um índice escalar criado pelo utilizador. - Os operadores de filtro escalar gerais não podem ser aplicados diretamente a um campo «
TEXT». Estes incluem operadores de comparação, tais como==e!=, operadores de intervalo, tais como>,>=,<e<=, bem comoIN,LIKE, operadores de expressões regulares (=~e!~) eIS NULLouIS NOT NULL. Para filtrar por termos analisados, defina o campo comenable_analyzer=Trueeenable_match=Truee utilizeTEXT_MATCHouTEXT_MATCH_FUZZY. Para a recuperação de texto completo ordenada por relevância, utilize o BM25. - No Milvus 3.0.0, uma função BM25 ou MinHash que utilize um campo «
TEXT» como entrada deve ser definida aquando da criação da coleção. Não pode ser adicionada posteriormente através de «add_function_field» ou «AlterCollectionSchema», mesmo que a coleção existente esteja vazia, porque o Milvus não consegue preencher retroativamente a saída da função a partir de valores «TEXT» armazenados. Para adicionar essa Função a uma coleção existente, utilize um campo de entrada «VARCHAR» ou recrie a coleção com a Função incluída no seu esquema. Para obter detalhes sobre como adicionar uma Função e o seu campo vetorial gerado, consulte «Alter Collection Schema». - As funções de incorporação de texto também têm de ser definidas aquando da criação da coleção. O Milvus 3.0.0 não suporta a sua adição em tempo de execução.
Escolha TEXT ou VARCHAR
TEXT e « VARCHAR » armazenam ambos valores de cadeia de caracteres, mas satisfazem necessidades de aplicação diferentes. Utilize « VARCHAR » para metadados curtos e delimitados que identificam, categorizam ou filtram entidades. Utilize « TEXT » para conteúdo de origem mais extenso que forneça a um LLM ou agente contexto suficiente para ler, citar, resumir ou criar um prompt.
| Aspecto | VARCHAR | TEXT |
|---|---|---|
| Ideal para | Metadados curtos utilizados para identificar, categorizar ou filtrar entidades, tais como title, tag, category ou external_id. | Conteúdo de origem mais extenso utilizado por fluxos de trabalho de LLM ou de agentes, como content, passage, article_body ou log_message. |
| Definição de comprimento | Requer max_length, que define o número máximo de bytes que o campo pode armazenar. O valor máximo é 65,535 bytes. Se um valor puder exceder este limite, utilize TEXT. | Não requer max_length, pelo que o esquema não necessita de um limite fixo de bytes para o valor do texto. |
| Comportamento de armazenamento | Armazena cada valor dentro do ` max_length` configurado para o campo. | Utiliza a seleção automática de armazenamento para valores de texto maiores. Para mais detalhes, consulte Como o Milvus armazena valores TEXT de grande dimensão. |
| Suporte a campos primários | Pode ser utilizado como campo primário. | Não pode ser utilizado como campo primário. |
| Filtragem | Utilize para metadados de cadeias curtas que precisem de aparecer em expressões de filtro, tais como category == "news" ou tag in ["ai", "database"]. | Não suporta operadores de filtro escalares gerais. Utilize operadores de texto com correspondência ativada para a filtragem de termos analisados ou o BM25 para a recuperação de texto completo classificada por relevância. |
Para obter detalhes sobre os campos « VARCHAR », consulte «Campo VarChar».
Como o Milvus armazena valores TEXT de grande dimensão
Quando insere uma entidade, a cadeia de caracteres que fornece para um campo « TEXT » é o valor « TEXT ». O Milvus compara o tamanho desse valor com «dataNode.text.inlineThreshold», que é de « 65,536 » bytes por predefinição, e, em seguida, escolhe um de dois caminhos de armazenamento internos.
Armazenamento de texto de grande dimensão
- Armazenamento em linha: Se um valor de `
TEXT` for menor que `dataNode.text.inlineThreshold`, o Milvus armazena o valor do texto original diretamente nos dados do campo `TEXT`. - Armazenamento LOB: Se um valor de «
TEXT» for maior ou igual a «dataNode.text.inlineThreshold», o Milvus trata o valor como um objeto de grande dimensão e armazena o texto original separadamente num armazenamento de objetos, como o MinIO. Os dados do campo «TEXT» armazenam uma referência interna ao texto armazenado separadamente. Quando o campo «TEXT» é solicitado nos resultados de uma consulta ou pesquisa, o Milvus utiliza a referência para recuperar e devolver o texto original.
Esta seleção de armazenamento é interna. A inserção, consulta e pesquisa no campo TEXT são efetuadas da mesma forma, independentemente do caminho de armazenamento utilizado pelo Milvus. Para ajustar o limiar ou o comportamento relacionado com o armazenamento, a compactação e a recolha de lixo, consulte as Configurações relacionadas com o dataNode e as Configurações relacionadas com o dataCoord.
Se a sua implementação utilizar armazenamento de objetos, valores grandes de ` TEXT ` podem aparecer como objetos geridos pelo Milvus em percursos como lobs/.... Estes objetos são detalhes de implementação e não devem ser movidos, copiados ou eliminados manualmente. Após eliminar entidades, remover partições ou compactar dados, a utilização do armazenamento de objetos poderá diminuir apenas depois de a recolha de lixo do Milvus remover os dados de objetos de grande dimensão sem referências, após o seu período de segurança.
Uma utilização comum de TEXT é a Pesquisa de Texto Completo com o BM25. Neste padrão, o campo TEXT armazena o conteúdo original da fonte, e o BM25 analisa o texto e gera vetores esparsos para classificar correspondências baseadas em palavras-chave. Os resultados da pesquisa podem então devolver o valor TEXT correspondente como contexto para fluxos de trabalho de LLM ou de agentes. O exemplo seguinte mostra como utilizar um campo « TEXT » como campo de entrada para o BM25. Para saber mais sobre os conceitos e opções de consulta da Pesquisa de Texto Completo, consulte Pesquisa de Texto Completo.
Passo 1: Criar uma coleção com um campo TEXT
O exemplo seguinte cria uma coleção com um campo « TEXT » para o conteúdo de origem e um campo de vetores esparsos para os vetores esparsos gerados pelo BM25. A função BM25 converte o texto tokenizado de « content » em vetores esparsos armazenados em « sparse ».
Para a pesquisa de texto completo com BM25, o campo de entrada « TEXT » deve estar definido como « enable_analyzer=True ».
from pymilvus import DataType, Function, FunctionType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)
bm25_function = Function(
name="content_bm25",
input_field_names=["content"],
output_field_names=["sparse"],
function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)
Passo 2: Criar um índice de vetores esparsos
Crie um índice no campo de vetores esparsos gerado pela função BM25. O tipo de métrica deve ser definido como « BM25 ».
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={
"inverted_index_algo": "DAAT_MAXSCORE",
"bm25_k1": 1.2,
"bm25_b": 0.75,
},
)
client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params,
)
Passo 3: Inserir dados TEXT
Insira o texto diretamente no campo « TEXT ». Não forneça valores para o campo « sparse ». O Milvus gera os vetores esparsos internamente, aplicando a função BM25 a « content ».
data = [
{
"id": 1,
"content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
},
{
"id": 2,
"content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
},
{
"id": 3,
"content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
},
]
client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)
Passo 4: Efetuar a pesquisa de texto completo com BM25
Utilize o texto bruto da consulta como dados de pesquisa e pesquise no campo do vetor esparso. O Milvus converte o texto da consulta num vetor esparso, classifica as correspondências com o BM25 e devolve o campo « TEXT » solicitado em « output_fields ».
results = client.search(
collection_name=COLLECTION_NAME,
data=["how does Milvus store source text for retrieval"],
anns_field="sparse",
limit=2,
output_fields=["content"],
)
Passo 5: Ler os valores TEXT devolvidos
Cada resultado da pesquisa inclui a pontuação BM25 e o valor original de « TEXT ».
for hit in results[0]:
print(f"id: {hit['id']}, score: {hit['distance']}")
print(hit["entity"]["content"])
Para mais informações sobre as funções BM25, os índices de vetores esparsos e a sintaxe de consulta para a pesquisa de texto completo, consulte Pesquisa de Texto Completo.