blobbybob commited on
Commit
5bc32b2
·
verified ·
1 Parent(s): f7d1bd2

Review fixes: novel-facts gate parity with acceptance harness, CLI defaults, framing scoped to validation

Browse files
README.md CHANGED
@@ -17,7 +17,7 @@ tags:
17
 
18
  # tessera-compressor
19
 
20
- A 1.5B model that compresses English reasoning text into a telegraphic CJK/symbol register under deterministic fidelity gates. It minted the training data for [Tessera-Preview-9B](https://huggingface.co/ZelligeAI/tessera-preview-9b) and replaces the frontier-model teacher that originally produced the register: any English reasoning dataset becomes compressed-register training data at local-inference cost, with no API key and no external dependency.
21
 
22
  Example (real training pair, 85 to 49 tokens):
23
 
@@ -30,7 +30,7 @@ CJK: Integer(line32),Boolean(line262),BitString(line341),OctetString(line693).
30
 
31
  ## How it works
32
 
33
- The compressor operates on passages, not whole blocks. A reasoning block is segmented (code fences stay atomic), sentences are grouped into step-sized passages, each passage is classified as fact-dense or narrative, and the model compresses it against the tail of the chain built so far. Every model output then passes a deterministic gate: the sets of numbers, identifiers, and operators must survive, the output must not blow up in length, and it must beat a rules-only compression of the same passage in token count. A passage that fails any check falls back to the rules-only version, so a bad generation costs savings, never content.
34
 
35
  ## Acceptance record
36
 
@@ -38,7 +38,7 @@ Measured on 103 held-out reasoning blocks the model never trained on, under crit
38
 
39
  | Criterion | Result |
40
  | --- | --- |
41
- | Per-passage fidelity gate (numbers, identifiers, operators survive) | 99.0% |
42
  | Median per-passage compression ratio (output/input tokens) | 0.716 |
43
  | CJK adoption | 98.9% of compressed passages |
44
  | Judged semantic equivalence | 103/103 blocks (teacher references on the same blocks: 97.1%) |
 
17
 
18
  # tessera-compressor
19
 
20
+ A 1.5B model that compresses English reasoning text into a telegraphic CJK/symbol register under deterministic fidelity gates. It minted the training data for [Tessera-Preview-9B](https://huggingface.co/ZelligeAI/tessera-preview-9b) and replaces the frontier-model teacher that originally produced the register: English reasoning text becomes compressed-register training data at local-inference cost, with no API key and no external dependency. Validation covered code-centric reasoning (103 held-out mixed blocks); behavior on distant domains is unmeasured.
21
 
22
  Example (real training pair, 85 to 49 tokens):
23
 
 
30
 
31
  ## How it works
32
 
33
+ The compressor operates on passages, not whole blocks. A reasoning block is segmented (code fences stay atomic), sentences are grouped into step-sized passages, each passage is classified as fact-dense or narrative, and the model compresses it against the tail of the chain built so far. Every model output then passes a deterministic gate: the passage's novel numbers and identifiers must survive as substrings, the output must not blow up in length, and it must not exceed a rules-only compression of the same passage in token count. A passage that fails any check falls back to the rules-only version, so a bad generation costs savings rather than gated content. The gate is lexical, not semantic: it prevents the loss of numbers and identifiers, and a judged semantic-equivalence check backed it at acceptance (below), but it does not by itself guarantee semantic preservation on arbitrary input.
34
 
35
  ## Acceptance record
36
 
 
38
 
39
  | Criterion | Result |
40
  | --- | --- |
41
+ | Per-passage fidelity gate (numbers and identifiers survive) | 99.0% |
42
  | Median per-passage compression ratio (output/input tokens) | 0.716 |
43
  | CJK adoption | 98.9% of compressed passages |
44
  | Judged semantic equivalence | 103/103 blocks (teacher references on the same blocks: 97.1%) |
scripts/compress.py CHANGED
@@ -13,7 +13,7 @@ model output costs savings, never content.
13
  Serve the model first, e.g.:
14
  vllm serve ZelligeAI/tessera-compressor --port 8001
15
  or with the GGUF:
16
- llama-server -m compressor-v31-q8_0.gguf --port 8001
17
 
18
  Then:
19
  # one block from a text file
@@ -84,7 +84,7 @@ def compress_block(text, client, model, ntok):
84
  stats["narr_skipped"] += 1
85
  seen |= facts(s)
86
  continue
87
- if gate(s, rules_s, out, ntok) is None:
88
  chain.append(out)
89
  stats["model_ok"] += 1
90
  else:
 
13
  Serve the model first, e.g.:
14
  vllm serve ZelligeAI/tessera-compressor --port 8001
15
  or with the GGUF:
16
+ llama-server -m gguf/compressor-v31-q8_0.gguf --port 8001 # from the repo root
17
 
18
  Then:
19
  # one block from a text file
 
84
  stats["narr_skipped"] += 1
85
  seen |= facts(s)
86
  continue
87
+ if gate(s, rules_s, out, ntok, novel=novel) is None:
88
  chain.append(out)
89
  stats["model_ok"] += 1
90
  else:
scripts/requirements.txt CHANGED
@@ -1,2 +1,3 @@
1
  openai>=1.0
2
  tokenizers>=0.15
 
 
1
  openai>=1.0
2
  tokenizers>=0.15
3
+ transformers>=4.40 # tokenmax.py standalone CLI only
scripts/segmenting.py CHANGED
@@ -97,18 +97,25 @@ def classify_passage(seg, seen_facts, ntok):
97
  return 'narr'
98
 
99
 
100
- def gate(src_seg, rules_seg, out, ntok):
101
  """Deterministic per-passage fidelity gate.
102
  Returns None if the model output is admissible, else a short fail-reason
103
- string; on failure the caller uses rules_seg instead."""
 
 
 
 
 
104
  if not out or not out.strip():
105
  return "empty"
106
  if '```' in out:
107
  return "fence"
108
  if len(out) > 2 * len(src_seg) + 40: # explanation/blow-up guard
109
  return "blowup"
110
- if facts_preserved(src_seg, out): # every fact survives (substring check)
 
 
111
  return "facts"
112
- if ntok(out) > ntok(rules_seg): # must beat the deterministic version
113
  return "tokens"
114
  return None
 
97
  return 'narr'
98
 
99
 
100
+ def gate(src_seg, rules_seg, out, ntok, novel=None):
101
  """Deterministic per-passage fidelity gate.
102
  Returns None if the model output is admissible, else a short fail-reason
103
+ string; on failure the caller uses rules_seg instead.
104
+
105
+ novel: the passage's facts that are NOT already in the accumulated chain.
106
+ The prompt tells the model never to restate chain content, so only novel
107
+ facts are required to survive (matching the acceptance harness). Pass None
108
+ to require every fact of the passage (stricter, for chainless use)."""
109
  if not out or not out.strip():
110
  return "empty"
111
  if '```' in out:
112
  return "fence"
113
  if len(out) > 2 * len(src_seg) + 40: # explanation/blow-up guard
114
  return "blowup"
115
+ required = facts(src_seg) if novel is None else novel
116
+ out_n = out.replace(',', '')
117
+ if any(f.replace(',', '') not in out_n for f in required):
118
  return "facts"
119
+ if ntok(out) > ntok(rules_seg): # must not exceed the rules-only version
120
  return "tokens"
121
  return None
scripts/tokenmax.py CHANGED
@@ -363,8 +363,8 @@ if __name__ == '__main__':
363
  parser = argparse.ArgumentParser(description='Token-max post-processor for think blocks')
364
  parser.add_argument('--input', required=True, help='Input JSONL (messages format)')
365
  parser.add_argument('--output', help='Output JSONL (default: dry run, stats only)')
366
- parser.add_argument('--tokenizer', default='assets/omnicoder-tokenizer',
367
- help='Path to tokenizer')
368
  parser.add_argument('--force-cjk', action='store_true',
369
  help='Force CJK substitutions even if total tokens increase. '
370
  'Prioritizes CJK adoption over token savings.')
 
363
  parser = argparse.ArgumentParser(description='Token-max post-processor for think blocks')
364
  parser.add_argument('--input', required=True, help='Input JSONL (messages format)')
365
  parser.add_argument('--output', help='Output JSONL (default: dry run, stats only)')
366
+ parser.add_argument('--tokenizer', default='ZelligeAI/tessera-compressor',
367
+ help='HF repo id or local path of the tokenizer to count savings under')
368
  parser.add_argument('--force-cjk', action='store_true',
369
  help='Force CJK substitutions even if total tokens increase. '
370
  'Prioritizes CJK adoption over token savings.')