사용자 노출명은 AI 선배와의 만남입니다. 실존 인물의 인터뷰와 기록에서 검수된 경험 패턴을 찾아, 특정 인물을 사칭하지 않는 새로운 AI 선배의 대화로 재구성하는 교육·상담 프로젝트입니다.
현재 버전에서는 네 명의 선배가 모두 독립된 데이터 컬렉션과 대화 세션으로 활성화되어 있습니다.
| 선배 | 질문 | 상태 |
|---|---|---|
| 길을 찾는 사람 | 나는 무엇을 선택해야 할까? | 활성화 |
| 창작하는 사람 | 계속 창작할 수 있을까? | 활성화 |
| 생각하는 사람 | 어떻게 살아야 할까? | 활성화 |
| 연결하는 사람 | 사람과 기술은 어떻게 연결되는가? | 활성화 |
- 4명의 AI 선배를 만나는 선택 허브
- 버전 A 비주얼 노벨형 화면과 버전 B DM형 누적 대화 화면
- 답변을 문장 단위로 차례로 보여주고 클릭하면 즉시 전체 표시
- 모델이 생성하는 자연스러운 후속 선택지 3개와 자유 입력
Enter전송,Shift+Enter줄바꿈, 한글 조합 중 전송 방지- 브라우저 세션 저장, 대화 불러오기, 초기화, 실패한 질문 재시도
- 로컬 기록 우선 복구와 참여 ID 기반 Supabase 기기 간 동기화
- 출처를 상시 노출하지 않고
이 답변의 바탕서랍에서 확인
허브의 버전 A / 버전 B 컨트롤로 대화 화면을 바꿀 수 있습니다. 두 버전은 동일한 세션을 공유하며 선택한 화면은 브라우저에 저장됩니다. 버전 B에서는 사용자는 오른쪽, 선배는 왼쪽에 표시되고 선배 답변은 문장별 말풍선으로 이어집니다.
apps/web React + Vite + Framer Motion
└─ Cloudflare Static Assets
│ /api/*
apps/worker Cloudflare Worker
├─ same-origin API와 비밀 프록시
├─ input moderation
├─ local keyword search
├─ OpenAI Vector Store search
├─ Responses API structured output
├─ evidence ID validation
└─ output moderation
│ shared proxy secret
supabase
├─ session-api 참여 ID 해시 기반 세션 저장
├─ openai-proxy OpenAI API key와 Vector Store ID 보관
└─ Postgres private participant_sessions
packages/agents 4개 선배 설정과 공통 상담 정책
packages/rag 정규화 스키마, 로컬 검색, 검색 결과 병합
data/processed PDF에서 추출한 검수용 JSON
DB/꿈다락 AI 데이터베이스.pdf 4개 역할, 20명, 141페이지 원본 자료
Storygator 참고 자료이며 빌드에는 포함되지 않음
프로덕션은 Worker Static Assets를 사용해 웹 앱과 API를 한 도메인에서 제공합니다. 브라우저 번들 및 Cloudflare Worker에는 OpenAI 키나 Vector Store ID를 두지 않고 Supabase Secret으로 관리합니다.
- 한 장면씩 이어지는 인터랙티브 대화 구성
- 문장별 대화 호흡, 후속 대화 선택지, 자연어 자유 입력
- 구조화 응답과 파싱 실패 시 대체 장면
- 세션 복구와 절제된 화면 전환
framer-motion,lucide-react기반 UI
세계관·캐릭터 생성, 전투와 상태 수치, 음성·BGM, 로컬 모델, 성인 모드, 게임 전용 메모리 시스템은 가져오지 않았습니다.
Node.js 20 이상과 Python 3이 필요합니다.
npm install
npm run process:interview-db
npm run upload:vector-storeapps/worker/.dev.vars.example을 참고해 apps/worker/.dev.vars를 만듭니다.
OPENAI_MODEL=gpt-5.5
OPENAI_MODERATION_MODEL=omni-moderation-latest
ALLOWED_ORIGIN=http://localhost:5173
SUPABASE_FUNCTIONS_URL=https://wfyghzowxusawsztprqh.supabase.co/functions/v1
NEXTGEN_PROXY_SECRET=<Supabase와 Cloudflare에 등록한 동일한 값>두 터미널에서 실행합니다.
npm run dev:worker
npm run dev:web- Web:
http://localhost:5173 - Worker API:
http://localhost:8787 - Health check:
http://localhost:8787/api/health
웹은 기본적으로 http://localhost:8787의 Worker를 사용합니다. 다른 주소가 필요하면 빌드 전에 VITE_WORKER_URL을 설정합니다.
- 원본 PDF를
DB/에 보관합니다. npm run process:interview-db로 정규화 청크를 생성합니다.data/processed/dream-mentor.chunks.json의 인물, 에이전트, 페이지, 태그와 내용을 검수합니다.- 각 청크의
reviewStatus를 지정합니다.verified: 원 출처까지 확인되어 답변 근거로 사용 가능needs_review: 검색에는 쓰되 직접 인용이나 확정적 경험담에는 사용하지 않음excluded: 검색과 프롬프트에서 완전히 제외
npm run upload:vector-store로 현재 PDF를 OpenAI Vector Store에 업로드합니다. 같은 해시의 파일은 건너뛰고, 같은 이름의 이전 첨부는 새 인덱싱 성공 후 교체합니다.- 대표 질문으로 검색 결과,
evidenceIds, 최종 citation을 확인합니다.
direct_quote 표기만으로 원문이 검증된 것으로 간주하지 않습니다. sourceTitle, sourceUrl, verifiedAt까지 확인해야 verified로 승격합니다.
현재 자동 추출 결과는 총 194개 청크입니다.
| agentId | 인물 | 청크 |
|---|---|---|
pathfinder |
5명 | 40 |
creator |
5명 | 69 |
thinker |
5명 | 41 |
connector |
5명 | 44 |
Worker는 로컬 검색 전에 agentIds를 필터링하고, Vector Store 결과도 해당 역할의 로컬 청크와 일치할 때만 병합합니다. 따라서 다른 현자의 인물이 citation에 섞이지 않습니다.
POST /api/chat
{
"agentId": "pathfinder",
"sessionId": "browser-session-id",
"messages": [
{ "role": "user", "content": "곧 졸업인데 무엇을 준비해야 할까요?" }
]
}응답은 호환용 message와 신규 scene을 함께 반환합니다. scene에는 대화문, 감정·초상화 상태, 선택지 3개가 포함됩니다. 사용된 evidenceIds는 Worker가 실제 검색 결과와 대조한 뒤 citation으로 확정합니다.
입력 검사, 시스템 정책, 출력 검사, 안전 대체 응답의 네 단계를 적용합니다. 자해·학대·의료·법률 등 고위험 질문에서는 인물형 회고를 멈추고 안전한 안내로 전환합니다. 교육 환경에 맞지 않는 성적·폭력적·차별적 표현은 차단하거나 중립적으로 전환합니다.
이 서비스는 교육적 성찰을 돕는 도구이며 전문 의료·법률·위기 상담을 대신하지 않습니다.
npm run typecheck
npm test
npm run build
npm run test:e2e테스트는 구조화 응답 정규화, 선택지 보정, 제외 청크 필터, 로컬·Vector Store 검색 병합을 포함합니다. test:e2e는 로컬 웹과 Worker가 실행 중일 때 데스크톱·모바일 화면, 실제 응답, 선택지, 출처 서랍과 세션 복구를 검사합니다.
현재 공개 서비스: https://nextgenagent-worker.jsindustriests.workers.dev
연결된 Supabase 프로젝트는 NextGenAgent (wfyghzowxusawsztprqh, 서울 리전)입니다.
Supabase 프로젝트를 CLI로 연결하고 DB와 Edge Function을 먼저 배포합니다.
npx supabase link --project-ref <PROJECT_REF>
npx supabase db push
npx supabase secrets set --env-file supabase/.env
npx supabase functions deploy session-api
npx supabase functions deploy openai-proxyCloudflare Worker에는 Supabase Function URL과 양쪽이 공유하는 프록시 Secret만 설정한 뒤 npm run deploy를 실행합니다. 자세한 시연·배포·장애 대응 절차는 시연 및 운영 매뉴얼에 정리되어 있습니다.
GitHub Pages는 정적 프론트 대안으로만 지원합니다. 이 경우 VITE_WORKER_URL을 공개 Worker 주소로 지정하고, Worker의 ALLOWED_ORIGIN에 GitHub Pages Origin을 설정해야 합니다.
apps/web/public/assets의 네 현자는 얼굴·연령·인종을 특정하지 않는 익명 실루엣 일러스트입니다. 역할별로 길, 창작 매체, 사유의 원, 사람과 도구의 연결을 상징하는 형태와 보조색만 다르게 사용합니다. 현재는 정적 자산으로 배포되며 실시간 대화 중에는 이미지 모델을 호출하지 않습니다.