Planner & Query-Rewrite Trace Schema (v1)
Planner & Query-Rewrite Trace Schema (v1)
이 문서는 run_rag_query 가 생성하고 eval/run_eval.py 가 reports/traces/<run>/<case_id>.trace.json 에 저장하는 로컬 trace 산출물에 대한 reviewer 대상 레퍼런스다.
목표는 reviewer 가 .trace.json 파일 하나를 열어 계획(planner)이 무엇을 결정했는지, 왜 쿼리를 재작성(rewrite)했는지(또는 하지 않았는지), 시간이 어디에 쓰였는지 를 파이프라인 재실행 없이 재구성할 수 있도록 하는 것이다.
빌더는 rag_core.py 에 있다: build_query_rewrite_trace, build_planner_trace, build_result_trace.
최상위 구조
{
"schema_version": 1,
"query_rewrite": { ... },
"planner": { ... },
"answer_schema": { ... }
}
schema_version 은 현재 1 이다. 하위 호환 가능한 필드 추가(새 optional 키)는 이 값을 올리지 않는다. 호환성을 깨는 구조 변경은 올린다(#63 answer-schema v2 와 짝).
query_rewrite
대화 컨텍스트 해소(context resolution)와 검색(retrieval) 전에 수행된 prefix 주입을 기록한다.
| Field | Type | Notes |
|---|---|---|
original_query |
str | 이번 턴의 사용자 쿼리 원문. |
resolved_query |
str | 실제 검색에 전달된 쿼리. 재작성이 없으면 original_query 와 동일. |
rewritten |
bool | resolved_query != original_query 일 때만 True. |
rewrite_type |
str | conversation_state_prefix, explicit_context, clarification_required, none 중 하나. |
context_source |
str | 해소 신호의 출처: conversation_state, context_entities, query, 또는 none. |
context_status |
str | resolved, needs_clarification, not_needed 등. |
context_resolution_confidence |
float (0.0–1.0) | 해소 결정의 신뢰도. CONTEXT_RESOLUTION_THRESHOLD 미만이면 clarification 을 유발. |
reason |
str | 진단 태그(예: weak_active_state, ambiguous_active_state, no_active_state). |
context_entities |
list[str] | 이월된 기관(agency) / 엔티티 이름. |
context_projects |
list[str] | 이월된 사업(project) 이름. |
active_doc_ids |
list[str] | 활성 대화 상태의 문서 ID. |
readable_summary |
str | 재작성 결과를 한 줄로 기술한 사람 친화 설명. |
읽는 요령
rewrite_type=clarification_required와 낮은context_resolution_confidence로 보류(abstain)한 follow-up 은 전형적인 “지시 대상을 특정하지 못함” 경로다.rewrite_type=conversation_state_prefix+ 비어 있지 않은context_entities는 이전 턴의 기관/사업이 쿼리 앞에 덧붙여졌음을 의미한다.
planner
검색/답변 계획(plan)과 stage 별 시도(attempt)를 기록한다.
| Field | Type | Notes |
|---|---|---|
query_type |
str | single_doc, comparison, follow_up, abstention. |
pipeline |
str | 활성 파이프라인 이름(예: agentic_full, naive). |
prompt_profile |
str | 이번 실행에 선택된 prompt profile. |
strategy |
str | 상위 수준 검색 전략 라벨. |
retrieval_mode |
str | flat 또는 계층(hierarchical) 모드. |
metadata_first |
bool | metadata-first 경로를 탔는지 여부. |
rerank |
bool | 재순위(reranker) 활성화 여부. |
verifier_retry |
bool | 검증기(verifier) 기반 재시도 활성화 여부. |
stage_sequence |
list[str] | 순서대로 시도한 필터 stage(예: ["strict", "reduced", "relaxed"]). |
selected_stage |
str | 답변을 만들어 낸 최종 필터 stage. |
selected_top_k |
int | null | 사용된 최종 top-k. |
retrieval_budget |
object | top-k 계획 세부 정보(기본값, query-type override, 사유). |
metadata_candidate_count |
int | null | metadata 해소로 얻은 후보 문서 수. |
metadata_selected_doc_ids |
list[str] | metadata-first 해소로 선택된 문서 ID. |
metadata_ambiguous |
bool | metadata 해소가 모호성(ambiguity)을 표시했는지 여부. |
comparison_coverage |
object | null | 비교(comparison) 커버리지 진단(해당 시). |
stage_latencies_ms |
object | {query_analysis_ms, context_resolution_ms, answer_generation_ms}. |
attempts |
list[object] | stage 별 시도 기록: stage, top_k, verified, verification_reasons, metadata_doc_ids. |
readable_summary |
str | 계획을 한 줄로 요약. 예: single_doc planned with agentic_full stage=strict top_k=4 metadata_docs=['rfp-agency-a-ai-quality']. |
읽는 요령
- 재시도 체인을 보려면
attempts를 순서대로 따라간다. 첫verified=true가 답변 생성에 투입된 것이다. - stage 수준의
retrieve_ms/verify_ms는 각 attempt 항목 안에 있고, 최상위stage_latencies_ms는 분석 / 컨텍스트 해소 / 답변 생성을 다룬다. metadata_selected_doc_ids와query_rewrite.active_doc_ids를 짝지어 계획이 활성 대화 컨텍스트를 존중했는지 확인한다.
answer_schema
답변 envelope(schema_version, status, status_reason, query_type, claim_count)를 그대로 반영하므로, reviewer 가 답변 파일을 열지 않고도 검증기가 보류했는지 판단할 수 있다.
프라이버시 & 마스킹(redaction)
trace 에는 인덱싱된 코퍼스의 문서 ID, 기관 이름, 사업 이름이 담긴다. 이들은 로컬 파일에만(reports/traces/...) 기록되며 이 저장소의 어떤 코드 경로로도 업로드되지 않는다.
문서 ID / 엔티티가 민감한 reviewer 인계(hand-off) 상황에서는:
# mask both doc IDs and entities
python eval/run_eval.py --config eval/dev_config.yaml --redact_trace all
# mask only doc IDs
python eval/run_eval.py --config eval/dev_config.yaml --redact_trace doc_ids
마스킹은 리스트 길이를 보존한 채 각 리스트 항목을 리터럴 "<redacted>" 로 치환하므로, 구조적 형태(예: “문서 ID 두 개가 선택됨”)는 여전히 검사 가능하다. planner.readable_summary 도 함께 재작성되어 요약 문자열로 선택된 문서 ID 가 새지 않는다. run_rag_query 가 반환하는 in-memory 결과는 절대 변형되지 않으며, 마스킹은 trace 기록 경계에서만 적용된다.
eval_summary.json 은 실효 마스킹 상태를 trace_redaction 아래에 기록한다.
회귀(regression) 커버리지
tests/test_fuzzy_retrieval.py 가 다음을 강제한다:
- Schema 버전 1.
query_rewrite와planner의 필수 필드 집합(향후 PR 이 필드를 조용히 누락하지 못하도록).stage_latencies_ms키가 존재하며 숫자형일 것.redact_trace가 입력을 변형하거나 길이를 잃지 않고 리스트 필드를 마스킹할 것.