Maison > Article > développement back-end > Un moyen simple de supprimer les informations personnelles avant de les envoyer aux LLM
Tous les scénarios n’exigent pas une anonymisation parfaite. Dans les cas moins critiques, un pipeline d’anonymisation léger peut suffire. Ici, je partage une approche basée sur Python tirant parti de GLiNER, Faker et rapidfuzz pour anonymiser le texte en remplaçant les entités sensibles par des espaces réservés réalistes.
Le code identifie d'abord les entités sensibles (comme les noms, les pays et les professions) à l'aide de GLiNER. Ensuite, il remplace ces entités par de fausses contreparties générées par Faker. La correspondance approximative des chaînes (rapidfuzz) garantit que même les variations du texte sont anonymisées. Après traitement avec le LLM, les entités d'origine sont restaurées.
Cette méthode est conçue pour les cas d'utilisation non critiques où une anonymisation parfaite n'est pas obligatoire. Par exemple, analyser des avis ou répondre à une requête adressée au chatbot sur votre site Web sans enregistrer de données relève généralement de cas moins critiques. Le code n'est pas parfait mais suffisant pour vous aider à démarrer.
from gliner import GLiNER from faker import Faker from faker.providers import job import google.generativeai as genai import re import warnings from rapidfuzz import process, utils warnings.filterwarnings("ignore") genai.configure(api_key="key") model_llm = genai.GenerativeModel("gemini-1.5-flash-002") fake = Faker() fake.add_provider(job) model_gliner = GLiNER.from_pretrained("urchade/gliner_small-v2.1") # let's say we have this prompt along with context that we want to anonymize before sending to LLM prompt= f"""Given the context, answer the question. \n context: Hi, I am Mayank Laddha. I lives in India. I love my country. But I would like to go to Singapore once. I am a software developer.\n question: Where does Mayank Laddha want to go?" """ # Perform entity prediction labels = ["Person", "Country", "Profession"] entities = model_gliner.predict_entities(prompt, labels, threshold=0.4) print(entities) # create a replacement dictionary replacement = {} for entity in entities: if "Person" in entity["label"] and entity["text"] not in replacement: fake_set = {fake.name() for _ in range(3)} fake_set.discard(entity["text"]) new_name = fake_set.pop() replacement[entity["text"]] = new_name elif "Country" in entity["label"] and entity["text"] not in replacement: name_set = {fake.country() for _ in range(10)} print(name_set) name_set.discard(entity["text"]) new_name = name_set.pop() replacement[entity["text"]] = new_name elif "Profession" in entity["label"] and entity["text"] not in replacement: name_set = {fake.job() for _ in range(20)} name_set = {k for k in name_set if len(k.split())==1} print(name_set) name_set.discard(entity["text"]) new_name = name_set.pop() replacement[entity["text"]] = new_name #also create a reverse dictionary replacement_reversed = {v: k for k, v in replacement.items()} #perform replacement for k, v in replacement.items(): # Split text into a list of words words = prompt.split() n = len(k.split()) # so the key appears fully in choices choices = [' '.join(words[i:i+n]) for i in range(len(words) - n + 1)] matches = process.extract(k, choices, limit=1, processor=utils.default_process) for match in matches: if match[1]>80: prompt = re.sub(match[0], v, prompt, flags=re.IGNORECASE) #prompt response = model_llm.generate_content(prompt) content = response.text print("llm response",content) #perform replacement again for k, v in replacement_reversed.items(): words = content.split() n = len(k.split()) choices = [' '.join(words[i:i+n]) for i in range(len(words) - n + 1)] matches = process.extract(k, choices, limit=1, processor=utils.default_process) for match in matches: if match[1]>80: content = re.sub(match[0], v, content, flags=re.IGNORECASE) print("final result", content)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!