Bulkhead: 검색된 데이터와 지시사항을 분리하여 프롬프트 인젝션 '수프'를 줄여주는 초경량 라이브러리
Bulkhead: a tiny library to reduce prompt-injection “soup” by separating instructions from retrieved data
핵심 요약
검색된 데이터를 지시사항과 분리해 프롬프트 인젝션 위험을 줄여주는 오픈소스 라이브러리 Bulkhead를 소개합니다.
- 구조적 분리 — 검색된 콘텐츠를 JSON 배열로 래핑하여 프롬프트와 분리함
- 경량 가드레일 — 의존성이나 네트워크 호출 없이 간편하게 적용 가능함
- 위험 관리 — 로컬 스코어링을 통해 검색된 데이터의 위험도를 평가함
- 오픈소스 공개 — npm 및 pip 패키지로 제공되며 MIT 라이선스를 따름
대부분의 LLM 앱은 검색된 데이터를 사용자 지시사항 뒤에 단순히 붙여넣는 방식으로 처리합니다. 모든 내용이 하나의 거대한 프롬프트로 합쳐지기 때문에, "지시사항을 무시하고 의심스러운 행동을 해라"라고 적힌 웹페이지 내용이 그대로 통과해 버립니다. 최신 모델들은 이를 어느 정도 인지하지만, 해결책은 여전히 구조적 분리가 아닌 필터링에 의존하고 있습니다. 이것이 바로 프롬프트 인젝션의 '수프' 문제입니다.
저는 구조적 분리를 기본값으로 만들어주는 작고 오픈소스인 npm/pip 라이브러리 Bulkhead를 만들었습니다.
검색된 콘텐츠를 프롬프트에 직접 붙여넣는 대신, 다음과 같이 사용합니다:
seal(user=prompt, retrieved=web_content)
또는 JS에서도 동일하게 사용 가능합니다.
Bulkhead는 신뢰할 수 있는 사용자 지시사항을 분리된 상태로 유지하고, 신뢰할 수 없는 검색 콘텐츠를 JSON 배열로 감쌉니다. 각 검색 항목에는 로컬 위험 점수가 태그로 지정됩니다.
이것이 프롬프트 인젝션을 완벽하게 해결하는 것은 아닙니다. LLM에는 여전히 데이터와 시스템 간의 확실한 경계가 없기 때문입니다. JSON 구조는 강한 힌트일 뿐, 강제적인 벽은 아닙니다. 난독화되거나 인코딩된 새로운 공격은 놓칠 수 있으며, 오탐(false positive)이 발생할 수도 있습니다.
핵심은 간단합니다:
프롬프트 수프를 기본값으로 배포하지 마세요.
Bulkhead는 경량 구조적 가드레일 역할을 합니다:
- npm 및 pip 패키지 제공
- import 한 번과 몇 줄의 코드로 적용
- 핵심 기능에 런타임 의존성 없음
- 네트워크 호출 없음
- 모델 호출 없음
- MIT 라이선스
- 플러그인 가능한 스코어러
- 기본적인 로컬 사전 필터 포함
설치:
npm install bulkhead-ai
pip install bulkhead-ai
GitHub:
https://github.com/hamj20k/bulkhead-ai
무료 Groq 모델과 Claude Sonnet/Haiku를 사용한 스모크 테스트 결과와 작은 테스트 GUI를 저장소에 추가했습니다.
RAG 에이전트, 브라우저 에이전트, 도구를 사용하는 로컬 모델, 또는 평가 도구를 만드는 분들의 피드백을 기다립니다.

