Text Generation
PEFT
Safetensors
English
qwen3.5
qwen
lora
instruction-tuning
task-induction
in-context-learning
conversational
Instructions to use Davitotty1/Teleste-Learner-4B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use Davitotty1/Teleste-Learner-4B with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("unsloth/Qwen3.5-4B") model = PeftModel.from_pretrained(base_model, "Davitotty1/Teleste-Learner-4B") - Notebooks
- Google Colab
- Kaggle
| license: apache-2.0 | |
| base_model: unsloth/Qwen3.5-4B | |
| library_name: peft | |
| pipeline_tag: text-generation | |
| language: | |
| - en | |
| tags: | |
| - qwen3.5 | |
| - qwen | |
| - lora | |
| - instruction-tuning | |
| - task-induction | |
| - in-context-learning | |
| # Teleste Learner 4B | |
| Teleste Learner 4B is a LoRA fine-tune of [Qwen3.5-4B](https://huggingface.co/Qwen/Qwen3.5-4B) trained to **adapt to the current request** instead of assuming a fixed job. | |
| Give it a new rule, a few examples, or a mid-conversation rule change. It is supposed to infer the contract from *this* conversation, apply it, and drop the old rule if you change it. That is in-context task induction, not a new form of AGI and not online weight updates while you chat. | |
| ## What it is good at | |
| - Invented mappings shown with a few labeled examples | |
| - Following a procedure you just defined (format, cipher, filter, schema) | |
| - Switching behavior when a later message replaces the rule | |
| - Staying quiet on extra commentary when the contract is strict | |
| ## What it is not | |
| - Not a general agent with memory across sessions | |
| - Not trained as a specialist in one domain (medicine, law, a single company's docs) | |
| - Not guaranteed to invent the correct rule when the examples are ambiguous | |
| ## How to use | |
| Load the repo with Transformers. If this repo is a **merged 16-bit model**: | |
| ```python | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| import torch | |
| repo = "Davitotty1/Teleste-Learner-4B" | |
| tok = AutoTokenizer.from_pretrained(repo) | |
| model = AutoModelForCausalLM.from_pretrained( | |
| repo, dtype=torch.float16, device_map="auto" | |
| ) | |
| system = ( | |
| "You adapt to the current request. Infer the user's goal, the hidden rules, " | |
| "and the output contract from this conversation only. If examples are present, " | |
| "the mapping in those examples is the law. If a later message changes the rules, " | |
| "the new rules replace the old ones. Check the answer against the inferred " | |
| "contract before you finish. Do not keep a default job." | |
| ) | |
| messages = [ | |
| {"role": "system", "content": system}, | |
| {"role": "user", "content": "examples: walrus→12, turtle→12, pig→6. now sloth → ?"}, | |
| ] | |
| prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) | |
| inputs = tok(prompt, return_tensors="pt").to(model.device) | |
| out = model.generate(**inputs, max_new_tokens=256, temperature=0.6, top_p=0.95, top_k=20) | |
| print(tok.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)) | |
| ``` | |
| If the repo is **LoRA-only**, load the base model first and attach the adapter: | |
| ```python | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| from peft import PeftModel | |
| import torch | |
| base = "unsloth/Qwen3.5-4B" | |
| tok = AutoTokenizer.from_pretrained(base) | |
| model = AutoModelForCausalLM.from_pretrained(base, dtype=torch.float16, device_map="auto") | |
| model = PeftModel.from_pretrained(model, "Davitotty1/Teleste-Learner-4B") | |
| ``` | |
| Needs a recent `transformers` with Qwen3.5 support (v5+). | |
| Sampling that works well: `temperature=0.6`, `top_p=0.95`, `top_k=20`. Allow enough `max_new_tokens` for a short `<think>` block plus the answer. | |
| ## Training | |
| | | | | |
| |---|---| | |
| | Base | Qwen/Qwen3.5-4B (Unsloth image `unsloth/Qwen3.5-4B`) | | |
| | Method | 16-bit LoRA (rank 16, alpha 16), not 4-bit QLoRA | | |
| | Targets | q, k, v, o, gate, up, down | | |
| | Context | 2048 | | |
| | Hardware | Kaggle Tesla T4, Unsloth LoRA (Qwen3.5 uses float32 training on T4) | | |
| | Objective | Supervised chat SFT | | |
| Data mix: | |
| 1. ~1000 synthetic **adaptation traces** (few-shot invented tasks, rule shifts, self-checks, stacked constraints, messy specs) | |
| 2. A many-task slice of [Super-NaturalInstructions](https://huggingface.co/datasets/Muennighoff/natural-instructions) so it does not overfit one puzzle format | |
| ## Evaluation | |
| Held-out bench vs stock [Qwen3.5-4B](https://huggingface.co/unsloth/Qwen3.5-4B) (`unsloth/Qwen3.5-4B`). **22 items**, not in the train file: 15 adaptation (invented few-shot mappings), 3 rule-switch (user replaces the rule mid-chat), 4 control (ordinary short Q&A). Same system prompt, greedy decode, exact / last-line / normalized match. | |
| Teleste **7/22 (31.8%)**, Qwen3.5-4B **1/22 (4.5%)**, **+6 items**. | |
| | split | qwen3.5-4b | teleste-learner-4b | delta | | |
| |---|---:|---:|---:| | |
| | adaptation | 0.0 | 13.3 | +13.3 | | |
| | rule_switch | 0.0 | 66.7 | +66.7 | | |
| | control | 25.0 | 75.0 | +50.0 | | |
| | **overall** | **4.5** | **31.8** | **+27.3** | | |
| Teleste emits a short think block, one answer, and stops. Stock Qwen3.5-4B, on the same prompts, usually stays in `<think>` (`No, too complex`, `Thinking Process:`) and never prints the mapping. That is most of the headline gap. Teleste still misses many 2-example letter puzzles; several FAILs are near-misses (`F5S2` vs `F5W2`, CSV `Go,1` vs `Go,0` with the other rows right). | |
| `switch_filter` is a weak item: both the old rule (keep > 10) and the new rule (keep evens) yield `14` / `22` on that list. | |
| | split | id | base | teleste | gold | pred (teleste) | | |
| |---|---|---:|---:|---|---| | |
| | adaptation | vowel_count | 0 | 0 | 3 | 2 | | |
| | adaptation | first_last_upper | 0 | 0 | PE | PR | | |
| | adaptation | double_plus_one | 0 | 0 | 13 | 29 | | |
| | adaptation | consonants_only | 0 | 0 | slvr | er | | |
| | adaptation | last_letters | 0 | 0 | kge | ne | | |
| | adaptation | sorted_letters | 0 | 0 | eikstt | ilkits | | |
| | adaptation | drop_last | 0 | 0 | penci | pe | | |
| | adaptation | third_letter | 0 | 0 | n | e | | |
| | adaptation | minus_four | 0 | 1 | 11 | 11 | | |
| | adaptation | wrap_last_first | 0 | 0 | eorange | rorange | | |
| | adaptation | hyphen_swap_reverse | 0 | 0 | aet-neerg | tah-eulb | | |
| | adaptation | inventory_code | 0 | 0 | F5W2 | F5S2 | | |
| | adaptation | strict_csv_score | 0 | 0 | Go,0 / b2,2 / NO,0 / zz9,2 | Go,1 / b2,2 / NO,0 / zz9,2 | | |
| | adaptation | keep_even_index | 0 | 0 | evt | elv | | |
| | adaptation | json_field | 0 | 1 | cold | cold | | |
| | rule_switch | switch_scoring | 0 | 0 | Hi,1 / a1,1 / WHY,0 / ok2,1 | Hi,2 / a1,2 / WHY,1 / ok2,2 | | |
| | rule_switch | switch_transform | 0 | 1 | MAPLE | MAPLE | | |
| | rule_switch | switch_filter | 0 | 1 | 14 / 22 | 14 / 22 | | |
| | control | ctrl_mul | 0 | 1 | 323 | 323 | | |
| | control | ctrl_capital | 0 | 1 | Paris | Paris | | |
| | control | ctrl_translate | 0 | 0 | buenos días | good morning | | |
| | control | ctrl_list | 1 | 1 | 3 | 3 | | |
| ## License | |
| Apache 2.0, inherited from Qwen3.5-4B. | |