# ModernBERT Reward Model (CoT SQL/NL Alignment) Finetuned `answerdotai/ModernBERT-base` to score how well a generated natural-language description (NL) and chain-of-thought reasoning align with a SQL query. The model is trained as a regression head (sigmoid output in `[0, 1]`) to predict `similarity_with_penalty` scores derived from human preference data plus corruption heuristics. ## Usage ```python import torch from transformers import AutoTokenizer from modeling_reward import BERTRewardModel model_name = "DarianNLP/modernbert-nl-sql" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = BERTRewardModel(model_name=model_name) state_dict = torch.load("model.safetensors") # or use safetensors.torch.load_file model.load_state_dict(state_dict) model.eval() sql = "SELECT COUNT(*) FROM orders WHERE status = 'complete';" reasoning = "think: Count rows in orders filtered by status 'complete'." nl = "How many completed orders exist?" text = f"SQL: {sql}\nReasoning: {reasoning}\nNL: {nl}" inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=2048) score = model(**inputs)["scores"].item() print(f"Reward: {score:.3f}") ``` For convenience, `modeling_reward.py` exposes `load_finetuned_model(model_dir)` which handles loading `model.safetensors` or `pytorch_model.bin` and moves the module to GPU if available (falling back to CPU on OOM). ## Notes - The reward target is bounded `[0, 1]` and already penalizes copied NL or incorrect reasoning. - The model uses mean pooling instead of CLS to better leverage long ModernBERT contexts. - Tokenizer files are saved from the finetuned run; no extra special tokens were introduced.