제프(Jev) 유사 모델 역설계 공개
TypeSafe가 설계를 공개하지 않은 상업용 'Jev' 모델과 동일한 입출력 구조를 가진 독립 스타터 모델이 오픈소스로 공개되었습니다. 이 모델은 텍스트와 N개의 선택지를 받아 한 번의 패스로 각 옵션별 확률을 반환하는 구조이며, 옵션-어텐션(option-attention) 헤드가 게임 컨트롤러 버튼 선택(둠, 체스)에도 재사용될 수 있음을 데모로 보여줍니다. 합성 데이터 생성·학습·평가·예측까지 빠르게 실행할 수 있는 CLI 퀵스타트도 포함되어 있습니다.
Jevlike: 변하는 텍스트 옵션 목록 중에서 하나를 선택하는 작은 모델을 학습시킵니다. Jev 유사 모델은 하나의 텍스트와 N개의 텍스트 옵션 목록을 입력받아, 각 옵션에 대해 하나의 확률을 반환합니다. 답을 한 단어씩 생성하는 방식이 아니라 한 번의 패스로 처리합니다. Jev는 TypeSafe가 이런 종류의 작업을 위해 만든 상업용 모델이지만, TypeSafe는 그 설계를 공개하지 않았습니다. 이 저장소는 동일한 입력·출력 형태를 가진 독립적인 스타터 모델입니다.
데모: 동일한 옵션-어텐션 헤드로 이미지 패치에서 컨트롤러 버튼의 점수를 매길 수 있습니다. 10초짜리 영상은 선택된 두 개의 5초 구간을 이어 붙인 것으로, 첫 번째는 둠(Doom)의 7개 버튼으로 치명적인 복도(deadly_corridor)에서 실제 전투를 벌이는 장면, 두 번째는 체스 컨트롤러가 5개 키를 사용해 걸어다니며 수를 두는 장면입니다. 다이어그램은 각 결정에 사용된 텐서를 보여줍니다. 둠 구간은 제공된 공동(joint) 체크포인트에서 나왔으며, 기록된 10개 에피소드에서 평균 0.60킬, 보상 -97.50을 기록했습니다. 체스 구간은 더 강력한 체스 전용 체크포인트에서 나왔으며, 무작위 움직이는 상대(random mover)와의 샘플링된 50게임에서 4승 46무 0패를 기록했지만, Stockfish 레벨 0 상대로는 0승 2무 48패였습니다. 이 구간들은 활동량 기준으로 선별되었으며 일반적인 플레이나 실력을 주장하는 것이 아닙니다.
게임 추가 기능을 설치하고, 공개된 공동 체크포인트로 새로운 640x480 둠 트레이스를 기록하세요:
uv pip install -e '.[games]' python examples/doom/play.py examples/checkpoints/joint-imitation.pt --episodes 10 --game-seconds 35.3 --device cpu --capture-resolution 640x480 --output runs/doom.mp4 --trace runs/doom-trace.json
같은 시각 레이아웃으로 트레이스를 렌더링하세요. 저자 소유의 사운드트랙 원본이 저장소에 포함되어 있지 않아 무성 영상으로 출력됩니다.
(cd examples/film && npm install && npx playwright install chromium) examples/film/make-film.sh runs/doom-trace.json runs/doom-film.mp4 10
릴리스에는 둠 예제, 체스 예제, 단일 게임 체크포인트, 공유 12-옵션 체크포인트가 포함되어 있습니다. 두 게임 모두 jevlike.vision에서 시각 스코어러를 임포트하며, 어느 예제에도 두 번째 모델 복사본이 없습니다.
아키텍처: 각 옵션은 쿼리 벡터(query vector)가 되는데, 이는 해당 텍스트를 나타내는 짧은 숫자 목록입니다. 쿼리는 컨텍스트 토큰에 어텐션 가중치를 할당합니다. 그 가중치로 해당 옵션에 대한 하나의 컨텍스트 벡터가 만들어집니다. 공유 내적(dot product)이 각 옵션-컨텍스트 쌍을 하나의 점수로 바꿉니다. 점수를 합이 1인 확률로 변환하는 소프트맥스(softmax)가 옵션들 전체에 걸쳐 실행됩니다. 기본 인코더는 바이트 임베딩을 처음부터 학습합니다. 인코더는 텍스트를 벡터로 변환하는 부분입니다. 선택적 Hugging Face 경로는 사전학습된 인코더를 동결(frozen)해 사용하며, 기존 가중치는 고정된 채 작은 스코어러만 학습합니다.
데이터 형식: 한 줄에 하나의 JSON 객체를 사용하세요:
{ "context": "고객이 환불을 원합니다.", "options": ["환불", "영업", "기술 지원"], "label": 0 }
label은 정답 옵션의 0부터 시작하는 인덱스입니다. 각 행은 서로 다른 수의 옵션을 가질 수 있으며 최소 2개입니다.
퀵스타트: 저장소 루트에서 다음 명령을 실행하세요. 로컬 합성 데이터를 생성하고, 학습하고, 저장된 모델을 평가하고, 새로운 메뉴 하나에 점수를 매깁니다.
uv venv source .venv/bin/activate uv pip install -e '.[dev]' jevlike-data synthetic --output data/synthetic jevlike-train data/synthetic/train.jsonl --validation data/synthetic/validation.jsonl --output runs/synthetic.pt jevlike-eval runs/synthetic.pt data/synthetic/test.jsonl jevlike-predict runs/synthetic.pt --context "정확히 amber badger 배지를 선택하세요. 배지: amber badger." --option "azure crane" --option "amber badger" --option "gold heron"
평가는 Top-1 정확도(첫 번째 선택이 정답인 비율)를 출력합니다. Top-3 정확도는 가장 점수가 높은 세 개 중에 정답이 있는 비율입니다. 기대 보정 오차(expected calibration error)는 신뢰도와 실제 정확도를 비교합니다. 이 명령은 또한 셔플된 컨텍스트 대조군(shuffled-context control)을 출력하는데, 각 메뉴를 잘못된 컨텍스트와 짝짓는 것입니다. 유용한 모델이라면 이 대조군보다 나은 성능을 보여야 합니다.
자신의 데이터 사용: 학습 데이터를 내보내고...