Heim  >  Artikel  >  Backend-Entwicklung  >  Eine einfache Möglichkeit, personenbezogene Daten vor dem Senden an LLMs zu entfernen

Eine einfache Möglichkeit, personenbezogene Daten vor dem Senden an LLMs zu entfernen

Barbara Streisand
Barbara StreisandOriginal
2024-11-25 20:20:18252Durchsuche

An easy way to remove PII before sending to LLMs

Nicht alle Szenarien erfordern eine perfekte Anonymisierung. In weniger kritischen Fällen kann eine einfache Anonymisierungspipeline ausreichen. Hier teile ich einen Python-basierten Ansatz, der GLiNER, Faker und Rapidfuzz nutzt, um Text zu anonymisieren, indem sensible Entitäten durch realistische Platzhalter ersetzt werden.

Der Code identifiziert zunächst sensible Einheiten (wie Namen, Länder und Berufe) mithilfe von GLiNER. Anschließend werden diese Entitäten durch gefälschte Gegenstücke ersetzt, die von Faker generiert wurden. Der ungefähre String-Abgleich (Rapidfuzz) stellt sicher, dass auch Variationen im Text anonymisiert werden. Nach der Verarbeitung mit dem LLM werden die ursprünglichen Entitäten wiederhergestellt.

Diese Methode ist für unkritische Anwendungsfälle konzipiert, bei denen eine perfekte Anonymisierung nicht zwingend erforderlich ist. Das Analysieren von Bewertungen oder das Beantworten einer Anfrage, die an den Chatbot auf Ihrer Website gestellt wird, ohne dass Daten gespeichert werden, fällt beispielsweise im Allgemeinen unter weniger kritische Fälle. Der Code ist nicht perfekt, aber gut genug, um Ihnen den Einstieg zu erleichtern.

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)

Das obige ist der detaillierte Inhalt vonEine einfache Möglichkeit, personenbezogene Daten vor dem Senden an LLMs zu entfernen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn