사용자 → 백엔드(Spring) → AI서버(FastAPI) 로 요청이 들어오고, AI서버가 NDJSON 스트리밍으로 응답을 보내면 백엔드가 그걸 받아 SSE로 프론트에 전달합니다. STREAMING_API_GUIDE
운영에서는 이 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 |
아래 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
✅ 민감정보 보호 방식(로그에 남기는 범위 제한)
백엔드는 줄(\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}