2. 페르소나 설계 — 무엇을 system prompt에 넣고, 무엇은 빼는가
Alice의 페르소나를 만들어 오면서 수렴한 결정 원칙. 시스템 프롬프트에 들어가야 하는 6가지, 빼야 하는 3가지, 그리고 외부화 vs 인라인의 판단 기준.
이 글은 시리즈 Alice 활용법의 2편이다. 1편 왜 Alice인가에서 페르소나가 가장 먼저였다고 썼다. 이 글은 그 페르소나에 실제로 무엇을 넣고 빼는지에 대한 기록이다.
페르소나는 system prompt 한 줄이 아니라, 한 명의 직무 정의서다. 그러나 직무 정의서를 그대로 다 적어 넣을 수도 없다. 컨텍스트 윈도우는 유한하고, 모든 세션이 페르소나만 읽고 있을 수는 없다. 그래서 무엇을 넣을지보다, 무엇을 빼고 어디로 옮길지가 더 중요한 결정이 된다.
0. 페르소나는 mind의 일부를 빌려 주는 일이다
페르소나에 무엇을 넣고 빼는가의 본질은 — 운영자가 자기 mind의 어떤 부분을 협업자에게 빌려 줄 것인가에 대한 선택이다.
빌려 주지 않은 mind는 매 세션 다시 협의된다. 빌려 준 mind는 매 세션 시작 시점에 이미 거기 있는다. 무엇을 빌려 줄지를 결정하지 않으면, 협업자는 매번 다른 누군가로 합류한다 — 어떤 때는 학생, 어떤 때는 컨설턴트, 어떤 때는 단순 도구.
페르소나 설계는 그래서 톤 설정이 아니다. 운영자가 매 세션 다시 설명하지 않을 mind의 경계를 긋는 일이다.
아래 §1부터는 그 경계를 어디에 어떻게 긋는지 — 무엇을 인라인에 두고 무엇은 외부로 빼는지의 실제 기준을 다룬다.
1. 페르소나에 들어가야 하는 것
운영자가 수렴한 결과 — 페르소나(즉, 모든 세션에서 항상 자동 로드되는 system prompt)에는 다음 여섯 가지가 들어간다.
1.1 역할 정의
가장 먼저 들어가는 것은 누구로 행동해야 하는가다.
- 직급/직무 (예: "시니어 개발자")
- 누구의 지시를 받는가 (예: "팀 리드의 지시에 따라 독립 수행")
- 어떤 톤으로 일하는가 (예: "독립적 판단 + 결과 보고")
이 한 단락이 빠지면 응답은 일관성 있는 한 명의 누군가가 아니라 매번 다른 누군가가 된다. 어떤 때는 학생 톤, 어떤 때는 컨설턴트 톤, 어떤 때는 보조 도구 톤. 그러면 운영자는 매번 톤을 추측해야 하고, 그 자체가 인지 부하다.
1.2 전문 영역
다음은 무엇을 잘 알고 있는가다.
- 언어 (예: C/C++, Python, TypeScript, Rust)
- 플랫폼 (예: Windows, Tauri, Next.js, Supabase)
- 도메인 (예: 네트워크, 빌드 시스템, 자동화)
이 줄은 운영자가 어떤 질문을 던졌을 때, 그 질문이 어느 영역에 속하는지를 자동으로 매핑하는 데 쓰인다. "이건 내 영역이다" / "이건 영역 밖이라 신중하게 가야 한다" 같은 자기 인식을 시킨다.
1.3 명령 체계와 보고 형식
세 번째는 어떻게 일이 흘러가는가다.
- 작업 착수 절차 (계획 → 보고 → 승인 → 구현 → 갱신)
- 진행 보고는 어느 시점에 (3-5단계마다 중간 보고)
- 보고 형식 (어떤 양식으로 — 짧게/길게)
- 작업 관리 단일 진실원 (어디에 작업 보드가 있는가)
이게 빠지면 매번 "보고는 어떻게 해야 하나" 같은 질문을 받게 된다. 한 번 정해 두면 매 세션 일관된다.
1.4 결정 권한의 분배
네 번째가 가장 중요하다. 무엇을 자율적으로 결정하고, 무엇은 승인을 받아야 하는가.
운영자의 경우 세 단계로 나눠 두었다.
| 단계 | 기준 | 예시 |
|---|---|---|
| ✅ 자유 | 작업 영역 내 일반 작업 | 코드 작성·수정, 빌드·테스트, 작업 영역 push |
| 🔒 승인 필수 | 영향 범위가 큰 변경 | 외부 push·merge, public 인터페이스 변경, 새 의존성, DB 스키마 |
| 🚫 절대 금지 | 되돌릴 수 없거나 정책 위반 | 시크릿 커밋, 운영자 실명 노출, 설정 파일 자체 수정 |
이 표가 있으면 협업자는 매번 "이걸 해도 됩니까" 물어보지 않는다. 한편 위험한 일은 자동으로 멈춘다. 가장 큰 효과는 — 운영자가 같은 승인 결정을 반복하지 않게 된다는 점이다.
1.5 안전성 가드 — "절대 하지 마라" 목록
다섯 번째는 운영자가 과거에 데인 일을 막는 자동 가드다. 페르소나에는 다음 같은 가드가 들어 있다.
- 병렬 서브에이전트 과다 금지 → 순차, 20파일 넘으면 분할
- 디렉토리 전체 Read 금지 → ls/grep으로 특정 후 Read
- 500줄 넘는 파일은 헤더/범위 지정 우선
- 3-5단계마다 중간 보고
이 가드는 모두 한 번씩 사고가 났던 결과다. 한 번은 병렬 에이전트가 너무 많이 떠서 API rate limit에 걸렸고, 한 번은 큰 디렉토리를 한꺼번에 읽다가 컨텍스트가 터졌고, 한 번은 500줄짜리 파일을 한 번에 처리하다가 잘못된 위치를 수정했다. 각 사건이 한 줄의 가드로 응고됐다.
운영자의 페르소나는 "할 수 있는 것" 목록보다 "해서는 안 되는 것" 목록이 더 짧고 더 효과적이다.
1.6 핵심 운영 원칙 — 5~10개의 일반 원리
마지막은 영역을 가로지르는 일반 원칙이다. 운영자의 경우 다음 같은 원칙이 들어 있다.
- Plan First — 5+파일 수정 / 새 모듈 / 아키텍처·보안·DB 변경은 계획 필수
- One Task Per Subagent — 결과를 맹목적으로 신뢰하지 말 것
- Self-Improvement — 버그 조사 시 기존 교훈을 먼저 grep
- Verification Before Done — 코드 변경 후 "완료" 보고 직전 자동 검증 루프
- Demand Elegance — 대안 검토. 과도한 추상화 ≠ 우아함
- Cross-Platform — Alice 자체는 모든 지원 OS에서 동작 필수
각 원칙은 한 줄 이내. 자세한 절차는 외부 규칙 파일로 빠진다(아래 §2 참조). 페르소나에는 원칙의 이름과 트리거 조건만 들어가고, 구체적 절차는 그 트리거가 발동될 때 따로 로드된다.
2. 페르소나에서 빼야 하는 것
들어가야 하는 것보다 빼야 하는 것이 더 결정적이다. 잘못 들어간 한 단락이 매 세션 토큰을 소모한다.
2.1 동적으로 바뀌는 정보 — 메모리로
다음은 페르소나에 절대 넣지 않는다.
- 진행 중인 프로젝트의 현재 상태
- 어제 무엇을 했는지
- 누가 무엇을 책임지는지 (변하는 정보)
- 일시적 결정사항
이런 정보는 페르소나가 아니라 메모리에 들어간다. 페르소나는 "이 협업자는 누구인가"이고, 메모리는 "지금 이 협업자가 알고 있는 사실은 무엇인가"다. 둘은 갱신 주기가 다르다. 페르소나는 거의 안 바뀌고, 메모리는 매일 바뀐다.
이 분리를 안 하면 페르소나가 점점 부풀어 오르다가 결국 한 달 전 내용까지 다 안고 있는 비대한 문서가 된다. 그렇게 되면 매 세션 거의 모든 토큰을 페르소나 읽는 데 쓰게 된다.
2.2 프로젝트별 지침 — 프로젝트 CLAUDE.md로
운영자는 여러 프로젝트를 동시에 운영한다. 각 프로젝트마다 기술 스택·컨벤션·배포 방식·관계자가 다르다.
이런 정보는 페르소나가 아니라 프로젝트 루트의 CLAUDE.md로 빠진다. 도구가 작업 디렉토리에 진입할 때 자동으로 로드되니, 그 프로젝트에 있을 때만 보면 된다. 다른 프로젝트에 갔을 때는 사라진다.
페르소나는 모든 프로젝트에 공통되는 운영자 자신의 정체성만 들고 있는다. 어떤 프로젝트의 디테일도 페르소나에는 없다.
2.3 자세한 절차 — 외부 규칙 파일로 (Read on demand)
세 번째로 빠지는 것은 자세한 절차 매뉴얼이다.
- 언어별 코딩 패턴 (cpp/rust/typescript)
- 보안 체크리스트 상세
- 멀티에이전트 위임 절차 상세
- 작업 착수 절차 상세
이런 것들은 페르소나에는 이름과 위치 포인터만 들어간다.
- 보안: .claude/rules/common-security.md (항상 적용)
- 언어 패턴: 작업 시 memory/rules/lang/{cpp,rust,typescript}-patterns.md Read
- MCP 정책 → memory/rules/mcp-policy.md협업자는 특정 작업에 진입했을 때만 해당 규칙 파일을 Read한다. Rust 작업이 아니면 Rust 패턴 파일은 아예 안 본다. 이게 외부화의 핵심 이득이다.
3. 외부화 vs 인라인 — 판단 기준
운영자가 수렴한 기준은 단순하다.
"매 세션 거의 무조건 적용되는가?" → 인라인 "특정 상황에서만 적용되는가?" → 외부화 + 트리거 명시
| 항목 | 매 세션 적용? | 위치 |
|---|---|---|
| 역할 정의 | ✅ 매번 | 페르소나 인라인 |
| 보안 일반 원칙 | ✅ 매번 | 페르소나 인라인 (체크리스트는 외부) |
| 결정 권한 표 | ✅ 매번 | 페르소나 인라인 |
| 안전성 가드 6개 | ✅ 매번 | 페르소나 인라인 |
| 언어별 패턴 | ❌ 그 언어 작업 시만 | 외부 + "작업 시 Read" |
| 보안 심화 (유니코드 등) | ❌ 보안 감사 시만 | 외부 + "감사 세션에서만 Read" |
| MCP 정책 상세 | ❌ MCP 설정 시만 | 외부 + 포인터 |
| 멀티에이전트 절차 상세 | ❌ 위임 시만 | 외부 + 포인터 |
이 분리 후 페르소나 자체는 짧아진다. 동시에 깊이가 필요한 작업에서는 깊이 있는 규칙이 그때그때 로드된다. 얕은 일은 빠르게 처리되고, 깊은 일은 깊게 처리된다.
4. 진화 패턴 — 페르소나가 자라는 방식
페르소나는 처음부터 완성된 채로 만들어지지 않는다. 운영자의 경우 다음 패턴으로 자랐다.
- 최소 시작: 역할 정의 + 영역 + 한 가지 보고 형식
- 사건 → 가드: 실수가 한 번 발생 → 그 실수를 막는 한 줄 추가
- 반복 결정 → 권한 표: 같은 승인 요청이 두 번 반복 → 권한 표에 명시
- 부풀면 외부화: 한 항목이 5줄을 넘어가면 외부 파일로 빠지고 페르소나에는 포인터만
- N=2 파일럿: 새 패턴은 한 프로젝트에서 검증 → 두 번째 프로젝트에서 재현 → 그 후 페르소나에 정식 등재
가장 중요한 것은 승급/강등 기준이 있다는 점이다. 모든 좋은 아이디어가 페르소나로 가지 않는다. 두 번 이상 효과가 검증되어야 페르소나로 올라간다. 한 번 들어간 항목이라도 사용 빈도가 떨어지면 외부로 강등되거나 삭제된다.
이 규율이 없으면 페르소나는 시간이 지날수록 비대해진다.
5. 실제 효과 — 전후 비교
페르소나를 도입하기 전후로 무엇이 바뀌었나.
| 항목 | 전 | 후 |
|---|---|---|
| 매 세션 톤 추측 | 매번 | 한 번 정해진 톤 유지 |
| "이거 해도 됩니까" 질문 | 자주 | 권한 표가 답함 |
| 같은 사고 재발생 | 종종 | 가드가 막음 |
| 자세한 매뉴얼 토큰 소비 | 매 세션 | 필요할 때만 |
| 보고 형식 협의 | 매번 | 한 번 정해진 형식 유지 |
가장 큰 변화는 운영자의 인지 부하가 줄었다는 점이다. 같은 결정을 반복하지 않게 됐고, 같은 형식을 매번 설명하지 않게 됐다.
6. 한 가지 함정 — 페르소나에 "성격"을 너무 많이 넣지 말 것
마지막으로 한 가지 함정. 페르소나라고 하면 의인화하면서 "친근한 톤" "유머러스" 같은 성격 설정을 넣고 싶어진다. 그러나 운영자의 경험상, 그런 설정은 다음 두 가지 부작용이 있다.
- 응답 길이가 늘어난다 — 친근한 톤은 한 줄로 끝낼 일을 세 줄로 늘인다.
- 신호를 흐린다 — 농담과 실제 권고의 경계가 모호해진다.
운영자가 수렴한 톤은 단순했다. 간결, 직접, 결정 중심. 페르소나에 들어간 톤 관련 지시는 한 줄뿐이다. "응답은 짧고 직접적으로." 성격이 아니라 직무 정의서다.
마무리
페르소나 설계의 핵심은 한 문장으로 압축된다 — "매 세션 반드시 봐야 할 것만 인라인, 나머지는 다 외부." 그 결정 하나가 페르소나를 비대한 매뉴얼이 아니라, 짧고 작동하는 직무 정의서로 만든다.
다음 글에서는 페르소나가 가리키는 메모리 시스템 — 즉, 동적으로 바뀌는 정보를 어디에 어떻게 누적하는가에 대해 다룬다.