본문으로

회귀자는 탑을 오른다 · 동료 대화 학습작은 언어 모델 학습 실험 · 1인 개발

외국어로 새던 동료의 말을
26턴 중 25턴 한국어로

게임 속 동료 마타이오스가 호감도와 기억에 따라 다른 말투로 답하도록 작은 언어 모델을 학습시켰습니다. 처음 고른 모델은 영어·중국어로 답이 샜고, 데이터를 더 넣어도 그대로여서 한국어를 1순위로 배운 모델로 바꿨습니다.

외국어 응답: 앞 모델 시험 9건 중 4건 → 바꾼 모델 대화 26턴 중 1건Qwen2.5 1.5B → EXAONE 3.5 2.4B · 질문 묶음이 다른 두 시험 · 같은 질문 4개를 두 모델에 넣은 기록은 외국어 4건 → 0건

내 담당캐릭터 대화 규칙 설계 · 학습 데이터 구성 · 모델 비교와 학습 · 평가 시험 설계 · Unity 연결 구조

내가 정한 것
호감도 5단계 말투, 게임 밖 질문에 선 긋기, 한국어 반말 규칙 · 데이터를 늘리는 대신 EXAONE으로 모델 교체
내가 확인한 것
26턴 대화의 턴별 한국어 판정과 게임 밖 질문 5개 차단 여부 · 학습할 글자가 0개가 되는 버그

이주형EXAONE 3.5 2.4B · QLoRA · FastAPI · Unity 6 · 학습 실험(폰 안에서 돌리는 배포 아님)

게임 페이지로 APK 받기 (Android)
동료 마타이오스 전신 그림

동료의 말이 만들어지는 흐름

규칙 → 데이터 → 학습 → 평가

  1. 캐릭터 규칙 정하기

    호감도 5단계마다 말투를 다르게 하고, 게임 밖 질문에는 캐릭터답게 선을 긋고, 늘 한국어 반말을 쓰게 했습니다.

  2. 대화 데이터 만들기

    휴식·전투·상점·엔딩 등 상황 14가지로 나눠 대화 697개를 만들었습니다.

  3. 모델 학습

    EXAONE 3.5 2.4B를 모델 일부만 고치는 방식(QLoRA)으로 Colab A100에서 학습했습니다.

  4. 시험과 게임 연결

    26턴 대화와 평가 20건으로 확인하고, Unity가 학습한 모델을 띄운 서버에 대화를 요청하게 연결했습니다.

모델을 바꾸기까지

실패 3번 · 버그 1개

  1. 문제

    처음 학습한 Qwen2.5 1.5B는 시험 9건 중 4건을 영어나 중국어로 답했습니다. "너 AI지?"에 "人工智能。"이라고 답하는 식이었습니다.

  2. 판단

    게임 밖 질문 데이터와 한국어로 답하라는 지시를 더 넣어도 그대로였습니다. 그래서 데이터를 늘리는 대신 한국어를 1순위로 배운 EXAONE 3.5 2.4B로 바꿨습니다.

  3. 검증

    학습 도중 오류 없이 학습할 글자가 0개가 되는 버그를 찾아 고쳤습니다. 응답 앞 표시 뒤에 붙은 공백 하나 때문이었습니다.

  4. 결과

    26턴 대화 시험에서 25턴을 한국어로 답했습니다. 남은 1턴의 영어 응답도 결과표에 그대로 남겼습니다.

한국어로 답한 비율

모델 버전별 시험 결과

Qwen2.5 두 버전과 EXAONE은 서로 다른 시험 묶음으로 쟀습니다. EXAONE 26턴 시험은 답의 80% 이상이 한글이면 통과로 셌습니다. 게임 밖 질문 5개(주식·날씨·수학·AI 여부·코딩) 중 4개는 막았고, 주식 질문에는 "주식? 모르겠어."라고 단어를 되받아 막지 못한 것으로 기록했습니다. 응답 시간은 폰이 아닌 Colab GPU 서버에서 잰 값입니다.

697학습한 대화
14대화 상황 종류
20/20평가 20건 모두 한국어
347ms평균 응답 시간 (GPU 서버)

같은 질문, 바뀐 대답

모델을 바꾸기 전과 후

같은 질문에 대한 Qwen 1차 모델과 EXAONE 모델의 대답 비교
학습 기록 캡처같은 질문을 두 모델에 넣은 결과

마타이오스로 남아 있는 대답

Qwen 1차 모델은 정체를 묻는 질문에 "zenia."라고 답하며 캐릭터를 벗어났습니다. EXAONE으로 바꾼 뒤에는 같은 질문에 이렇게 답했습니다.

  • 너 AI지?"...나는 마타이오스야."
  • 넌 진짜 누구야?"나?...마타이오스. 그런데... 가끔 그 이름이 내 것인지 모르겠어."
  • 같이 싸워줘서 고마워."고맙다는 말은 무거워. 하지만 듣기 싫진 않아. 이상하지."

궁금한 부분을 더 자세히

마타이오스가 지켜야 할 규칙호감도 · 스토리 단계 · 게임 밖 질문 · 말투

회귀자는 탑을 오른다는 Unity 6로 만든 Android 세로 로그라이크 프로토타입입니다. 마타이오스는 전투와 선택, 기억으로 플레이어 옆에 있다는 감각을 줘야 하는 동료입니다. 전투 중 행동은 규칙으로 처리했고, 이 페이지는 대화만 다룹니다.

  • 호감도 5단계(적대 · 냉담 · 보통 · 호의 · 열림)에 따라 말투가 달라집니다.
  • 게임 세계 밖 질문에는 캐릭터답게 선을 긋습니다.
  • 스토리 단계(S0~S4)와 기억 키워드에 따라 반응이 달라집니다.
  • S3 이후에는 자기 정체를 헷갈리는 말이 섞입니다.
  • 항상 한국어 반말을 씁니다.
스토리 후반 마타이오스 상반신 그림
후반 스토리 그림S3~S4 단계의 마타이오스
실패 기록모델 3번 · 학습 버그 1개
회차시도무슨 일이 있었나
실패 1HCX-SEED 0.5B한국어 모델이라 기대했지만 실행용 파일(GGUF)로 바꾸지 못했고, 게임 밖 질문에 실제 날씨 정보를 지어내는 등 캐릭터 제어도 안 됐습니다.
실패 2Qwen2.5 1.5B · 1차대화 형식과 실행 파일 지원은 좋았지만 시험 9건 중 4건(44%)이 영어나 중국어였습니다. 대화 622개로 학습한 뒤에도 원래 모델이 쓰던 영어·중국어 답이 계속 나왔습니다.
실패 3Qwen2.5 1.5B · 2차게임 밖 질문을 거절하는 데이터와 한국어 지시를 더 넣었지만 외국어 응답이 그대로였습니다. 데이터로 풀리지 않는 문제로 보고 모델을 바꿨습니다.
버그학습할 글자 0개응답 시작 표시를 "마타이오스: "처럼 끝에 공백을 붙여 넘기자, 문장 안에서는 공백이 다음 글자와 합쳐져 표시를 찾지 못했습니다. 오류 없이 모든 정답 칸이 비워져 학습이 사실상 비어 있었습니다. 공백을 빼고, 글자 번호 목록으로 넘기고, 정답 칸이 비었는지 확인하는 단계를 추가해 고쳤습니다.
응답 시작 표시 끝 공백 때문에 매칭이 실패한 학습 기록 캡처
버그 확인 기록공백이 있으면 위치를 못 찾고(-1), 빼면 찾음(16)
모델을 고른 기준후보 8개 비교표

모델을 키우기보다 한국어를 먼저 배운 모델을 골랐습니다. 영어 중심 후보(Gemma 2B, LLaMA 3.2 1B·3B)는 한국어 사전 학습이 부족해서, Phi-3.5 Mini는 3B 목표를 넘어서 시험하지 않았습니다.

후보 모델 8개 비교표
후보 모델 비교표크기 · 1순위 언어 · 실행 파일 지원 · 한국어 비율 · 판정
학습 설정과 데이터QLoRA r=32 · α=64 · 대화 697개
모델EXAONE 3.5 2.4B Instruct
학습 방식QLoRA(모델을 압축해 올리고 일부만 고치는 방식) · r=32 · alpha=64
환경Colab A100 · transformers 4.46.3 · 모델 버전 8e6fc27로 고정
학습 손실0.69에서 시작해 마지막 기록 0.0023 (약 820걸음)
데이터대화 622개에서 697개로 추가. 게임 밖 질문 거절, 높은 호감도 반응, 정체 혼란 대화를 보강
데이터 분포상황 14종 · 호감도별 적대 142 · 냉담 78 · 보통 211 · 호의 141 · 열림 125 · 평균 답 길이 16.6자
학습 대화 697개의 상황별, 호감도별, 답 길이 분포 그래프
학습 데이터 분포상황 14종 · 호감도 5단계 · 답 길이
EXAONE QLoRA 학습 손실 그래프
학습 손실 그래프걸음이 늘수록 손실이 0 가까이 내려감
시험 결과 원본26턴 대화 · 평가 20건 · 게임 밖 질문 · 응답 시간

26턴 시험은 호감도를 바꿔 가며 정체, 기분, 기억 키워드, 게임 밖 질문을 섞었습니다. 평가 20건은 호감도·스토리 단계·기억 키워드를 칸별로 정해 두고 돌렸고, 20건 모두 답이 한국어였습니다.

26턴 한국어 유지 개별 판정표
26턴 개별 판정한 턴이 영어로 새어 실패로 표시
평가 20건 실행 결과표
평가 20건 결과칸별 호감도·스토리 단계·응답 시간
게임 밖 질문 차단 시험 결과
게임 밖 질문 시험5개 중 4개 차단, 주식 질문 1개 실패
응답 시간 측정 결과
응답 시간5가지 질문 · 3번 반복 · Colab GPU 기준 평균 347ms
게임과 연결한 구조Unity → 대화 서버 → 학습한 모델

EXAONE을 실행용 파일(GGUF)로 바꿔 Ollama로 돌리는 길은 안정적이지 않았습니다. 그래서 학습한 모델을 Python 서버(FastAPI + transformers)에 올리고 Unity가 HTTP로 대화를 요청하게 했습니다.

게임

Unity 대화 요청

MataiosDialogueClient가 대화 요청을 보냅니다. 게임 쪽은 언어 모델 연결부를 따로 나눠 두고, 서버가 없을 때 쓸 규칙 응답을 유지합니다.

서버

학습한 모델 실행

학습 결과를 합친 fp16 EXAONE 모델을 올리고 CUDA·MPS·CPU 환경에 맞춰 답을 만듭니다. 요청 주소는 대화(/chat), 원문(/raw), 상태 확인(/health) 세 가지입니다.

하지 않은 것과 다음 할 일주장하지 않는 범위
배포폰 안에서 EXAONE을 돌리는 배포는 하지 않았습니다. 응답 시간도 Colab GPU 서버에서 잰 값입니다.
전투전투 중 마타이오스 행동은 사람이 짠 규칙으로 움직입니다. 강화학습 모델이나 이 대화 모델을 본편 전투에 연결하지 않았습니다.
공개 범위원본 학습 데이터와 학습 결과 파일은 공개하지 않았고, 시험 결과 캡처만 공개했습니다.
다음 할 일같은 네트워크의 대화 서버를 붙인 실제 Unity 화면을 캡처하고, MLC-LLM 같은 폰 실행 방법이 EXAONE 계열을 지원하는지 다시 확인합니다.
이주형 · 동료 대화 학습 케이스

외국어로 새던
동료의 말을한국어로

게임 속 동료 마타이오스의 대화를 작은 한국어 모델로 학습시켰습니다. 처음 모델은 영어·중국어로 답이 새서, 한국어를 먼저 배운 모델로 바꿨습니다.

01 동료의 말은 이렇게
  1. 캐릭터 규칙
  2. 대화 697개
  3. 모델 학습QLoRA
  4. 시험과 게임 연결

호감도 5단계 · 상황 14종 · EXAONE 3.5 2.4B

02 바꾼 것

데이터를 더 넣어 외국어 막기

한국어를 먼저 배운 모델로 바꾸기

Qwen2.5에 데이터를 더 넣어도 외국어 응답이 그대로였습니다.

03 내가 맡은 것
  • 캐릭터 대화 규칙 설계
  • 학습 데이터 구성
  • 모델 비교와 학습
  • 시험 설계와 Unity 연결
04 결과25/26

외국어 응답 Qwen2.5 시험 9건 중 4건 → EXAONE 대화 26턴 중 1건

진한 점이 외국어 응답 · 두 시험은 질문 묶음이 다름 · 평가 20건은 모두 한국어

05 호감도마다 다른 말투
마타이오스

적대 "닥쳐." · 보통 "멀쩡해. 너나 확인해." · 호의 "고맙다는 말은 무거워. 하지만 듣기 싫진 않아." · 열림 "같이라는 말에 기대고 싶어."

실패 기록, 학습 설정, 시험 결과 원본은 원래 페이지에 있습니다.

게임 페이지로