Aller au contenu

Pipeline conversationnel

ThreadAnonymizationPipeline encapsule le pipeline de base avec une ConversationMemory pour accumuler les entités entre les messages et fournir désanonymisation / réanonymisation par remplacement de chaîne.

import asyncio

from piighost.anonymizer import Anonymizer
from piighost.detector.gliner2 import Gliner2Detector
from piighost.linker.entity import ExactEntityLinker
from piighost.resolver import MergeEntityConflictResolver, ConfidenceSpanConflictResolver
from piighost.pipeline import AnonymizationPipeline, ThreadAnonymizationPipeline
from piighost.placeholder import LabelCounterPlaceholderFactory

from gliner2 import GLiNER2

entity_linker = ExactEntityLinker()
entity_resolver = MergeEntityConflictResolver()
span_resolver = ConfidenceSpanConflictResolver()

ph_factory = LabelCounterPlaceholderFactory()
anonymizer = Anonymizer(ph_factory=ph_factory)

model = GLiNER2.from_pretrained("fastino/gliner2-multi-v1")
detector = Gliner2Detector(
    model=model,
    threshold=0.5,
    labels=["PERSON", "LOCATION"],
)
pipeline = ThreadAnonymizationPipeline(
    detector=detector,
    span_resolver=span_resolver,
    entity_linker=entity_linker,
    entity_resolver=entity_resolver,
    anonymizer=anonymizer,
)


async def conversation():
    # Premier message : détection NER + enregistrement des entités
    # la pipeline garde en mémoire que l'entrée et la sortie sont liées,
    # et que <<PERSON:1>> correspond à "Patrick" et <<LOCATION:1>> à "Paris"
    anonymized, _ = await pipeline.anonymize("Patrick habite à Paris.")
    print(anonymized)
    # <<PERSON:1>> habite à <<LOCATION:1>>.

    # Désanonymisation via la correspondance stockée dans le cache de la pipeline
    restored = await pipeline.deanonymize("Bonjour <<PERSON:1>> !")
    print(restored)

    # Désanonymisation par remplacement de texte, utilisant les anciennes détections stockées en mémoire
    restored = await pipeline.deanonymize_with_ent("Bonjour <<PERSON:1>> !")
    print(restored)
    # Bonjour Patrick !

    # Réanonymisation par remplacement de texte, utilisant les anciennes détections stockées en mémoire
    reanon = pipeline.anonymize_with_ent("Résultat pour Patrick à Paris")
    print(reanon)
    # Résultat pour <<PERSON:1>> à <<LOCATION:1>>


asyncio.run(conversation())
Cache SHA-256

Le pipeline utilise aiocache avec des clés SHA-256. Si le même texte est soumis plusieurs fois, le résultat mis en cache est retourné sans appel au modèle NER.