jevlike README

The project's README from github.com/vinnylarouge/jevlike. As one markdown file: README.md.

Jevlike

Train a small model that chooses among a changing list of text options.

A Jev-like model takes a piece of text and a list of N text options. It returns one probability for each option. It does this in one pass instead of writing an answer word by word. Jev is TypeSafe's commercial model for this kind of task. TypeSafe has not published its design. This repository is an independent starter model with the same input and output shape.

Demo

The same option-attention head can score controller buttons from image patches. This ten-second film joins two selected five-second windows: live deadly_corridor combat on the seven Doom buttons, then a chess controller walking to and playing moves with five keys. The diagram shows the tensors used for each decision. The Doom window came from the supplied joint checkpoint, which averaged 0.60 kills and -97.50 reward across its ten recorded episodes. The chess window came from the stronger chess-only checkpoint, which scored 4 wins, 46 draws and 0 losses in 50 sampled games against a random mover, but 0 wins, 2 draws and 48 losses against Stockfish level 0. The windows were selected for activity and are not typical-play or competence claims.

Install the game extras and record a fresh 640 by 480 Doom trace from the released joint checkpoint:

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

Render the trace in the same visual layout. This writes a silent film because the author-owned soundtrack source is not part of the repository.

(cd examples/film && npm install && npx playwright install chromium)
examples/film/make-film.sh runs/doom-trace.json runs/doom-film.mp4 10

The release includes the Doom example, the chess example, the single-game checkpoints and the shared 12-option checkpoint. Both games import the visual scorer from jevlike.vision; there is no second model copy in either example.

Architecture

Each option becomes a query vector, which is a short list of numbers representing its text. The query assigns attention weights to the context tokens. Those weights make one context vector for that option. A shared dot product turns each option and context pair into one score. A softmax, which converts scores into probabilities that sum to one, runs across the options.

Each option queries the context, receives an attended context vector, and becomes one probability.

The default encoder learns byte embeddings from scratch. An encoder is the part that turns text into vectors. The optional Hugging Face path uses a frozen pretrained encoder, whose existing weights stay fixed while the small scorer learns.

Data format

Use one JSON object per line:

{"context":"The customer needs a refund.","options":["refund","sales","technical support"],"label":0}

label is the zero-based index of the correct option. Each row may have a different number of options, with a minimum of two.

Quickstart

Run these commands from the repository root. They create local synthetic data, train on it, evaluate the saved model and score one new menu.

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 "Choose the exact badge amber badger. Badge: amber badger." \
  --option "azure crane" \
  --option "amber badger" \
  --option "gold heron"

The evaluation prints top-1 accuracy, which is the fraction of correct first choices. Top-3 accuracy is the fraction with the right answer among the three highest scores. Expected calibration error compares confidence with observed accuracy. The command also prints a shuffled-context control, which pairs each menu with the wrong context. A useful model should beat that control.

Use your own data

  1. Export train, validation and test JSONL files in the format above.
  2. Keep all options that the model will see at prediction time in each row.
  3. Split related records together. For example, keep all records for one customer or one target page in one split. This prevents near-duplicates from leaking into the test set.
  4. Run jevlike-train with your train and validation files.
  5. Run jevlike-eval once on the held-out test file. Held-out means the file was never used for training or model selection.

The default byte encoder truncates context to 192 bytes and each option to 32 bytes. Raise --context-tokens or --option-tokens when your text needs more room. Training supports CPU, Apple MPS for a Mac GPU, and CUDA for an NVIDIA GPU through --device.

Use a frozen pretrained encoder

Install the optional dependency and name any compatible encoder from Hugging Face:

uv pip install -e '.[transformers]'
jevlike-train data/synthetic/train.jsonl \
  --validation data/synthetic/validation.jsonl \
  --output runs/qwen-head.pt \
  --encoder hf \
  --hf-model Qwen/Qwen2.5-0.5B \
  --rank 256 \
  --batch-size 8

The checkpoint stores the trained scorer head and the encoder name. It does not copy the frozen encoder weights. Loading the checkpoint therefore needs access to the same Hugging Face model.

--rank sets the width of the small scorer head. A wider head has more trainable weights and uses more memory.

Wikispeedia example

scripts/get_wikispeedia.sh downloads the public SNAP archives and builds next-click JSONL files. The data stay outside this repository.

scripts/get_wikispeedia.sh
jevlike-train data/wikispeedia/jsonl/train.jsonl \
  --validation data/wikispeedia/jsonl/validation.jsonl \
  --output runs/wikispeedia.pt

Cite Robert West and Jure Leskovec, Human Wayfinding in Information Networks, WWW 2012. Review the source data terms on the SNAP dataset page.

What to expect

In the experiments that led to this starter, the one-pass scorer reached about 98% accuracy on synthetic menus. On target-disjoint Wikispeedia next-click data, a frozen Qwen2.5-0.5B encoder plus the scorer reached 26%, against about 8% for shuffled and random-encoder controls. A small model trained from scratch on 40,000 clicks reached 29%. At eight options, one pass was about 100 times faster than a small decoder forced to write 400 tokens.

These numbers describe local experiments, not this quickstart run. We did not show equal quality with Jev or reproduce TypeSafe's private training method.

Limitations

Licence

Code is released under the MIT License. Downloaded datasets and pretrained models keep their own terms.

jevlike (vinnylarouge/jevlike)

Searching Database…

1.4K ·GitHub
这是什么?一个小型研究模型,读入一段文本加一个选项列表,一次性为每个选项返回一个概率,而不是逐个词元地写出答案。
这是可以直接下载的模型,还是需要我自己训练的代码?这是一个需要你自己运行的训练起步项目,不是托管模型:Jev 是 TypeSafe 的商业版本,其设计未公开,这个仓库只提供相同的输入和输出格式。
我怎么快速试一下?在仓库根目录运行快速上手命令:它们会生成合成数据、训练模型、评估效果并为一份菜单打分。要用自己的数据,就在 JSONL 文件上使用 jevlike-train 和 jevlike-eval。
主要有哪些限制?它是一个研究起步项目,不是 Jev 的复制品:字节编码器很廉价但对语言语义较弱,预训练路径可能下载一个大模型,而且预测前必须先知道完整的选项列表。
代码可以随便用吗?采用 MIT 协议。你下载的数据集和预训练模型仍适用各自的条款。
为什么不直接用 Jev,而要自己做一个?Jev 是 TypeSafe 的商业选项打分模型,其设计尚未公开,所以这个仓库是一个独立的起步项目,只复现相同的输入和输出格式,并不包含私有的训练方法。
评估怎么区分模型真的好还是碰运气?除了 top-1 和 top-3 准确率以及期望校准误差,每次运行还会输出一个打乱上下文的对照:把每份菜单和错误的上下文配对,一个好模型的成绩应该超过这个对照。
Wikispeedia 例子是做什么用的?scripts/getwikispeedia.sh 会下载公开的 SNAP 存档,并生成用于真实训练数据的“下一步点击” JSONL 文件。README 要求你引用 West 和 Leskovec 发表在 WWW 2012 上的论文,并查阅 SNAP 数据的使用条款。
文本长度默认限制是多少?默认的字节编码器会把上下文截断到 192 字节,每个选项截断到 32 字节;如果你的文本需要更多空间,可以调大 --context-tokens 或 --option-tokens。
Size
3.2 MB
Stars
1.4K
Updated
CommitSep 16
Age
1mo
Commits · 90 Days