Seeking feedback on token-block context selection for long-sequence QLoRA fine-tuning

Hi everyone,

I’m building SpiralCoreAttention, an experimental training-time context-selection prototype for open-weight LLM fine-tuning.

Instead of passing the complete long sequence through every training forward/backward pass, the prototype selects token blocks from the sequence, trains on that selected context, and evaluates the resulting adapter on held-out full-context sequences.

I recently ran an internal QLoRA experiment with:

  • Qwen2.5-7B-Instruct

  • 4-bit NF4 QLoRA

  • one RTX PRO 6000 Blackwell GPU

  • 8,192-token sequences

  • 48 training steps per run

  • three seeds

  • 60% selected-context configuration

Across the three internal runs, mean training-step speedup was 1.675× and peak VRAM was 6.036 GB lower. Held-out full-context loss did not worsen in these short runs.

Important limitations: this is a local-corpus, short-duration, single-GPU research result. It is not a production claim, a task-level quality proof, distributed-training result, or evidence for full pretraining / 70B-scale training.

Code, methodology, exact seed-level results, and limitations:
https://github.com/cannural2-cpu/SpiralCoreAttention

I would appreciate technical feedback on:

  1. Whether this is a reasonable evaluation protocol for selected-context fine-tuning

  2. Which task-level quality evaluations I should add next

  3. Whether there are established baselines or papers I should compare against

  4. Failure modes I should test before attempting a real design-partner validation

Thank you.

For now, I ran a quick experiment. There may be something useful in teasing apart why 60% seems to hold up:


My short answer to the four questions would be:

  • The current protocol looks useful as a pilot. In particular, evaluating the resulting adapter again on the full context is a good choice.
  • Before scaling the experiment up, I think the highest-information next step is probably to separate “60% is enough” from “this selector chose a particularly good 60%.”
  • For task-level evaluation, I would start with a very small controlled cross-block dependency test rather than a large benchmark suite.
  • The closest literature I found spans several different design points—TokenTune, TokenSeek, LeMo, LongLoRA, LongQLoRA, and PoSE—but I would not treat any of them as identical to what you are doing.

If I were trying to get the most information from the fewest additional runs, my default path would be roughly:

base / step 0

full-context 100%
matched random-block 60%
Spiral-selected 60%

with the same dataset split, seed, block size, block-joining policy, position-ID policy, and loss masking.

That one control seems unusually valuable because both possible outcomes are informative:

random 60% ≈ Spiral 60%
    → a large part of the result may come from generic shortening /
      redundancy in this corpus

Spiral 60% > random 60%
    → much stronger evidence that the selector itself is contributing

The first outcome would not make the experiment uninteresting. It could mean that this workload admits a much simpler compression rule than expected, which is useful information in its own right.

I would also record the step-0 full-context held-out loss if that is cheap. That separates:

"both methods learned, and ended up similarly good"

from

"after 48 steps, neither method has moved very far yet"

I would not jump straight from 48 steps to a large long-running sweep just to answer this. If intermediate checkpoints already exist, even something like 0 → 12 → 24 → 48 would be enough to see whether the curves are meaningfully separating.

Two other implementation details seem worth making explicit because they change what “drop 40% of the context” actually means:

  1. whether the reported timing includes the block scoring/selection work;
  2. what happens to positions and loss targets when non-adjacent blocks are joined.

Those are not objections to the approach; they are useful axes for separating the mechanism.

Why I would add a matched random-block control first

The main ambiguity I see in the current pilot is attribution.

There are at least two fairly different hypotheses consistent with:

full context and selected 60% have similar held-out full-context loss.

Hypothesis A — generic shortening is enough here

The local corpus may contain enough redundancy that many 60% subsets work.

In that case, the interesting result becomes something like:

for this data distribution and training horizon, a substantial amount of context can be removed before QLoRA quality visibly degrades.

That could be useful even if a sophisticated selector turns out not to be necessary.

Hypothesis B — the selector matters

The particular 60% chosen by the selector may retain substantially more useful training signal than an equally sized random subset.

Then the selector itself becomes the interesting part.

A matched random-block condition seems cleaner than random-token dropping here, because it preserves the same granularity as the method:

same original sequence
same block size
same number of retained blocks
same ordering rule
same position policy
same loss policy

only:
    selector score → random block choice

There is some nearby precedent for making this kind of distinction.

TokenTune reduces the number of token positions participating in backpropagation while retaining full contextual information in the forward pass.

TokenSeek moves from data-agnostic token selection toward instance-aware selection. The exact mechanism is different from pre-forward block deletion, but the underlying experimental question is useful here:

is the gain caused by having a smaller token budget, or by choosing the right tokens within that budget?

So I would use those more as evaluation precedents / neighboring design points than as claims that they are the same method.

If a second cheap control is available after random blocks, one optional variant could be uniformly spaced blocks at the same retention rate.

That would help distinguish:

content-aware selection

from

simply preserving broad coverage across the original sequence

but I would consider that secondary. Random 60% seems like the first control.

What I would try next for task-level quality

I would probably not begin with a large LongBench/HELMET-style evaluation.

First I would build one deliberately small case that should fail if a necessary dependency is cut.

For example:

Block A:
    Project Cedar uses key K17.

... several unrelated blocks ...

Block B:
    Key K17 opens archive 739251.

... several unrelated blocks ...

Target:
    Which archive can Project Cedar access?

Then vary only a few things:

A and B both retained
A retained / B removed
B retained / A removed

A and B close together
A and B far apart

low distractor density
high distractor density

The important quantity is no longer just:

retained token ratio = 60%

but something closer to:

did the selected context retain the dependency needed for this target?

This is closely related to why I think RULER is a useful source of test ideas here.

RULER deliberately goes beyond simple single-needle retrieval and includes configurable:

  • multiple-needle retrieval,
  • multi-hop variable tracing,
  • aggregation.

Its own documentation is careful that these synthetic tests are not a replacement for realistic downstream tasks, which seems exactly the right role here: use a tiny synthetic test as an inexpensive mechanism probe, not as the final quality claim.

A practical progression could therefore be:

tiny controlled dependency probe
        ↓
small RULER-style subset
        ↓
realistic RAG / QA workload
        ↓
broader downstream validation

For the later stage, HELMET is useful because it found that simple needle-in-a-haystack results do not reliably predict performance across realistic long-context categories. It covers recall, RAG, long-document QA, reranking, citation, summarization, and ICL.

The HELMET authors specifically suggest RAG tasks as a relatively convenient development-time signal before doing a broad evaluation.

So I would see the synthetic dependency test and HELMET as complementary:

controlled synthetic test:
    "what mechanism breaks?"

realistic task:
    "does the break matter in an application?"
Why I would keep the full-context loss, but not make it the final metric

I think the existing full-context held-out loss is worth keeping.

It is stronger than evaluating the model only on the selected/truncated sequence, because it at least asks the trained adapter to operate again under the original context.

The caveat is that average language-model loss can hide a small subset of tokens that actually depend on distant context.

This is the main issue studied by LongPPL / “What is Wrong with Perplexity for Long-context Language Modeling?”.

Their argument is roughly:

most tokens may be predictable from local context
+
only a minority may genuinely benefit from distant context
+
ordinary PPL averages over everything
=
a model can lose some long-range behavior without a dramatic PPL change

They address that by comparing long-context and short-context predictions to identify “key tokens” whose prediction depends more on the distant context.

I do not think you need to implement LongPPL immediately.

A much cheaper version of the same diagnostic idea would simply be:

create a small set of target tokens for which you know distant blocks are necessary, and inspect those separately from aggregate loss.

That gives the current full-context held-out loss a useful partner rather than replacing it.

Position IDs may be a separate experimental variable

One thing I would make explicit in the method description is what happens to positions after block selection.

Suppose the original sequence contains:

block 1   @ positions   0–511
block 7   @ positions   3072–3583
block 12  @ positions   5632–6143

and those three blocks are selected.

There are at least two conceptually different ways to feed them back:

A. compact positions

block 1  → 0–511
block 7  → 512–1023
block 12 → 1024–1535

or something closer to:

B. preserve original positional distance

block 1  → 0–511
block 7  → 3072–3583
block 12 → 5632–6143

These are not necessarily “right” and “wrong”; they are different training signals.

PoSE is useful context here because it deliberately decouples physical training length from positional distance. It trains on short chunks but manipulates their position indices so that the model still experiences positions across a much larger target window.

So if selected blocks are being compacted, the method may effectively combine:

content selection
+
positional-distance compression

If original positions are preserved, it is closer to:

content selection
while preserving long positional gaps

Either can be a legitimate design choice. I just think documenting it makes the result easier to interpret, and later it becomes a cheap ablation if needed.

I tried a very small independent sanity check on this point with Qwen2.5-0.5B-Instruct: I kept exactly the same selected tokens and changed only whether their positions were compacted or kept at their original offsets. Even in that toy setup the loss changed measurably.

I would not read anything universal into the direction or magnitude of that change—the setup was synthetic and much smaller than your experiment—but it convinced me that position policy is cheap enough to treat as a first-class experimental variable rather than an invisible implementation detail.

What happens at a discontinuity between selected blocks?

There is a second, separate issue when physically non-adjacent blocks become neighbors.

For example:

original:

... end of block 3 ...
[blocks 4–9]
... beginning of block 10 ...

after selection may become:

... end of block 3 ...
... beginning of block 10 ...

In a causal-LM objective, unless something special is done, the first token of block 10 is now predicted from a prefix ending in block 3.

That transition did not exist in the original document.

Again, I do not think there is one universally mandatory policy. Two possibilities are:

1. keep the transition as a real training target

2. mask the first loss-bearing token after a discontinuity

The distinction matters because in case 1 the experiment measures:

context selection
+
learning on newly created block joins

while in case 2 it more narrowly measures the selected within-block language-model targets.

Hugging Face’s current TRL SFTTrainer documentation and its padding-free/packing implementation are useful examples of why these details are normally explicit: packed sequences carry position information, and non-loss-bearing locations can be represented with labels == -100.

That is not the same problem as this block-selection setup, but the general lesson transfers:

once sequence topology is changed, input_ids, position_ids, and labels become separate parts of the experimental contract.

So if non-adjacent blocks are directly concatenated, I would simply document the policy.

A one-example debug dump is probably enough to make it unambiguous:

selected block IDs
input_ids around each join
position_ids around each join
labels around each join
Where this seems to sit relative to nearby methods

The neighboring work became easier for me to understand when I stopped putting all of it under “token pruning.”

They reduce different things:

Method What is reduced / changed? Useful comparison point
Your block-selection approach Input/context visible before the forward pass Physical sequence shortening
TokenTune Token positions participating in backward/activation storage Keeps forward context
TokenSeek Instance-aware token participation Selection quality vs data-agnostic selection
LeMo Token involvement dynamically across inputs/layers Long-context token sparsity inside the model
LongLoRA Attention interactions during training Keeps tokens, sparsifies attention
LongQLoRA QLoRA + positional/attention-side long-context adaptation Similar resource-constrained problem setting
PoSE Physical train length vs positional range Shows that token distance itself is an experimental variable

I would not call these direct substitutes.

To me, the interesting part of your approach is that it acts earlier:

long sequence
    ↓
select blocks
    ↓
physically shorter sequence
    ↓
normal forward/backward

That makes large real wall-clock savings plausible in a way that some “selective backward” methods do not automatically get, because fewer tokens enter the expensive forward computation in the first place.

For that reason, I would also report timing in a way that makes the boundary clear:

selection/scoring time
+
model forward/backward time
=
end-to-end step time

If the reported ~1.675× already includes selection, that is especially useful to know.

If it currently excludes selection, reporting both numbers would make it easier to compare future selector variants whose scoring costs differ.

A later design axis: retain dependencies, not just tokens

This is probably not something I would implement before the cheap random control, but it may become useful if the basic result keeps holding.

There is a separate long-context literature arguing that:

a long document is not automatically a document with useful long-range dependencies.

For example, ProLong scores training documents using dependency strength, dependency distance, and dependency specificity, with the goal of identifying samples that genuinely exercise long-range modeling.

NExtLong approaches the same broad issue from the opposite direction: it inserts hard-negative distractors between related chunks so that the model must maintain useful relationships over larger distances.

Those papers are not doing your block selection.

But they suggest a useful future distinction:

retained-token ratio

is not necessarily the same as:

retained long-range dependency

A selector could retain 60% of the tokens while accidentally severing the one pair of distant blocks that supplies the important training signal.

Conversely, a selector that protects a relatively small set of dependency-carrying block pairs might be able to remove even more raw tokens.

So if the simple selector beats random selection, a possible later direction is not merely “find even more important individual blocks,” but:

identify groups of blocks whose value comes from their relationship to one another.

I would treat that as a second-generation design question, not as something needed to validate the current pilot.

What my quick sanity check did — and did not — show

I also tried a deliberately small independent probe, mainly to see whether the proposed diagnostic axes were observable at all.

It used:

Qwen2.5-0.5B-Instruct
small synthetic context
random block retention at roughly 60%

It was not a reproduction of your 7B / 8K / 48-step setup, and it did not implement your selector.

Two things were useful:

1. Same selected tokens, different position policy

Keeping the token IDs fixed but switching between compacted and original position IDs changed the measured NLL.

I would not generalize that number to your setup, but it supports treating position handling as an explicit variable.

2. Drop one actually necessary evidence block

In a tiny synthetic case where the answer depended on one distant evidence block, the candidate-answer NLL moved strongly when that block was removed.

Again, this is not evidence about your selector.

What it showed me is simply that a very cheap controlled dependency probe can have enough sensitivity to be useful before running a large task suite.

I did not get a clean independent training-speed comparison from that probe—the backward benchmark hit memory limits—so I would not use it to say anything about your reported speed/VRAM results.

A possible low-cost decision tree

I think this is the cleanest way to avoid turning the validation process into a long checklist:

1. Compare step 48 with step 0
   |
   +-- little/no learning signal yet
   |      |
   |      → extend only far enough to establish that both runs
   |        are actually learning
   |
   +-- clear learning signal
          |
          v

2. Add matched random-block 60%
          |
          +-- random ≈ Spiral
          |      |
          |      → generic shortening / corpus redundancy may explain
          |        much of the result
          |
          |      → a simple selector may already be useful
          |
          +-- Spiral > random
                 |
                 → selector-specific value becomes much more plausible
                 |
                 → optionally try a small retention sweep
                   (for example 40 / 60 / 80)

3. Run one tiny cross-block dependency probe
          |
          +-- aggregate loss holds, dependency probe drops
          |      |
          |      → separate "context reduction" from
          |        "dependency-preserving selection"
          |
          +-- dependency probe also holds
                 |
                 → stronger reason to move to a realistic task
                   or design-partner workload

And independently of those branches, I would keep these three things explicit:

timing boundary:
    does end-to-end time include selection?

position policy:
    compact selected blocks or preserve original offsets?

discontinuity policy:
    what happens to the first loss-bearing token after a removed span?

That seems like enough information to interpret almost every branch without requiring a large evaluation campaign up front.

So overall, I think the pilot is already pointing at a useful question.

I would not try to prove “60% is universally safe” from this stage. I would instead ask:

what made 60% safe in this run?

If a matched random 60% baseline performs just as well, that tells you something important about redundancy and how simple the method might be.

If the selected 60% reliably beats random 60%, that makes the selector itself substantially more interesting.

And if both look fine on aggregate loss but differ on a tiny long-range dependency probe, that gives a fairly clean next design boundary without invalidating the efficiency idea.

That seems like a lot of information for only a few small additional checks.

Is the training script already set up so you can switch between full context, random 60% and Spiral 60% without changing much else?

Thank you — this is exactly the kind of feedback I was hoping for.

I agree that the matched random-block 60% control is the highest-value next experiment. The current script has full-context and Spiral-selected modes, but not yet the matched random-block mode. I will add it so that only the block-choice policy changes while the model, data split, seed, block size, position policy, and loss masking remain fixed.

I will also add measurements at step 0, 12, 24, and 48, report selection overhead separately, and build a small cross-block dependency probe before moving to a larger benchmark.

Thank you again for the careful evaluation plan and the related-work pointers.

Not yet. The current script supports full-context baseline and Spiral-selected context under the same model, initial adapter state, data split, optimizer, batch size, sequence length, and seed.

A matched random-block 60% mode is the next change I am adding. The goal is to make full context, random 60%, and Spiral 60% differ only in the block-choice policy, so the comparison is controlled.

Nice, that sounds like the right shape.

Once the random 60% mode is in, if you’re happy to share the training command or script entrypoint for the three cases, I can help turn it into one clean eval run so you can execute all three with the same settings and compare the checkpoints/results consistently.

Thank you again — I implemented the matched control you suggested and completed the 48-step, 8K, three-seed comparison.

All conditions used the same Qwen2.5-7B 4-bit QLoRA setup, data split, initial adapter state, optimizer, batch size, sequence length, and seed. End-to-end timing included selection work. Selected blocks used compact positions, and the first loss target after a non-adjacent join was masked.

Mean results across seeds 17, 29, and 43:

  • Full-context held-out loss: 0.443981

  • Random-block 60% held-out loss: 0.445061

  • Spiral-selected 60% held-out loss: 0.444474

  • Spiral versus random loss difference: -0.000587

  • Spiral versus full loss difference: +0.000493

  • Spiral end-to-end step speedup versus full context: 1.668x

  • Peak VRAM reduction versus full context: 6.040 GB

My interpretation is that generic shortening explains most of the efficiency gain on this local corpus. However, Spiral was slightly better than matched random selection in all three seeds. The effect is small, so I do not treat it as proof that the selector is generally superior.

The next addition is the controlled cross-block dependency probe you suggested, followed by a task-level evaluation.

Thanks — I have now added the three-condition entry point in the repository: full context, matched random blocks, and Spiral-selected blocks run from the same initial adapter state and report the same checkpoints.

The exact local text corpus used for the current internal result is not public, so I do not want to present the current numbers as fully reproducible by another person yet. The script can run on a user-provided local text corpus, but I am preparing a small public deterministic evaluation input so that the comparison contract can be reviewed and run without relying on my local corpus.

For protocol review, the important controls now held fixed are model, adapter initial state, split, optimizer, batch size, sequence length, seed, block size, position policy, and join-loss masking.

Thank you again for the evaluation plan. I completed the requested controls and added one further mechanism comparison.

1. Controlled 8K QLoRA training results

I ran full context, matched random 60%, the original cheap Spiral gate, and a compact semantic selector across seeds 17, 29, and 43.

All runs used Qwen2.5-7B-Instruct, 4-bit NF4 QLoRA, one RTX PRO 6000 Blackwell GPU, 8,192-token sequences, 48 steps, the same local split, initial adapter state, optimizer, batch size, block size, compact position policy, and join-loss masking. Selection time is included in end-to-end step time.

Mean results across the three seeds:

Condition Mean step time Full-context held-out loss
Full context 2676.57 ms 0.443962
Random blocks, ~60% 1596.40 ms 0.445005
Original cheap Spiral gate 1594.98 ms 0.444530
Tail-anchored semantic selection, ~60% 1624.53 ms 0.445099

The original cheap gate averaged 1.678x speedup and 6.040 GB lower peak VRAM versus full context. It was slightly better than matched random on this local corpus, with a mean loss difference of -0.000475.

The semantic selector averaged 1.647x speedup and 5.956 GB lower peak VRAM versus full context. Its mean selection overhead was 31.28 ms per step, compared with 2.16 ms for random selection and 1.27 ms for the cheap gate.

2. Controlled cross-block dependency probe

I also ran a separate synthetic coverage probe with two distant evidence blocks required together for the final question, at the same ~60% context budget.

Across 144 cases over the same three seeds:

  • Original cheap gate retained both required blocks: 0 / 144

  • Matched random selection retained both: 31 / 144 = 21.53%

  • A compact query-aware semantic selector retained both: 144 / 144

This exposed an important distinction. The original cheap gate is effective as a very low-overhead reduction policy on the local corpus, but it is not query-aware and did not preserve the deliberately constructed distant dependency. The semantic selector solved that controlled coverage problem, but its training version used the protected target tail as an offline anchor and did not improve aggregate held-out loss over random selection on the current generic corpus.

My current interpretation is that generic shortening explains most of the compute benefit on this corpus. The evidence is not yet sufficient to claim that semantic selection improves general fine-tuning quality. The next experiment I am considering is a dependency-rich task-level corpus or a small RULER-style / long-document QA evaluation, where the target anchor contains a meaningful task signal rather than generic continuation text.

I would appreciate your view on whether that is the right next boundary to test.

I think that makes sense:


I would move to a dependency-rich task-level test next, with one qualification: I would not treat that as “replace the cheap Spiral gate with the semantic selector.”

Your latest results look more useful to me if they are read as exposing two different operating points:

cheap Spiral gate
    → very low-overhead generic context reduction

query-/target-aware semantic selection
    → more expensive dependency protection when the task supplies
      a meaningful signal about what must survive

That distinction seems worth preserving rather than forcing both selectors into a single winner/loser comparison.

On the generic local corpus, the cheap gate is still doing something useful: it stays very close to random/full-context loss while retaining roughly the same large step-time/VRAM reduction. On the deliberately constructed dependency probe, however, the cheap gate and random selection can cut the required pair, while the query-aware semantic selector can protect it.

So my default next step would be a small task-level bridge, not a large benchmark sweep:

dependency-rich dataset with known required evidence
        ↓
selector-only coverage check
        ↓
small task-level inference check
        ↓
only then: controlled QLoRA comparison

For the eventual training comparison, I would keep the core conditions small:

full context
matched random 60%
cheap Spiral 60%
query-aware / task-aware semantic 60%

and, when the task exposes an actual query, optionally add a very cheap lexical baseline such as BM25 at the same block budget.

For every condition I would record three things together:

1. did the selected context retain the required evidence?
2. did that translate into task success?
3. what did it cost end-to-end?

That would answer a more useful question than either aggregate held-out loss or evidence coverage alone:

does preserving the dependency actually buy training/task quality at a cost that is worth paying?

A 2-hop MuSiQue subset looks particularly suitable for a first pass because its questions were constructed specifically so that one reasoning step depends on another, and the official repository exposes the underlying multi-hop structure. I would use something like RULER as a mechanism probe alongside that, rather than making a synthetic benchmark the main task-level result.

One useful extra evaluation-only condition is:

gold evidence only

That is almost free once the dataset provides support labels. If gold-only works well but a selector that retained all gold evidence still performs poorly, the next bottleneck is probably no longer selection recall; it is somewhere in the noisy-context recognition / prioritization / synthesis path.

That separation has become fairly explicit in recent multi-hop work as well. Failure Modes in Multi-Hop QA: The Weakest Link Effect and the Recognition Bottleneck separates locating the evidence from integrating it, and its released experimental code includes fixed-distractor multi-hop setups and gold-focused controls that seem useful as evaluation-design references.

I would therefore see your next boundary roughly as:

"can the selector preserve both required blocks?"
                    ↓
"can the model use those blocks among distractors?"
                    ↓
"does training on that selected context improve the task?"
                    ↓
"does the improvement justify selector overhead?"

rather than jumping directly from 144/144 coverage to a claim about fine-tuning quality.

Why I would keep the cheap gate and semantic selector as separate design branches

The current results seem to support keeping both ideas alive.

For the generic 8K QLoRA experiment, your reported means were approximately:

Condition Step time Full-context held-out loss
Full 2676.57 ms 0.443962
Random ~60% 1596.40 ms 0.445005
Cheap Spiral gate ~60% 1594.98 ms 0.444530
Tail-anchored semantic ~60% 1624.53 ms 0.445099

The cheap gate therefore still looks like a very inexpensive way to obtain most of the physical-sequence-shortening benefit on this corpus.

Its selector overhead was about 1.27 ms/step, versus 31.28 ms for the semantic training selector. But even 31 ms is only a small part of the ~1.62 s selected-context step in this particular run, so I would not read that overhead as a reason to discard semantic selection either. If semantic selection buys measurable task quality on dependency-rich data, that could still be a very reasonable trade.

The controlled dependency probe answers a different question:

cheap gate:       required pair retained 0 / 144
random:                              31 / 144
query-aware semantic:               144 / 144

To me this is less:

semantic selector > cheap selector

and more:

generic compression objective
        !=
dependency-preservation objective

That distinction could eventually lead to a hybrid policy rather than one universal selector:

ordinary / redundant samples
    → cheap gate

samples with an explicit task/query or strong long-range dependency
    → dependency-aware selector

There is some related motivation for thinking about the data as dependency-rich or dependency-poor rather than assuming every long sequence needs the same treatment. ProLong, for example, is not a block selector like yours, but explicitly distinguishes raw sequence length from the strength, distance, and specificity of long-range dependencies in the training data.

I would treat that as a later design direction rather than something required for the next experiment.

A low-cost task-level protocol

I would stage this so that an expensive QLoRA run is the last step, not the first.

Stage A — selector-only audit

No model training is needed.

For each task example, record the gold-support blocks and run:

random 60%
cheap Spiral 60%
semantic 60%
optional BM25 60%

Then report something like:

P(all required evidence retained)
P(hop 1 retained)
P(hop 2 retained)
number of retained fragments / joins
selected-token count
selector time

If the semantic selector does not separate from cheap/random here, there is little reason to spend GPU time training it on that dataset.

If it strongly separates, proceed.

Stage B — frozen-model task probe

Before fine-tuning, feed the selected contexts to a frozen model and measure:

question only
gold evidence only
random-selected context
cheap-Spiral-selected context
semantic-selected context
full context, if practical

This is not the final fine-tuning result. It just tells you whether the selected context is usable.

The informative comparisons are:

gold-only strong
semantic weak despite retaining gold
    → evidence recall is not the remaining bottleneck

semantic ≈ gold-only
random / cheap much lower
    → selector-specific dependency preservation is promising

all selected conditions weak
    → task/model/prompt may be the bottleneck before training

Stage C — small controlled QLoRA run

Only after A/B show a meaningful separation would I run the expensive comparison.

Keep fixed what you already made explicit:

model
initial adapter state
split
optimizer
batch size
sequence length
block size
compact-position policy
join-loss masking
seed

and vary only the context-selection policy.

The useful output table would combine quality and compute rather than publishing them separately:

Policy Evidence retained Task score Full-context held-out loss Selector ms End-to-end step ms Peak VRAM
Full
Random 60%
Cheap Spiral 60%
Semantic 60%

If the existing 0 → 12 → 24 → 48 checkpoints are already available, I would keep them as a useful secondary diagnostic, but I would not make a large checkpoint sweep a prerequisite for this task-level experiment.

Why evidence retention and answer quality should be separate columns

One trap here is that a selector can be objectively better at retaining required information without producing an immediate improvement in aggregate model quality.

Those are different stages:

selection:
    are the necessary blocks present?

recognition:
    does the model locate / prioritize them among distractors?

synthesis:
    can it combine them correctly?

learning:
    does the resulting training signal improve the adapter?

The Weakest Link work is useful here because it explicitly asks whether multi-hop failures come from evidence recognition or evidence integration.

That distinction also fits your current result surprisingly well:

semantic selector:
    controlled evidence coverage looks excellent

generic held-out LM loss:
    no clear advantage over random

Those two observations do not have to conflict.

The generic continuation corpus may simply not reward the type of dependency preservation that the controlled probe tests.

This is also why I would keep your full-context held-out loss but stop asking it to carry the entire quality claim.

LongPPL / “What is Wrong with Perplexity for Long-context Language Modeling?” gives a useful general warning: average LM loss can hide a small subset of tokens whose prediction actually depends on distant context.

You do not need to adopt LongPPL itself for the next experiment. A task with known dependency-bearing evidence/targets already gives you a much simpler version of the same diagnostic idea.

Why MuSiQue first, RULER second, and a broader benchmark later

I would give these tools different jobs rather than choosing one benchmark to do everything.

MuSiQue — first task-level bridge

MuSiQue was specifically designed around connected multi-hop reasoning: one sub-question is selected so that a later reasoning step critically depends on its answer.

That makes it unusually convenient for your case because you can ask both:

did the selector preserve the required support?

and:

did the resulting context support the final answer?

The MuSiQue repository also makes the dataset structure reusable rather than requiring you to invent a private synthetic task.

I would probably start with 2-hop cases before 3/4-hop examples so the interpretation stays simple.

RULER — controlled mechanism stress

RULER remains useful for things such as:

  • multiple-needle retrieval,
  • variable tracking,
  • configurable hop counts,
  • aggregation.

Its own README explicitly says it is a sanity-check test bed and is not comprehensive enough to replace realistic tasks.

That seems exactly right here.

Use it to answer:

what kind of dependency does this selector sever?

rather than:

does this prove downstream quality?

HELMET / realistic RAG — later breadth check

HELMET is useful mainly for the next stage.

Its large study found that synthetic needle-style performance does not reliably predict downstream long-context performance, and it recommends its RAG tasks as a relatively convenient development-time signal before broad evaluation.

So a progression like this still looks economical:

controlled dependency coverage
        ↓
small MuSiQue / multi-hop task
        ↓
small realistic RAG or long-document QA task
        ↓
only then broader long-context evaluation

That gives each test a clear purpose.

The selector's information contract is worth making explicit

I would separate at least three selector classes.

1. Query-only / task-input-aware

The selector can use information available at inference or ordinary task execution time:

question / instruction
+
candidate context

This is the cleanest contract if the future application is QA/RAG-style selection.

2. Target-aware / training-only

The selector can use a protected target tail, labels, or another signal that exists during fine-tuning but would not necessarily exist during inference.

I would not call this inherently invalid or “leakage.”

If SpiralCoreAttention is specifically a training-time context-selection method, using training-only information may be a perfectly legitimate design.

It just supports a different claim:

query-only:
    online/task-conditioned selection

target-aware:
    offline/training-time selection

The useful thing is simply to label the distinction.

3. Gold/oracle

The selector is explicitly given the known evidence/support labels.

That is not a deployable baseline; it is a ceiling/diagnostic.

For example:

semantic retains all gold evidence but task score is far below gold-only

is much more informative than simply saying semantic selection failed.

It tells you that improving selector recall further is unlikely to address the main bottleneck.

Because your training semantic selector uses a protected target tail as an offline anchor, while the controlled coverage probe is described as query-aware, I would keep those two experimental contracts visibly separate rather than merging them under one generic “semantic selector” label.

A cheap lexical baseline may help isolate what the semantic scorer is buying

Once there is an explicit query/task signal, I think BM25 block ranking at the same budget is a useful cheap control.

The comparison becomes:

random
    → no task information

BM25
    → cheap lexical task information

semantic
    → richer semantic task information

Then:

semantic ≈ BM25 >> random
    → query-awareness matters, but a semantic scorer may not be necessary

semantic >> BM25 >> random
    → evidence for value beyond lexical matching

BM25 ≈ semantic ≈ random
    → task/query signal is not helping selection much

coverage improves but task score does not
    → selection recall is no longer the main boundary

I would only add BM25 where there is a genuine query/task anchor. It is not an obvious baseline for generic next-token continuation where there is no meaningful query.

This is similar in spirit to the attribution question behind instance-aware methods such as TokenSeek: the mechanism is different, but it is useful to separate benefits from reducing the token budget from benefits obtained by selecting tokens using instance-specific information.

About the 31 / 144 random dependency result

I would not compare 31/144 directly with:

0.6 × 0.6 = 36%

unless every block is independently eligible for the same 60% sampling probability.

If part of the selected-token budget is reserved in advance—for example for a protected target region—then the random selector may actually be doing something more like:

protect some blocks first

then:

choose k additional blocks
from N remaining eligible blocks

For two required blocks that are both in that remaining pool, their joint inclusion probability is governed by sampling without replacement from N, not simply by squaring the global retained-token ratio.

So the only extra reporting I would want here is very small:

total block count
protected block count
random-eligible block count
number randomly selected from that pool

With those four values, the expected random pair-retention rate becomes unambiguous.

I would treat this as documentation of the comparison contract, not as a problem with the 31/144 result.

One small independent sanity check that changed how I would interpret the result

I also tried a deliberately small public-data side probe—not a reproduction of your training setup, and not evidence about the Spiral selector itself.

I built 48 fixed ~8K two-hop cases from public MuSiQue-derived material, with two known required evidence blocks and distractors, then compared matched ~60% block selection policies.

On that constructed fixture:

required pair retained:

random, one selection seed: 21 / 48
BM25 query-only:           39 / 48
semantic query-only:       48 / 48

So the semantic selector did exactly what I would hope at the coverage layer.

I then used a frozen 4B instruction model as a crude task probe on those selected contexts.

With a longer output cap, the diagnostic primary-answer F1s were roughly:

gold evidence only:   0.539

semantic 60%:         0.162
BM25 60%:             0.164
random 60%:           0.141

I would not treat those numbers as a benchmark:

  • the fixture was constructed;
  • most distractor material was still synthetic/controlled rather than a natural long document;
  • this was frozen inference, not QLoRA;
  • the model was not your 7B training model;
  • the metric used only the primary answer rather than the full official MuSiQue alias set.

But qualitatively it was useful.

It showed a very concrete failure mode:

semantic selector:
    nearly perfect evidence retention

model:
    still far below the gold-only condition

In other words, improving selection recall can expose a second bottleneck rather than automatically solving the task.

That is why I would report:

retained?
used successfully?
task correct?

as separate quantities in the next experiment.

A decision tree I would use after the next run
dependency-rich task
        |
        v
Does semantic selection retain required evidence
more reliably than random / cheap Spiral?
        |
        +-- no
        |     |
        |     → semantic scoring is not buying the intended mechanism
        |       on this task
        |
        |     → keep the cheap gate unless another task motivates it
        |
        +-- yes
              |
              v
Does task quality improve too?
              |
              +-- yes
              |     |
              |     → selector-specific dependency preservation
              |       now has task-level evidence
              |
              |     → compare quality gain against the extra
              |       selector overhead
              |
              +-- no
                    |
                    v
              Is gold-only much better?
                    |
                    +-- yes
                    |     |
                    |     → selection recall is probably no longer
                    |       the main bottleneck
                    |
                    |     → investigate distractor sensitivity,
                    |       evidence prioritization / ordering,
                    |       and multi-hop synthesis
                    |
                    +-- no
                          |
                          → the model/task/training horizon itself may
                            be limiting the observable separation

A second branch is useful if BM25 is included:

semantic ≈ BM25 > random
    → task-aware selection matters;
      expensive semantic scoring may not be necessary

semantic > BM25 > random
    → stronger evidence that semantic matching itself contributes

semantic coverage > BM25
but task quality ≈ BM25
    → the extra retrieved evidence is not yet translating into utility

That seems like a fairly high-information experiment without turning the project into a benchmark campaign.

The main thing I would preserve from the current results is that the original cheap gate does not look invalidated by the dependency failure.

Instead, the new probe seems to have identified a boundary of what that gate is optimizing.

For a generic, redundant corpus, an extremely cheap selection rule may be enough to get most of the compute/VRAM benefit.

For a task where one distant dependency is disproportionately important, a different selector may be worth paying for.

If the next task-level experiment confirms that split, I think that is actually a cleaner result than trying to make one selector dominate every regime:

cheap shortening when shortening is enough

dependency-aware selection when the dependency matters

And if semantic selection still fails to improve task quality despite reliably preserving the evidence, that is also a useful result: it moves the next design question downstream from which blocks are selected to how selected evidence is recognized and used.

Thank you — I followed the task-level bridge you proposed rather than moving directly to a larger training sweep.

I treated the cheap gate and query-aware semantic selector as separate operating points, not as a winner-take-all replacement:

  • The cheap gate remains the low-overhead generic shortening branch. On the earlier local QLoRA corpus it retained the large step-time/VRAM benefit while remaining close to the matched random/full-context loss.

  • The semantic branch is the dependency-protection policy used only when a meaningful task signal, here the MuSiQue question, is available.

I then ran the task-level protocol on MuSiQue-Ans 2-hop development cases:

dependency-rich data with gold support labels
→ selector-only evidence coverage
→ task-level inference with the unchanged base model
→ gold-evidence-only diagnostic

The test used two non-overlapping 100-case slices, for 200 cases total. Each reduced policy retained the same 60% paragraph budget. Paragraphs were capped at 192 tokens, and the answer model was frozen 4-bit Qwen2.5-7B-Instruct.

Combined results:

Policy Both gold evidence retained Exact Match Token F1
Full context 100.0% 0.190 0.3459
Matched random 60% 31.5% 0.140 0.2452
Cheap gate 60% 39.5% 0.105 0.2293
Query-aware semantic 60% 72.5% 0.195 0.3583
Hybrid semantic + cheap 60% 69.0% 0.185 0.3361
Gold evidence only 100.0% 0.465 0.5977

For the query-aware semantic policy, mean prompt input fell from 2,342 to 1,420 tokens. Mean prefill-plus-selection time was 97.3 ms, compared with 143.1 ms for full context, approximately 32% lower in this internal setup.

My interpretation is aligned with your framing:

  1. Generic shortening alone does not protect multi-hop dependencies: random retained both gold passages in 31.5% of cases, and the cheap gate in 39.5%.

  2. Query-aware semantic selection substantially improves dependency retention: 72.5% at the same reduced budget.

  3. That retention translated into materially better task F1 than random selection. Its numerical F1 was also close to full context, but I do not treat the small difference versus full context as evidence of improvement.

  4. Gold-evidence-only was important: even with perfect supporting evidence, the frozen 7B reader reached only 0.465 EM and 0.598 F1. So the remaining boundary is downstream of selection: recognizing, prioritizing, and composing the retained evidence.

The hybrid policy did not yet beat pure semantic selection, so I am not presenting it as a preferred method.

My next step is therefore not to collapse the two branches into one. I plan to preserve cheap generic shortening as one operating point, semantic dependency protection as another, and then add the controlled QLoRA comparison only after separating cases where selection failed from cases where the reader had the necessary evidence but failed to use it.

Your proposed three-column structure — evidence retained, task success, and end-to-end cost — made the result much more interpretable.

If you know researchers or engineers who work on long-context training, multi-hop QA, retrieval, or context-selection evaluation, I would be grateful if you felt comfortable sharing this thread with them. I am specifically looking for critical technical feedback on the evaluation design, the selector’s failure modes, and the reader-side bottleneck after evidence is retained, rather than promotional exposure.

Thank you again.

Thank you again. I completed the controlled QLoRA follow-up you suggested.

This comparison used Qwen2.5-7B-Instruct with 4-bit NF4 QLoRA on MuSiQue 2-hop data. I kept the base model, initial adapter state, optimizer configuration, data order, batch size, sequence budget, training steps, and held-out full-context evaluation prompts fixed. The only intended change was the paragraph-selection policy during training.

I ran three seeds (17, 29, 43), using 96 training cases, 192 steps, an 80-case held-out evaluation set, and a 60% paragraph budget.

Mean results across the three seeds:

Training policy Held-out full-context F1 EM Step time Peak VRAM Train examples retaining all gold support
Full context 0.4119 0.2875 684 ms 13.214 GB 100.0%
Matched random 60% 0.3421 0.2125 406 ms 11.130 GB 37.5%
Cheap gate 60% 0.3460 0.2042 411 ms 11.105 GB 43.8%
Query-aware semantic 60% 0.4516 0.3333 410 ms 11.228 GB 80.2%

The common untrained adapter started at 0.3803 F1 / 0.225 EM.

My cautious reading is:

  • The matched random control confirms that generic shortening alone loses important multi-hop evidence.

  • The semantic policy retained substantially more complete gold evidence than random or the cheap gate at the same 60% budget.

  • In this internal three-seed pilot, semantic selection was better than matched random and also numerically higher than full-context fine-tuning on the common held-out full-context evaluation.

  • It preserved the reduced-context efficiency effect: about 1.67x faster training steps and about 1.99 GB lower peak VRAM than full context.

  • The semantic preprocessing cost was about 5.8 ms per training example, reported separately from the training-step timing.

I do not take this as evidence of general superiority over full context, pretraining cost reduction, or production behavior. It is still a small internal 7B QLoRA experiment. But it does seem to support the distinction you emphasized: at a fixed context budget, task-aware selection can preserve dependencies that generic shortening does not.

My next step is to analyze per-example failures: separating cases where evidence was not retained from cases where it was retained but the reader still failed to compose it. Thank you again for steering the evaluation toward this control.

I think the overall picture is much clearer now:


I think your proposed per-example failure analysis is the right next step, and I would probably do that before adding another training sweep.

The one change I would make is to split the current:

evidence retained
vs
reader failed

into a slightly more explicit chain:

paragraph selected
        ↓
required evidence still survives paragraph/token preprocessing
        ↓
reader recognizes / prioritizes that evidence
        ↓
reader composes the multi-hop answer correctly
        ↓
training gain appears
        ↓
gain is worth the selector cost

That distinction seems especially useful now because the latest result is no longer just a coverage result.

At the same 60% paragraph budget, the query-aware semantic policy retained much more complete gold support than random/cheap selection, and in the controlled QLoRA pilot that also coincided with a materially higher held-out full-context task score.

I would still be cautious about the numerical semantic > full result itself. I would read it as an interesting mechanism question, not yet as evidence that selected context is generally better than full context.

So my default next route would be:

existing adapters/checkpoints
        ↓
save exact eval IDs + predictions
        ↓
save selected paragraph IDs + post-cap inputs
        ↓
run the official MuSiQue metric path
        ↓
paired per-example failure analysis
        ↓
add a cheap BM25 boundary
        ↓
only then decide whether another training experiment is needed

That seems likely to extract more information from the runs you already paid for than another immediate QLoRA sweep.

A minimal per-example record like this would already support most of the analysis:

example_id
seed
training_policy
gold_support_paragraph_ids
selected_paragraph_ids
original paragraph token lengths
post-cap paragraph token lengths
prediction
reference answer + aliases
EM / F1
selector timing / caching status

If the existing policy×seed adapters are still available, I would also consider evaluating them on a larger common 2-hop held-out set before retraining anything. The current 80-case result is useful as a controlled pilot, but a broader inference-only pass would make it much easier to tell whether the difference is broad or concentrated in a small number of examples.

I would split evidence retention one step further

One thing I would make explicit in the failure analysis is:

support paragraph retained

is not necessarily the same as:

usable evidence retained

if the paragraph is subsequently capped or otherwise transformed.

If the QLoRA path is still using the 128-token paragraph cap described in the current experiment setup, that looks worth auditing directly.

I did a small independent check on the public MuSiQue-Ans 2-hop dev data using the Qwen2.5 tokenizer. This was not a reproduction of your train/eval split or selector; I only wanted to see whether the cap could be a visible variable at all.

On that public set, roughly 37.6% of gold-support paragraphs exceeded 128 tokens.

I then used a deliberately weak diagnostic: for each supporting paragraph where a decomposition-step answer string could be found verbatim in the original paragraph, I checked whether that string was still present after the 128-token cap.

Most survived individually, but not all. At the example level, roughly 10.8% of the auditable 2-hop cases lost at least one such mapped answer string after truncation.

I would not interpret that as:

10.8% of examples are broken by the cap.

The string check is much too crude for that. A reasoning dependency can survive without the exact answer string, and the string can survive without the full useful reasoning evidence.

But it was enough to convince me that the clean failure decomposition is probably:

gold paragraph selected?
        ↓
required content survives preprocessing?
        ↓
reader succeeds?

rather than stopping at paragraph IDs.

This also connects nicely to the distinction in Failure Modes in Multi-Hop QA: The Weakest Link Effect and the Recognition Bottleneck.

That paper separates failures in recognizing/locating required evidence from failures in integrating it, and shows on MuSiQue and other multi-hop settings that one poorly visible required fact can bottleneck the whole reasoning chain.

I would use that mostly as an evaluation-design precedent, not as a claim that your model is exhibiting exactly the same mechanism.

A useful table might therefore look like:

Gold paragraphs selected Evidence survives preprocessing Answer correct Likely boundary
No No Selection
Yes No No Preprocessing / cap
Yes Yes No Recognition / synthesis
Yes Yes Yes Successful path

And I would keep a fifth bucket for:

proxy says evidence is absent
but answer is correct

because that can expose either alternate evidence, shortcuts, or limitations in the proxy itself.

The semantic > full result is interesting, but I would test it pairwise before interpreting it

The current mean F1 pattern is more interesting to me when written relative to the common untrained adapter:

step 0     0.3803

full       0.4119   (+0.0316)
random     0.3421   (-0.0382)
cheap      0.3460   (-0.0343)
semantic   0.4516   (+0.0713)

So the observation is not only:

semantic > full

It is also:

generic evidence-poor shortening
    → fell below the common starting point

full context
    → learned somewhat

task-aware semantic selection
    → learned more in this pilot

That makes dependency preservation a plausible explanation.

But there are still several other explanations consistent with those means:

dependency preservation
hard-distractor filtering
cleaner / easier small-data curriculum
position or ordering changes
compact-position geometry
optimizer / training-horizon interaction
ordinary finite-sample variation

I would therefore avoid choosing one yet.

The cheapest discriminator is probably paired data from the runs you already have:

per-seed F1 / EM
+
same-example semantic vs full results
+
win / tie / loss counts
+
paired bootstrap over examples

The exact statistical machinery is less important than seeing whether the advantage is:

many small improvements

or:

a handful of large flips

and whether its sign is reasonably consistent across the three seeds.

This seems especially useful in a 96-example fine-tuning setting. Measuring the Instability of Fine-Tuning is a useful general reminder here: fine-tuning on small datasets can be seed-sensitive, and aggregate standard deviation alone does not capture every useful notion of instability.

My decision boundary would be roughly:

semantic > full persists
across seeds
+
on a broader inference-only evaluation
+
in paired per-example comparisons
        ↓
mechanism investigation becomes quite worthwhile

versus:

semantic > full weakens or becomes unstable
        ↓
the stronger supported claim remains:

semantic > random / cheap
at the same reduced context budget

That second outcome would still be a useful result.

I would not treat full context as a theoretical quality ceiling either.

Lost in the Middle gives a good general reason not to assume that simply supplying more relevant context guarantees the model will use it robustly: long-context QA performance can change substantially with the position of relevant information.

That does not establish the cause of your current result, but it makes semantic > full something worth investigating rather than dismissing automatically.

A BM25 row now looks unusually informative

Now that the experiment has a real task query, I think BM25 has become a particularly clean attribution control.

The comparison would be:

random
    → no task signal

BM25
    → cheap lexical task signal

semantic
    → richer semantic task signal

I ran a separate public-data sanity check on the official MuSiQue 2-hop dev set at the same 60% paragraph budget.

Again, this did not reproduce your selector, your 96/80 split, or the QLoRA experiment. It was only a selector-level check.

The approximate both-gold-support retention rates were:

matched random                 36.6%
BM25 over question → context   56.6%
MiniLM semantic proxy          75.1%

The exact random expectation under the common 20-paragraph / choose-12 / two-required-paragraph structure is about:

(12 / 20) × (11 / 19) ≈ 34.7%

so the random result behaved roughly as expected.

The more interesting part was:

semantic proxy > BM25 > random

on the public task.

I would not compare the MiniLM percentage directly with your 72.5% or 80.2% numbers. The public proxy used all-MiniLM-L6-v2, which is simply a convenient public semantic-search model, and its own model card notes that longer inputs are truncated by default.

So I see that result only as independent evidence for this evaluation distinction:

semantic ≈ BM25 >> random
    → query-awareness is doing most of the work;
      the semantic scorer may not be necessary

semantic >> BM25 >> random
    → stronger evidence that semantic matching adds something
      beyond lexical query matching

semantic retains more evidence
but BM25 and semantic task scores are similar
    → the extra coverage is not translating into reader utility

That seems like a lot of attribution information for a very cheap extra row.

I would only use BM25 in the task-aware branch, though.

It is not an obvious baseline for the generic continuation setting where there is no meaningful query or task anchor.

If semantic stays above full, I would treat that as a mechanism question

MuSiQue makes the distractor-filtering hypothesis somewhat more plausible than it would be on an arbitrary collection of long text.

The MuSiQue paper was designed specifically around connected multi-hop reasoning, and its context construction deliberately includes difficult distractors rather than merely padding questions with unrelated text.

That matters because semantic selection may be doing something closer to:

remove task-confusable distractors
+
preserve the two dependent supports

rather than merely:

make the prompt shorter

There is also an interesting precedent in the official MuSiQue repository.

On the released MuSiQue-Answerable dev results, the repository reports:

End2End answer F1          0.423
Select+Answer answer F1    0.473

and the corresponding step-execution variants are also numerically higher for the select-then-answer route.

Those systems are quite different from SpiralCoreAttention, so I would not use this as evidence for your method.

But it is a useful task-specific precedent that filtering/selecting context before answering can be beneficial on MuSiQue.

There is another relevant direction in Tackling Distractor Documents in Multi-Hop QA with Reinforcement and Curriculum Learning.

In that setting, training examples with fewer distractors allowed citation and reasoning skills to be learned more sample-efficiently, and the models could later generalize to noisier retrieval contexts.

That suggests a plausible small-data interpretation of your current result:

semantic selection
    → cleaner dependency-bearing training examples
    → stronger learning signal over 96 examples / 192 steps

But I would still call that a hypothesis, not the explanation.

A very cheap way to investigate it would be to inspect:

semantic correct / full wrong

cases and record:

where the two gold paragraphs occur in the full prompt
how many distractors precede / separate them
whether both survive the cap
their order in the semantic-selected prompt
whether the full prediction looks like a one-hop / partial-answer failure

If full-context failures visibly cluster around position or distractor patterns, the recognition/filtering explanation becomes more plausible.

If they do not, finite-sample or optimization explanations stay very much alive.

Coverage and reader success should remain separate columns

I think the gold-only result remains one of the most useful diagnostics in the whole sequence of experiments.

Your frozen-model bridge had:

gold evidence only
    >> noisy selected/full contexts

but gold-only was still far from perfect.

That implies at least two separable limits:

selector limit:
    did the right evidence survive?

reader limit:
    can the model use it?

So even a hypothetical selector with 100% support recall does not automatically solve the task.

I would keep the layers separate:

selection
    are the required passages chosen?

preprocessing
    does the useful content survive caps / joins?

recognition
    does the reader find and prioritize it?

synthesis
    can it combine both hops correctly?

This is also why I would not respond to every retained-but-wrong example by immediately modifying the selector.

If the evidence is clearly present and usable, the next useful experiment may instead concern:

evidence ordering
position
reader prompting
multi-hop composition
distractor sensitivity

The Weakest Link / Recognition Bottleneck work is particularly useful as a conceptual map here because it explicitly asks whether long-context multi-hop failures come from locating evidence or integrating it.

I would still keep the cheap and task-aware branches separate

Nothing in the MuSiQue result makes me think the cheap gate should be discarded.

I would still describe the two branches as different operating points:

cheap gate
    → generic low-overhead physical shortening

query-aware semantic selector
    → dependency protection when a meaningful task signal exists

The cheap gate failed to preserve deliberately important multi-hop evidence as reliably as the semantic branch, but that is not necessarily a failure of its original objective.

On the earlier generic local corpus it was extremely cheap and preserved most of the physical-shortening benefit while staying close to the other conditions in held-out LM loss.

So I would keep the distinction:

generic compression objective
        !=
dependency-preservation objective

If the project eventually needs both, a later hybrid/dispatcher could be reasonable:

redundant / dependency-poor sample
    → cheap branch

explicit-query / dependency-rich sample
    → task-aware branch

but I would not make that the next experiment.

The current failure decomposition seems more informative.

A later trade-off may be clean skill acquisition vs distractor robustness

There is also a useful counterpoint to the idea that removing distractors is always good.

The curriculum result above suggests:

cleaner context
    → can make initial skill acquisition easier

But NExtLong deliberately goes in the other direction.

It constructs long-context training data by interleaving hard negative distractors between related chunks, with the goal of forcing the model to distinguish genuinely dependent content from plausible distractors.

So I would not turn the present result into:

fewer distractors are always better for training

A later design space might instead look like:

early / small-data adaptation
    → cleaner dependency-preserving context

later robustness training
    → progressively harder distractors / longer context

That is only a future option, but I think it is useful because it keeps two different objectives separate:

learn the dependency efficiently
vs
remain robust when the dependency is buried in noise
I would report semantic preprocessing as an amortization contract

The reported semantic preprocessing cost of roughly 5.8 ms per training example does not look large enough, by itself, to erase the current training-step advantage.

But I would make its lifetime explicit, because the same number means different things depending on the workflow:

A. compute once and cache
B. recompute once per epoch
C. recompute every training step

So future efficiency tables could report:

one-time preprocessing cost
+
recurring selector cost
+
model training cost
=
end-to-end workload cost

If the semantic representation or ranking can be reused, reporting the preprocessing cost separately plus its amortized cost seems perfectly reasonable.

If it is recomputed repeatedly, I would fold that repeated work into the end-to-end number.

I would treat this as a reporting contract rather than a problem with the current pilot.

I would keep full-context loss, but not ask it to carry the task-quality claim

I would still keep the full-context held-out LM loss from the earlier experiments.

It remains useful as a general training-distribution diagnostic.

I just would not make it the primary quality metric once the experiment moves into a dependency-rich task.

What is Wrong with Perplexity for Long-context Language Modeling? gives a useful reason: ordinary PPL averages over tokens and can hide the relatively small subset whose prediction really depends on distant context.

For this project I would therefore keep the roles separate:

full-context held-out LM loss
    → secondary distribution-level diagnostic

gold-support retention
post-cap usable-evidence check
task EM / F1
    → primary dependency-rich task diagnostics

I do not think you need to implement LongPPL itself for the next step; the labeled MuSiQue structure already gives you a much cheaper task-specific diagnostic.

A few reporting details would make the next result much easier to interpret

If you already have the raw predictions and selector outputs, a small reproducibility bundle would make the next comparison unusually easy to inspect:

exact train/eval IDs
per-seed EM / F1
per-example predictions
selected paragraph IDs
post-cap paragraph lengths
paragraph ordering
position policy
join-loss masking policy
semantic preprocessing caching policy

For answer scoring, I would also run the predictions once through the official MuSiQue evaluator.

The official script evaluates each prediction against:

primary answer
+
answer aliases

so this is a cheap way to make the metric contract unambiguous and avoid differences caused only by answer normalization or alias handling.

I see this mainly as making the result easier for future readers to reproduce and extend, rather than as a prerequisite for continuing the experiment.

So at this point, my working picture would be:

generic shortening
    → explains much of the compute / VRAM saving

task-aware semantic selection
    → preserves substantially more dependency-bearing evidence

controlled MuSiQue QLoRA
    → suggests that preservation can translate into training/task gain

next high-information question
    → where do the remaining failures actually occur?

If the paired/per-example analysis shows the semantic advantage is stable across seeds and examples, I think that would make the result substantially stronger: not “60% context is generally better than full context,” but something narrower and more interesting:

at a fixed reduced context budget, task-aware selection can preserve dependency-bearing training signal that generic shortening loses.

If semantic > full weakens under that analysis, I do not think that hurts the main result much. The semantic-vs-random/cheap separation would still identify a useful boundary between generic context reduction and dependency-aware context selection.

And if the evidence is usually retained but many answers still fail, then the project has learned something equally useful: the next bottleneck has moved downstream from which context is selected to how the retained evidence is recognized and composed.