본 문서는 기존 “수정 설계 플랜(Plan A~D)” 초안을 실제 운영 가능한 형태로 보완한 최종 계획표입니다.
핵심은 (1) 질문을 구조화(JSON) → (2) Plan을 선택 → (3) 실행 중 결과에 따라 자동 완화/전환(fallback) → (4) 케이스(case=sub_code) 단위로 근거팩을 구성하는 것입니다.
PlanChooser의 입력은 항상 “정규화된 router_json”이어야 합니다. (스키마 고정)
{
"mode": "search | report",
"goal": "similar_case | disposition | stats | report_draft | policy_check",
"constraints": {
"org": ["환경부", "보건복지부"],
"audit_field": ["환경", "보건/복지"],
"date_range": {"start": "2024-01-01", "end": "2024-12-31"},
"year_ref": ["올해", "작년", "최근3년"],
"count": 5,
"amount": null
},
"axes": {
"issue": true,
"action": false,
"procedure": false,
"result": false
},
"keywords": ["병가", "해외여행", "복무"],
"missing_slots": ["org", "date_range"],
"confidence": {
"goal": 0.78,
"constraints": 0.64,
"axes": 0.55
}
}
LLM만으로 “올해/작년/최근”을 처리하면 흔들릴 수 있으므로, 규칙 기반 보정 단계를 둡니다.
DateNormalizer는 router_json의 date_range를 최종 확정값으로 덮어쓰고, 변환 로그를 남깁니다.
PlanChooser는 “우선순위 + 점수(score) + 결과 기반 fallback” 3단으로 운영합니다.
goal == stats 또는 질문에 집계 의도(“몇 건/추이/증가/비중/기관별/연도별”)가 강함 → Plan Dgoal == disposition 또는 처분/수위(“징계/주의/통보/시정/적정 처분/수위/기준”)가 핵심 → Plan C위 규칙으로 1차 선택을 하되, 아래 2.2의 “점수 + fallback”이 실제 운영 안정성을 결정합니다.
우선순위만으로 흔들리는 경우를 줄이기 위해 Plan별 점수를 계산합니다.
constraints_count: 확정 제약 슬롯 개수 constraints_conf: constraints.confidencegoal_conf: goal.confidenceaggregation_signal: 집계형 키워드/표현 감지(“몇 건”, “추이”, “증가”, “비율” 등)disposition_signal: 처분/수위 키워드 감지(“징계”, “주의”, “통보”, “수위”, “처분” 등)실제 구현에서는 “우선순위(룰) → 점수로 tie-break” 구조가 가장 운영하기 쉽습니다.
sub_code 기준으로 dedupe/집계한다.권장:
max_chunks_per_case = 3max_cases_return = 20 (검색 응답)min_cases_for_report = 3 (보고서/처분추천 근거팩 최소)Plan 실행은 항상 “후보 케이스 수”를 기준으로 자동 전환한다.
MIN_CASES = 20 (너무 적으면 제약 완화 또는 Plan B로)MAX_CASES = 2000 (너무 많으면 필터 강화 또는 샘플링/Plan D 일부 차용)아래는 “무엇을 하드로 걸고(필터), 무엇을 소프트로 쓰는지(가점/재정렬)”가 핵심입니다.
트리거
전략
1) 하드 필터로 후보 케이스 축소
하드 필터(권장)
소프트(가점/재정렬)
출력 포맷
주요 위험
트리거
전략
1) issue 중심 dense/hybrid 검색으로 넓게 후보 확보(리콜 우선)
2) 후보에서 메타(기관/기간/처분)를 추출해 그룹핑(케이스 단위)
3) “주요 패턴 3가지” 요약 + 추가 슬롯(missing_slots) 질문 유도(선택)
하드 필터(최소화)
소프트(가점/재정렬)
출력 포맷
주요 위험
트리거
전략(운영형)
1) 처분(action_type) 신호로 후보군을 확보하되,
권장 구현(안전)
출력 포맷
주요 위험
트리거
전략
1) 제약(기간/기관/분야/주제)으로 case 단위 집계 수행
집계 축(권장)
출력 포맷
주요 위험
| Plan | 트리거(PlanChooser) | 1차 후보 생성 | 필터(하드) | 정렬(소프트) | 산출물 | 실패 시 전환 |
|---|---|---|---|---|---|---|
| A | 제약 ≥2, 명확 | 필터로 케이스 축소 후 유사도 | audit_field/org/date_range | issue/action 유사도 + rerank + action_type 가점 | 조건 만족 유사사례 TOP N | 제약 완화 → B |
| B | 모호/정보부족 | 유사도(리콜)로 케이스 확보 | 최소(있으면만) | 제약 일치 가점 + rerank(상위만) | 패턴 요약 + 샘플 | 너무 많으면 A 또는 D 일부 |
| C | 처분/수위 중심 | 넓게 확보 후 처분 중심 재정렬 | 처분 하드 금지(원칙) | action_type/action 가점 + issue 유사도 | 처분 그룹 + 대표 근거 | 부족하면 B |
| D | 건수/추세 중심 | 집계 우선(case) | 기간/분야/기관 | 필요 시 샘플 rerank | 집계표 + 사례샘플 | 집계 불가면 B |
1) Slot/Intent Extractor (+ DateNormalizer)
2) PlanChooser (본 문서 규칙을 구현한 라우터)
3) Plan별 Branch(A/B/C/D) 서브플로우
4) Evidence Pack Builder (case 단위 근거팩)
5) Answer/Report Generator
selected_plan: "A"|"B"|"C"|"D"normalized_router_json: 보정된 date_range 포함execution_params: top_k, min_cases, max_cases, relax_steps 등1) Slot/Intent Extractor 스키마 고정 + DateNormalizer 룰 확정
2) PlanChooser 컴포넌트 구현(룰+점수+fallback)
3) Case 단위 후보군/근거팩 표준화(sub_code 중심)
4) Plan D 집계 쿼리 템플릿 확정(시간축 정의 포함)
5) 모니터링/리그레션 테스트(질문 50~100개)로 라우팅 안정화
input: router_json
router_json = DateNormalizer(router_json)
signals:
agg = detect_aggregation(router_json, user_text)
disp = detect_disposition(router_json, user_text)
c_cnt = count_confirmed_constraints(router_json.constraints)
c_conf = router_json.confidence.constraints
g_conf = router_json.confidence.goal
priority_choice:
if agg: plan = D
else if disp: plan = C
else if c_cnt >= 2 and c_conf >= 0.6: plan = A
else: plan = B
score_choice (tie-break / override):
scoreD = 2*agg + 0.5*g_conf
scoreC = 2*disp + 0.5*g_conf
scoreA = 1.2*c_cnt + 1.0*c_conf
scoreB = 0.5
plan = argmax_with_priority(plan, score*)
execute(plan) -> result_cases
fallback:
if result_cases == 0 or result_cases < MIN_CASES:
relax_constraints()
rerun
if still low: plan = B; rerun
if result_cases > MAX_CASES:
add_light_filters() or switch_to_D_sampling()