
LangChain에서 PII 데이터 처리하기
요약
LLM 애플리케이션 개발 시 발생할 수 있는 개인 식별 정보(PII) 유출 위험과 이를 방지하기 위한 데이터 마스킹의 중요성을 다룹니다. Microsoft Presidio와 같은 도구를 활용하여 텍스트 내 PII를 식별하고 익명화하는 방법론을 제시합니다.
핵심 포인트
- 챗봇 사용자가 대화 중 자발적으로 제공하는 PII가 LLM 제공업체의 로그에 기록될 위험이 있음
- LLM 제공업체의 데이터 활용 정책(모델 학습 등)에 따라 PII가 재현될 가능성이 존재함
- Microsoft Presidio는 규칙 기반 로직과 NER 모델을 결합하여 PII를 효과적으로 식별하고 마스킹함
- 데이터 보안을 위해 LLM API로 데이터를 전송하기 전 정화(Sanitizing) 과정이 필수적임
이 블로그 포스트는 기업들이 정확하고 비용 효율적인 LLM (Large Language Model) 애플리케이션을 개발할 수 있도록 지원하는 Pampa Labs의 창립자 Francisco가 작성했습니다.
서론
PII는 "개인 식별 정보 (Personally Identifiable Information)"의 약자로, 개인의 신원을 밝히는 데 사용될 수 있는 개인 데이터를 의미합니다. 최근 GDPR과 같은 규제로 인해, 기업들이 PII 데이터를 효과적으로 처리하는 솔루션을 찾는 것이 점점 더 중요해지고 있습니다.
LLM으로 PII 데이터를 관리하는 것은 까다로울 수 있습니다. 많은 애플리케이션에서는 양식(form)의 형태로 명시적으로 요청하기 때문에 PII 데이터를 다루고 있다는 사실을 알 수 있습니다. 하지만 챗봇의 경우, 사용자가 대화 중에 자발적으로 PII 데이터(예: 이름과 성을 말하며 자신을 소개하는 것 등)를 보낼 수 있으며, 애플리케이션에 따라 이 정보가 LLM 제공업체로 전송되어 품질 관리 목적으로 로그(log)에 기록될 수 있습니다.
흔히 발생하는 몇 가지 질문은 다음과 같습니다:
- PII 데이터를 마스킹 (masking)할 수 있는 사용 가능한 옵션은 무엇인가요?
- LangSmith는 어떤가요? 만약 LangSmith가 내 앱의 대화를 기록한다면, PII 데이터도 함께 기록될까요?
- 데이터를 OpenAI로 보내면 PII 데이터가 유출될 위험이 있나요? 다른 제공업체들은 어떤가요?
우리가 이 질문들에 대한 확정적인 답변을 제시하려는 것은 아니지만, 현재 사용 가능한 몇 가지 옵션을 제시함으로써 LLM으로 작업할 때 PII 데이터를 처리하는 가장 좋은 방법에 대한 논의를 촉발하고자 합니다.
LLM 제공업체를 위해 입력을 마스킹해야 하는 이유
OpenAI, Anthropic, Cohere와 같은 LLM 제공업체는 모두 API 사용 시 전송된 데이터를 어떻게 사용하는지 상세히 설명하는 자체 개인정보 보호정책을 가지고 있습니다. 예를 들어, 어떤 기업들은 모델을 개선하는 방법을 조사하기 위해 해당 데이터를 사용하거나, 심지어 새로운 모델을 훈련하는 데 데이터를 사용할 수도 있습니다. LLM은 때때로 훈련 과정에서 학습한 내용을 명시적으로 기억할 수 있기 때문에, 이는 향후 버전의 LLM이 다른 사용자에게 귀하의 PII 데이터를 잠재적으로 재현할 수도 있음을 의미합니다.
이러한 개인정보 보호정책(privacy policies)의 중요성과 시간이 지남에 따라 정책이 변경될 수 있다는 사실을 고려할 때, 사용자가 서비스를 이용하기 전에 제공업체의 개인정보 보호정책을 확인하는 것을 강력히 권장합니다. 예시로, 여기 OpenAI의 개인정보 보호정책이 있습니다.
LLM 제공업체를 위한 데이터 정화 (Sanitizing data)
첫 번째 질문은 이것입니다: 어떻게 데이터를 익명화(anonymize)할 수 있을까요? LangChain 생태계는 애플리케이션에서 데이터를 사용하기 전에 데이터를 마스킹(masking)하기 쉽게 만들어주는 도구들과 통합되어 있습니다. 그중 몇 가지를 살펴보겠습니다:
Microsoft Presidio
Microsoft Presidio는 입력 텍스트 내의 PII 식별 및 익명화를 용이하게 하는 도구입니다. 즉, 텍스트의 PII 요소를 일반적인 상응 요소로 대체할 수 있습니다. 신용카드 번호, 이메일, 전화번호, 주소, 성명 등과 같은 엔티티(entities)를 대체할 수 있어 매우 유용합니다.
Presidio는 두 단계로 작동합니다. 먼저, 텍스트를 분석하여 PII 데이터를 검색합니다. 이는 Presidio의 핵심적인 차별화 기능일 것입니다. 왜냐하면 규칙 기반 로직(rule based logic)과 개체명 인식(NER) 머신러닝(Machine Learning) 모델을 모두 포함하여, 텍스트 내의 PII 데이터를 식별하기 위해 다양한 방법의 조합을 사용하기 때문입니다. 두 번째 단계로, 데이터를 일반적인 상응 요소(예: '<PERSON>')로 대체하여 익명화합니다. LangChain 내에서 이를 사용할 경우, 라이브러리는 LLM이 텍스트를 더 자연스럽게 받아들일 수 있도록 faker를 사용하여 엔티티를 가짜 값('John Smith')으로 대체합니다.
Presidio가 PII 데이터를 식별하는 방법에 대해 더 자세한 정보를 원하신다면, 여기서 Presidio가 기본적으로 탐지하는 엔티티와 이를 탐지하는 데 사용되는 방법들을 확인할 수 있습니다.
LangChain에서 Presidio를 사용하는 방법은 매우 간단합니다. 다음과 같이 익명화가 수행되는 단계를 체인(chain)에 추가하기만 하면 됩니다:
anonymizer = PresidioAnonymizer()
template = """Rewrite this text into an official, short email:
{anonymized_text}"""
prompt = PromptTemplate.from_template(template)
llm = ChatOpenAI(temperature=0)
chain = {"anonymized_text": anonymizer.anonymize} | prompt | llm
response = chain.invoke(text)
LangChain 문서에서는 Microsoft Presidio를 사용하는 방법에 대한 전체 튜토리얼과 영어가 아닌 언어에서 Presidio를 사용하는 방법에 대한 튜토리얼을 찾아볼 수 있습니다. Presidio 사용을 계획 중이라면, 입력 제어 및 가드(PII 데이터 익명화, 탈옥 (jailbreaks))와 출력 제어(악성 링크, 독성 (toxicity))를 모두 포함하여 LLM 보안을 위한 도구 모음을 갖춘 LLMGuard와 함께 사용하는 것도 고려해 볼 수 있습니다.
OpaquePrompts
데이터를 익명화하는 또 다른 좋은 옵션은 OpaquePrompts를 사용하는 것입니다. OpaquePrompts는 여러 기술을 동시에 사용하는 대신, 하나의 머신러닝 (ML) 모델을 사용하여 PII 데이터를 탐지하고 적절하게 마스킹 (masking)합니다.
OpaquePrompts 사용의 주요 장점 중 하나는 LangChain과 함께 사용하기가 매우 쉽다는 점입니다. 우리는 OpenAI와 같은 LangChain LLM으로 초기화되는 OpaquePrompts LLM 클래스를 사용하기만 하면 됩니다.
chain = LLMChain(
prompt=prompt,
llm=OpenAI(),
llm=OpaquePrompts(base_llm=OpenAI()),
memory=memory,
)
차별화되는 또 다른 측면은 기밀 컴퓨팅 (confidential computing)을 사용한다는 점입니다. 이는 그들의 익명화 서비스조차 원본 데이터에 접근할 수 없음을 의미하며, 개인정보 보호를 중시하는 사용자들에게 훌륭한 기능입니다. 마지막으로, LLM으로부터 응답을 받은 후 데이터를 다시 비익명화 (deanonymize)하므로, 사용자는 자신이 언급하거나 요청했던 원래의 엔티티 (entities)가 포함된 답변을 받게 됩니다.
LangSmith를 위한 데이터 정화 (Sanitizing)
애플리케이션의 대화 내용을 기록하기 위해 LangSmith를 사용하려는 경우, 또 다른 과제에 직면할 수 있습니다. 바로 데이터를 정화된 형태로 저장하는 것입니다. 앞서 설명한 방식으로 도구들을 단순히 사용한다면, LLM 제공업체는 정화된 형태의 입력을 받겠지만, 우리는 정화되지 않은 원본 입력을 LangSmith에 저장하게 될 것입니다. 이를 어떻게 방지할 수 있을까요?
옵션 #1: 입력 또는 출력을 저장하지 않음
LangSmith에 어떠한 PII (개인정보) 데이터도 저장되지 않도록 확실히 하고 싶다면, 모든 쿼리의 입력(inputs)과 출력(outputs)을 LangSmith로부터 숨길 수 있습니다. 이는 LangSmith가 입력/출력 로그를 남길지 여부를 판단할 때 사용하는 몇 가지 환경 변수(environmental variables)를 통해 수행할 수 있습니다:
LANGCHAIN_HIDE_INPUTS=true
LANGCHAIN_HIDE_OUTPUTS=true
이러한 방식으로 무엇을 로그로 남길지 직접 제어할 수 있습니다. 이에 대한 자세한 내용은 문서를 참조하십시오.
이 기능을 사용할 때는 입력과 출력을 모두 숨기는 것을 고려해야 한다는 점이 중요합니다. LLM이 답변 중에 PII 데이터 포인트(예: '안녕하세요, John Smith님! 만나서 반갑습니다')를 언급할 수 있기 때문입니다.
옵션 #2: 저장하기 전에 마스킹 (mask before saving)
LangSmith의 데이터를 애플리케이션 디버깅에 사용하고 싶거나, 자체 모델을 파인튜닝(finetuning)하려는 경우를 가정해 봅시다. 이 경우, 사용자 대화 로그가 없다면 실제 데이터를 사용하여 애플리케이션의 품질을 개선하는 데 어려움을 겪게 될 것입니다.
이와 같은 상황을 위한 또 다른 옵션은 입력을 마스킹(masking)하여 LLM과 트레이싱(tracing) 소프트웨어 모두 마스킹된 입력을 받도록 하는 것입니다. 이는 입력을 체인(chain)의 입력으로 보내기 전에 마스킹함으로써 달성할 수 있습니다. 이 방법은 대화 데이터를 추적하고 나중에 사용할 수 있게 하면서도, LLM 제공업체와 LangSmith 트레이싱을 위해 데이터를 위생적으로(sanitized) 유지할 수 있다는 장점이 있습니다.
결론
이 블로그 포스트가 즐거우셨다면, 다음 주에 이 주제로 웨비나(webinar)도 진행할 예정입니다. 참여하시려면 여기에서 신청하세요!
AI 자동 생성 콘텐츠
본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기