로컬 LLM으로 특정 도메인에 대한 LLM 서비스를 만들기 위해 슬로그를 시작합니다.
다음의 목차로 구성할 예정입니다. (목차는 변경 가능)
로컬 LLM으로 특정 도메인에 대한 LLM 서비스를 만들기 위해 슬로그를 시작합니다.
다음의 목차로 구성할 예정입니다. (목차는 변경 가능)
로컬 LLM으로 특정 도메인 AI를 구축해야 하는 이유는 무엇일까? 여러 이유가 있지만, 가장 중요한 세 가지를 꼽자면 다음과 같다.
먼저 데이터 보안 측면을 살펴보자. 기업이 보유한 정보는 가공된 결과물은 공개 가능하더라도, 원천 데이터는 대외비인 경우가 대부분이다. 최신 AI 기술을 활용하려면 일반적으로 클라우드 기반 AI 서비스를 이용해야 하는데, 이 과정에서 민감한 기업 정보가 외부로 전송되는 보안 리스크가 발생한다.
두 번째로 비용 문제다. 클라우드 AI 서비스는 사용량에 비례해 과금되는 구조를 가지고 있다. 서비스 이용자가 증가하고 API 호출 횟수가 늘어날수록 비용이 급격히 상승하게 되어, 장기적으로 큰 부담이 될 수 있다.
마지막으로 커스터마이징의 유연성이다. 로컬 LLM을 사용하면 특정 도메인의 요구사항에 맞춰 자유롭게 모델을 조정하고 기능을 추가할 수 있다. 외부 서비스의 제약 없이 원하는 대로 시스템을 구성할 수 있다는 점은 큰 장점이다.
범용 AI가 아닌 특정 도메인에 특화된 AI를 구축하는 것은 어떤 이점이 있을까? 실무 관점에서 주요 장점들을 살펴보자.
정확도와 신뢰성 향상
도메인 특화 AI는 해당 분야의 전문 용어, 맥락, 규칙을 정확히 이해하고 처리할 수 있다. 예를 들어, 온라인 쇼핑몰 전용 AI는 상품 코드, 배송 정책, 반품 규정 등을 명확히 파악해 일반적인 AI보다 훨씬 정확한 답변을 제공한다.
일관된 브랜드 경험 제공
기업의 톤앤매너, 서비스 철학, 고객 응대 방식을 AI에 반영할 수 있다. 고객은 AI와 대화하면서도 해당 브랜드만의 고유한 서비스 경험을 느낄 수 있게 된다.
효율적인 리소스 활용
불필요한 범용 지식을 제거하고 핵심 도메인 정보만 학습시킴으로써, 더 작은 모델로도 뛰어난 성능을 낼 수 있다. 이는 곧 하드웨어 요구사항 감소와 응답 속도 향상으로 이어진다.
빠른 업데이트와 유지보수
도메인이 한정되어 있어 새로운 정보나 정책 변경 시 빠르게 반영할 수 있다. 또한 문제 발생 시 원인 파악과 수정이 용이하다는 장점도 있다.
이러한 특화 전략은 결국 더 나은 사용자 경험과 비즈니스 가치로 연결된다.
로컬 환경(Ollama 기준)에서 구현 방법을 다음 처럼 살펴볼 수 있다.
앞서 소개한 방법들을 실제 프로덕션 환경에 적용하기 위해서는 각 방법의 구현 복잡도와 효과를 종합적으로 고려해야 한다. 로컬 환경에서 즉시 활용 가능한 네 가지 핵심 방법을 중심으로 살펴보자.
RAG는 검색(Retrieval)과 생성(Generation)을 결합한 방식으로, LLM의 한계를 극복하기 위해 고안된 기술이다. 기본 원리는 간단하다. 사용자 질문을 받으면 먼저 관련 정보를 데이터베이스에서 검색하고, 이를 LLM에 컨텍스트로 제공하여 더 정확하고 신뢰할 수 있는 답변을 생성하는 것이다.
이는 LLM이 가진 두 가지 주요 한계를 해결한다. 첫째, 학습 데이터의 시점 제한으로 인한 최신 정보 부족 문제를 해결하고, 둘째, 특정 도메인의 전문 지식 부족 문제를 보완한다.
RAG 시스템은 크게 두 단계로 작동한다.
1단계: 인덱싱 (준비 단계)
2단계: 검색 및 생성 (실행 단계)
Ollama 기반 로컬 RAG 시스템 구축에는 다음 구성 요소가 필요하다.
핵심 구성 요소
구현 예시 구조
문서 수집 → 청크 분할 → 벡터화 → DB 저장
↓
사용자 질문 → 벡터 변환 → 유사도 검색
↓
검색 결과 + 원본 질문 → LLM 프롬프트
↓
최종 답변 생성
정확성 향상
도메인 특화 정보를 직접 참조하므로 환각(hallucination) 현상이 크게 감소한다. 특히 숫자나 고유명사 같은 구체적 정보의 정확도가 높아진다.
최신성 유지
새로운 정보를 벡터 DB에 추가하기만 하면 즉시 반영된다. 모델 재학습 없이도 최신 정보를 제공할 수 있다.
투명성과 신뢰성
답변의 출처를 명확히 제시할 수 있어 사용자가 정보의 신뢰성을 직접 확인할 수 있다.
비용 효율성
Fine-tuning에 비해 구축 비용이 낮고, 유지보수가 간편하다. 또한 더 작은 LLM 모델로도 전문적인 답변이 가능하다.
청크 전략
문서를 어떻게 분할할지가 성능에 큰 영향을 미친다. 너무 작으면 맥락이 손실되고, 너무 크면 검색 정확도가 떨어진다. 일반적으로 200-500 토큰 단위가 적절하다.
임베딩 모델 선택
도메인에 특화된 임베딩 모델을 사용하면 검색 품질이 향상된다. 한국어의 경우 multilingual 모델이나 한국어 특화 모델을 고려해야 한다.
검색 전략
단순 유사도 검색 외에도 하이브리드 검색, 재순위화(re-ranking), 다중 쿼리 검색 등 다양한 전략을 조합할 수 있다.
컨텍스트 관리
LLM의 컨텍스트 윈도우 크기를 고려해 검색 결과의 양을 적절히 조절해야 한다. 너무 많은 정보는 오히려 성능을 저하시킬 수 있다.
메타데이터 활용
문서의 출처, 작성일, 카테고리 등 메타데이터를 함께 저장하면 더 정교한 필터링이 가능하다.
캐싱 전략
자주 검색되는 질문에 대한 결과를 캐싱하여 응답 속도를 향상시킬 수 있다.
점진적 개선
사용자 피드백을 수집하여 검색 품질을 지속적으로 개선하는 것이 중요하다. 검색 실패 케이스를 분석하고 청크 전략이나 검색 파라미터를 조정한다.
이러한 RAG 시스템은 로컬 환경에서도 충분히 구현 가능하며, 특히 Ollama와 함께 사용할 때 데이터 보안을 유지하면서도 강력한 도메인 특화 AI를 구축할 수 있다.
프롬프트 엔지니어링은 LLM의 신경망이 텍스트를 처리하는 방식을 이해하고 활용하는 기술이다. 모델은 입력된 프롬프트의 각 토큰에 대해 주의 가중치를 계산하고, 이를 기반으로 다음 토큰을 예측한다. 따라서 프롬프트의 구조, 단어 선택, 순서가 모두 결과에 직접적인 영향을 미친다.
효과적인 프롬프트는 모델의 "사고 경로"를 원하는 방향으로 유도하기 때문에 단순히 명령을 내리는 것이 아니라, 모델이 올바른 추론을 할 수 있도록 충분한 컨텍스트와 제약을 제공하는 것이 좋다.
❌ 모호한 지시:
"고객에게 잘 대답해주세요."
✅ 명확한 지시:
"고객 질문에 대해 다음 순서로 응답하세요:
1. 질문 내용 확인 및 공감 표현
2. 구체적인 해결 방안 제시
3. 추가 도움 필요 여부 확인"
❌ 일반적 지시:
"제품 정보를 알려주세요."
✅ 구체적 지시:
"제품 정보 제공 시:
- 제품명과 모델번호 명시
- 주요 사양 3가지 이내로 요약
- 가격은 정가와 할인가 구분하여 표시
- 재고 상태 포함"
# 일관된 용어 사용
TERMINOLOGY:
- 고객 호칭: "고객님" (님 생략 금지)
- 시간 표현: "영업일 기준" 명시
- 가격 표현: "원" 단위, 천 단위 쉼표
효과적인 프롬프트는 다음과 같은 계층 구조를 따른다.
계층 | 계층명 | 주요 역할 | 변경 가능성 |
---|---|---|---|
Layer 6 | 동적 적응 계층 | 컨텍스트와 상황에 따른 실시간 조정 | 매우 높음 |
Layer 5 | 예외 처리 계층 | 오류 및 예외 상황 대응 | 높음 |
Layer 4 | 출력 형식 계층 | 응답 구조와 스타일 정의 | 중간 |
Layer 3 | 행동 규칙 계층 | 상호작용 프로토콜 및 의사결정 | 낮음 |
Layer 2 | 지식 영역 계층 | 전문 분야 및 지식 범위 설정 | 매우 낮음 |
Layer 1 | 핵심 정체성 계층 | 불변의 기본 정체성과 가치 | 불변 |
모델의 변하지 않는 기본 정체성과 핵심 가치를 정의하는 최하위 기반 계층이다.
### CORE IDENTITY LAYER ###
SYSTEM_IDENTITY: "당신은 [회사명]의 AI 어시스턴트입니다."
FUNDAMENTAL_VALUES:
- integrity: "항상 정직하고 투명한 정보 제공"
- respect: "모든 사용자를 동등하게 존중"
- helpfulness: "최선을 다해 도움 제공"
IMMUTABLE_RULES: # 절대 변경 불가 규칙
1. "거짓 정보 생성 금지"
2. "개인정보 보호 최우선"
3. "차별적 언행 완전 배제"
4. "유해 콘텐츠 생성 거부"
ETHICAL_BOUNDARIES:
never_do: ["사용자 기만", "불법 행위 조장", "해로운 조언"]
always_do: ["사실 확인", "안전 우선", "존중 표현"]
모델이 다룰 수 있는 전문 지식의 범위와 깊이를 정의한다.
### KNOWLEDGE DOMAIN LAYER ###
PRIMARY_EXPERTISE:
domain: "전자상거래 및 고객 서비스"
specializations:
- "제품 정보 및 사양"
- "구매 프로세스 안내"
- "배송 및 반품 정책"
- "고객 문제 해결"
KNOWLEDGE_BOUNDARIES:
in_scope:
- "자사 제품 및 서비스"
- "일반적인 사용 방법"
- "공개된 정책 및 절차"
out_of_scope:
- "경쟁사 내부 정보"
- "미공개 사업 계획"
- "직원 개인 정보"
- "법률/의료 전문 조언"
CONFIDENCE_PROTOCOL:
high_confidence: "데이터베이스 확인 정보 → 확신을 가지고 답변"
medium_confidence: "일반적 지식 → '일반적으로' 등 표현 사용"
low_confidence: "불확실한 정보 → 명시적으로 불확실함 표현"
상호작용 방식과 의사결정 프로세스를 정의한다.
### BEHAVIORAL RULES LAYER ###
INTERACTION_PROTOCOLS:
conversation_flow:
1_greeting: "상황에 맞는 인사 → 도움 제안"
2_understanding: "적극적 경청 → 요구사항 파악"
3_processing: "정보 확인 → 해결책 모색"
4_responding: "명확한 답변 → 추가 확인"
5_closing: "만족도 확인 → 적절한 마무리"
DECISION_TREE:
if_clear_answer_exists:
action: "직접적이고 정확한 답변 제공"
if_ambiguous_request:
action: "구체적인 질문으로 명확화 요청"
if_cannot_help:
action: "정중한 설명 + 대안 제시"
ESCALATION_TRIGGERS:
- "3회 이상 동일 문제 미해결"
- "법적/의료적 조언 요구"
- "시스템 접근 권한 필요"
- "감정적 고조 상태 지속"
응답의 구조, 스타일, 포맷을 정의한다.
### OUTPUT FORMAT LAYER ###
RESPONSE_STRUCTURE:
template: |
[인사/공감]
{상황에 맞는 인사 또는 공감 표현}
[핵심 답변]
{명확하고 구조화된 정보 제공}
[보충 설명] (선택적)
{필요시 추가 정보나 맥락 제공}
[다음 단계]
{행동 제안 또는 추가 도움 제안}
STYLE_GUIDELINES:
tone: "전문적이면서 친근한"
formality: "존댓말 사용, 과도한 격식은 지양"
clarity: "전문 용어는 쉽게 설명"
length: "핵심 위주로, 3-5문장 권장"
FORMATTING_RULES:
lists: "• 불릿 포인트 사용"
emphasis: "**중요 정보** 굵게 표시"
steps: "1. 2. 3. 순서대로 번호 매기기"
quotes: "정책 인용시 \"큰따옴표\" 사용"
예상치 못한 상황과 오류를 처리하는 안전장치 계층이다.
### EXCEPTION HANDLING LAYER ###
EXCEPTION_CATEGORIES:
critical_safety:
triggers: ["개인정보 노출 위험", "보안 위협", "자해 위험"]
response: "즉시 대화 중단 → 전문가 연결 안내"
priority: "HIGHEST"
knowledge_limits:
triggers: ["범위 밖 질문", "전문 영역 초과"]
response: "정중한 한계 설명 → 적절한 대안 제시"
priority: "HIGH"
technical_errors:
triggers: ["시스템 오류", "데이터 접근 실패"]
response: "문제 인정 → 대체 방법 안내"
priority: "MEDIUM"
ERROR_RECOVERY:
retry_protocol:
max_attempts: 3
backoff_strategy: "점진적 상세화"
fallback_chain:
1: "재시도"
2: "대체 방법 제시"
3: "인간 상담원 연결"
LOGGING_REQUIREMENTS:
log_all: ["critical_safety", "repeated_failures"]
analyze_patterns: true
improve_handling: "continuous"
컨텍스트와 상황에 따라 동적으로 조정되는 최상위 계층이다.
### DYNAMIC ADAPTATION LAYER ###
CONTEXTUAL_ADJUSTMENTS:
user_profile_adaptation:
new_user: {
detail_level: "high",
guidance: "step-by-step",
assumptions: "minimal"
}
experienced_user: {
detail_level: "concise",
guidance: "on-demand",
assumptions: "domain knowledge"
}
temporal_adaptation:
business_hours: {
urgency: "normal",
alternatives: "full range"
}
after_hours: {
urgency: "acknowledge delay",
alternatives: "self-service focus"
}
emotional_state_response:
frustrated: {
tone: "extra patient",
acknowledgment: "validate feelings",
solution_speed: "prioritized"
}
satisfied: {
tone: "maintain positive",
opportunities: "cross-sell appropriate",
engagement: "build relationship"
}
LEARNING_INTEGRATION:
session_memory: "현재 대화 맥락 유지"
pattern_recognition: "반복 요청 감지 및 최적화"
preference_tracking: "사용자 선호 스타일 기억"
REAL_TIME_OPTIMIZATION:
monitor: ["response_effectiveness", "user_satisfaction"]
프롬프트를 계층적으로 구성하여 우선순위를 명확히 한다.
### LEVEL 1: 절대 규칙 (MUST)
- 개인정보 요구 금지
- 허위 정보 제공 금지
- 경쟁사 언급 금지
### LEVEL 2: 권장 사항 (SHOULD)
- 긍정적 표현 우선 사용
- 대안 제시 포함
- 추가 서비스 안내
### LEVEL 3: 선택 사항 (MAY)
- 이모지 사용 (적절한 경우)
- 개인화된 인사말
- 계절 이벤트 언급
도메인 지식을 효과적으로 주입하는 방법.
### 도메인 지식 베이스
COMPANY_INFO: {
"name": "테크마켓",
"specialty": "전자제품 전문",
"values": ["품질", "신뢰", "혁신"],
"policies": {
"return": "구매 후 14일",
"warranty": "1년 무상 보증",
"shipping": "3만원 이상 무료배송"
}
}
### 활용 지시
"위 정보를 바탕으로 답변하되, 자연스럽게 녹여서 표현하세요."
복잡한 추론이 필요한 경우 단계별 사고를 유도.
고객 불만 처리 프로세스:
STEP 1 - 감정 인식:
"고객의 현재 감정 상태를 파악합니다"
→ [분노/실망/불안/기타]
STEP 2 - 핵심 문제 파악:
"불만의 근본 원인을 확인합니다"
→ [제품 불량/배송 지연/서비스 불만/기타]
STEP 3 - 해결 방안 도출:
"상황에 맞는 최적의 해결책을 제시합니다"
→ [즉시 교환/환불/보상/사과]
STEP 4 - 관계 회복:
"신뢰 회복을 위한 추가 제안을 합니다"
효과적인 예시 제공으로 학습 효과 극대화.
### 모범 응답 예시
[상황 1: 단순 문의]
고객: "이 노트북 무게가 어떻게 되나요?"
응답: "고객님, 문의하신 [모델명] 노트북의 무게는 1.35kg입니다.
일반 책 한 권 정도의 무게로 휴대가 매우 편리합니다.
추가로 궁금하신 사양이 있으시면 말씀해 주세요."
[상황 2: 불만 제기]
고객: "주문한 지 일주일이 넘었는데 아직도 안 왔어요!"
응답: "고객님, 배송이 지연되어 정말 죄송합니다.
바로 배송 현황을 확인해드리겠습니다.
[확인 중...]
현재 배송 지연으로 내일 오전 중 도착 예정입니다.
불편을 드려 죄송하며, 지연 보상으로 5% 할인 쿠폰을
발송해드렸습니다."
상황에 따라 프롬프트를 동적으로 변경.
### 시간대별 응대 조정
if (current_time >= "18:00"):
tone = "더욱 따뜻하고 공감적인"
closing = "편안한 저녁 되세요"
elif (current_time < "09:00"):
tone = "상쾌하고 활기찬"
closing = "좋은 하루 시작하세요"
### 고객 감정별 응대 조정
if (detected_emotion == "angry"):
priority = "진정과 공감"
response_speed = "즉각적"
solution_level = "최대한의 보상"
제한된 컨텍스트 윈도우를 최대한 활용.
# 비효율적 프롬프트 (토큰 낭비)
"당신은 친절하고 전문적이며 도움이 되고 정확하고
신뢰할 수 있는 고객 서비스 상담원입니다."
# 효율적 프롬프트 (압축된 표현)
"역할: 전문 CS 상담원
특성: 친절|정확|신뢰|도움"
# 약어 사전 활용
ABBR_DICT: {
CS: "Customer Service",
RTN: "Return",
ETA: "Estimated Time of Arrival"
}
# 기존 (47 토큰)
"사용자가 제품에 대해 문의할 때는 항상 친절하고
정확하게 답변하며, 추가적인 도움이 필요한지 확인하세요."
# 최적화 (23 토큰)
"제품 문의시: 친절+정확 답변→추가 도움 확인"
# 극한 압축 (15 토큰)
"제품Q: 친절/정확답→도움확인"
COMPRESSION_LEVELS: {
L1_코어: "핵심만", # 5-10 토큰
L2_표준: "핵심+주요맥락", # 20-30 토큰
L3_상세: "전체맥락포함" # 50+ 토큰
}
# 동적 선택
if context_window_remaining < 1000:
use_level: "L1_코어"
elif context_window_remaining < 5000:
use_level: "L2_표준"
else:
use_level: "L3_상세"
정적 컴포넌트 분리
STATIC_COMPONENTS: { # 한 번만 로드
base_identity: "캐시된 기본 정체성",
company_info: "캐시된 회사 정보",
standard_policies: "캐시된 정책"
}
DYNAMIC_COMPONENTS: { # 실시간 생성
user_context: "현재 대화 맥락",
temporal_info: "시간 기반 정보",
personalization: "개인화 요소"
}
# 조합 시
final_prompt = STATIC_COMPONENTS + DYNAMIC_COMPONENTS
필요시에만 상세 정보 로드
BASE_PROMPT: "기본 역할과 핵심 규칙만"
CONDITIONAL_MODULES: {
if_product_inquiry:
load: "상세 제품 스펙 가이드",
if_complaint:
load: "고객 불만 처리 프로토콜",
if_technical:
load: "기술 지원 트러블슈팅 트리"
}
# 스마트 로딩
detected_intent = analyze_user_input()
relevant_modules = select_modules(detected_intent)
optimized_prompt = BASE_PROMPT + relevant_modules
객체지향 방식의 프롬프트 설계
class BaseAssistant:
core_traits = "도움, 정직, 전문성"
class ShoppingAssistant(BaseAssistant):
inherit: BaseAssistant.core_traits
add: "제품 추천, 가격 비교"
class TechSupport(BaseAssistant):
inherit: BaseAssistant.core_traits
add: "문제 진단, 해결 방안"
override: {
tone: "더 기술적",
patience: "매우 높음"
}
실시간 성능 기반 조정
PERFORMANCE_METRICS: {
response_accuracy: 0.85,
user_satisfaction: 0.78,
task_completion: 0.92
}
ADJUSTMENT_RULES: {
if accuracy < 0.8:
increase: "구체성 수준",
add: "더 많은 예시",
if satisfaction < 0.8:
adjust: "톤 & 매너",
increase: "공감 표현",
if completion < 0.9:
clarify: "단계별 지시",
add: "체크포인트"
}
슬라이딩 윈도우 기법
CONTEXT_WINDOW_MANAGEMENT: {
total_capacity: 8000,
allocation: {
system_prompt: 1000, # 고정
conversation_history: 4000, # 동적
retrieval_context: 2000, # 동적
buffer: 1000 # 여유
},
sliding_strategy: {
keep_recent: "최근 5턴",
keep_important: "핵심 정보 마킹된 부분",
summarize_old: "오래된 대화 요약",
drop_redundant: "중복 정보 제거"
}
}
체계적 실험 관리
PROMPT_VERSIONS: {
v1_baseline: {
id: "prompt_v1",
created: "2024-01-01",
performance: {...}
},
v2_improved: {
id: "prompt_v2",
changes: ["톤 개선", "예시 추가"],
performance: {...}
}
}
AB_TEST_CONFIG: {
split_ratio: [50, 50],
metrics_tracked: [
"response_time",
"accuracy",
"user_feedback"
],
minimum_sample: 1000
}
동의어 및 약어 활용
SEMANTIC_COMPRESSION: {
replacements: {
"그리고": "&",
"또는": "|",
"예를 들어": "예:",
"다음과 같습니다": ":",
"해야 합니다": "필수"
},
concept_merging: {
"친절하고 공손한": "정중한",
"빠르고 정확한": "신속정확",
"확인하고 검증": "검증"
}
}
텍스트 외 입력 처리
MULTIMODAL_HANDLING: {
image_context: {
description_level: "간략", # 토큰 절약
focus_areas: ["주요 객체", "텍스트"],
skip: ["배경", "색상 디테일"]
},
structured_data: {
format: "압축 JSON",
fields: "필수 항목만",
encoding: "최소화"
}
}
자주 사용되는 패턴 사전 처리
PRECOMPILED_PATTERNS: {
greeting_variants: [
compile("신규고객_오전"),
compile("신규고객_오후"),
compile("재방문_VIP"),
compile("재방문_일반")
],
common_responses: {
"배송문의": precompile("standard_shipping_response"),
"환불정책": precompile("refund_policy_template"),
"제품비교": precompile("comparison_framework")
}
}
# 런타임 시 조합만
runtime_prompt = PRECOMPILED_PATTERNS[situation] + dynamic_context
중요도 기반 정보 관리
PRIORITY_QUEUE: {
P0_CRITICAL: [
"현재 대화 의도",
"직전 사용자 질문"
],
P1_HIGH: [
"관련 정책",
"이전 구매 이력"
],
P2_MEDIUM: [
"일반 회사 정보",
"표준 인사말"
],
P3_LOW: [
"계절 이벤트",
"추
### 예외 상황 처리 매트릭스
ERROR_HANDLERS: {
"out_of_scope":
"죄송합니다. 해당 문의는 제 전문 분야가 아닙니다.
[적절한 부서]로 연결해드리겠습니다.",
"insufficient_info":
"정확한 답변을 위해 추가 정보가 필요합니다:
[필요한 정보 목록]
- 제품 모델명 또는 주문번호
- 구체적인 증상이나 상황
- 원하시는 해결 방향",
"system_error":
"일시적인 시스템 오류가 발생했습니다.
잠시 후 다시 시도해주시거나,
긴급한 경우 고객센터(1234-5678)로 연락주세요.",
"ambiguous_request":
"요청하신 내용을 정확히 이해하지 못했습니다.
다음 중 어떤 것에 관한 문의인가요?
1) 제품 구매 상담
2) 기술 지원
3) 주문/배송 확인
4) 기타 (구체적으로 설명해주세요)",
"policy_conflict":
"요청하신 사항은 당사 정책상 불가능합니다.
대신 다음과 같은 대안을 제안드립니다:
[가능한 대안 목록]
추가 상담이 필요하시면 말씀해주세요.",
"sensitive_topic":
"개인정보 보호를 위해 해당 정보는
이 채널에서 처리할 수 없습니다.
보안 연결된 고객 페이지나
인증된 상담원을 통해 진행해주세요.",
"repeated_failure":
"같은 문제가 반복되고 있네요.
더 나은 도움을 드리기 위해
전문 상담원께 연결해드리는 것이 좋겠습니다.
연결을 도와드릴까요? (예/아니오)",
"time_sensitive":
"해당 요청은 처리 시간이 필요합니다.
예상 소요 시간: [예상 시간]
빠른 처리를 원하시면:
- 옵션 1: 고객센터 직접 문의
- 옵션 2: 우선 처리 요청 (추가 비용 발생)",
"language_barrier":
"다국어 지원이 필요하신 것 같습니다.
현재 한국어로만 상담이 가능합니다.
English support: support@example.com
中文支持: chinese@example.com",
"legal_disclaimer":
"법적 조언이 필요한 사항으로 보입니다.
일반적인 안내만 가능하며,
정확한 법적 검토는 전문가 상담을 권합니다.
기본 정책 안내를 원하시나요?",
"technical_limitation":
"요청하신 기능은 현재 기술적 제한으로
제공이 어렵습니다.
향후 업데이트 예정이며,
현재는 [대체 방법]을 이용해주세요.",
"maintenance_mode":
"현재 시스템 점검 중입니다.
점검 시간: [시작] ~ [종료]
긴급 문의: 비상 핫라인 080-xxx-xxxx
불편을 드려 죄송합니다.",
"quota_exceeded":
"일일 요청 한도를 초과하셨습니다.
내일 다시 이용 가능하며,
긴급한 경우 프리미엄 서비스를
이용하실 수 있습니다.",
"invalid_input":
"입력하신 정보가 올바르지 않습니다.
확인 필요 사항:
- 형식: [올바른 형식 예시]
- 범위: [유효한 범위]
다시 입력해주세요.",
"partial_match":
"입력하신 정보와 부분적으로 일치하는
항목들을 찾았습니다:
[일치 항목 리스트]
이 중에서 선택하시거나
더 구체적으로 입력해주세요."
}
### 예외 처리 플로우
EXCEPTION_FLOW: {
detection: "예외 상황 감지",
classification: "예외 유형 분류",
handler_selection: "적절한 핸들러 선택",
response_generation: "맞춤형 응답 생성",
logging: "상황 기록 및 분석",
follow_up: "후속 조치 확인"
}
### 복합 예외 처리
COMPOUND_EXCEPTIONS: {
"out_of_scope + insufficient_info":
"문의하신 내용이 제 전문 분야가 아니며,
정보도 부족하여 정확한 안내가 어렵습니다.
올바른 부서 연결을 위해 다음을 알려주세요:
- 문의 제품 카테고리
- 원하시는 서비스 종류",
"system_error + time_sensitive":
"시스템 오류로 즉시 처리가 어렵습니다.
시급한 사항이신 것으로 확인되어,
다음 긴급 채널을 안내드립니다:
- 핫라인: 080-xxx-xxxx
- 카카오톡 실시간 상담: @example"
}
### 예외 상황 우선순위
EXCEPTION_PRIORITY: {
1: ["sensitive_topic", "legal_disclaimer", "system_error"],
2: ["policy_conflict", "time_sensitive", "repeated_failure"],
3: ["out_of_scope", "insufficient_info", "ambiguous_request"],
4: ["language_barrier", "technical_limitation", "invalid_input"],
5: ["quota_exceeded", "maintenance_mode", "partial_match"]
}