"""피드백 통계 섹션. 사용자 검증 현황 (Human-in-the-Loop). """ import pandas as pd import streamlit as st from core.utils import get_feedback_reason_label, get_feedback_type_emoji def render_feedback_stats(feedback_stats: dict): """피드백 통계 섹션 렌더링.""" if not feedback_stats or feedback_stats.get("total_feedback", 0) == 0: return with st.expander("📝 **피드백 분석** - 사용자 검증 현황", expanded=False): fb_total = feedback_stats.get("total_feedback", 0) fb_correct = feedback_stats.get("correct_count", 0) fb_wrong = feedback_stats.get("wrong_count", 0) fb_ambiguous = feedback_stats.get("ambiguous_count", 0) accuracy = feedback_stats.get("accuracy_rate", 0) fb_col1, fb_col2, fb_col3, fb_col4, fb_col5 = st.columns(5) with fb_col1: st.metric(label="총 피드백", value=f"{fb_total}건", help="사용자가 제출한 총 피드백 수") with fb_col2: st.metric( label="👍 정확", value=f"{fb_correct}건", delta=f"{fb_correct/fb_total*100:.0f}%" if fb_total > 0 else None, delta_color="normal", help="정확하다고 평가된 분석 수", ) with fb_col3: st.metric( label="👎 오류", value=f"{fb_wrong}건", delta=f"{fb_wrong/fb_total*100:.0f}%" if fb_total > 0 else None, delta_color="inverse", help="틀렸다고 평가된 분석 수", ) with fb_col4: st.metric(label="🤔 애매", value=f"{fb_ambiguous}건", help="판단하기 어려운 경우") with fb_col5: st.metric(label="정확도", value=f"{accuracy:.1f}%", help="correct / (correct + wrong) x 100") wrong_reasons = feedback_stats.get("wrong_reasons", {}) if wrong_reasons: st.markdown("##### 오류 원인 분포") reason_df = pd.DataFrame([ {"원인": get_feedback_reason_label(k), "건수": v} for k, v in wrong_reasons.items() ]).sort_values("건수", ascending=False) st.dataframe(reason_df, use_container_width=True, hide_index=True) recent_feedback = feedback_stats.get("recent_feedback", []) if recent_feedback: st.markdown("##### 최근 피드백 (10건)") recent_df = pd.DataFrame([ { "Answer ID": fb.get("answer_id"), "유형": get_feedback_type_emoji(fb.get("feedback_type", "")), "원인": get_feedback_reason_label(fb.get("wrong_reason")) if fb.get("wrong_reason") else "-", "코멘트": fb.get("comment", "-")[:50] + "..." if fb.get("comment") and len(fb.get("comment", "")) > 50 else fb.get("comment", "-"), "시간": fb.get("created_at", "")[:16].replace("T", " ") if fb.get("created_at") else "-", } for fb in recent_feedback ]) st.dataframe(recent_df, use_container_width=True, hide_index=True)