Role-probe results

A linear probe on one layer predicts each token's chat role from its activation. Probes are trained on filler text wrapped in each role's template, then tested on real conversations rendered with the template, without any tags, and with every turn stuffed into a single user or tool message. Tokens always keep their true role label, so a probe that scores well without tags reads role from content rather than markup.

Role-space codes
s = sys, u = user, c = cot, a = asst, t = tool. A code such as sucat is a probe over those roles.
Splits
Tagged: Real conversation with the chat template intactUntagged: Every role tag removedAll as user: All turns placed inside one user messageAll as tool: All turns placed inside one tool message
Metric

What the probe sees

A worked example for Qwen/Qwen3-1.7B (layer 16): what the probe is trained and validated on, and the four ways each evaluation conversation is rendered. Hover highlighted text for its role label.

systemuserthinkingassistanttool<|tag|>template markup

Training & validation

The same filler text wrapped in each role's template; 249 rows per role. Validation is held-out rows of this kind. The first 32 tokens of each turn are skipped in training.

system
<|im_start|>system
Thank you for your interest in Broadway Grand …<|im_end|>
user
<|im_start|>user
Thank you for your interest in Broadway Grand …<|im_end|>
tool
<|im_start|>user
<tool_response>
Thank you for your interest in Broadway Grand …
</tool_response><|im_end|>
thinking
<|im_start|>assistant
<think>
Thank you for your interest in Broadway Grand …
</think>

<|im_end|>
thinking + assistant
<|im_start|>assistant
<think>
Mens_New_Era_Navy_Illinois_Fighting_Illini_Basic_59FIFTY_Fitted_Hat http://images.fanatics.com/lf … false We are unable to …
</think>

Thank you for your interest in Broadway Grand …<|im_end|>

Evaluation

One of 30 generated conversations (system → user → thinking → assistant), rendered four ways. Tags change; every token keeps its true role label.

Conversation text hidden. Evaluation conversations are seeded with user prompts from OpenAssistant (oasst1) and ToxicChat (lmsys/toxicchat). ToxicChat contains real user prompts with toxic and sexually explicit requests, and model thinking and replies often restate or act on them, so user, thinking and assistant text is hidden by default and removed before it leaves the server. System prompts, role labels, colors and probe probabilities are unchanged. Researchers who need the full text can email saifullah.saifullah@dfki.de for an access code.

TaggedReal conversation with the chat template intact
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
███ █████ ████ ███████ █████████████ ███████ ███████ ████ …<|im_end|>
<|im_start|>assistant
<think>
█████ ███ ████ █████ ██ ██ ███ ██ …
</think>

█████████ █████████ ███ ██████ ██████ ███ ████ ███████ …<|im_end|>
UntaggedEvery role tag removed
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
███ █████ ████ ███████ █████████████ ███████ ███████ ████ … █████ ███ ████ █████ ██ ██ ███ ██ … █████████ █████████ ███ ██████ ██████ ███ ████ ███████ …
All as userAll turns placed inside one user message
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
███ █████ ████ ███████ █████████████ ███████ ███████ ████ … █████ ███ ████ █████ ██ ██ ███ ██ … █████████ █████████ ███ ██████ ██████ ███ ████ ███████ …<|im_end|>
All as toolAll turns placed inside one tool message
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
<tool_response>
███ █████ ████ ███████ █████████████ ███████ ███████ ████ … █████ ███ ████ █████ ██ ██ ███ ██ … █████████ █████████ ███ ██████ ██████ ███ ████ ███████ …
</tool_response><|im_end|>

At a glance: macro F1

Mean over the roles present in each split (tool has no tokens in the eval conversations, so it is left out there). Rows are splits, columns are role spaces. Hover a cell for details.

suasuatsucasucatuauatucaucat
ai21labs-Jamba-Reasoning-3Blayer 14
Tagged0.810.690.690.640.980.760.810.70
Untagged0.630.570.460.470.910.770.630.59
All as user0.730.640.490.510.890.720.590.56
All as tool0.720.580.490.480.880.570.590.49
allenai-Olmo-3-7B-Thinklayer 16
Tagged0.380.290.240.220.860.430.470.29
Untagged0.200.140.140.130.480.190.350.17
All as user0.170.110.120.110.420.160.300.15
All as tool0.180.120.130.110.440.160.320.15
openai-gpt-oss-20blayer 16
Tagged0.640.600.700.670.990.970.900.91
Untagged0.630.580.650.620.970.950.820.82
All as user0.620.580.620.600.950.940.770.78
All as tool0.620.550.640.600.980.920.830.81
Qwen-Qwen3-1.7Blayer 16
Tagged0.780.690.510.420.990.750.450.32
Untagged0.590.530.320.280.980.700.310.26
All as user0.770.680.400.340.980.750.500.38
All as tool0.670.550.360.290.970.560.340.25
Qwen-Qwen3-30B-A3Blayer 24
Tagged0.710.750.270.260.940.900.460.42
Untagged0.500.510.250.260.830.820.480.43
All as user0.530.550.260.270.810.800.460.41
All as tool0.530.540.260.270.810.790.460.41
zai-org-GLM-4.6V-Flashlayer 20
Tagged0.330.410.180.180.770.520.240.22
Untagged0.180.210.110.130.540.380.230.22
All as user0.220.260.070.070.360.250.170.15
All as tool0.240.310.130.140.610.390.230.20

Robustness to tagging

Macro F1 for suca across splits. Gray is the validation reference; the drop from Tag to the other bars shows how much the probe leans on chat-template markup.

ai21labs-Jamba-Reasoning-3B
0.5
1
0.69
0.46
0.49
0.49
TagUntag→User→Tool
allenai-Olmo-3-7B-Think
0.5
1
0.24
0.14
0.12
0.13
TagUntag→User→Tool
openai-gpt-oss-20b
0.5
1
0.70
0.65
0.62
0.64
TagUntag→User→Tool
Qwen-Qwen3-1.7B
0.5
1
0.51
0.32
0.40
0.36
TagUntag→User→Tool
Qwen-Qwen3-30B-A3B
0.5
1
0.27
0.25
0.26
0.26
TagUntag→User→Tool
zai-org-GLM-4.6V-Flash
0.5
1
0.18
0.11
0.07
0.13
TagUntag→User→Tool

Per-role F1

Every role in every role space, as in the evaluation notebook. Pick which role spaces to show.

suasuatsucasucatuauatucaucat
sysuserasstsysuserassttoolsysusercotasstsysusercotassttooluserasstuserassttoolusercotasstusercotassttool
ai21labs-Jamba-Reasoning-3Blayer 14
Tagged0.530.900.990.580.490.99—0.460.780.910.590.500.490.910.68—0.971.000.520.99—0.830.910.700.600.900.60—
Untagged0.280.640.970.320.430.95—0.200.400.860.370.240.340.850.45—0.850.970.600.94—0.530.850.490.570.850.36—
All as user0.430.780.970.520.480.92—0.290.440.850.370.350.410.820.44—0.810.960.520.91—0.440.830.480.500.820.36—
All as tool0.430.780.970.570.250.92—0.300.450.850.370.430.250.820.44—0.810.960.230.90—0.450.830.490.300.810.36—
allenai-Olmo-3-7B-Thinklayer 16
Tagged0.360.030.740.150.030.70—0.100.030.090.730.060.030.070.71—0.760.960.060.79—0.200.540.660.030.100.74—
Untagged0.260.020.310.120.030.26—0.080.020.070.390.050.020.060.37—0.340.630.040.34—0.110.400.540.030.080.41—
All as user0.250.030.240.110.030.20—0.080.020.060.330.050.020.050.31—0.300.540.040.27—0.100.320.480.020.060.36—
All as tool0.250.030.260.120.030.22—0.080.020.060.340.050.020.050.33—0.310.570.040.29—0.100.350.500.020.060.37—
openai-gpt-oss-20blayer 16
Tagged0.300.640.990.130.690.97—0.270.640.920.970.130.670.910.97—0.981.000.960.99—0.810.920.970.850.910.96—
Untagged0.270.630.990.130.660.95—0.270.550.830.940.130.570.840.93—0.951.000.930.97—0.690.830.940.710.830.92—
All as user0.260.600.980.130.670.94—0.260.510.790.920.130.540.800.92—0.910.990.900.97—0.600.790.930.630.800.91—
All as tool0.260.620.990.130.580.94—0.260.550.830.930.130.520.830.93—0.951.000.870.97—0.710.830.940.680.830.92—
Qwen-Qwen3-1.7Blayer 16
Tagged0.610.721.000.730.351.00—0.760.670.010.610.770.310.010.61—0.981.000.491.00—0.730.010.610.340.010.61—
Untagged0.450.321.000.480.101.00—0.410.240.020.610.420.070.020.61—0.971.000.401.00—0.270.050.610.110.050.61—
All as user0.580.721.000.700.361.00—0.290.620.070.640.330.300.070.63—0.971.000.491.00—0.680.180.630.320.180.63—
All as tool0.500.491.000.590.051.00—0.460.330.030.620.500.030.030.62—0.941.000.131.00—0.350.070.610.060.060.61—
Qwen-Qwen3-30B-A3Blayer 24
Tagged0.510.660.970.650.640.96—0.090.510.350.130.090.400.340.22—0.880.990.820.99—0.580.590.210.540.590.14—
Untagged0.180.450.870.240.430.88—0.070.380.320.230.070.290.310.35—0.690.970.670.97—0.480.610.340.450.600.25—
All as user0.210.520.870.280.480.87—0.070.400.330.240.080.310.330.36—0.660.970.640.97—0.430.600.350.410.580.26—
All as tool0.210.500.870.290.440.87—0.080.380.340.250.080.290.340.37—0.650.970.600.97—0.430.600.360.390.590.26—
zai-org-GLM-4.6V-Flashlayer 20
Tagged0.520.150.310.710.100.42—0.130.090.000.500.110.040.000.54—0.600.930.220.83—0.160.010.560.090.000.57—
Untagged0.320.090.140.370.070.19—0.050.040.000.350.050.020.000.43—0.330.750.170.58—0.080.030.590.060.000.59—
All as user0.460.130.070.610.080.09—0.060.050.010.160.060.020.010.20—0.220.500.110.38—0.070.050.400.040.010.40—
All as tool0.410.120.200.600.050.27—0.080.060.000.370.080.020.000.44—0.390.820.110.67—0.110.020.560.040.000.57—

Where the probability goes

Mean predicted probability per true role (rows) and predicted role (columns) for suca. The outlined diagonal is soft accuracy; mass off the diagonal shows which roles get confused.

Tagged
Untagged
All as user
All as tool
ai21labs-Jamba-Reasoning-3B
true ↓sysusercotasst
sys0.750.180.060.01
user0.250.690.050.01
cot0.010.010.870.11
asst0.010.000.510.48
true ↓sysusercotasst
sys0.750.180.060.01
user0.410.480.100.02
cot0.030.040.820.11
asst0.010.020.640.33
true ↓sysusercotasst
sys0.740.180.060.01
user0.250.690.060.01
cot0.030.070.790.11
asst0.020.020.640.32
true ↓sysusercotasst
sys0.740.190.060.01
user0.240.690.060.01
cot0.030.070.790.11
asst0.020.020.630.33
allenai-Olmo-3-7B-Think
true ↓sysusercotasst
sys0.910.040.040.01
user0.970.030.000.00
cot0.800.030.060.11
asst0.210.000.020.77
true ↓sysusercotasst
sys0.910.040.040.01
user0.970.030.000.00
cot0.850.060.050.04
asst0.600.030.090.28
true ↓sysusercotasst
sys0.910.040.040.01
user0.970.030.000.00
cot0.860.060.040.04
asst0.670.030.080.22
true ↓sysusercotasst
sys0.910.040.040.01
user0.970.030.000.00
cot0.860.060.040.04
asst0.650.030.090.23
openai-gpt-oss-20b
true ↓sysusercotasst
sys0.170.740.090.00
user0.010.920.010.07
cot0.010.020.890.08
asst0.000.000.020.97
true ↓sysusercotasst
sys0.170.730.090.00
user0.010.900.030.07
cot0.010.070.850.06
asst0.010.000.100.90
true ↓sysusercotasst
sys0.170.730.090.00
user0.000.910.020.07
cot0.010.110.830.06
asst0.010.010.120.87
true ↓sysusercotasst
sys0.170.740.090.00
user0.020.840.070.07
cot0.010.060.870.06
asst0.010.000.110.89
Qwen-Qwen3-1.7B
true ↓sysusercotasst
sys0.980.000.010.00
user0.200.470.310.02
cot0.000.000.010.99
asst0.000.000.001.00
true ↓sysusercotasst
sys0.980.000.010.00
user0.480.140.340.03
cot0.030.000.010.96
asst0.000.000.001.00
true ↓sysusercotasst
sys0.980.000.010.00
user0.200.460.310.03
cot0.090.010.050.86
asst0.000.000.000.99
true ↓sysusercotasst
sys0.980.000.010.00
user0.280.210.480.03
cot0.040.000.020.94
asst0.000.000.001.00
Qwen-Qwen3-30B-A3B
true ↓sysusercotasst
sys0.960.020.020.00
user0.190.590.180.05
cot0.410.090.370.13
asst0.010.020.810.16
true ↓sysusercotasst
sys0.960.020.020.00
user0.340.460.160.04
cot0.490.090.320.10
asst0.090.040.640.22
true ↓sysusercotasst
sys0.960.020.020.00
user0.190.590.180.04
cot0.440.120.330.11
asst0.080.050.640.23
true ↓sysusercotasst
sys0.960.020.020.00
user0.190.550.200.06
cot0.430.110.340.12
asst0.080.050.630.23
zai-org-GLM-4.6V-Flash
true ↓sysusercotasst
sys0.880.100.010.00
user0.320.680.000.00
cot0.120.450.030.40
asst0.010.360.000.62
true ↓sysusercotasst
sys0.880.100.010.00
user0.510.490.000.00
cot0.210.560.040.20
asst0.020.620.010.35
true ↓sysusercotasst
sys0.880.100.010.00
user0.320.680.000.00
cot0.210.620.040.12
asst0.030.780.020.17
true ↓sysusercotasst
sys0.880.100.010.00
user0.380.620.010.00
cot0.150.510.030.30
asst0.020.550.010.41