--- language: - crk - en license: apache-2.0 library_name: peft pipeline_tag: text-generation base_model: Qwen/Qwen3-30B-A3B-Instruct-2507 tags: - cree - nehiyawewin - indigenous-languages - low-resource-language - dictionary - grammar - reinforcement-learning - grpo - tinker - thinking-machines - peft - lora widget: - text: "Translate 'a good man' to Cree, preserving the 1865 orthography. Return only the answer." - text: "Give the Cree for 'abandon' from Watkins 1865. Return only the answer." ---
Cree1865 — one 1865 Cree dictionary, rebuilt as a training loop

Cree1865 · Tinker RL Adapter

A reinforcement-learning adapter that read Rev. E. A. Watkins' 1865 Dictionary of the Cree Language and was scored against a deterministic, decomposed Cree reward ledger.


--- ## Overview This is a **GRPO reinforcement-learning adapter** on `Qwen/Qwen3-30B-A3B-Instruct-2507`, trained for **Cree (nēhiyawēwin) dictionary and orthography behavior** drawn from a single historical source: **Rev. E. A. Watkins' 1865 _A Dictionary of the Cree Language_**. It is a research bootstrap artifact built with the **Dakota1890** pipeline, retargeted to Cree. Training scores each sampled answer against a **deterministic Cree verifier** — no LLM judge — and logs every reward channel independently so failures can be read, not guessed. > **Scope, stated plainly.** This is not a Cree language authority, a fluent-speaker replacement, or a production translator. It is a first, correctable model — the working endpoint for a community-in-the-loop second stage. Nēhiyawēwin belongs to its communities; this repository is a transparent technical artifact built in service of that work, not over it. --- ## Model Details | Field | Value | |---|---| | Base model | `Qwen/Qwen3-30B-A3B-Instruct-2507` | | Adapter | LoRA, rank 32 (PEFT) | | Method | GRPO (grouped rollout RL) with a deterministic **Cree** reward ledger | | Infrastructure | Thinking Machines Tinker | | W&B run | [`hda2wqhl`](https://wandb.ai/christian-cooper-us/thinking-machines-qwen3-30b/runs/hda2wqhl) — `cree1865-synthetic-expansion-v1` | | Steps | 800 | | Batch / group size | 16 / 8 | | Max sampled tokens | 256 | | Temperature | 0.9 | | Learning rate | `4e-5` | | Tinker session | `9d734fdb-7851-5f2f-9949-e9e574eb9a55` | | Languages | Cree `crk`, English `en` | | Source | Watkins 1865 — Internet Archive `cihm_41985` | | License | Apache-2.0 (code) · Public Domain (1865 text) | --- ## Training Data & Methodology Everything derives from **one public-domain book** — a bilingual, two-part 1865 dictionary. | Part | Direction | PDF pages | State | |------|-----------|:---------:|-------| | Front matter | pronunciation key + notes | 1–28 | reference | | **Part I** | **English → Cree** | 29–210 | extracted | | **Part II** | **Cree → English** | 212–end | extracted | **Extraction snapshot** (full local build, 2026-06-24):
| Pages | Usable entries | Multi-variant | SFT (train/val) | RL tasks | |:-----:|:--------------:|:-------------:|:---------------:|:--------:| | **463** | **19,560** | **4,049** | **18,463 / 972** | **38,870** |
Structured entries become a synthetic Q&A prompt bank and a set of verifiable RL tasks (English↔Cree translation, orthography, containment). This run trained on the balanced synthetic-expanded task set (`rl_tasks_synthetic_expanded_balanced.jsonl`). --- ## Reward Function A **composite, deterministic** reward — every channel is checkable by code, logged, and inspectable: | Channel | Weight | Verifies | |---|:--:|---| | Exact match | 0.20 | Normalized response equals the Watkins-derived answer | | Target containment | 0.25 | Expected answer appears inside the response | | Orthography recall | 0.20 | Cree marks, hyphens, apostrophes, and accents preserved | | Character F1 | 0.20 | Spelling-level overlap for near misses | | Concise length | 0.15 | No padding a lookup answer with unsupported text | The verifier logs raw channel values, weighted contributions, the reconstructed composite, and a `composite_diff` for full auditability. This is the `cree` rubric — the run below was scored against exactly these channels. --- ## Reward Ledger (run `hda2wqhl`) Logged live to W&B for all 800 steps and pulled directly from the run.
Cree reward ledger dashboard for run hda2wqhl
What the curves show, honestly: - **Composite reward rises** from about `0.15` to a smoothed `~0.30` band — real upward movement, though noisy. - **Concise length is the strongest channel**, climbing to roughly `0.95` and holding; it is the largest weighted contribution at the end. - **Character F1 and orthography recall both contribute** and move in the `0.3`–`0.45` range, which is where orthographic learning is visible. - **Exact match and target containment stay near `0.0`.** For short answer-only lookups these are the honest ceiling on composite reward and the clearest targets for the next iteration. - **Policy entropy converges**, peaking early then settling to about `0.1`–`0.2` — the policy committing to a narrow answer style.
Composite reward progression
Composite reward, raw and smoothed.
Cree reward channels over training
Each Cree reward channel, tracked independently.
No fluency or community-validation claim is made from this run. The useful signals are per-channel reward movement, English→Cree versus Cree→English asymmetry, and orthography behavior on held-out prompts. --- ## Usage ```python from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel base_model_name = "Qwen/Qwen3-30B-A3B-Instruct-2507" adapter_name = "HarleyCooper/Cree1865" model = AutoModelForCausalLM.from_pretrained( base_model_name, device_map="auto", torch_dtype="auto", trust_remote_code=True, ) tokenizer = AutoTokenizer.from_pretrained(base_model_name) model = PeftModel.from_pretrained(model, adapter_name) messages = [ {"role": "system", "content": "You are a Cree language assistant working from Watkins 1865. Return only the answer."}, {"role": "user", "content": "Translate 'a good man' to Cree, preserving the 1865 orthography."}, ] text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tokenizer(text, return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=64, do_sample=False) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` Treat the output as a **first attempt** — a starting point for community correction, not a final answer. --- ## Limitations & Ethical Notes The source is a **missionary-era dictionary published in 1865**. It reflects the orthography, analysis, and **colonial-era framing** of its time, recorded across the Hudson's Bay territories. Outputs can inherit mistakes, omissions, and outdated descriptions from both the source extraction and the base model. - This is **not** a Cree language authority, a fluent-speaker replacement, or a production translation system. - Many tasks are dictionary lookups, not natural conversation; the reward verifies lookup behavior, not communicative fluency. - Cree language work should be reviewed with **appropriate community and linguistic expertise**. - The model is designed to be **corrected**: it is the working endpoint for a community-in-the-loop stage, not a finished teacher. - No community has certified this model as fluent, authoritative, or safe for language instruction. --- ## Citation > **Watkins, E. A. (1865).** *A Dictionary of the Cree Language, as Spoken by the Indians of the Hudson's Bay Territories.* London: Society for Promoting Christian Knowledge. Internet Archive: `cihm_41985`. ```bibtex @misc{cree1865_model, title = {Cree1865: A Single-Volume GRPO Cree Language Adapter}, author = {Cooper, Christian Harley}, year = {2026}, note = {Base: Qwen/Qwen3-30B-A3B-Instruct-2507. Source: Watkins 1865 (IA cihm_41985). Method derived from Dakota1890.} } ``` **Infrastructure & lineage:** Thinking Machines Tinker (RL), Anthropic (VLM extraction), and the [Dakota1890](https://github.com/HarleyCoops/Dakota1890) pipeline this work replays.