> 백엔드 개발 > 파이썬 튜토리얼 > LLM으로 보내기 전에 PII를 제거하는 쉬운 방법

LLM으로 보내기 전에 PII를 제거하는 쉬운 방법

Barbara Streisand
풀어 주다: 2024-11-25 20:20:18
원래의
312명이 탐색했습니다.

An easy way to remove PII before sending to LLMs

모든 시나리오에서 완벽한 익명화가 요구되는 것은 아닙니다. 덜 중요한 경우에는 가벼운 익명화 파이프라인으로 충분할 수 있습니다. 여기에서는 GLiNER, Faker 및 rapidfuzz를 활용하여 민감한 항목을 현실적인 자리 표시자로 대체하여 텍스트를 익명화하는 Python 기반 접근 방식을 공유합니다.

코드는 먼저 GLiNER를 사용하여 민감한 항목(예: 이름, 국가, 직업)을 식별합니다. 그런 다음 이러한 엔터티를 Faker가 생성한 가짜 개체로 대체합니다. 대략적인 문자열 일치(rapidfuzz)를 통해 텍스트의 변형도 익명화됩니다. LLM으로 처리한 후 원래 엔터티가 복원됩니다.

이 방법은 완벽한 익명화가 필수가 아닌 중요하지 않은 사용 사례를 위해 설계되었습니다. 예를 들어, 데이터를 저장하지 않고 리뷰를 분석하거나 웹 사이트의 챗봇에 대한 쿼리에 응답하는 것은 일반적으로 덜 중요한 경우에 속합니다. 코드가 완벽하지는 않지만 시작하기에 충분합니다.

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)
로그인 후 복사

위 내용은 LLM으로 보내기 전에 PII를 제거하는 쉬운 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿