La fonction AI_PII_MASK détecte et masque les informations personnelles identifiables (PII) dans un texte. Elle protège la vie privée dans les journaux de service client, l'archivage des tickets et les données d'analyse.
Prérequis
Avant d'utiliser AI_PII_MASK, vérifiez que vous disposez des éléments suivants :
Un endpoint de cluster Milvus (par exemple,
http://c-xxxx.milvus.aliyuncs.com:19530).Des identifiants d'authentification au format
<yourUsername>:<yourPassword>.Un modèle de texte configuré (par exemple,
qwen3.7-max).(Python uniquement) PyMilvus installé.
Format de la commande
AI_PII_MASK prend en charge deux méthodes d'appel :
Interface REST — Appelez directement l'API pour masquer du texte à la demande.
Fonction de collection Python — Ajoutez une fonction au schéma d'une collection pour masquer automatiquement les PII lors de l'écriture des données.
Interface REST
Interface REST
@id="c0053k7q2t53"
Envoyez une requête POST vers l'endpoint /v2/vectordb/ai/pii_mask :
POST /v2/vectordb/ai/pii_mask
Content-Type: application/json
{
"model_name": "<model name>",
"texts": ["<text>"],
"params": {"pii_types": ["EMAIL", "PHONE"]}
}
@id="cmdpysecpii01"
@id="cmdpyhpii0001"
Python (Fonction de collection)
Python (Fonction de collection)
@id="cmdpycodpii01"
Définissez un schéma avec une Function utilisant le type de fonction TEXTTRANSFORM. La fonction utilitaire texttransform_function_type() ci-dessous gère la compatibilité entre les versions de PyMilvus. Pour son implémentation complète, consultez l'Exemple d'utilisation Python.
schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("content", DataType.VARCHAR, max_length=4096)
schema.add_field("masked", DataType.VARCHAR, max_length=4096)
schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=2)
schema.add_function(
Function(
name="mask_pii",
function_type=texttransform_function_type(),
input_field_names=["content"],
output_field_names=["masked"],
params={
"provider": "aliyun_milvus",
"model_name": "<model name>",
"task": "ai_pii_mask",
"pii_types": "PERSON,EMAIL,PHONE",
"mask_char": "*",
"preserve_length": "true",
"temperature": "0",
},
)
)
Paramètres
| @id="p0060k7q2t60" Paramètre | @id="p0062k7q2t62" Description |
@id="p0003k7q2t03" model_name |
@id="p0005k7q2t05" Obligatoire. Nom du modèle de texte configuré. |
@id="p0008k7q2t08" texts |
@id="p0010k7q2t10" Obligatoire pour REST. Tableau de textes à masquer. |
@id="p0013k7q2t13" pii_types |
@id="p0015k7q2t15" Facultatif. Types de PII à masquer. Accepte un tableau ou une chaîne séparée par des virgules ; 1 à 30 types pris en charge. Par défaut, masque les noms, adresses e-mail, numéros de téléphone, numéros d'identification, numéros de carte bancaire, adresses, URL, adresses IP, jetons et mots de passe. |
@id="p0018k7q2t18" mask_char |
@id="p0020k7q2t20" Facultatif. Caractère de remplacement unique. Valeur par défaut : *. |
@id="p0023k7q2t23" preserve_length |
@id="p0025k7q2t25" Facultatif. Conserve la longueur du segment sensible d'origine. Valeur par défaut : true. |
@id="p0028k7q2t28" temperature/max_concurrency/timeout_sec |
@id="p0030k7q2t30" Facultatif. Paramètres de stabilité du modèle, de concurrence et de délai d'expiration. |
@id="p0033k7q2t33" provider/task |
@id="p0035k7q2t35" Obligatoire uniquement pour la fonction de collection. Valeurs fixes : aliyun_milvus et ai_pii_mask. |
Réponse
data.output.outputs renvoie le texte masqué dans le même ordre que l'entrée. Avec une fonction de collection, le résultat s'écrit dans le champ texte cible.
Exemple d'utilisation : masquage des journaux de service client avant stockage
Les équipes opérationnelles doivent conserver les enregistrements de contact à des fins d'analyse, mais ne peuvent pas stocker de noms, d'adresses e-mail ou de numéros de téléphone dans la base de données analytique. L'exemple suivant montre comment masquer une entrée de journal via REST et comment masquer automatiquement les données lors des écritures à l'aide d'une fonction de collection.
Interface REST
Interface REST
@id="c0072k7q2t72"
Exécutez le script suivant pour masquer les PII dans un exemple d'entrée de journal :
#!/usr/bin/env bash
set -euo pipefail
MILVUS_REST_BASE_URL="http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_AUTH_TOKEN="<yourUsername>:<yourPassword>"
post_json() {
local path="$1"
local body="$2"
curl -X POST \
"$MILVUS_REST_BASE_URL$path" \
-H "Authorization: Bearer $MILVUS_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d "$body"
}
MODEL_NAME="qwen3.7-max"
BODY=$(cat <<JSON
{
"model_name": "$MODEL_NAME",
"texts": ["Please contact Zhang San at zhangsan@example.com or +86 13812345678."],
"params": {
"pii_types": ["PERSON", "EMAIL", "PHONE"],
"mask_char": "*",
"preserve_length": true,
"temperature": 0
}
}
JSON
)
RESPONSE_BODY="$(post_json "/v2/vectordb/ai/pii_mask" "$BODY")"
if command -v jq >/dev/null 2>&1; then
echo "$RESPONSE_BODY" | jq .
[ "$(echo "$RESPONSE_BODY" | jq -r '.code // -1')" = "0" ] || exit 1
else
echo "$RESPONSE_BODY"
fi
# Expected: masked = Please contact ********* at ******************** or ***************.
@id="pt0073k7q2t73"
@id="h0074k7q2t74"
Python (Fonction de collection)
Python (Fonction de collection)
@id="p0075k7q2t75"
Après avoir installé PyMilvus, remplacez les espaces réservés MILVUS_URI et MILVUS_TOKEN par l'adresse et le jeton réels de votre cluster, puis exécutez le script. Les fonctions utilitaires courantes sont intégrées dans l'exemple.
@id="c0076k7q2t76"
from __future__ import annotations
from typing import Any
from pymilvus import DataType, Function, FunctionType, MilvusClient
MILVUS_URI = "http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_TOKEN = "<yourUsername>:<yourPassword>"
DUMMY_VECTOR_DIM = 2
TEXTTRANSFORM_FUNCTION_TYPE = 9
def texttransform_function_type() -> Any:
for type_name in ("TEXTTRANSFORM", "TEXT_TRANSFORM", "TextTransform"):
function_type = getattr(FunctionType, type_name, None)
if function_type is not None:
return function_type
# Alibaba Cloud Milvus provides TEXTTRANSFORM as a managed extension (function type value 9);
# some pymilvus versions do not include this enum member natively, yet Function(...) validates through FunctionType(...).
existing = getattr(FunctionType, "_value2member_map_", {}).get(TEXTTRANSFORM_FUNCTION_TYPE)
if existing is not None:
return existing
extension = int.__new__(FunctionType, TEXTTRANSFORM_FUNCTION_TYPE)
extension._name_ = "TEXTTRANSFORM"
extension._value_ = TEXTTRANSFORM_FUNCTION_TYPE
FunctionType._value2member_map_[TEXTTRANSFORM_FUNCTION_TYPE] = extension
FunctionType._member_map_["TEXTTRANSFORM"] = extension
return extension
def add_id(schema: Any) -> None:
schema.add_field("id", DataType.INT64, is_primary=True)
def add_dummy_vector(schema: Any) -> None:
schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=DUMMY_VECTOR_DIM)
def run_texttransform_example(*, client, collection_name, input_fields, output_field, function_name, function_params, rows) -> None:
if client.has_collection(collection_name):
client.drop_collection(collection_name)
schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
add_id(schema)
for name, data_type, max_length in input_fields:
field_params = {"max_length": max_length} if max_length is not None else {}
schema.add_field(name, data_type, **field_params)
output_name, output_data_type, output_max_length = output_field
output_params = {"max_length": output_max_length} if output_max_length is not None else {}
schema.add_field(output_name, output_data_type, **output_params)
add_dummy_vector(schema)
schema.add_function(
Function(
name=function_name,
function_type=texttransform_function_type(),
input_field_names=[name for name, _, _ in input_fields],
output_field_names=[output_name],
params=function_params,
)
)
index_params = client.prepare_index_params()
index_params.add_index(field_name="dummy_vector", index_type="AUTOINDEX", metric_type="COSINE")
client.create_collection(collection_name=collection_name, schema=schema, index_params=index_params)
client.insert(collection_name, rows)
client.flush(collection_name)
fields = [name for name, _, _ in input_fields] + [output_name]
for row in client.query(collection_name, filter="", output_fields=fields, limit=len(rows)):
print(row)
MODEL_NAME = "qwen3.7-max"
client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)
run_texttransform_example(
client=client,
collection_name="simple_ai_pii_mask",
input_fields=[("content", DataType.VARCHAR, 4096)],
output_field=("masked", DataType.VARCHAR, 4096),
function_name="mask_pii",
function_params={"provider": "aliyun_milvus", "model_name": MODEL_NAME, "task": "ai_pii_mask", "pii_types": "PERSON,EMAIL,PHONE", "mask_char": "*", "preserve_length": "true", "temperature": "0"},
rows=[{"content": "Please contact Zhang San at zhangsan@example.com or +86 13812345678.", "dummy_vector": [0.1, 0.2]}],
)
# Expected: masked = Please contact ********* at ******************** or ***************.
Résultat attendu : masked renvoie Please contact ********* at ******************** or ***************. — le nom, l'adresse e-mail et le numéro de téléphone sont masqués tout en conservant leur longueur d'origine, ce qui permet d'écrire les données en toute sécurité dans la collection d'analyse.