0) 이 로그가 커버하는 흐름

사용자 → 백엔드(Spring)AI서버(FastAPI) 로 요청이 들어오고, AI서버가 NDJSON 스트리밍으로 응답을 보내면 백엔드가 그걸 받아 SSE로 프론트에 전달합니다. STREAMING_API_GUIDE


1) 요청 메타(백엔드 → AI서버로 보낸 실제 형태 예시)

운영에서는 이 request_id 하나로 “이 턴이 어디서 느렸는지/어디서 실패했는지”를 끝까지 따라갑니다.

request_id는 “중복 방지/재시도용 키”입니다. STREAMING_API_GUIDE

항목 값(예시) 설명
request_id abc-123 이 턴을 식별하는 ID (재시도/중복방지에도 사용)
STREAMING_API_GUIDE
endpoint POST /ai/chat/stream AI 스트리밍 채팅 API
STREAMING_API_GUIDE
user_message 연차휴가 규정이 어떻게 되나요? 사용자 질문
STREAMING_API_GUIDE
role employee 사용자 역할(기본 employee)
STREAMING_API_GUIDE
session_id sess-uuid-001 채팅 세션 ID(선택)
STREAMING_API_GUIDE
metadata.department 개발팀 부서 등 추가 정보(선택)
STREAMING_API_GUIDE

2) AI서버 내부(RAG) 디버그 로그 4줄로 “검색이 잘 됐는지” 추적

아래 4줄이 한 턴(=request_id 1개) 에 대해 남습니다. (DEBUG_RAG 켰을 때)DEVELOPMENT_REPORT_PHASE41

[DEBUG_RAG] {"ts":"2025-01-15T10:30:00.123","event":"route","request_id":"abc-123","user_message":"연차 관련해서 알려줘","intent":"POLICY_QA","domain":"POLICY","tool":"RAG_INTERNAL","reason":"rule-based: IntentService"}
[DEBUG_RAG] {"ts":"2025-01-15T10:30:00.125","event":"retrieval_target","request_id":"abc-123","collection":"ragflow_chunks","partition":null,"filter_expr":null,"top_k":5,"domain":"POLICY"}
[DEBUG_RAG] {"ts":"2025-01-15T10:30:00.130","event":"final_query","request_id":"abc-123","original_query":"연차 관련해서 알려줘","rewritten_query":null,"keywords":null}
[DEBUG_RAG] {"ts":"2025-01-15T10:30:00.500","event":"retrieval_top5","request_id":"abc-123","count":3,"results":[{"doc_title":"연차휴가 관리 규정","chunk_id":"doc-001","score":0.85}]}

DEVELOPMENT_REPORT_PHASE41

민감정보 보호 방식(로그에 남기는 범위 제한)


3) AI서버 → 백엔드 스트리밍(NDJSON) 로그 예시

백엔드는 줄(\n) 단위로 JSON을 파싱해서, 프론트로는 SSE로 흘려보냅니다. STREAMING_API_GUIDE

{"type":"meta","request_id":"abc-123","model":"gpt-4o-mini","timestamp":"2025-01-01T10:00:00.000000"}
{"type":"token","text":"안"}
{"type":"token","text":"녕"}
{"type":"token","text":"하"}
...
{"type":"done","finish_reason":"stop","total_tokens":18,"elapsed_ms":1234,"ttfb_ms":150}