⛏️ Forge 서버 · 반응형 실시간 AI 캐릭터

사람처럼 행동하는
마인크래프트 AI 봇

딥시크 LLM을 뇌로, mineflayer를 몸으로. 실제로 걷고, 보고, 대화하고, 상황에 맞게 행동하는 실시간 AI 캐릭터 설계 문서.

mineflayer봇의 몸 (걷기/채팅/상호작용)
DeepSeek봇의 뇌 (대화+행동 결정)
SQLite자기교정 기억
Node.js 20+브레인 판단 루프
01

개요

Project Overview

마인크래프트 서버(포지/Forge)에서 사람처럼 행동하는 실시간 AI 캐릭터를 만든다. 강화학습 대신 경량 자기교정 루프로 행동을 점진적으로 개선한다.

🚶

실제 움직임

가짜 플레이어로 접속하여 걷고, 점프하고, 바라보고, 블록과 상호작용한다.

💬

자연스러운 대화

플레이어 채팅에 맥락에 맞게 한국어로 반응한다.

🧠

딥시크 브레인

딥시크 LLM이 상황을 판단해 대화+행동을 한 번에 결정한다.

🎯

자기교정 학습

성공/실패를 기억해 다음 행동을 더 똑똑하게 선택한다.

02

시스템 아키텍처

System Architecture

Forge 서버 모드가 아니라 별도 봇 클라이언트가 가짜 플레이어로 접속한다. 서버는 기존 포지/바닐라 서버 그대로 사용.

⛏️ 마인크래프트 포지 서버
가짜 플레이어로 접속 · 온라인/오프라인 서버
🚶 mineflayer 봇 클라이언트
몸 · 걷기/채팅/상호작용/감각 수집
⚙️ Node.js 봇 브레인
판단 루프 · 관찰→결정→행동→피드백
🧠 DeepSeek API
뇌 · 대화 + 행동 의사결정 (JSON)
🗄️ SQLite 메모리 DB
성공/실패 축적 → 행동 개선
📦

main.js

엔트리 · 봇 구동 + 루프 시작 + 종료 처리

src/main.js
🧠

brain/

deepseek.js (API 호출+파싱) · memory.js (자기교정 DB) · loop.js (판단 루프 심장)

brain/deepseek brain/memory brain/loop
🚶

body & perception

mcBody.js (mineflayer 래퍼) · world.js (주변 상황 텍스트 요약)

body/mcBody perception/world
03

동작 루프

Perceive → Decide → Act → Learn

매 사이클마다 4단계를 반복한다. 이게 봇의 "사람 같은 실시간 반응"의 핵심.

STEP 1

관찰 Perceive

주변 플레이어·시간·좌표·채팅·체력을 수집해 "텍스트 상황 요약"으로 변환. (world.js)

STEP 2

결정 Decide

[상황+대화+자기교정 힌트]를 딥시크에 전송 → JSON 응답 획득.

STEP 3

실행 Act

action을 게임 조작으로 변환. 이동·채팅·바라보기 실행. (mcBody)

STEP 4

학습 Learn

행동 결과를 memory.js에 기록. 성공 가중치 ↑, 실패 ↓. 다음 결정에 반영.

response (딥시크 JSON)
// 딥시크가 매 사이클 반환하는 JSON
{
  "speech": "안녕! 같이 놀래?",
  "action": "move_toward",
  "params": { "target": "player1" },
  "thought": "플레이어가 가까이 와서 다가가 반기자"
}
04

행동 카탈로그

Action Catalog v1

딥시크가 고를 수 있는 9가지 행동. 각 행동은 지속시간 제한(timeout)이 있어 무한 루프를 방지한다.

idle

가만히 있기

params: {}
chat

말만 하기

params: { text }
move_toward

특정 플레이어에게 이동

params: { target }
look_at

특정 대상을 바라보기

params: { target }
avoid

대상을 피해 멀어지기

params: { target }
wander

근처 랜덤 배회

params: { radius }
collect_drop

주변 아이템 줍기

params: {}
follow_player

일정 거리 따라다니기

params: { target, distance }
go_home

스폰 지점 복귀

params: {}
05

딥시크 연동

DeepSeek Integration

🔗

연결 정보

  • 엔드포인트 · https://api.deepseek.com/chat/completions
  • 모델 · deepseek-v4-flash (저렴·빠름)
  • 인증 · Bearer $DEEPSEEK_API_KEY
  • 형식 · OpenAI 호환
🔄

두 가지 호출 모드

대화 모드 — 플레이어가 채팅하면 자연스러운 답변+행동.

자율 행동 모드 — 아무도 안 말 걸면 스스로 상황 보고 행동 결정(배회·관찰).

두 경우 모두 응답을 JSON으로 고정해 파싱을 쉽게 한다.

POST /chat/completions
{
  "model": "deepseek-v4-flash",
  "messages": [
    { "role": "system", "content": "너는 마인크래프트 서버에 사는 AI 캐릭터다... 반드시 JSON만 출력한다." },
    { "role": "user",   "content": "상황: 밤, 플레이어 '철수'가 20블록 앞에 있음\n철수: \"같이 놀자\"" }
  ],
  "temperature": 0.8
}
06

자기교정 루프

Self-Correction · 강화학습 대체

진짜 강화학습은 GPU 학습 팜이 필요해 비현실적. 대신 경량 자기교정(기억 강화)으로 대체한다. 같은 상황이 오면 이전에 잘 통했던 행동을 우선 선택.

🎓
결정 우선순위
  • ① 명시적 요청 (플레이어가 봇 이름을 부름)
  • ② 위험 감지 (밤+몹 근접, 낙하) → 회피 강제
  • ③ 자기교정 힌트: 같은 context_key의 confidence 최고치 행동 우선 (단, input_count ≥ 3)
  • ④ 그 외에는 딥시크 자유 결정 → 탐험·활용의 균형
confidence 시뮬레이션
// 성공: +0.1 (최대 1.0) / 실패: -0.2 (최소 0.0)
action: "move_toward"  // 야간+플레이어 근접 상황
success  ×12  → confidence 0.92  ✅
fail     ×3   → confidence 0.32  ⚠️
시간 감쇠 (Decay)

오래된 메모리는 confidence를 절반으로 감쇠시켜, 옛날 지식이 불필요하게 우세해지는 걸 막는다.

📊

행동별 신뢰도 (사례)

move_toward
0.92
input 31
wander
0.74
input 18
look_at
0.61
input 12
avoid
0.32
input 4 (실패↑)
collect_drop
0.46
신규

신뢰 기준: input_count ≥ 3 && confidence ≥ 0.6 → 이때만 메모리가 결정을 주도.

자기교정 알고리즘 (의사코드)
function decide():
  if requested : return act(requested)
  if danger    : return act('avoid')
  hit = bestMemory(context_key())          // confidence 최고치 + input_count≥3
  if hit : return act(hit.action)
  else  : return act(deepseekDecide())   // 탐험

function feedback(result):
  row = find(action, context_key())
  row.confidence += (result.success ? +0.1 : -0.2)
  row.input_count += 1
  decayOlderMemories()                      // 오래된 기억 confidence 절반화
07

데이터베이스

SQLite Schema

🧩

memories

자기교정 메모리. action + context_key + confidence + input_count

idactioncontext_keyoutcomeconfidenceinput_countnoteupdated_at
💬

dialog_history

대화 컨텍스트. 봇과 플레이어 간 대화 보존

speakerrolecontentts
📜

events

행동 실행 로그. 디버깅/통계용

typepayloadts
memories.sql
CREATE TABLE IF NOT EXISTS memories (
  id          INTEGER PRIMARY KEY AUTOINCREMENT,
  action      TEXT NOT NULL,
  context_key TEXT NOT NULL,
  outcome     TEXT NOT NULL,
  confidence  REAL    NOT NULL DEFAULT 0.5,
  input_count INTEGER NOT NULL DEFAULT 0,
  note        TEXT,
  updated_at  TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_mem_context ON memories(context_key);
08

설정

.env Configuration

기본값설명
MC_HOST(필수)서버 주소
MC_PORT25565서버 포트
MC_USERNAME(필수)봇 닉네임
MC_AUTHofflineoffline | microsoft
DEEPSEEK_API_KEY(필수)딥시크 키
DEEPSEEK_MODELdeepseek-v4-flash모델
DEEPSEEK_BASE_URLhttps://api.deepseek.com엔드포인트
AI_TEMPERATURE0.8창의성
LOOP_INTERVAL_MS5000판단 사이클 주기
ACTION_TIMEOUT_MS30000행동 최대 실행시간
HUMAN_DELAY_MS600사람 같은 딜레이
DB_PATH./data/brain.dbSQLite 경로
DB_BACKUP1시작 시 백업 여부
AUTO_RECONNECTtrue연결 끊김 재시도
MAX_DIALOG_HISTORY20대화 최대 보존 개수
BOT_FAMILIARITYtrue봇 이름 부를 때만 응답할지
09

오류 처리 및 복원

Error Recovery

오류 시나리오처리 전략
딥시크 API 실패/타임아웃재시도 3회(지수백오프) → 실패 시 기본 배회/idle 후 다음 사이클
JSON 파싱 실패응답에서 {...} 추출 재시도 → 안 되면 fallback JSON
action 미지원로그 기록 후 idle 처리
pathfinder 목적지 도달 실패타임아웃 후 실패 피드백
서버 연결 끊김대기 후 재연결(AUTO_RECONNECT), 연속 실패 시 종료
채팅 256자 초과잘라서 분할 전송 또는 말 줄임
기타 예외전역 try/catch → 이벤트 로그 + 안전한 idle
10

구현 계획

Implementation Roadmap

설계문서 작성

아키텍처·프로토콜·자기교정 알고리즘·스키마 확정

package.json + .env

의존성, 설정 로드, .env.example

brain/deepseek.js

딥시크 호출/JSON 파싱/재시도/fallback

brain/memory.js

SQLite 3개 테이블 + 자기교정 로직 + 단위테스트

body/mcBody.js

mineflayer 접속/이동/채팅/인식

perception/world.js

상황 요약 텍스트 생성

brain/loop.js

관찰→결정→행동→피드백 통합 루프

main.js

엔트리, 부팅 순서, 종료 처리

통합 테스트

오프라인 서버로 접속·채팅·이동 검증

⚠️

제한사항

  • 별도 프로세스라 서버 내부 상태를 완전히 통제 못함
  • 시야는 렌더 거리(~32블록)로 제한
  • AntiCheat 있으면 부자연스러운 움직임 감지됨
  • 온라인 검증 서버는 정품 계정 필요
  • 딥시크 API 비용 발생 (flash로 최소화)
🚀

이후 확장

  • 서버 로그 연동 → 멀리 있는 사건도 습득
  • 봇 프로필(성격) 시스템
  • WebUI 대시보드 (기존 express 통합)
  • 다국어 지원 · 음성 채팅
✔️
핵심 검증 포인트
  • 플레이어 "안녕" 채팅 → 봇 자연스럽게 답변
  • 다가가면 따라오거나 바라보기
  • 밤이 되면 위험 회피
  • 같은 상황 반복 시 confidence 증가 → 결정 안정화 (자기교정 동작 확인)