* support user-defined prompt processing strategies for dpo * interpret dict dataset types as user-defined * fix lint errors * setup pydantic config for validation of User defined DPO --------- Co-authored-by: Wing Lian <wing.lian@gmail.com>
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
"""
|
|
User-defined DPO strategies
|
|
"""
|
|
|
|
|
|
def default(cfg, dataset_idx=0, **kwargs): # pylint: disable=unused-argument
|
|
ds_cfg = cfg["datasets"][dataset_idx]["type"]
|
|
if not isinstance(ds_cfg, dict):
|
|
raise ValueError(
|
|
f"User-defined dataset type must be a dictionary. Got: {ds_cfg}"
|
|
)
|
|
field_prompt = ds_cfg.get("field_prompt", "prompt")
|
|
field_system = ds_cfg.get("field_system", "system")
|
|
field_chosen = ds_cfg.get("field_chosen", "chosen")
|
|
field_rejected = ds_cfg.get("field_rejected", "rejected")
|
|
prompt_format = ds_cfg.get("prompt_format")
|
|
if not prompt_format:
|
|
prompt_format = "{" + field_prompt + "}"
|
|
chosen_format = ds_cfg.get("chosen_format")
|
|
if not chosen_format:
|
|
chosen_format = "{" + field_chosen + "}"
|
|
rejected_format = ds_cfg.get("rejected_format")
|
|
if not rejected_format:
|
|
rejected_format = "{" + field_rejected + "}"
|
|
|
|
def transform_fn(sample):
|
|
if (
|
|
"{" + field_system + "}" in prompt_format
|
|
and field_system in sample
|
|
and sample[field_system]
|
|
):
|
|
sample["prompt"] = prompt_format.format(
|
|
system=sample[field_system], prompt=sample[field_prompt]
|
|
)
|
|
else:
|
|
sample["prompt"] = prompt_format.format(prompt=sample["prompt"])
|
|
sample["chosen"] = chosen_format.format(chosen=sample[field_chosen])
|
|
sample["rejected"] = rejected_format.format(rejected=sample[field_rejected])
|
|
return sample
|
|
|
|
return transform_fn
|