Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
ai-exam · 신입사원 AI 역량 시험과 결과 리포트
Translation pending
BusinessTypeScript · PLpgSQLGitHub @pgp217OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
신입사원 대상 AI 역량 시험 앱입니다. 응시 → 객관식 자동 채점 + 서술형 AI 1차 채점 → 담당자 확정 → 개인 리포트·관리자 결과 목록까지 다룹니다. • 설계안: docs/design.md • 교재: genai-book Ch 1~11 (GenAI Education Project, https://github.com/Zakedu/genai-book, MIT License). 교재 내용을 바탕으로 문항을 새로 썼고, 장 제목과 요인 체계를 참고했습니다. 저작권 고지: NOTICE.md • 기술: Next.js 16 + TypeScript + Tailwind, Supabase(Postgres), Claude API, Vercel 배포Read the full README ↗
신입사원 대상 AI 역량 시험 앱입니다. 응시 → 객관식 자동 채점 + 서술형 AI 1차 채점 → 담당자 확정 → 개인 리포트·관리자 결과 목록까지 다룹니다.
| 경로 | 내용 |
|---|---|
src/lib/exam/factors.ts | 상위 3 · 중위 8 · 하위 16 요인과 교재 장 |
src/lib/exam/items.ts | 공개 문항 (정답 없음, 응시 화면에서도 사용) |
src/lib/exam/answer-key.ts | 정답 키·채점 기준표 (server-only, 클라이언트에서 import 하면 빌드 실패) |
src/lib/exam/scoring.ts | 8단계 등급, 3×3 유형, 요인 점수, 자기평가 차이, 강점·약점, 복습할 장, 동기 내 상위 % |
src/lib/exam/reliability.ts | 응답 신뢰도 신호 (빠른 응답+낮은 정답률, 일렬 응답, 자기평가 무변별, 붙여넣기, 짧은 답안). 신호가 있으면 "추가 검토 필요" |
src/lib/attempt/responses.ts | 응답 검증·병합, 제출 시 객관식 채점과 응답 신뢰도 판정 |
src/lib/attempt/timing.ts | 응시 기간, 제한 시간 마감(+60초 여유), 응시 시간 계산 |
src/lib/attempt/service.ts | 응시 흐름(서버 전용): 링크 확인 → 시작 → 임시 저장 → 제출, 저장소 선택 |
src/lib/attempt/supabase-store.ts · memory-store.ts | Supabase(PostgREST) 저장소 · 개발용 메모리 저장소 |
src/app/t/[token] | 응시 화면 (안내·동의 → 응시 → 제출 완료) |
src/app/api/t/[token]/{start,responses,submit} | 응시 시작 · 임시 저장(PUT) · 제출 API |
src/lib/grading/grade.ts | 채점 프롬프트, 모델 출력 검증(인용이 응답 원문에 있는지 확인), 개발용 가짜 채점, 일치율 |
src/lib/grading/claude.ts | Claude API 호출 (claude-opus-5-5, 구조화 출력, 거절 시 서버 측 fallback) |
src/lib/grading/service.ts | AI 1차 채점 실행(제출 직후 after()), 담당자 확정, 결과 재계산 |
src/lib/admin/ | 관리자 로그인(Supabase Auth), 토큰 서명 검증(JWKS), 세션 쿠키 |
src/proxy.ts | 관리자 화면 요청 전 만료가 가까운 로그인 토큰 갱신 |
src/app/admin | 관리자 로그인, 서술형 채점 목록, 응시자별 채점 리뷰 |
src/lib/report/ | 리포트 계산(동기 분포·상위 %, 비교 인원 5명 미만이면 숨김), 결과 목록 필터 |
src/lib/feedback/ | 성장 피드백: 프롬프트, Claude 호출, 결과 확정 시 초안 생성, 담당자 승인 |
src/lib/exam/simulate.ts | 가상 응시자 생성 (결정적 난수) |
src/components/report/report.tsx | 개인 리포트 화면 (응시자·관리자 공용) |
src/app/admin/(console)/results | 결과 목록(필터), 개인 리포트 + 피드백 확인·승인 |
src/lib/exams/ | 시험 설정 검증(KST 입력, D-day), 대상자 엑셀 검증·읽기(exceljs), 안내문 치환·문자 바이트 계산, 시험 관리 서비스 |
src/app/admin/(console)/exams | 시험 목록, 새 시험, 단계별 설정(기본·응시 사이트·대상자·안내문), 양식 내려받기, 안내문 CSV |
scripts/crosscheck.py · export-scoring-config.mts | 정합성 점검: 채점 규칙을 앱과 별개로 구현해 DB 결과와 대조 |
scripts/seed-cohort.mts | 시험에 가상 동기 응시자를 넣거나(--count) 지우는(--remove) 스크립트 |
supabase/migrations/0001_init.sql | 테이블, 권한, RLS 정책 |
supabase/migrations/0002_attempt_flow.sql | 임시 저장·제출 함수(save_responses, submit_attempt), results 를 객관식만 채점된 상태로도 저장 |
supabase/migrations/0003_report_feedback.sql | results.feedback (성장 피드백 저장) |
supabase/migrations/0005_survey.sql | 응시 후 설문(attempt_surveys), 시험별 설정 exams.collect_survey, 재응시 보관본에 설문 포함 |
src/lib/survey/ · src/app/admin/(console)/surveys | 설문 문항·검증·집계, 관리자 설문 결과(문항별 평균·분포, 오류 신고, 자유 의견) |
src/lib/analysis/ · src/app/admin/(console)/analysis | 문항 분석: 객관식 정답률·변별도(교정 점이연 상관, 상하위 27% 차)·보기 분포, KR-20 신뢰도, 자기평가 분포와 과대·과소평가, 서술형 기준별 평균과 AI 일치율 |
src/lib/bi/ · src/app/admin/(console)/results/export · scripts/bi-sample.mts | BI 내보내기(응시자·역량 점수·역량 CSV, 이름·사번 없이 해시 ID), Power BI 연습용 가상 조직 데이터 docs/bi/sample/ |
src/lib/exam/items.v*.ts · answer-key.v*.data.ts | 문항 세트 버전별 문항·정답·채점 기준표. 시험은 만들 때의 item_set_version(현재 v2)으로 채점·분석된다. v2 근거: docs/item-set-v2.md |
docs/pilot.md · docs/pilot-result.md | 소규모 파일럿 운영 계획과 1차 결과(10명)·v2 수정 후보 |
supabase/migrations/0004_retake.sql | 재응시: 이전 응시 보관(attempt_archives), 대상자별 재응시 마감(candidates.retake_until), reset_attempt · clear_archive_scores 함수 |
supabase/seed/demo.sql | 데모 시험 1개 + 응시자 3명 (응시 링크용 access_token 출력) |
npm install
cp .env.example .env.local # 값 채우기
npm run dev
npm test # 단위 테스트 (Supabase 통합 테스트는 STORE_IT_* 환경 변수가 있을 때만)
Supabase 서버 키(SUPABASE_SERVICE_ROLE_KEY 또는 SUPABASE_SECRET_KEY)가 없으면 npm run dev 는 메모리 저장소로 동작합니다. 첫 화면에 데모 응시 링크(/t/demo, /t/demo2, /t/demo3)가 나오고, 서버를 다시 켜면 초기화됩니다. EXAM_STORE=memory|supabase 로 강제할 수 있고, 프로덕션에서는 키가 없으면 메모리로 넘어가지 않고 오류를 냅니다.
메모리 저장소 모드의 관리자 화면(/admin)은 데모 계정 [email protected] / demo1234 로 들어갑니다. Claude API 키가 없으면 개발 환경에서는 가짜 채점(키워드 기반, 모델명 fake-grader)으로 흐름을 시험할 수 있고, 화면에 "개발용 가짜 채점"으로 표시됩니다. AI_GRADER=claude|fake 로 강제할 수 있고, 프로덕션에서는 키가 없으면 가짜 채점으로 넘어가지 않습니다(담당자가 직접 채점해 확정할 수는 있습니다).
응시 흐름
attempts 생성(1인 1회). 제한 시간은 시작 + time_limit_min 과 응시 기간 종료 중 이른 시각입니다.attempts.reliability, results(status grading)에 저장합니다. 마감 + 60초가 지난 요청의 응답은 받지 않고, 마감 뒤 링크를 다시 열면 저장된 응답으로 자동 제출합니다.서술형 채점 흐름
after()) 서술형 3문항을 병렬로 AI 1차 채점해 ai_gradings 에 저장합니다. 이름·사번은 보내지 않고 문항·기준표·답안만 보냅니다. 답안 안의 지시는 따르지 않도록 프롬프트에 명시했습니다.results(status complete)에 저장합니다. 확정 점수를 고치면 결과도 다시 계산합니다.This is the beginning of the README. Read the rest at the original. Read the full README ↗