148 lines
7.7 KiB
Python
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
|
|
|
|
"""
|
|
|