Elasticsearch와 LlamaIndex로 RAG에서 민감 정보 및 PII 정보 보호하기

Elasticsearch와 LlamaIndex를 사용하여 RAG 애플리케이션에서 민감한 데이터와 개인 식별 정보(PII) 데이터를 보호하는 방법.

Elasticsearch는 업계 최고 수준의 생성형 AI 도구 및 다양한 공급업체와 기본적으로 연동됩니다. Elastic 벡터 데이터베이스를 활용해 진행 중인 RAG 기본 넘어서기 또는 프로덕션 수준 앱 구축 웨비나를 확인해 보세요.

사용 사례에 가장 적합한 검색 솔루션을 구축하려면 무료 클라우드 체험판을 시작하거나 로컬 기기에서 Elastic을 지금 사용해 보세요.

이 글에서는 RAG(검색 증강 생성) 흐름에서 공개 LLM을 사용할 때 개인 식별 정보(PII)와 민감한 데이터를 보호하는 방법을 살펴봅니다. 오픈 소스 라이브러리와 정규식을 사용하여 PII 및 민감한 데이터를 마스킹하는 방법과 공개 LLM을 호출하기 전에 로컬 LLM을 사용하여 데이터를 마스킹하는 방법을 살펴봅니다.

시작하기 전에 이 게시물에서 사용하는 몇 가지 용어를 살펴보겠습니다.

용어

LlamaIndex는 LLM(대규모 언어 모델) 애플리케이션을 구축하기 위한 선도적인 데이터 프레임워크입니다. LlamaIndex는 검색 증강 생성(RAG) 애플리케이션 구축의 다양한 단계에 대한 추상화를 제공합니다. 라마인덱스나 랭체인과 같은 프레임워크는 애플리케이션이 특정 LLM의 API에 밀접하게 연결되지 않도록 추상화를 제공합니다.

Elasticsearch는 Elastic에서 제공합니다. Elastic은 정밀도를 위한 전체 텍스트 검색, 의미 이해를 위한 벡터 검색, 두 가지 장점을 모두 갖춘 하이브리드 검색을 지원하는 확장 가능한 데이터 저장소이자 벡터 데이터베이스인 Elasticsearch를 개발한 업계 리더입니다. Elasticsearch는 분산형 RESTful 검색 및 분석 엔진, 확장 가능한 데이터 저장소, 벡터 데이터베이스입니다. 이 블로그에서 사용하는 Elasticsearch 기능은 무료 및 오픈 버전의 Elasticsearch에서 사용할 수 있습니다.

검색 증강 생성(RAG) 은 LLM에 외부 지식을 제공하여 사용자 쿼리에 대한 응답을 생성하는 AI 기술/패턴입니다. 이를 통해 LLM 응답을 특정 컨텍스트에 맞게 조정하고 일반적이지 않게 만들 수 있습니다.

임베딩은 텍스트/미디어의 의미를 숫자로 표현한 것입니다. 이는 고차원적 정보를 저차원적으로 표현한 것입니다.

RAG 및 데이터 보호

일반적으로 대규모 언어 모델(LLM)은 인터넷 데이터로 학습된 모델에서 사용할 수 있는 정보를 기반으로 응답을 생성하는 데 능숙합니다. 그러나 모델에서 정보를 사용할 수 없는 쿼리의 경우 LLM은 모델에 포함되지 않은 외부 지식이나 특정 세부 정보를 제공해야 합니다. 이러한 정보는 데이터베이스나 내부 지식 시스템에 있을 수 있습니다. 검색 증강 생성(RAG)은 주어진 사용자 쿼리에 대해 먼저 외부 시스템(예: 데이터베이스)에서 관련 컨텍스트/정보를 검색하고 해당 컨텍스트를 사용자 쿼리와 함께 LLM으로 전송하여 보다 구체적이고 관련성 높은 응답을 생성하는 기술입니다.

따라서 RAG 기술은 질문 답변, 콘텐츠 제작 등 맥락과 세부 사항에 대한 깊은 이해가 필요한 모든 분야에 매우 효과적으로 활용될 수 있습니다.

결과적으로 RAG 파이프라인에서는 PII(개인 식별 정보)와 같은 내부 정보와 민감한 정보(예: 이름, 생년월일, 계좌 번호 등)가 공개 LLM에 노출될 위험이 있습니다.

역할 기반 액세스 제어, 문서 수준 보안 등과 같은 다양한 수단을 통해 Elasticsearch와 같은 벡터 데이터베이스를 사용할 때는 데이터가 안전하지만, 데이터를 외부의 공용 LLM으로 전송할 때는 주의해야 합니다.

대규모 언어 모델(LLM)을 사용할 때는 여러 가지 이유로 개인 식별 정보(PII)와 민감한 데이터를 보호하는 것이 중요합니다:

  • 개인정보 보호 규정 준수: 많은 지역에서는 개인 데이터 보호를 의무화하는 유럽의 GDPR(일반 개인정보 보호 규정) 또는 미국의 CCPA(캘리포니아 소비자 개인정보 보호법)와 같은 엄격한 규정을 시행하고 있습니다. 이러한 법률을 준수해야 법적 처벌과 벌금을 피할 수 있습니다.
  • 사용자 신뢰: 민감한 정보의 기밀성과 무결성을 보장하면 사용자 신뢰가 쌓입니다. 사용자는 자신의 개인정보를 보호할 수 있다고 믿는 시스템을 사용하고 상호작용할 가능성이 더 높습니다.
  • 데이터 보안: 데이터 유출에 대한 보호는 필수입니다. 적절한 보호 장치 없이 LLM에 노출된 민감한 데이터는 도난이나 오용에 취약하여 신원 도용이나 금융 사기와 같은 잠재적 피해를 초래할 수 있습니다.
  • 윤리적 고려 사항: 윤리적으로 사용자의 개인정보를 존중하고 데이터를 책임감 있게 처리하는 것이 중요합니다. PII를 잘못 처리하면 차별, 낙인 또는 기타 부정적인 사회적 영향을 초래할 수 있습니다.
  • 비즈니스 평판: 민감한 데이터를 보호하지 못하는 기업은 평판이 손상되어 고객 및 매출 손실 등 비즈니스에 장기적으로 부정적인 영향을 미칠 수 있습니다.
  • 남용 위험 감소: 민감한 데이터를 안전하게 처리하면 편향된 데이터로 모델을 학습시키거나 개인을 조작하거나 해를 입히는 데 데이터를 사용하는 등 데이터 또는 모델의 악의적인 사용을 방지하는 데 도움이 됩니다.

전반적으로 법률 준수, 사용자 신뢰 유지, 데이터 보안 보장, 윤리적 기준 유지, 비즈니스 평판 보호, 남용 위험 감소를 위해서는 PII 및 민감한 데이터를 강력하게 보호해야 합니다.

빠른 요약

이전 게시물에서는 LlamaIndex와 로컬에서 실행 중인 Mistral LLM을 사용하면서 벡터 데이터베이스로 Elasticsearch와 함께 RAG 기법을 사용하는 Q&A 경험을 구현하는 방법에 대해 설명했습니다. 여기서는 이를 기반으로 구축합니다.

이제 이전 게시물에서 수행한 작업을 빠르게 논의하고 요약할 것이므로 이전 게시물을 읽는 것은 선택 사항입니다.

가상의 주택 보험 회사의 상담원과 고객 간의 콜센터 대화 샘플 데이터 세트가 있었습니다. "고객이 어떤 종류의 물 관련 문제에 대해 클레임을 제기하는가?"와 같은 질문에 답하는 간단한 RAG 애플리케이션을 만들었습니다.

대략적인 흐름은 다음과 같습니다.

인덱싱 단계에서는 LlamaIndex 파이프라인을 사용하여 문서를 로드하고 인덱싱했습니다. 문서들은 청크로 묶여 임베딩과 함께 Elasticsearch 벡터 데이터베이스에 저장되었습니다.

사용자가 질문을 하는 쿼리 단계에서 LlamaIndex는 쿼리와 관련된 상위 K개의 유사한 문서를 검색했습니다. 이러한 상위 K 관련 문서는 쿼리와 함께 로컬에서 실행 중인 Mistral LLM으로 전송되어 사용자에게 다시 전송할 응답을 생성했습니다. 이전 게시물을 살펴보거나 코드를 살펴보세요.

이전 게시물에서는 로컬에서 LLM을 실행했습니다. 그러나 프로덕션 환경에서는 OpenAI, Mistral, Anthropic 등 다양한 회사에서 제공하는 외부 LLM을 사용할 수 있습니다. 사용 사례에 더 큰 기본 모델이 필요하거나 확장성, 가용성, 성능 등과 같은 엔터프라이즈 프로덕션 요구 사항으로 인해 로컬에서 실행하는 것이 옵션이 아니기 때문일 수 있습니다.

RAG 파이프라인에 외부 LLM을 도입하면 실수로 민감한 정보 및 PII가 LLM에 유출될 위험에 노출됩니다. 이 게시물에서는 외부 LLM으로 문서를 보내기 전에 RAG 파이프라인의 일부로 PII 정보를 마스킹하는 방법에 대한 옵션을 살펴봅니다.

공개 LLM이 있는 RAG

RAG 파이프라인에서 PII와 민감한 정보를 보호하는 방법에 대해 논의하기 전에 먼저 LlamaIndex, Elasticsearch Vector 데이터베이스 및 OpenAI LLM을 사용하여 간단한 RAG 애플리케이션을 구축해 보겠습니다.

필수 구성 요소

다음이 필요합니다.

  • 임베딩을 저장하기 위한 벡터 데이터베이스로 Elasticsearch를 가동하고 실행합니다. 이전 게시물 Elasticsearch 설치하기의 지침을 따르세요.
  • AI API 키를 엽니다.

간단한 RAG 애플리케이션

참고로 전체 코드는 이 Github 리포지토리(branch:protecting-pii)에서 찾을 수 있습니다. 아래 코드를 살펴볼 때 리포지토리 복제는 선택 사항입니다.

즐겨 사용하는 IDE에서 아래 3개의 파일을 사용하여 새 Python 애플리케이션을 만듭니다.

  • index.py 데이터 인덱싱과 관련된 코드가 있는 곳입니다.
  • query.py 쿼리 및 LLM 상호 작용과 관련된 코드가 있는 곳입니다.
  • .env API 키와 같은 구성 속성이 있는 곳입니다.

몇 가지 패키지를 설치해야 합니다. 애플리케이션의 루트 폴더에 새 파이썬 가상 환경을 만드는 것으로 시작합니다.

가상 환경을 활성화하고 아래 필수 패키지를 설치합니다.

.env에서 OpenAI 및 Elasticsearch 연결 속성을 구성합니다. 파일입니다.

데이터 인덱싱

가상의 주택 보험 회사의 고객과 콜센터 상담원 간의 대화가 포함된 conversations.json 파일을 다운로드하세요. 이 파일을 애플리케이션의 루트 디렉터리에 2개의 파이썬 파일 및 .env 파일과 함께 배치합니다. 파일을 생성합니다. 다음은 파일 내용의 예시입니다.

아래 코드를 index.py 에서 데이터 인덱싱을 처리합니다.

위의 코드를 실행하여 확인하면 Elasticsearch에 인덱스가 생성되고 convo_index 이라는 이름의 Elasticsearch 인덱스에 임베딩이 저장됩니다.

LlamaIndex 수집 파이프라인에 대한 설명이 필요한 경우 이전 게시물인 수집 파이프라인 만들기 섹션을 참조하세요.

쿼리하기

이전 게시물에서는 쿼리를 위해 로컬 LLM을 사용했습니다.

이 게시물에서는 아래와 같이 퍼블릭 LLM인 OpenAI를 사용합니다.

위의 코드는 OpenAI의 응답을 아래와 같이 출력합니다.

고객들은 지하실의 침수, 파이프 파열, 지붕의 우박 피해, 적시 통지 부족, 유지보수 문제, 점진적인 마모, 기존 피해 등의 이유로 인한 클레임 거부 등 다양한 물 관련 문제를 제기하고 있습니다. 각 사례에서 고객들은 보험금 청구 거부에 대해 불만을 표출하고 보험금 청구에 대한 공정한 평가와 결정을 요구했습니다.

RAG에서 PII 마스킹

지금까지 살펴본 것은 사용자 쿼리와 함께 문서를 있는 그대로 OpenAI로 보내는 것입니다.

벡터 스토어에서 관련 컨텍스트를 검색한 후 RAG 파이프라인에서 쿼리와 컨텍스트를 LLM으로 보내기 전에 PII와 민감한 정보를 마스킹할 수 있습니다.

PII 정보를 외부 LLM으로 전송하기 전에 마스킹하는 방법에는 여러 가지가 있으며, 각 방법에는 고유한 장점이 있습니다. 아래에서 몇 가지 옵션을 살펴봅니다.

  1. spacy.io 또는 Presidio (Microsoft에서 유지 관리하는 오픈 소스 라이브러리)와 같은 NLP 라이브러리 사용.
  2. 즉시 사용 가능한 라마인덱스 사용 NERPIINodePostprocessor.
  3. 다음을 통해 로컬 LLM 사용 PIINodePostprocessor

위의 방법 중 하나를 사용하여 마스킹 로직을 구현한 후에는 포스트프로세서(사용자 정의 포스트프로세서 또는 LlamaIndex의 기본 제공 포스트프로세서)를 사용하여 LlamaIndex 수집 파이프라인을 구성할 수 있습니다.

NLP 라이브러리 사용

RAG 파이프라인의 일부로 NLP 라이브러리를 사용하여 민감한 데이터를 마스킹할 수 있습니다. 이 데모에서는 spacy.io 패키지를 사용하겠습니다.

query_masking_nlp.py 파일을 새로 만들고 아래 코드를 추가합니다.

LLM의 응답은 아래와 같습니다.

고객들은 지하실의 침수, 파이프 파열, 지붕의 우박 피해, 폭우 시 침수 등 다양한 물 관련 문제를 제기해 왔습니다. 이러한 청구는 적시 통지 부족, 유지 관리 문제, 점진적인 마모, 기존 손상 등의 이유로 청구가 거부되어 불만을 야기했습니다. 고객들은 이러한 청구 거부에 따른 실망, 스트레스, 재정적 부담을 호소하며 청구에 대한 공정한 평가와 철저한 검토를 요구하고 있습니다. 일부 고객은 보험금 청구 처리가 지연되어 보험사가 제공하는 서비스에 대한 불만이 더욱 커졌습니다.

위의 코드에서 라마 인덱스 쿼리 엔진을 생성할 때 사용자 지정 포스트 프로세서를 제공합니다.

CustomPostProcessor_postprocess_nodes 메서드에 정의된 QueryEngine에 의해 호출되는 로직입니다. 우리는 SpaCy.io 라이브러리를 사용하여 명명된 엔티티를 감지한 다음 몇 가지 정규식을 사용하여 해당 이름과 민감한 정보를 대체한 후 문서를 LLM으로 전송하고 있습니다.

아래는 원본 대화의 일부와 CustomPostProcessor로 만든 마스크된 대화의 예입니다.

원본 텍스트:

고객님 안녕하세요: 안녕하세요, 저는 매튜 로페즈이고 생년월일은 1984년 10월 12일이며, 뉴욕 스몰타운 456 Cedar St, 34567에 거주하고 있습니다. 내 정책 번호는 TUV8901입니다. 상담원입니다: 안녕하세요, 매튜. 오늘 무엇을 도와드릴까요? 고객님 안녕하세요, 제 청구를 거부한 귀사의 결정에 매우 실망했습니다.

마스킹된 텍스트는 커스텀포스트프로세서에 의해 가려집니다.

고객님: 안녕하세요, 저는 [마스크됨], [마스크됨]은 [DOB 마스크됨]이며 456 Cedar St, [마스크됨], [마스크됨] 34567에 살고 있습니다. 내 정책 번호가 [마스킹됨]입니다. 상담원입니다: 안녕하세요, [MASKED]. 오늘 무엇을 도와드릴까요? 고객님 안녕하세요, 제 청구를 거부한 귀사의 결정에 매우 실망했습니다.

참고:

PII 및 민감한 정보를 식별하고 마스킹하는 것은 간단한 작업이 아닙니다. 민감한 정보의 다양한 형식과 의미를 다루려면 도메인과 데이터에 대한 충분한 이해가 필요합니다. 위에 제시된 코드는 일부 사용 사례에 적합할 수 있지만, 요구 사항과 테스트에 따라 수정해야 할 수도 있습니다.

즉시 사용 가능한 라마 인덱스 사용

LlamaIndex는 다음을 도입하여 RAG 파이프라인에서 PII 정보를 더 쉽게 보호할 수 있도록 했습니다. NERPIINodePostprocessor.

응답은 다음과 같습니다.

고객이 재산 피해와 관련하여 화재 관련 클레임을 제기했습니다. 한 사례에서는 방화는 보상 대상에서 제외된다는 이유로 차고 화재 피해에 대한 보험금 청구가 거부된 적이 있습니다. 또 다른 고객은 보험으로 보장되는 주택 화재 피해에 대해 보험금을 청구했습니다. 또한 한 고객은 주방 화재를 신고했고 화재 피해에 대한 보상을 받을 수 있었습니다.

다음을 통해 로컬 LLM 사용

또한 로컬 또는 프라이빗 네트워크에서 실행 중인 LLM을 활용하여 데이터를 퍼블릭 LLM으로 보내기 전에 마스킹 작업을 수행할 수도 있습니다.

마스킹을 위해 로컬 머신의 Ollama에서 실행 중인 Mistral을 사용합니다.

로컬에서 미스트랄 실행

Ollama를 다운로드하여 설치합니다. Ollama를 설치한 후 다음 명령을 실행하여 미스트랄을다운로드하고 실행합니다.

모델을 로컬에서 처음 다운로드하고 실행하는 데 몇 분 정도 걸릴 수 있습니다. 아래 "구름에 대한 시를 써주세요"와 같은 질문을 통해 미스트랄이 실행 중인지 확인하고 마음에 드는 시가 있는지 확인합니다. 나중에 코드를 통해 미스트랄 모델과 상호 작용해야 하므로 올라마를 계속 실행하세요.

query_masking_local_LLM.py 이라는 새 파일을 만들고 아래 코드를 추가합니다.

응답은 아래와 같습니다.

고객이 재산 피해와 관련하여 화재 관련 클레임을 제기했습니다. 한 사례에서는 방화는 보상 대상에서 제외된다는 이유로 차고 화재 피해에 대한 보험금 청구가 거부된 적이 있습니다. 또 다른 고객은 보험으로 보장되는 주택 화재 피해에 대해 보험금을 청구했습니다. 또한 한 고객은 주방 화재를 신고했고 화재 피해에 대한 보상을 받을 수 있었습니다.

결론

이 게시물에서는 RAG 흐름에서 공개 LLM을 사용할 때 PII 및 민감한 데이터를 보호하는 방법을 보여드렸습니다. 이를 달성하기 위한 다양한 방법을 시연했습니다. 이러한 접근 방식을 채택하기 전에 사용 사례와 요구 사항에 따라 테스트해 보는 것이 좋습니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요