RuneSight: 텍스트와 코드를 구분하는 신경망 엔진
버전 1.0.6은 추출된 줄 가운데 어떤 것이 텍스트이고 어떤 것이 경로, 식별자, 제어 코드인지를 판단하던 손으로 작성한 정규식 목록을 은퇴시킵니다. 실제 게임에서 뽑아낸 90만 줄, 16개 언어의 실제 문장, 그리고 문서화된 모든 엔진 제어 코드로 학습한 400 KB 신경망 분류기 RuneSight가 이제 그 판단을 CPU에서 마이크로초 단위로 내리고, 모든 행에 그 이유를 밝히며, 실제 텍스트가 담긴 줄에는 결코 손대지 않습니다.
RuneTranslate가 여는 모든 게임은 대부분 플레이어가 읽게 될 텍스트지만, 그 뒤로 텍스트처럼 보이기만 하는 것들이 길게 이어집니다. 에셋 경로, 변수 이름, 제어 코드, 플러그인 키, 디버그 라벨, 누군가 데이터 파일에 남겨 둔 base64 블롭 같은 것들이죠. 이런 것을 번역하면 잘해야 요청 하나를 낭비하는 정도로 끝나고, 최악의 경우 엔진이 더 이상 존재하지 않는 이름을 찾다가 장면 자체가 로드되지 않습니다.
첫 출시 이후로 이 둘을 가르는 선은 사람 손으로 그어져 있었습니다. 엔진마다 마주친 쓸모없는 텍스트의 형태 하나하나에 규칙 하나씩, 수백 개의 정규식으로요. 버전 1.0.6은 그 목록을 실제 데이터로 학습한 작은 신경망 RuneSight로 대체합니다. RuneSight는 추출된 모든 줄에 대해 그 줄이 텍스트인지, 아니면 내부 코드에 지나지 않는지를 판단하며, 이 판단을 앱 안에서 CPU만으로 몇 마이크로초 만에 끝냅니다.
규칙 목록만으로는 더 이상 충분하지 않았던 이유
정규 표현식은 자신이 작성된 바로 그 형태만 정확히 잡아냅니다. bg_office_01은 식별자이므로 snake_case용 규칙이 이를 잡아냅니다. 그런데 Wolf RPG 게임이 <<GET_FILE_EXIST>>Data/\s[1]을 들고 나타나고, Bakin 게임이 Lv.\partystatus[0]을, Unity 게임이 "CubismTaskQueue.OnTask" already set.을 들고 나타나며, 일본어로 쓰인 폴더 이름은 ASCII를 전제로 한 경로 규칙을 깨뜨립니다. 그때마다 새 규칙이 하나씩 늘었고, 진짜 대사를 삼키지 않도록 범위를 신중하게 좁혀야 했으며, 새로운 엔진이 등장할 때마다 이 과정이 처음부터 다시 시작됐습니다.
규칙에는 또한 증거를 저울질하는 능력이 없습니다. 대부분이 제어 코드이고 끝에 대사 세 단어가 붙은 줄은 텍스트이며, 번역 가능한 상태로 남아야 합니다. .png 파일에 관한 완전한 문장으로 된 줄도 텍스트입니다. 반면 \f[\cself[1]]\space[4] 그 자체뿐인 줄은 텍스트가 아닙니다. 이 둘을 가려내려면 줄의 일부가 아니라 줄 전체를 감지하는 능력이 필요합니다.
RuneSight란
RuneSight는 약 400 킬로바이트 크기의 분류기입니다. 한 줄을 1~4자 길이의 문자 조각들이 모인 가방(bag)으로 읽어 고정된 테이블에 해시하고, 여기에 그 줄의 수십 가지 측정된 속성을 함께 넣습니다. 글자, 숫자, 문장 부호, 공백이 각각 얼마나 되는지, 어떤 문자 체계를 쓰는지, 경로처럼 보이는지, 괄호 쌍이 맞는지, 문장이 끝나는 방식으로 끝나는지 같은 것들이죠. 작은 은닉층 하나가 이를 두 가지 답으로 바꿉니다. 그 줄이 텍스트가 아닐 확률, 그리고 텍스트가 아니라면 어떤 종류의 비텍스트인지입니다.
두 번째 답이 바로 편집기에서 보게 되는 것입니다. 제외된 행에는 여전히 읽을 수 있는 이유가 붙습니다. 코드 패턴, 에셋 참조, 시스템 라벨, 숫자, 주석, 플러그인 키, 제어 코드만 있음, 바이너리, 플러그인 명령 중 하나죠. 해당 행에는 작은 RuneSight 표시와 판정에 대한 확신도가 함께 붙으므로 결정이 블랙박스가 되는 일은 없으며, 행을 한 번 클릭하면 다시 켤 수 있습니다.
이 모든 과정은 줄당 약 4마이크로초 만에 끝납니다. 10만 줄짜리 JRPG도 Windows 10이나 11이 깔린 어떤 PC에서든 GPU 없이, 어디에도 아무것도 전송하지 않고 1초가 채 안 되어 분류를 마칩니다.
무엇으로 학습했는가
이런 용도로 라벨링된 데이터는 존재하지 않았기에, 직접 만들었습니다. 학습 데이터셋은 90만 줄을 조금 넘습니다.
- 실제 게임. RPG Maker와 Ren'Py부터 Wolf RPG, Kirikiri, Artemis, Unity, Godot, Bakin, Unreal까지 열 개 엔진에 걸친 열세 개 게임을 통째로 추출하고, RuneSight가 대체하려는 그 규칙들로 라벨을 붙였습니다. 이것이 최저 기준선입니다. 기존 규칙이 잡아내던 것은 전부 잡아내야 했습니다.
- 실제 문장. 16개 언어로 된 25만 개 문장으로, 그중에는 일본어, 중국어, 한국어, 태국어, 아랍어, 러시아어와 로마자 표기 언어들이 포함됩니다. 어떤 원본 언어로 된 평범한 텍스트도 코드로 오인되지 않도록 하기 위해서입니다.
- 실제 내부 코드. 소스 코드와 패키지에서 수집한 경로, 식별자, 점으로 연결된 이름, 주석 줄 16만 개로, 여러 엔진이 공통으로 갖는 형태들입니다.
- 일부러 만든 사각지대. Wolf RPG, RPG Maker, Bakin의 공식 제어 코드 레퍼런스를 바탕으로 생성한 거의 30만 개 줄로, 하나하나가 절대 삼키면 안 되는 아슬아슬한 대사와 짝을 이룹니다. 파일을 언급하는 문장, 숫자가 뒤따르는 이름, 중간에 코드가 섞인 텍스트 줄 같은 것들이죠.
- 직접 검수한 골드 세트. 기존 규칙이 고정 테스트로 삼던 모든 줄에, 실제로 플레이한 게임에서 제보된 줄들을 더해 하나하나 판정했습니다.
출시 전에 증명해야 했던 것
평균적으로만 더 나은 모델은 새로운 실수와 마주치는 사람에게는 여전히 퇴보일 뿐입니다. 그래서 RuneSight는 고정된 게이트를 통과해야 하며, 재학습할 때마다 다시 검증합니다.
- 학습 세트의 모든 실제 게임에서, 손으로 작성한 규칙이 잡아내던 것의 최소 99.5%를 잡아냅니다.
- 번역 가능한 상태로 반드시 남아야 하는, 기존 규칙이 항상 시험대로 삼아 온 고정 세트에서는 0건의 제외도 만들지 않습니다.
- 실제 산문에서는 줄의 0.2% 미만만 제외됩니다.
- 제시하는 이유는 최소 97%의 경우에 정확합니다.
- 한 줄을 채점하는 데 5마이크로초 미만이 걸립니다.
가장 중요했던 규칙은 혼합된 줄에 관한 것입니다. 코드와 함께 실제 텍스트가 담긴 줄은 텍스트이며, 번역 가능한 상태로 남습니다. RuneSight는 줄 전체가 내부 코드일 때만 그 줄을 제거합니다.
달라지지 않은 것
RuneSight가 판단하는 것은 줄의 형태입니다. 형태가 아니라 맥락이 필요한 판단은 여전히 엔진 어댑터가 담당합니다. Godot 노드 이름은 씬 트리 안에서 어디에 있는지에 따라 제외되고, RPG Maker 이벤트 주석은 그것을 담고 있는 명령에 따라, 플러그인 파라미터 키는 그것이 들어 있는 파일에 따라 제외됩니다. 이런 규칙들은 그대로 남으며, 원본 언어 문자가 전혀 없는 줄처럼 이유 열에서 볼 수 있는 정책성 규칙들도 마찬가지입니다.
여러분이 직접 설정한 정규식 필터는 RuneSight 다음에 실행되며 전과 똑같이 동작합니다. 그리고 누가 만들었든 모든 제외는 여전히 다시 켤 수 있는 빨간색 옵트인 행으로 표시됩니다. RuneSight의 판단 중 어느 것도 최종적이지 않습니다.
어디서 확인할 수 있나
RuneSight 배지는 앱 오른쪽 아래, 버전 표시줄 위에 있습니다. 모델이 로드되면 점이 초록색으로 바뀝니다. 배지를 열면 모델 크기, 기본 탑재된 확신도 임계값, 그리고 마지막 추출에서 있었던 일, 즉 몇 줄을 채점했는지, 몇 줄을 제외했는지, 어디에서 기존 규칙과 판단이 갈렸는지를 알려줍니다. 추출이 끝날 때마다 짧은 토스트 알림이 같은 수치를 다시 보여줍니다.
혹시라도 모델이 로드되지 않으면 배지가 그 사실을 알려 주고, 추출은 그냥 이전 규칙으로 돌아갑니다. 이것 때문에 앱이 작동을 거부하는 일은 없습니다.
모델이 기존 규칙과 다르게 판단한 모든 지점은 작은 로컬 로그에 기록될 뿐 업로드되는 일은 없습니다. 진짜 대사라고 생각하는 줄이 제외되어 나타난다면, 편집기에서 다시 켜고 Discord로 알려 주세요. 그런 제보야말로 다음 재학습이 그대로 배우게 될 내용입니다.
RuneTranslate를 써볼 준비가 되셨나요?
무료 등급에서 모든 엔진과 모든 번역 제공자가 열립니다. Supporter($3.99/mo)로 최고 속도가 열립니다.
Windows용 다운로드
