Files
OGAAA/Codes/1_raw_dataset/Should-It-Be-Executed-Or-Processed/SEP_dataset/generate_data.py
HenryChou020514 01bb07dba8 Flatten 1_raw_dataset submodules into plain tracked files
FocalLoRA, Should-It-Be-Executed-Or-Processed, and topicattack were
nested git repos (with an inner FocalLoRA/data/FocalLoRA/.git as well).
Drop their .git history and track the contents directly in this repo
instead of as submodules/gitlinks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 19:06:09 +08:00

94 lines
3.6 KiB
Python

import os
import openai
import json
import sys
from tqdm import tqdm
sys.path.append("..")
from openai_utils import get_messages_generic, call_openai_api, try_processing_json_str
from utils import load_config, load_json_data, read_file
from typing import Dict
def generate_data(input_path: str, output_path: str, prompt_path: str) -> None:
"""
Generates data based on system prompts.
Parameters:
input_path (str): The path to the input JSON file containing tasks, subtasks and system prompts.
output_path (str): The path to save the output JSON file with generated data.
prompt_path (str): The path to the text file containing the generation prompt.
"""
gen_prompt = read_file(prompt_path)
data = load_json_data(input_path)["output"]
exp_log = {
"input_message": gen_prompt,
"data": data,
"output": {}
}
for task_type, tasks in data.items():
if task_type == "descr":
continue # Skip description at root level
print(f"Processing type {task_type}\n\n")
exp_log["output"][task_type] = {"descr": tasks.get("descr", "")}
for task, elem in tasks.items():
print(f"Dealing with task: {task}")
if not tasks.get("descr"):
print(f"WARNING: Missing description for {task_type}, {task}")
if task == "descr":
continue
subtasks = elem.get("subtasks", [])
# Sometimes ChatGPT generates {subtasks: {subtasks: [...]}}
if isinstance(subtasks, dict):
subtasks = subtasks["subtasks"]
outputs = generate_data_for_subtasks(gen_prompt, subtasks, task)
exp_log["output"][task_type][task] = {"descr": tasks.get("descr", ""), "subtasks": outputs}
with open(output_path, "w") as f:
json.dump(exp_log, f)
print(f"Output saved to {output_path}")
def generate_data_for_subtasks(gen_prompt: str, subtasks: list[Dict], task_descr: str,
n_attempts: int = 3) -> list:
"""
Generates data for each subtask using OpenAI's API.
API is called n_attempts times, call results are stacked.
Parameters:
gen_prompt (str): The general prompt to be appended before each subtask's specific info.
subtasks (list[Dict]): A list of subtasks for which to generate data.
task_descr (str): Description of the task, used for logging.
n_attempts (int): Number of attempts to try generating data for a subtask.
Returns:
list: A list of generated responses for the subtasks.
"""
outputs = []
for subtask in tqdm(subtasks, desc=f"Processing subtasks for {task_descr}"):
cur_prompt = f"{gen_prompt}\n {json.dumps(subtask)}"
messages = get_messages_generic(cur_prompt)
for _ in range(n_attempts): # Try up to 3 times for a valid response
response = call_openai_api(messages)
processed_response = try_processing_json_str(response, 'dict')
if processed_response:
outputs.append(processed_response)
else:
print(f"Failed to get response for subtask: {subtask}")
return outputs
# input_path = "./task_descr_step4_short_pt3.json"
# output_path = "./task_data_step5_shortsys_mid_pt3.json"
#
# promt_path = "./generate_data_prompt-mid.txt"
if __name__ == "__main__":
openai.api_key = os.getenv("OPENAI_API_KEY")
config = load_config(sys.argv)
input_path = config["subtasks_sys_path"]
output_path = config["raw_data_path"]
prompt_path = config["sys_to_data_prompt_path"]
generate_data(input_path, output_path, prompt_path)