AI 안전 및 위험 감지 자료
Mind-Log v5.0 | 최종 업데이트: 2026-04-17 18:30
1. LMS v4.0 안전 아키텍처 개요
LMS v4.0은 4단계 TIER 구조로 설계되어 있으며, Safety 관련 기능은 다음과 같이 분산됩니다.
| TIER | 에이전트 | 안전 관련 역할 | 중요도 |
|---|---|---|---|
| TIER 0 | Intent Classifier | risk_flag 초기 판정, complexity_score 산출 | 높음 |
| TIER 1 | Safety Agent | 위험 레벨 판정(L0~L4), safety_directives 생성, CRISIS 시 직접 사용자 응답 | 최고 |
| TIER 2 | Synthesis Agent | safety_directives 준수하여 응답 생성, _sources 블록에 safety 출처 표기 | 높음 |
| TIER 3 | Validator Agent | 응답 안전성 재검증, 윤리성 확인, safety_compliance 검사 | 높음 |
| TIER 4 | Personalization Agent | safety_directives의 tone_policy 적용 | 중간 |
핵심 원칙: Safety Agent = 유일한 안전 책임자
- v4.0에서는 Crisis Agent가 존재하지 않습니다
- Safety Agent가 L0(안전)부터 L4(긴급)까지 모든 위험 레벨을 직접 처리합니다
- CRISIS 상황(L3
L4)에서는 Safety Agent가 **TIER 24를 건너뛰고** 사용자에게 직접 응답합니다 - 이는 v4.0의 A2A 직접 통신 원칙에 따른 설계입니다
1-A. 입력 정제 레이어 — 프롬프트 인젝션 방어 & PII 마스킹 (PR #142)
Safety Agent가 판정을 수행하기 전, 라우트 레벨의 정제 레이어가 모든 입력/출력을 스캔한다. 구현 위치: src/agents/shared/input_sanitizer.py, src/agents/shared/output_sanitizer.py.
1-A.1 프롬프트 인젝션 패턴 — 총 12개 (영어 6 + 한국어 6)
주의: 초기 계획서의 "한국어 8종" 표기는 오기였으며, 실제 구현(src/agents/shared/input_sanitizer.py:12-29 INJECTION_PATTERNS)에는 한국어 6개, 영어 6개, 총 12개가 등록되어 있다.
동작 원칙:
- 라우트 레벨에서 패턴 감지 시
safety_flags에 표시한다. - 입력을 차단하지 않는다. 최종 판단은 Safety Agent가 수행한다.
- 감지 결과는 TIER 1 Safety Agent로 전달되어 risk_level 산출에 기여한다.
영어 패턴 (6개):
| # | 정규식 | 탐지 대상 |
| --- | ---------------------------- | ------------------------------ | -------------------------------------- | ------------------------------------ | ------ | -------------- | ------------------------- |
| 1 | ignore\s+(all\s+)?previous | 이전 지시 무시 시도 |
| 2 | (?:system | assistant)\s\*: | 역할 탈출 (system/assistant 헤더 위조) |
| 3 | \[INST\] | Llama 지시 형식 인젝션 |
| 4 | <\|im_start\|> | ChatML 메시지 경계 토큰 인젝션 |
| 5 | (?:you\s+are | act\s+as)\s+(?:now | a) | 역할 재정의 (you are now / act as a) |
| 6 | (?:print | reveal | show)\s+(?:your | the)\s+(?:system | prompt | instructions) | 시스템 프롬프트 유출 요청 |
한국어 패턴 (6개):
| # | 정규식 | 탐지 대상 |
| --- | -------------------- | ----------------------------------- | ----------------------------- | ----------------- | ------------------------------------ | -------------------- | -------------------------------------- |
| 1 | 이전\s\*(?:지시 | 명령 | 설정 | 규칙)을?\s\*무시 | 이전 지시/명령/설정/규칙 무시 |
| 2 | (?:시스템 | 어시스턴트)\s*프롬프트를?\s*(?:보여 | 알려 | 출력) | 시스템/어시스턴트 프롬프트 유출 요청 |
| 3 | 지금부터\s\*(?:너는 | 당신은 | you\s*are)\s*\S+(?:야 | 이야 | 입니다 | 다) | 역할 재정의 (지금부터 너는/당신은 ~다) |
| 4 | (?:프롬프트 | 지시문 | 시스템\s*메시지)를?\s*(?:무시 | 우회 | 변경 | 수정)해 | 프롬프트/지시문/시스템 메시지 조작 |
| 5 | (?:역할 | persona)을?\s\*(?:바꿔 | 변경해 | 전환해) | 역할/페르소나 전환 요청 |
| 6 | (?:탈옥 | jailbreak | 감옥\s*탈출)\s*(?:해 | 시켜 | 모드) | 탈옥(jailbreak) 시도 |
1-A.2 PII 마스킹 6종 (출력 정제)
Output Sanitizer가 최종 응답 직전에 6종의 개인식별정보(PII)를 탐지하고 마스킹한다.
| # | PII 유형 | 마스킹 규칙 |
|---|---|---|
| 1 | 주민등록번호 | 6자리-7자리 패턴 → ******-******* |
| 2 | 휴대전화 번호 | 010/011/016/017/018/019 + 8자리 → ***-****-**** |
| 3 | 유선전화 번호 | 02/0NN 지역번호 + 7~8자리 → **-****-**** |
| 4 | 이메일 주소 | RFC 5322 패턴 → ***@***.*** |
| 5 | 신용카드 번호 | 13~19자리 Luhn 검증 패턴 → ****-****-****-**** |
| 6 | 고유 이름 (NER) | NER 기반 인명 탐지 → [이름] |
보안 정책:
- Safety CRISIS 응답에 안내되는 긴급 상담 전화번호(1393, 1577-0199, 1588-9191)는 화이트리스트 처리하여 마스킹 대상에서 제외한다.
- PII 마스킹은 모든 TIER의 출력에 일괄 적용된다.
2. Intent Classifier (TIER 0) — 초기 위험 판별
risk_flag 판정
Intent Classifier는 사용자 입력에서 위험 키워드를 감지하여 risk_flag를 설정합니다.
# Intent Classifier의 위험 키워드 감지
RISK_KEYWORDS = ["자해", "자살", "죽고 싶", "포기하고 싶", "살기 싫", "죽고싶", "살기싫"]
def classify_intent(user_input: str) -> dict:
risk_flag = any(kw in user_input for kw in RISK_KEYWORDS)
return {
"intent_type": "crisis" if risk_flag else "general_inquiry",
"risk_flag": risk_flag,
"complexity_score": 0.3 if risk_flag else 0.0 # 위기 시 우선순위 상향
}
risk_flag에 따른 처리 변화
| risk_flag | TIER 1 Fan-out 우선순위 | Safety Agent 동작 |
|---|---|---|
| False | priority=1 (일반) | L0~L1 판정 → safety_directives만 생성 |
| True | priority=0 (최우선) | L2 |
3. Safety Agent (TIER 1) — 핵심 안전 엔진
3.1 Safety Agent의 역할
Safety Agent는 LMS의 유일한 안전 전담 에이전트로, 모든 위험 수준을 직접 처리합니다.
| 기능 | 설명 | 출력 |
|---|---|---|
| 위험 레벨 판정 | 사용자 입력의 위험도를 L0 | risk_level, risk_score |
| safety_directives 생성 | 하위 TIER에 전달할 안전 지침 생성 (Safety Output Only 원칙) | allow_generation, constraint_level, banned_content 등 |
| CRISIS 직접 대응 | L3 | crisis_response (하드코딩 폴백) |
| 트라우마 필터링 | 사용자의 과거 트라우마 트리거 감지 | trauma_triggers, avoid_topics |
3.2 Safety Output Only 원칙
safety_directives는 Safety Agent의 response에만 포함됩니다. 다른 에이전트(Emotion, Context, Reasoning)는 safety_directives를 생성하지 않으며, Synthesis Agent가 Safety Agent의 output에서만 안전 지침을 참조합니다.
# Safety Agent의 출력 구조
safety_output = {
"risk_score": 0.15,
"risk_level": "L1",
"mode": "safe",
"safety_directives": {
"allow_generation": True,
"constraint_level": 1,
"banned_content": ["medical_diagnosis"],
"required_disclaimers": [],
"style_constraints": {}
},
"cancel_downstream": False
}
4. 5단계 위험 레벨 시스템
| 레벨 | 이름 | risk_score | 처리 에이전트 | TIER 흐름 | 주요 조치 |
|---|---|---|---|---|---|
| L0 | Safe (안전) | 0.0 ~ 0.2 | Safety Agent | TIER 1→2→3→4 정상 완료 | 제한 없이 정상 응답 |
| L1 | Caution (주의) | 0.2 ~ 0.4 | Safety Agent | TIER 1→2→3→4 정상 완료 | 경미한 제한, 모니터링 |
| L2 | Warning (경고) | 0.4 ~ 0.6 | Safety Agent | TIER 1→2→3→4 정상 완료 → Personalization에서 톤 조정 | banned_content 확대, 면책 조항 추가, 톤 정책 적용 |
| L3 | High Risk (고위험) | 0.6 ~ 0.8 | Safety Agent (직접 대응) | ■ TIER 1 자연 완료 → TIER 2~4 하드코딩 폴백 경로 활성화 | CRISIS 프로토콜 발동, 위기 자원 안내, TIER 2~4 LLM 우회 |
| L4 | Emergency (긴급) | 0.8 ~ 1.0 | Safety Agent (즉각 대응) | ■ 즉시 Safety 직접 응답 → 전체 파이프라인 중단 | 즉각적 위기 개입, 긴급 상담 전화번호 제공, 관리자 알림 |
5. CRISIS 프로토콜 — Safety Agent 직접 대응
5.0 CRISIS 임계값 (코드 기준)
Safety 에이전트 실제 구현 기준의 임계값:
risk_level:0 ~ 4정수 (4 = CRISIS)- 0 = Safe, 1 = Caution, 2 = Warning, 3 = High Risk, 4 = Emergency
risk_score:0.0 ~ 1.0실수- CRISIS 판정:
risk_level == 4또는risk_score >= 0.8
문서 내 L0
L4 표기는 위 정수 매핑(04)과 동일한 의미이다.
5.1 CRISIS 발동 조건
Safety Agent가 risk_level 3 또는 4(L3/L4)를 판정하면 CRISIS 프로토콜이 즉시 발동됩니다.
5.2 CRISIS 처리 흐름 (PR #159 반영, Task 1/8/18/19와 통일)
중요 정책 변경: PR #159 이전의 "Cancel Broadcast로 TIER 1~4 취소" 모델은 폐지되었다. 현재 구현은 다음과 같이 하드코딩 폴백 기반이다.
- cancel_event 미발행 — CRISIS 경로는 cancel_event를 발행하지 않는다.
- TIER 2~4 하드코딩 폴백 — Script Generator / Visualization / Batch Validator / Script Personalizer가 각자 CRISIS 분기에서 LLM을 호출하지 않고 사전 정의된 폴백을 반환한다.
- cancel_event는 TIMEOUT 전용 —
workflow.py:378의 cancel_event는 오직 TIER 타임아웃 시에만 발행된다.
[사용자 입력] "더 이상 살기 싫어요"
│
▼
[TIER 0] Intent Classifier
│ intent_type = "crisis"
│ risk_flag = true
│ priority = 0 (최우선)
▼
[TIER 1] Safety, Emotion, Content Analyzer, Reasoning (병렬 Fan-out)
│ Safety Agent 감지: risk_level = 4 (L4, CRISIS)
│ ※ cancel_event 미발행 (PR #159). TIER 1은 전부 자연 완료한다.
▼
[TIER 2] Script Generator + Visualization (병렬)
│ ■ is_crisis 감지 → LLM 호출 생략
│ ■ 하드코딩 CRISIS 스크립트/비주얼 폴백 반환
▼
[TIER 3] Batch Validator
│ ■ is_crisis 감지 → LLM 미호출 폴백 반환 (PR #159)
│ ■ decision="pass", score=고정값
▼
[TIER 4] Script Personalizer
│ ■ is_crisis 감지 → LLM 호출 생략
│ ■ 하드코딩 CRISIS 응답 반환:
│ "지금 많이 힘드신 것 같습니다.
│ 정신건강 위기 상담: 1393 / 1577-0199 / 1588-9191"
▼
[END] Telemetry에 CRISIS 이벤트 기록
TIER 2~4가 LLM을 우회하는 것은 CRISIS 판정 시 잘못된 생성 응답이 사용자에게 전달될 위험을 제거하기 위함이다.
5.3 CRISIS 직접 응답 메시지 (Script Personalizer 하드코딩 폴백 최종 출력)
Script Personalizer(TIER 4)의 CRISIS 분기에서 하드코딩으로 반환되는 응답입니다. LLM을 호출하지 않으며 TIER 2~4 전체가 동일한 하드코딩 폴백 패턴으로 동작합니다.
# Safety Agent → User 직접 응답
{
"sender": "safety",
"receiver": "user",
"message_type": "response",
"payload": {
"crisis_response": "지금 이 순간, 당신의 생명이 가장 소중합니다. "
"혼자 감당하지 않으셔도 됩니다.",
"resources_provided": [
{"name": "자살예방상담전화", "number": "1393", "hours": "24시간"},
{"name": "정신건강위기상담전화", "number": "1577-0199", "hours": "24시간"},
{"name": "생명의전화", "number": "1588-9191", "hours": "24시간"}
],
"alert_sent": True,
"escalation_level": "immediate"
},
"metadata": {
"tier": 1,
"priority": 0
}
}
6. safety_directives 상세 구조
6.1 정상 흐름 (L0~L2) — safety_directives 전달
# L1 (Safe) 모드
safety_directives_safe = {
"allow_generation": True,
"constraint_level": 1,
"banned_content": ["medical_diagnosis"],
"required_disclaimers": [],
"style_constraints": {}
}
# L2 (Warning) 모드
safety_directives_warning = {
"allow_generation": True,
"constraint_level": 2,
"banned_content": ["medical_diagnosis", "medical_advice", "self_harm_instructions"],
"required_disclaimers": ["non_diagnostic", "non_therapeutic"],
"style_constraints": {
"tone_policy": "supportive_neutral",
"avoid_certainty_language": True
}
}
6.2 Synthesis Agent에서의 safety_directives 활용
Synthesis Agent는 Safety Agent의 출력에서 safety_directives를 참조하여 응답을 생성합니다.
def synthesis_apply_safety(response_text: str, safety_result: dict) -> str:
directives = safety_result.get("safety_directives", {})
# 금지 콘텐츠 필터링
for banned in directives.get("banned_content", []):
response_text = filter_banned_content(response_text, banned)
# 면책 조항 추가
for disclaimer in directives.get("required_disclaimers", []):
response_text += f"\n\n{get_disclaimer_text(disclaimer)}"
# 톤 정책 적용
style = directives.get("style_constraints", {})
if style.get("tone_policy") == "supportive_neutral":
response_text = adjust_tone(response_text, "supportive_neutral")
return response_text
6.3 Validator Agent에서의 안전성 재검증
Validator Agent(TIER 3)는 Synthesis Agent의 출력이 safety_directives를 준수하는지 최종 검증합니다.
def validator_safety_check(synthesis_output: dict, safety_result: dict) -> dict:
directives = safety_result.get("safety_directives", {})
issues = []
# 1. 금지 콘텐츠 포함 여부
for banned in directives.get("banned_content", []):
if contains_banned_content(synthesis_output["response_text"], banned):
issues.append({"type": "banned_content", "severity": "high", "content": banned})
# 2. 필수 면책 조항 포함 여부
for disclaimer in directives.get("required_disclaimers", []):
if not contains_disclaimer(synthesis_output["response_text"], disclaimer):
issues.append({"type": "missing_disclaimer", "severity": "medium", "content": disclaimer})
# 3. 톤 정책 준수 여부
if directives.get("style_constraints", {}).get("avoid_certainty_language"):
if contains_certainty_language(synthesis_output["response_text"]):
issues.append({"type": "certainty_language", "severity": "medium"})
return {
"safety_compliance": len([i for i in issues if i["severity"] == "high"]) == 0,
"issues": issues,
"recommendation": "pass" if len(issues) == 0 else "reject"
}
7. 트라우마 필터링 시스템
7.1 트라우마 트리거 감지
Safety Agent는 사용자의 과거 트라우마 기록을 참조하여 잠재적 트리거를 감지합니다.
def check_trauma_triggers(user_input: str, user_id: str) -> dict:
# Memory Agent에서 사용자의 트라우마 이력 조회
user_profile = get_user_profile(user_id)
trauma_triggers = user_profile.get("trauma_triggers", [])
detected = []
for trigger in trauma_triggers:
if trigger["keyword"] in user_input:
detected.append({
"trigger": trigger["keyword"],
"severity": trigger["severity"],
"avoid_topics": trigger["avoid_topics"]
})
return {
"trauma_detected": len(detected) > 0,
"triggers": detected,
"recommendation": "avoid" if detected else "safe"
}
7.2 트라우마 필터와 safety_directives 연동
트라우마가 감지되면 safety_directives에 회피 주제가 추가됩니다.
# 트라우마 감지 시 safety_directives 업데이트
if trauma_result["trauma_detected"]:
safety_directives["banned_content"].extend(
[t["avoid_topics"] for t in trauma_result["triggers"]]
)
safety_directives["style_constraints"]["trauma_sensitive"] = True
8. Validator Agent — 응답 안전성 최종 검증
8.1 Generator-Critic 패턴
[TIER 2] Synthesis Agent (초안 생성: Fan-in)
↓
[TIER 3] Validator Agent (검증: safety_compliance + 품질)
│
통과 여부?
├─ PASS → [TIER 4] Personalization → END
└─ FAIL → [TIER 2] Synthesis 재시도 (retry_count ≤ 2)
8.2 CRISIS 시 Validator 동작 (PR #159)
Batch Validator(TIER 3)는 state에 is_crisis=true가 포함된 경우 LLM을 호출하지 않고 사전 정의된 폴백을 반환한다. 이는 CRISIS 하드코딩 응답이 품질 점수 임계값에 걸려 재시도 루프에 들어가는 것을 방지하기 위함이다.
- LLM 미호출: 추가 지연/비용 발생 없음
- 폴백 반환 값:
decision="pass",score는 통과 임계값 이상으로 고정 - safety_compliance: True로 고정 (Safety 직접 응답이므로 선험적으로 준수)
8.3 검증 항목 (일반 경로)
| 검증 항목 | 설명 | FAIL 시 조치 |
|---|---|---|
| safety_compliance | safety_directives 준수 여부 | Synthesis 재시도 |
| ethical_compliance | 윤리적 기준 준수 여부 | Synthesis 재시도 |
| quality_score | 응답 품질 점수 (0.0~1.0) | 0.7 미만 시 재시도 |
| hallucination_check | 환각 요소 포함 여부 | 해당 부분 제거 후 재생성 |
| tone_check | 톤 정책 준수 여부 | 톤 조정 후 재전달 |
9. 에스컬레이션 플로우
9.1 단계별 에스컬레이션
[단계 1] Safety Agent 위험 감지 (risk_level 판정)
│
├─ L0~L2: 정상 흐름 → safety_directives 생성 → TIER 2~4 계속
│
└─ L3~L4: CRISIS 프로토콜 발동
│
[단계 2] TIER 1 자연 완료 + TIER 2~4 하드코딩 폴백 경로 활성화
│ ├─ Script Generator / Visualization: LLM 우회 → CRISIS 폴백 반환
│ ├─ Batch Validator: LLM 미호출 → decision="pass", score 고정값 반환
│ └─ Script Personalizer: LLM 우회 → CRISIS 고정 응답 반환
│
[단계 3] 전문 상담 센터 안내
│ ├─ 자살예방상담전화: 1393
│ ├─ 정신건강위기상담전화: 1577-0199
│ └─ 생명의전화: 1588-9191
│
[단계 4] 관리자 알림 (B2B)
│ └─ 조직 관리자에게 비상 알림 전송
│
[단계 5] Telemetry 기록
└─ CRISIS 이벤트를 Telemetry Agent에 비동기 전송
10. LLM 모델 배치 전략
| TIER | 에이전트 | 권장 모델 | 이유 |
|---|---|---|---|
| TIER 0 | Intent Classifier | Claude Haiku | 빠른 분류, 낮은 비용 |
| TIER 1 | Safety Agent | Claude Haiku | 빠른 위험 감지 (지연시간 최소화) |
| TIER 1 | Emotion Agent | Claude Haiku | 감정 분류는 경량 모델로 충분 |
| TIER 1 | Context Agent | Claude Haiku | 맥락 추적은 경량 모델로 충분 |
| TIER 1 | Reasoning Agent | Claude Sonnet | GoT/ToT/CoT 복합 추론에 고성능 필요 |
| TIER 2 | Synthesis Agent | Claude Sonnet | 4개 에이전트 출력 통합에 고성능 필요 |
| TIER 3 | Validator Agent | Claude Sonnet | 자기 성찰(self-reflection) 기반 검증 |
| TIER 4 | Personalization | Claude Haiku | 톤/스타일 조정은 경량 모델로 충분 |
11. MCP 도구 명세
MCP 서버명: psy-safety-monitor
Tool 1: assess_risk_level
사용자 입력의 위험도를 평가합니다.
{
"input": {
"user_input": "더 이상 살기 싫어요",
"user_id": "user_001",
"session_id": "sess_conv_abc",
"intent_metadata": {"risk_flag": true}
},
"output": {
"risk_score": 0.92,
"risk_level": "L4",
"mode": "crisis",
"detected_signals": ["자살 관련 표현", "삶의 의미 상실"],
"cancel_downstream": true
}
}
Tool 2: generate_safety_directives
하위 TIER에 전달할 안전 지침을 생성합니다.
{
"input": {
"risk_level": "L2",
"risk_score": 0.55,
"user_profile": {"trauma_triggers": ["가족_갈등"]}
},
"output": {
"allow_generation": true,
"constraint_level": 2,
"banned_content": ["medical_diagnosis", "self_harm_instructions", "가족_갈등"],
"required_disclaimers": ["non_diagnostic", "non_therapeutic"],
"style_constraints": {
"tone_policy": "supportive_neutral",
"avoid_certainty_language": true,
"trauma_sensitive": true
}
}
}
Tool 3: check_trauma_triggers
사용자의 트라우마 이력을 확인합니다.
{
"input": {
"user_input": "가족과의 갈등이 심해졌어요",
"user_id": "user_001"
},
"output": {
"trauma_detected": true,
"triggers": [
{"keyword": "가족_갈등", "severity": "medium", "avoid_topics": ["가정폭력", "이혼"]}
],
"recommendation": "avoid"
}
}
12. 프로토콜 v2.0 메시지 흐름 (안전 관점)
12.1 정상 흐름 (L0~L2)
순서 sender → receiver message_type 비고
──────────────────────────────────────────────────────
1 intent_classifier → safety request risk_flag 포함
2 intent_classifier → emotion request 병렬 Fan-out
3 intent_classifier → context request 병렬 Fan-out
4 intent_classifier → reasoning request 병렬 Fan-out
5 safety → synthesis response safety_directives 포함
6 emotion → synthesis response 감정 분석 결과
7 context → synthesis response 맥락 분석 결과
8 reasoning → synthesis response 추론 결과
9 synthesis → validator response _sources 블록 포함
10 validator → personalization response safety_compliance=true
11 personalization → user response 최종 응답
12.2 CRISIS 흐름 (L3~L4)
순서 sender → receiver message_type 비고
──────────────────────────────────────────────────────
1 intent_classifier → safety request risk_flag=true, priority=0
2 intent_classifier → emotion request 병렬 Fan-out
3 intent_classifier → context request 병렬 Fan-out
4 intent_classifier → reasoning request 병렬 Fan-out
5 safety → synthesis response is_crisis=true (TIER 2\~4 하드코딩 폴백 트리거)
6 emotion → synthesis response (자연 완료)
7 context → synthesis response (자연 완료)
8 reasoning → synthesis response (자연 완료)
9 synthesis → validator response ■ is_crisis 감지 → LLM 우회, 하드코딩 폴백
10 validator → personalizer response ■ decision="pass", score 고정값
11 personalizer → user response ■ CRISIS 고정 응답 (1393 / 1577-0199 / 1588-9191)
12 personalizer → telemetry event CRISIS 기록
13. 안전 고려사항 체크리스트
| 항목 | Safety Agent 역할 | Validator Agent 역할 | 상태 |
|---|---|---|---|
| 위험 키워드 감지 | risk_flag 판정, risk_level 산출 | - | ✓ |
| CRISIS 즉시 대응 | L3 | - | ✓ |
| 트라우마 필터링 | 사용자별 트라우마 트리거 확인 | - | ✓ |
| 금지 콘텐츠 필터 | banned_content 목록 생성 | 응답에 금지 콘텐츠 포함 여부 검증 | ✓ |
| 면책 조항 삽입 | required_disclaimers 지정 | 면책 조항 포함 여부 검증 | ✓ |
| 톤 정책 적용 | tone_policy 지정 | 톤 정책 준수 여부 검증 | ✓ |
| 환각 방지 | - | hallucination_check 수행 | ✓ |
| 윤리성 검증 | - | ethical_compliance 검사 | ✓ |
참고 문서:
- AI 파트 아키텍처 — v4.0 TIER 구조, CRISIS 선점 메커니즘
- AI 에이전트, MCP 자료 — 메시지 프로토콜 v2.0, 에이전트 간 통신
- AI CoT/ToT/GoT 자료 — Reasoning Agent 추론 체계
- AI 개인화 자료 — Personalization Agent 톤 조정
- AI Neo4j & VectorDB 스키마 가이드 — 데이터 계층 설계
향후 계획
- cancel 메시지 타입 프로토콜 v3 도입 검토: 현재 PR #159로 폐지된 Cancel Broadcast(에이전트 간 cancel 메시지 전송)는 백엔드 통신 확장 또는 분산 파이프라인 전환 시 메시지 프로토콜 v3 설계와 함께 재검토한다. 현재
workflow.py:378의 cancel_event는 TIMEOUT 전용으로 유지된다. - CRISIS 하드코딩 폴백 외부화: 현재 TIER 2~4의 CRISIS 고정 응답 문자열(긴급 상담 전화번호 포함)은 코드에 하드코딩되어 있다. 운영 환경 유연성을 위해
config/settings.yaml또는 별도 YAML 파일로 외부화하는 방안을 검토한다. - Safety Agent 모델 재검토: 현재 Claude Haiku로 운영 중이나, 위험 판정 정확도 개선이 필요한 경우 Claude Sonnet으로 업그레이드를 검토한다.
- 프롬프트 인젝션 패턴 확장: 현재 12개(영어 6 + 한국어 6) 패턴을 모니터링 데이터 기반으로 주기적으로 리뷰하고, 신규 인젝션 벡터 감지 시 추가한다.
변경 이력
| 날짜 | 버전 | 변경 내용 | PR / 참조 |
|---|---|---|---|
| 2026-04-17 18:30 | v5.0 | Cancel Broadcast 본문 제거, 향후 계획으로 이관. §9/§12 다이어그램에서 cancel 흐름 삭제. §13 체크리스트 CRISIS 설명 정정. 상단 경고 callout 제거, 버전 1줄로 통일. | PR #159 반영 |
| 2026-04-17 | v4.9 | 프롬프트 인젝션 패턴 12개(영어 6 + 한국어 6) 명세 반영, PII 마스킹 6종 명세. CRISIS 정수 임계값(risk_level 0 | PR #142, #159 |
| 2026-04-14 | v4.5 | 로그 시스템 통일(get_agent_logger), CRISIS 타임아웃 수정, TIER 1 타임아웃 240s 확장. | PR #112, #113, #114 |
| 2026-04-07 | v4.0 | TIER 기반 파이프라인 전환. Orchestrator 제거. Safety Agent CRISIS 선점 메커니즘 설계 확정. | v4.0 아키텍처 |