데이콘(공모전 주최) 링크 : https://dacon.io/competitions/official/236666/overview/description
공용문서 링크 :
https://www.notion.so/2fd189dee3ba80fb8e4ed264bd944ea2
깃헙 링크 :
https://github.com/0798JiHyuk/-repository
(추후 조직링크로 변경..)
실전형 보이스피싱 대응 학습을 위해, 숏폼/롱폼 훈련 결과를 자동 집계하고 주간 리포트까지 생성하는 백엔드 기능을 고도화했다.
이번 작업의 목표는 크게 두 가지였다.
1. 사용자 훈련 데이터를 끝나자마자 요약해 리포트로 제공하기
2. 롱폼 시뮬레이터 답변 품질을 높이기 위해 대화 맥락(history)을 안정적으로 전달하기
기존에는 weekly_reports 조회 API는 있었지만, 실제 리포트 생성 로직이 비어 있어 체감 가능한 피드백 경험이 약했다. 또한 롱폼 응답 생성 시 직전 맥락 반영이 제한적이라 답변 일관성이 흔들리는 문제가 있었다.
파일: src/services/reports.service.ts
기존 export const reportsService = {}; 상태에서 실제 생성 로직을 완성했다.
from_date, to_date)training_results 기준 훈련 횟수/평균 점수/정확도 집계short: training_shorts.category_codelong: training_scenarios.categoryone_line_feedbackweak_patterns[]action_guides[]weekly_reports upsert 처리 (ON CONFLICT)23503) 발생 시 top_wrong_type_code=null로 재시도하는 안전장치 추가핵심 포인트는 "집계 SQL + AI 요약 + DB upsert"를 한 사이클로 묶어, 조회 전에 데이터가 만들어지는 구조를 만든 것이다.
파일:
src/routes/trainingShort.routes.tssrc/routes/trainingLong.routes.ts숏폼/롱폼 세션 finish 시점에 generateWeeklyReport(userId, mode)를 호출하도록 연결했다.
try/catch + warn 처리즉, 사용자 경험 관점에서 "훈련 완료 -> 바로 리포트 확인" 흐름이 자연스럽게 이어지게 했다.
파일: src/routes/reports.routes.ts
/api/reports/weekly에서 다음을 개선했다.
generated_at DESC로 변경해 가장 최근 생성본을 확실히 반환[reports/weekly] request/result)REPORT_QUERY_FAILED) 반환운영 중 장애 분석을 빠르게 하려는 목적이 컸다.
파일:
src/routes/trainingLong.routes.tssrc/services/ai.service.tssrc/services/simulator.service.tsscripts/simulator_bridge.py변경 내용:
longform_messages에서 기존 대화를 조회해 history 배열로 구성aiGenerateLongformReply 및 시뮬레이터 클라이언트 계층에 history 파라미터 추가history를 시뮬레이터 메시지 컨텍스트로 재구성효과:
ai -> assistant)로 모델 입력 안정화파일:
feedback_agent.pysimulator_test_2.py주요 개선:
리포트 기능은 "조회 API"만 만들면 끝이 아니었다.
실제 생성 트리거를 사용자 행동 지점(finish)에 붙여야 데이터가 살아 움직인다.
AI 요약은 항상 실패 가능성을 전제로 설계해야 한다.
API 키 누락, 파싱 실패, DB 제약 이슈를 각각 분리해 fallback/재시도를 넣어야 운영이 안정된다.
대화형 시스템에서 문맥(history)은 품질의 핵심이다.
한 턴의 입력만 보내는 구조보다, 정돈된 대화 이력을 전달할 때 응답 품질이 확실히 좋아진다.
weekly_reports upsert/api/reports/weekly에서 최신 리포트 조회pg): 훈련 결과 집계, 주간 리포트 upsert, 조인 기반 통계 쿼리가 핵심이라 관계형 DB가 적합했다.express-session: 로그인 기반 사용자 식별(req.session.user.id)이 필요해 세션 인증 구조를 적용했다.@aws-sdk/client-s3, @aws-sdk/s3-request-presigner): 음성 파일 업로드/조회 URL을 안전하게 관리하기 위해 presigned URL 방식을 사용했다.ON CONFLICT upsert로 주간 리포트 생성의 중복/정합성 문제를 줄였다.이번 작업으로 guardian-server는 단순 훈련 제공 백엔드에서, "학습 결과를 자동으로 요약하고 다음 행동까지 제시하는 피드백 백엔드"로 한 단계 올라갔다.
다음 단계로는 리포트 정확도 개선(카테고리 정규화), 장기 추세 리포트(4주/8주), 사용자별 개인화 코칭 템플릿을 확장해볼 계획이다.