Skip to content

Latest commit

 

History

History
56 lines (37 loc) · 6.3 KB

File metadata and controls

56 lines (37 loc) · 6.3 KB

AI 활용 기록

개발 과정

GPT-5.6 Codex를 다음 작업에 활용했습니다.

  • 결정론 사고 상태 머신과 콤보 판정 설계
  • Next.js/React/Phaser UI 통합과 클릭 조작 구현
  • Fastify 요청 검증, timeout, 폴백과 테스트 작성
  • 픽셀 그래픽 제작 보조, 시각 QA, README와 배포 문서 작성

최종 코드는 자동 테스트와 브라우저 플레이로 검증하며, 저장소의 코드와 데이터가 게임 규칙의 기준입니다.

게임 실행 중 AI

  • 모델 기본값: gpt-5.6-luna
  • API: OpenAI Responses API
  • 목적: NPC·구조 로봇의 한국어 대사, 로봇 도착 현장의 안전 상식 퀴즈, 본부 AI 폭탄 해체 무전, 웨이브 전환·결과 화면의 마을 뉴스와 주민 인터뷰 생성
  • 대사 출력: { "dialogue": "..." } 한 필드, 최대 160자
  • 퀴즈 출력: 질문, a/b/c 보기 3개, 정답 ID, 180자 이하 해설을 담은 strict JSON schema
  • 뉴스 출력: 제목, 짧은 기사, 지정 주민의 인터뷰 한 문장을 담은 strict JSON schema. edition=stage는 완료 웨이브의 중간 속보, edition=final은 전체 작전 결과로 분리합니다.
  • 폭탄 무전 출력: 정답 색을 비유하는 140자 이하 hint 한 필드 strict JSON schema
  • timeout: 최대 5초, 재시도 없음
  • 저장: API 요청의 store: false

지도 NPC는 이름·직업·성격 특성, 웨이브, 남은 시간, 마을 보존율, 해결 사고 수, 현재 선택 사고와 이전 대사 목록을 프롬프트로 전달합니다. NPC를 클릭할 때마다 생성형 AI를 새로 호출하며, 이전 대사와 문장 또는 의미가 겹치는 응답은 OCI·Vercel·브라우저에서 다시 검사해 채택하지 않습니다. 시스템 지시는 캐릭터 말투를 유지한 1~2문장, 새 사고·임무·보상·규칙·선택지 생성 금지, 마크다운 없이 120자 이하를 요구합니다. 기존 선택형 이벤트는 화자, 성격, 상황 ID, 사실과 미리 정의된 선택지 ID를 전달하며 최대 160자로 제한합니다.

안전 퀴즈는 로봇이 사고 좌표에 도착한 뒤 현재 사고 ID·유형·위험도, 선택 행동과 담당 로봇, 누적 문제 순서, 무작위 변형값과 최근 질문 48개를 전달합니다. 질문 이력과 순서는 브라우저 로컬 저장소에 보존되어 같은 탭의 재출동이나 페이지 새로고침 뒤에도 초기화되지 않습니다. 13번은 초급, 47번은 중급, 8번 이후는 고급으로 올라가며 현재 웨이브보다 낮은 난이도로 내려가지 않습니다. 최초 대응·숨은 위험·안전 순서·보호 준비·대피·현장 보고·사후 확인·우선순위의 8개 관점을 순환하고, 모델에는 이전 질문과 핵심 위험·정답 원칙까지 겹치지 않는 새 문제를 요구합니다. 서버와 브라우저는 문자 정규화와 2글자 유사도까지 검사하며, 첫 생성물이 중복이거나 잘못되면 OpenAI에서 한 번 더 생성한 뒤에도 실패할 경우 미사용 관점의 로컬 문제로 대체합니다.

폭탄 해체 정답은 AI 호출 전에 lib/bomb-defusal.ts가 게임 시드와 시도 횟수로 빨강·파랑 중 하나를 결정합니다. /api/bomb-hint는 정답 색·시도 횟수·위험도만 전달하며, 시스템 지시는 가족용 가상 퍼즐임을 명시하고 현실 폭발물의 구조·부품·해체 절차 설명을 금지합니다. 모델은 정답 색을 직접 말하지 않고 한 가지 색 비유로만 짧은 본부 무전을 작성합니다. Vercel과 OCI가 입력 enum, 출력 길이와 마크다운을 검증하고 실패하면 같은 정답에 맞는 로컬 무전을 사용합니다.

작전이 끝나면 결정론 엔진이 확정한 승패, 종료 이유, 등급, 점수, 보존율, 구조 인원, 해결·미해결 사고, 콤보, 남은 시간과 행동 수를 /api/news에 전달합니다. 인터뷰 대상은 결과에 따라 주민 4명 중 한 명으로 미리 선택하며 이름·직업·성격 역시 서버가 허용한 값과 정확히 일치해야 합니다. 모델은 주어진 사실만 사용해 마을 신문 제목·기사·해당 주민의 한 문장 인터뷰를 작성하고, 원인·인명 피해·날짜처럼 입력에 없는 사실을 만들 수 없습니다. OCI 응답과 브라우저 표시 전 양쪽에서 구조와 길이를 검증하며 실패하면 동일한 실제 기록을 사용한 로컬판 기사가 열립니다.

AI가 하지 않는 일

LLM은 다음을 결정하지 않습니다.

  • 사고 상태와 확산 타이머
  • 로봇 이동·작업 시간
  • 기존 대화 이벤트의 선택지 생성과 선택 결과
  • 콤보, 점수, 등급, 성공과 실패
  • 결과 뉴스에 표시할 작전 수치와 인터뷰 대상
  • 옥상 고양이의 이동·추락 시점, BUDDY 위치와 쿠션 충돌 판정
  • 폭탄 미니게임의 정답 전선, 클릭 판정, 점수와 성공·실패

이 항목은 모두 lib/rescue-engine.ts의 결정론 규칙이 계산합니다. AI는 안전 문제와 정답 ID를 생성하지만, 플레이어 선택 비교와 임무 완료 여부는 엔진이 처리합니다. NPC별 순환 대사, 사고·행동별 정적 문제와 결과별 로컬 기사를 준비했으며 OCI/OpenAI가 없거나 timeout·오류·잘못된 응답이 발생해도 게임을 끝까지 진행합니다.

키와 개인정보

브라우저는 OpenAI를 직접 호출하지 않습니다. OpenAI 키는 OCI VM의 저장소 밖 환경파일에만 두고, Vercel과 OCI 사이에는 별도 32바이트 이상 공유 토큰을 사용합니다. 원문 대사 요청, 키와 토큰은 감사 로그에 남기지 않습니다.

그래픽과 오픈소스

캐릭터, 맵, UI, 효과, 로고는 프로젝트용 오리지널 에셋이며 생성 과정에서 AI 이미지 제작 보조를 사용했습니다. BGM과 효과음도 프로젝트용 오리지널 음형을 코드로 작성해 Web Audio로 합성하므로 외부 음원이나 샘플을 포함하지 않습니다. 프레임워크와 라이브러리는 package.json, backend/package.json과 lockfile에 버전이 고정돼 있고 각 배포 패키지의 오픈소스 라이선스를 따릅니다.

공식 모델과 API 선택 근거: OpenAI 모델 목록, GPT-5.6 모델 가이드