134 lines
5.0 KiB
Python
134 lines
5.0 KiB
Python
import json
|
|||
|
|
import sys
|
||
|
|
import tempfile
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
|
||
|
|
MODULE_DIR = Path(__file__).resolve().parents[1]
|
||
|
|
sys.path.insert(0, str(MODULE_DIR))
|
||
|
|
|
||
|
|
import prepare_history_experiment
|
||
|
|
import purpose_data
|
||
|
|
|
||
|
|
|
||
|
|
def example(index: int, **overrides):
|
||
|
|
value = {
|
||
|
|
"prompt": f"Implement sample endpoint number {index} with stable pagination",
|
||
|
|
"purpose": purpose_data.LABELS[index % len(purpose_data.LABELS)],
|
||
|
|
"secondary": None,
|
||
|
|
"mixed": False,
|
||
|
|
"difficulty": 0.4,
|
||
|
|
"slice": "core",
|
||
|
|
"lang": "en",
|
||
|
|
}
|
||
|
|
value.update(overrides)
|
||
|
|
return value
|
||
|
|
|
||
|
|
|
||
|
|
class PrepareHistoryExperimentTests(unittest.TestCase):
|
||
|
|
def test_history_is_training_only_and_eval_splits_are_byte_identical(self):
|
||
|
|
with tempfile.TemporaryDirectory() as directory:
|
||
|
|
root = Path(directory)
|
||
|
|
base = root / "base"
|
||
|
|
base.mkdir()
|
||
|
|
train = [example(0)]
|
||
|
|
validation = [example(1)]
|
||
|
|
test = [example(2)]
|
||
|
|
purpose_data.write_jsonl(base / "train.jsonl", train)
|
||
|
|
purpose_data.write_jsonl(base / "validation.jsonl", validation)
|
||
|
|
purpose_data.write_jsonl(base / "test.jsonl", test)
|
||
|
|
validation_bytes = (base / "validation.jsonl").read_bytes()
|
||
|
|
test_bytes = (base / "test.jsonl").read_bytes()
|
||
|
|
|
||
|
|
history_path = root / "history.jsonl"
|
||
|
|
history = [
|
||
|
|
example(10, prompt="Add a durable upload endpoint", purpose="backendImpl"),
|
||
|
|
example(11, prompt=validation[0]["prompt"], purpose=validation[0]["purpose"]),
|
||
|
|
example(12, prompt="Can you assess this?", slice="vague-eval"),
|
||
|
|
]
|
||
|
|
purpose_data.write_jsonl(history_path, history)
|
||
|
|
fixtures = root / "fixtures.json"
|
||
|
|
fixtures.write_text(
|
||
|
|
json.dumps(
|
||
|
|
[{"prompt": "Review the release diff", "purpose": "review"}]
|
||
|
|
),
|
||
|
|
encoding="utf-8",
|
||
|
|
)
|
||
|
|
output = root / "output"
|
||
|
|
|
||
|
|
manifest = prepare_history_experiment.prepare(
|
||
|
|
base_dataset=base,
|
||
|
|
history_path=history_path,
|
||
|
|
fixtures_path=fixtures,
|
||
|
|
output_dir=output,
|
||
|
|
near_duplicate_threshold=0.92,
|
||
|
|
overwrite_output=False,
|
||
|
|
)
|
||
|
|
|
||
|
|
self.assertEqual(2, manifest["outputs"]["train"]["records"])
|
||
|
|
self.assertEqual(1, manifest["augmentation"]["acceptedHistoryRecords"])
|
||
|
|
self.assertEqual(
|
||
|
|
{"exact-eval-overlap": 1, "vague-eval": 1},
|
||
|
|
manifest["augmentation"]["exclusions"],
|
||
|
|
)
|
||
|
|
self.assertEqual(validation_bytes, (output / "validation.jsonl").read_bytes())
|
||
|
|
self.assertEqual(test_bytes, (output / "test.jsonl").read_bytes())
|
||
|
|
self.assertNotIn(
|
||
|
|
history[0]["prompt"],
|
||
|
|
(output / "validation.jsonl").read_text(encoding="utf-8"),
|
||
|
|
)
|
||
|
|
self.assertNotIn(
|
||
|
|
history[0]["prompt"],
|
||
|
|
(output / "test.jsonl").read_text(encoding="utf-8"),
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_near_eval_overlap_is_excluded_and_output_fails_closed(self):
|
||
|
|
with tempfile.TemporaryDirectory() as directory:
|
||
|
|
root = Path(directory)
|
||
|
|
base = root / "base"
|
||
|
|
base.mkdir()
|
||
|
|
purpose_data.write_jsonl(base / "train.jsonl", [example(0)])
|
||
|
|
words = [f"token{index}" for index in range(100)]
|
||
|
|
validation_prompt = " ".join(words)
|
||
|
|
purpose_data.write_jsonl(
|
||
|
|
base / "validation.jsonl",
|
||
|
|
[example(1, prompt=validation_prompt, purpose="review")],
|
||
|
|
)
|
||
|
|
purpose_data.write_jsonl(base / "test.jsonl", [example(2)])
|
||
|
|
words[50] = "replacement"
|
||
|
|
history_path = root / "history.jsonl"
|
||
|
|
purpose_data.write_jsonl(
|
||
|
|
history_path,
|
||
|
|
[example(10, prompt=" ".join(words), purpose="review")],
|
||
|
|
)
|
||
|
|
fixtures = root / "fixtures.json"
|
||
|
|
fixtures.write_text("[]", encoding="utf-8")
|
||
|
|
output = root / "output"
|
||
|
|
|
||
|
|
manifest = prepare_history_experiment.prepare(
|
||
|
|
base_dataset=base,
|
||
|
|
history_path=history_path,
|
||
|
|
fixtures_path=fixtures,
|
||
|
|
output_dir=output,
|
||
|
|
near_duplicate_threshold=0.92,
|
||
|
|
overwrite_output=False,
|
||
|
|
)
|
||
|
|
self.assertEqual(
|
||
|
|
{"near-eval-overlap": 1},
|
||
|
|
manifest["augmentation"]["exclusions"],
|
||
|
|
)
|
||
|
|
with self.assertRaisesRegex(purpose_data.DataError, "output is not empty"):
|
||
|
|
prepare_history_experiment.prepare(
|
||
|
|
base_dataset=base,
|
||
|
|
history_path=history_path,
|
||
|
|
fixtures_path=fixtures,
|
||
|
|
output_dir=output,
|
||
|
|
near_duplicate_threshold=0.92,
|
||
|
|
overwrite_output=False,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
unittest.main()
|