""" Reformat convergent_final_sft_format into a more compact XML layout. All information retained — just denser nesting, fewer lines. Original (verbose): Name Cat > Sub > Risk Effect Name True Significant Medium 0.0596 ... Compact: ... 0 This should be ~40% fewer tokens while keeping all data. """ import re import pandas as pd from transformers import AutoTokenizer def compact_effects(effects_block): """Convert ......... to inline tags.""" effects = re.findall( r'\s*' r'(.*?)\s*' r'(.*?)\s*' r'(.*?)\s*' r'(.*?)\s*' r'(.*?)\s*' r'', effects_block, re.DOTALL ) parts = [] for name, imm, ext, lik, score in effects: imm_short = "T" if imm.strip() == "True" else "F" parts.append(f'') return parts def compact_actions(section_content): """Convert ......... to ....""" actions = re.findall( r'\s*(.*?)\s*(.*?)\s*', section_content, re.DOTALL ) parts = [] for action_name, effects_block in actions: effects = compact_effects(effects_block) effects_str = "".join(effects) parts.append(f'{effects_str}') return parts def compact_stakeholder_block(block): """Convert a full stakeholder section into compact form.""" # Extract stakeholder name name_match = re.search(r'(.*?)', block) if not name_match: return block name = name_match.group(1).strip() # Extract harms harms_match = re.search(r'(.*?)', block, re.DOTALL) harms_content = harms_match.group(1).strip() if harms_match else "" harm_actions = compact_actions(harms_content) if harms_content else [] # Extract harm_score hs_match = re.search(r'(.*?)', block) harm_score = hs_match.group(1).strip() if hs_match else "0" # Extract benefits benefits_match = re.search(r'(.*?)', block, re.DOTALL) benefits_content = benefits_match.group(1).strip() if benefits_match else "" benefit_actions = compact_actions(benefits_content) if benefits_content else [] # Extract benefit_score bs_match = re.search(r'(.*?)', block) benefit_score = bs_match.group(1).strip() if bs_match else "0" # Build compact lines = [f''] if harm_actions: lines.append(f'{"".join(harm_actions)}') else: lines.append('') lines.append(f'{harm_score}') if benefit_actions: lines.append(f'{"".join(benefit_actions)}') else: lines.append('') lines.append(f'{benefit_score}') lines.append('') return "".join(lines) def compact_safety_check_score(score_block): """Convert the block to compact form.""" ht_match = re.search(r'(.*?)', score_block) bt_match = re.search(r'(.*?)', score_block) rs_match = re.search(r'(.*?)', score_block) fs_match = re.search(r'(.*?)', score_block) lb_match = re.search(r'', score_block) ht = ht_match.group(1).strip() if ht_match else "0" bt = bt_match.group(1).strip() if bt_match else "0" rs = rs_match.group(1).strip() if rs_match else "0" fs = fs_match.group(1).strip() if fs_match else "0" lb = lb_match.group(1).strip() if lb_match else "unknown" return f'' def reformat_to_compact(text): """Convert full convergent_final_sft_format to compact XML.""" # Split into safety_check content and the rest (think + response) sc_match = re.search(r'(.*?)', text, re.DOTALL) if not sc_match: return text sc_content = sc_match.group(1) after_sc = text[sc_match.end():] # Extract and compact the score section first score_match = re.search(r'(.*?)', sc_content, re.DOTALL) score_compact = "" if score_match: score_compact = compact_safety_check_score(score_match.group(1)) sc_content = sc_content[:score_match.start()] + sc_content[score_match.end():] # Split into stakeholder blocks # Each block starts with and ends before the next or end stakeholder_splits = re.split(r'(?=)', sc_content) compact_blocks = [] for block in stakeholder_splits: block = block.strip() if not block or '' not in block: continue compact_blocks.append(compact_stakeholder_block(block)) # Reconstruct compact_sc = "" + "".join(compact_blocks) + score_compact + "" return compact_sc + after_sc def main(): print("Loading data...") df = pd.read_parquet("data/sft-training-data/convergent_data_10k.parquet") print("Reformatting to compact XML...") df["convergent_final_sft_format"] = df["convergent_final_sft_format"].apply(reformat_to_compact) # Check token savings tokenizer = AutoTokenizer.from_pretrained("models/starting-checkpoint") original_df = pd.read_parquet("data/sft-training-data/convergent_data_10k.parquet") orig_tokens = [] compact_tokens = [] for orig, compact in zip(original_df["convergent_final_sft_format"], df["convergent_final_sft_format"]): orig_tokens.append(len(tokenizer.encode(orig))) compact_tokens.append(len(tokenizer.encode(compact))) import numpy as np orig_arr = np.array(orig_tokens) comp_arr = np.array(compact_tokens) savings = 1 - comp_arr.mean() / orig_arr.mean() print(f"Original: mean={orig_arr.mean():.0f}, max={orig_arr.max()}") print(f"Compact: mean={comp_arr.mean():.0f}, max={comp_arr.max()}") print(f"Savings: {savings:.1%} fewer tokens") # Verify no data loss on a sample print("\nSample compact output:") print(df["convergent_final_sft_format"].iloc[0][:1500]) output_path = "data/sft-training-data/convergent_data_10k_compact.parquet" df.to_parquet(output_path) print(f"\nSaved to: {output_path}") if __name__ == "__main__": main()