Files
2026-07-13 13:24:13 +08:00

148 lines
7.7 KiB
Python

import json
from collections import defaultdict, Counter
import argparse
import os
import sys
from glob import glob
import copy
from tqdm import tqdm
from datasets import load_dataset
import random
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
# from post_processors.code.clean import tag_cleaner
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--critique_exec_file", type=str,
help="The file contains completion from the teacher model for critique, as well as the execution results."
"The inputs for this file are generated by `pp_critique_difficulty` script.")
parser.add_argument("--completion_file", type=str,
help="The file contains the completion for each query.")
parser.add_argument("--completion_response_field", type=str, default="completion")
parser.add_argument("--completion_problem_id_field", type=str, default="problem_id")
parser.add_argument("--prompt_file", type=str, default="prompts/apps/worsen_from_feedback_0shot_v1.0.txt")
parser.add_argument("--output_file", type=str)
parser.add_argument("--seed", type=int, default=42)
parser.add_argument("--sample_num", type=int, default=2000)
parser.add_argument("--split", type=str, default="train")
args = parser.parse_args()
random.seed(args.seed)
prompt_template = open(args.prompt_file).read()
_dataset = load_dataset("codeparrot/apps", split=args.split).to_list()
p_id2item = {item["problem_id"]: item for item in _dataset}
critiques = json.load(open(args.critique_exec_file))
correct_critiques = []
for item in critiques:
if isinstance(item["completion"], str) or isinstance(item["completion"], dict):
completions = [item["completion"]]
else:
completions = item["completion"]
preds = item["pred"]
for i, (comp, p, r) in enumerate(zip(completions, preds, item["res"])):
if r:
new_item = copy.deepcopy(item)
new_item["completion"] = comp
new_item["pred"] = p
new_item["res"] = r
correct_critiques.append(new_item)
print(f"Total correct critiques: {len(correct_critiques)}")
if os.path.exists(args.completion_file):
data = json.load(open(args.completion_file))
else:
data = []
for file in glob(args.completion_file):
data += json.load(open(file))
outputs = []
for item in tqdm(data):
problem_id = item[args.completion_problem_id_field]
critique = random.choice(correct_critiques)
while critique["problem_id"] == problem_id:
critique = random.choice(correct_critiques)
preds = item["pred"]
if not preds:
continue
if isinstance(preds, str):
preds = [preds]
for i, pred in enumerate(preds):
if pred:
prompt = prompt_template.format(
example_question=critique["question"],
example_code=critique["neg_code"],
feedback=critique["completion"]["feedback"],
corrected_program=critique["completion"]["corrected_program"],
question=p_id2item[problem_id]["question"],
code=pred,
)
new_item = copy.deepcopy(item)
new_item["id"] = f"{item[args.completion_problem_id_field]}_neg{i}"
new_item["prompt"] = prompt
if args.completion_response_field != "response":
new_item["response"] = new_item.pop(args.completion_response_field)
outputs.append(new_item)
if len(outputs) >= args.sample_num:
break
if len(outputs) >= args.sample_num:
break
print(f"Total number of items: {len(outputs)}")
# json.dump(outputs, open(args.output_file, "w"), indent=2)
with open(args.output_file, "w") as f:
for item in outputs:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pp_worsen_inputs.py --critique_exec_file outputs/apps/critique/apps.train.gpt4o.tem1.0.n11.neg.intro.inter.gpt4o.tem1.0.s42.n1.json_obj.exec.json \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.0-of-8.v1.1.json" \
--completion_response_field response \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.worsen_4o_critic.s42.f2000.jsonl \
--sample_num 2000 --seed 42 --completion_problem_id_field id
>>> python scripts/apps/pp_worsen_inputs.py --critique_exec_file outputs/apps/critique/apps.train.gpt4o.tem1.0.n11.neg.intro.inter.gpt4o.tem1.0.s42.n1.json_obj.exec.json \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.?-of-8.v1.1.json" \
--completion_response_field response \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.worsen_4o_critic.s42.f10k.jsonl \
--sample_num 10000 --seed 42 --completion_problem_id_field id
>>> python scripts/apps/pp_worsen_inputs.py --critique_exec_file outputs/apps/critique/apps.train.gpt4o.tem1.0.n11.neg.intro.inter.gpt4o.tem1.0.s42.n1.json_obj.exec.json \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.?-of-8.v1.1.json" \
--completion_response_field response
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.worsen_4o_critic.s42.f100k.jsonl \
--sample_num 100000 --seed 42 --completion_problem_id_field id
Total correct critiques: 7205
100%|██████████████████████████████████████████████████████████████████| 5000/5000 [00:04<00:00, 1070.68it/s]
Total number of items: 49868
>>> python scripts/apps/pp_worsen_inputs.py --critique_exec_file outputs/apps/critique/apps.train.gpt4o.tem1.0.n11.neg.intro.inter.gpt4o.tem1.0.s42.n1.json_obj.exec.json \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.?-of-8.v1.1.json" \
--completion_response_field response \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.worsen_4o.s42.f10k.jsonl \
--sample_num 10000 --seed 42 --completion_problem_id_field id --prompt_file prompts/apps/worsen_0shot_v1.0.txt
python azure/gpt_crawler_mp.py --prompt_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.worsen_4o.s42.f10k.jsonl \
--outfile ../gpt-chat-examples/outputs/apps/critique/r2c.sft.train.0shot.tem1.0.n10.v1.1.worsen_4o.s42.f10k.gpt4o.tem1.0.s42.n1.json_obj.jsonl \
--model gpt-4o --max_gen_tokens 4096 --temperature 1.0 --num_processes 24 --seed 42 --n 1 --response_format json_object
"""