AlexWortega/openjev — Qwen3.5 기반의 범용 자연어 추론 크로스 인코더
openjev는 Qwen3.5를 premise와 hypothesis의 관계를 entailment·contradiction·neutral로 판별하는 단일 cross-encoder로 구성한 프로젝트입니다. 4B NLI 체크포인트와 동결된 35B-A3B MoE 백본의 작업별 MLP 헤드를 제공하며, 답변 재순위화·채점·콘텐츠 보호와 게임 제어까지 동일한 추론 primitive로 처리합니다.

본문
openjev는 Qwen3.5를 자연어 추론(Natural Language Inference, NLI) 모델인 jev 형태로 활용하는 프로젝트입니다. 모델은 하나의 cross-encoder로 premise와 hypothesis를 함께 읽고, 두 문장의 관계를 entailment, contradiction, neutral 세 가지 클래스로 판별합니다. 저장소가 제시하는 핵심 아이디어는 이 세 클래스에 대한 판별 하나만으로도 여러 응용을 구성할 수 있다는 점입니다. 예를 들어 기준 답변과 후보 답변의 관계를 비교해 답변을 채점하거나, 후보 목록에서 질문과 가장 잘 함의되는 항목을 골라 재순위화할 수 있습니다. 콘텐츠 보호에 활용하거나, 게임의 현재 상태와 가능한 행동을 설명하는 문장을 입력해 entailment 점수가 가장 높은 행동을 선택하는 방식도 제시합니다.
두 가지 모델 구성
저장소에는 먼저 qwen3.5-4b-nli 디렉터리의 4B jev 체크포인트가 포함되어 있습니다. 이 모델은 Qwen3_5ForSequenceClassification 구조를 사용하고, 출력 클래스는 contradiction, entailment, neutral 세 가지입니다. 마지막 토큰을 pooling하는 last-token pooling을 사용하며, 세 클래스에 대한 일반적인 cross-entropy 손실로 학습했다고 설명합니다. Python에서는 OpenJevCrossEncoder에 AlexWortega/openjev와 subfolder인 qwen3.5-4b-nli를 지정해 불러올 수 있습니다. premise로 새가 틈의 중심보다 0.05 아래에 있다는 문장을 넣고, hypothesis로 새가 틈의 중심보다 아래에 있다는 문장을 넣으면 세 클래스의 확률을 반환합니다. 이처럼 두 문장의 의미 관계를 확률 분포로 받을 수 있어 후속 로직에서 entailment 확률을 점수로 사용할 수 있습니다.
두 번째 구성은 Bigger jev로 소개된 35B-A3B MoE 백본입니다. Qwen3.5-35B-A3B를 backbone으로 사용하고, backbone 자체는 frozen 상태로 둔 뒤 마지막 토큰의 latent 표현 위에 작은 MLP head를 붙입니다. 이 구성은 zero-shot 방식으로 설명되며, 작업마다 하나의 헤드를 둡니다. mlp_heads_35b 디렉터리에는 작업별 head.pt, 정규화 정보가 담긴 norm.npz, 메타데이터인 meta.json이 들어가며, LatentMLPHead.load를 사용해 로드할 수 있습니다. 저장소는 각 작업마다 전체 대형 백본을 다시 학습하는 대신, 백본의 latent와 작은 MLP 헤드를 조합하는 구조를 제공한다고 설명합니다. 또한 transformers 5.15에는 해당 35B-A3B 백본을 위한 시퀀스 분류 구현이 없기 때문에 modeling_qwen35_moe_seqcls.py에 Qwen3_5MoeForSequenceClassification을 별도로 제공합니다.
제공되는 인터페이스와 사용 방식
modeling_openjev.py에는 OpenJevCrossEncoder가 정의되어 있습니다. 이 클래스는 predict, rerank, grade, latents 인터페이스를 제공합니다. predict는 premise와 hypothesis 쌍에 대해 세 NLI 클래스의 확률을 계산합니다. rerank는 질문과 여러 후보를 받아 후보별 entailment 점수를 비교하고, 가장 높은 항목의 인덱스를 반환하는 용도로 제시됩니다. 예시에서는 식물이 광합성 과정에서 흡수하는 기체를 묻는 질문과 oxygen, carbon dioxide, nitrogen 후보를 입력하고, entailment가 가장 높은 선택지를 고르게 합니다. grade는 기준 답변과 대상 답변의 관계를 평가하는 데 사용할 수 있으며, latents는 백본에서 얻은 latent 표현을 후속 작업별 헤드에 연결하는 기반 인터페이스로 볼 수 있습니다.
OpenJevCrossEncoder를 사용하지 않고 일반적인 Transformers API를 사용할 수도 있습니다. 이 경우 AutoTokenizer와 AutoModelForSequenceClassification으로 같은 저장소의 qwen3.5-4b-nli 서브폴더를 불러온 뒤, model.config.nli_template에 premise와 hypothesis를 채워 입력 문자열을 만듭니다. 따라서 별도의 전용 호출 래퍼 없이도 모델 설정에 정의된 NLI 입력 형식을 따라 추론할 수 있습니다.
게임 예제와 재현 자료
저장소는 이 primitive가 실제 게임 입력에도 연결될 수 있음을 보이기 위해 Flappy Bird와 Doom 예제를 포함합니다. Doom은 먼저 텍스트로 표현한 게임 상태를 입력하는 방식으로 실행하고, 이어서 Qwen3.5의 vision tower를 통해 픽셀을 직접 입력하는 방식으로 확장했다고 설명합니다. 게임 상태와 몇 개의 행동 관련 문장을 제공하면 entailment의 argmax를 행동으로 선택하는 형태이며, 작업별로 별도의 모델을 학습하지 않는 zero-shot 구성을 강조합니다. code 디렉터리에는 trainer, multiple-choice harness, Flappy Bird와 Doom의 텍스트·픽셀 실행 코드, radar가 들어갑니다. videos에는 Flappy Bird와 Doom의 replay가, results에는 각 실행의 raw JSON과 전체 report가 포함됩니다. 따라서 모델 파일뿐 아니라 실험 실행 코드와 결과 자료까지 함께 제공하는 저장소입니다.
구현 범위와 라이선스
구성 요소는 4B NLI 모델, 35B-A3B MoE용 시퀀스 분류 모델, 작업별 latent MLP 헤드, 추론 인터페이스, 게임 및 평가용 코드로 나뉩니다. 35B 구성에서 백본을 동결하고 작은 헤드를 사용하는 방식과 4B 체크포인트의 직접적인 세 클래스 분류 방식을 함께 제공하므로, 단일 NLI 모델을 바로 사용하는 경우와 latent 기반 작업별 헤드를 실험하는 경우를 모두 다룰 수 있습니다. 프로젝트의 라이선스는 MIT이며, 참고 지점으로 dleemiller의 NLI cross-encoder를 명시합니다.
원문: Hugging Face / 번역·요약: Trawling