Normalize product data prompt formatting
This commit is contained in:
@@ -242,6 +242,7 @@ canonical records 落盘必须使用 `export_dataset_records.py`,默认格式
|
||||
- 评测数据:执行 `export_planning_eval_csv.py`,输出 `eval_planning.csv`,字段为 `request_id,newPrompt,query,类别真实标签,code标签,complex`。
|
||||
- 训练 `output` 和流转表格 `function` 列都会自动组合为两行:第一行 `complex=true/false`,第二行原监督标签;评测 `complex` 列直接来自 canonical record 的 `dimensions.complex`,按评测表习惯输出 `TRUE/FALSE`。
|
||||
- 训练 `instruction` 和评测 `newPrompt` 复用相同 prompt 主体:`[知识注入]`、`[系统状态]`、`[对话历史]`、`[当前query]`、`[function]`;评测 `newPrompt` 还会额外包上 `<|im_start|>system`、`<|im_start|>user`、`<|im_start|>assistant` chat template。
|
||||
- prompt 格式必须由转换脚本生成并保持稳定:`[知识注入]` 固定为多行 JSON 块,当前 query 固定写成 `用户: <query>`,`[function]` 后必须保留换行;不要在 `[function]` 下追加 `def Agent(...)` / `def Skill(...)` 等签名说明。
|
||||
- 对话历史默认最多取 5 轮,且相邻轮间隔不超过 5 分钟;`context` 默认注入 `location` 和 `rag` 两个字段。
|
||||
|
||||
当前 canonical record v1 工作格式:
|
||||
|
||||
@@ -68,3 +68,10 @@ canonical record 是产品数据生成链路的中间元数据格式。它不是
|
||||
- `eval_planning.csv`:字段为 `request_id,newPrompt,query,类别真实标签,code标签,complex`,由 `export_planning_eval_csv.py` 生成;`newPrompt` 会包上 `<|im_start|>system/user/assistant` chat template;`complex` 列来自 `dimensions.complex`,按评测表习惯输出 `TRUE/FALSE`,不是固定默认值。
|
||||
|
||||
`instruction` 和 `newPrompt` 使用同一套 prompt 主体,默认包含 `[知识注入]`、`[系统状态]`、`[对话历史]`、`[当前query]`、`[function]`。历史轮次默认最多取 5 轮,且相邻时间间隔不超过 5 分钟。
|
||||
|
||||
格式约束:
|
||||
|
||||
- `[知识注入]` 必须是多行 JSON 块,默认只输出 `location` 和 `rag` 两个字段。
|
||||
- `[当前query]` 下一行必须带 `用户:` 前缀。
|
||||
- `[function]` 后必须保留换行;评测 `newPrompt` 中随后才是 `<|im_end|>`。
|
||||
- 不要在 `[function]` 下追加 `def Agent(...)`、`def Skill(...)` 等函数签名说明。
|
||||
|
||||
@@ -651,12 +651,15 @@ def build_planning_prompt(
|
||||
) -> str:
|
||||
"""把训练 instruction 包成评测侧使用的 chat template。"""
|
||||
|
||||
instruction = build_training_instruction(
|
||||
record,
|
||||
session_num=session_num,
|
||||
session_time_minutes=session_time_minutes,
|
||||
context_fields=context_fields,
|
||||
instruction = prompt_section_with_one_trailing_newline(
|
||||
build_training_instruction(
|
||||
record,
|
||||
session_num=session_num,
|
||||
session_time_minutes=session_time_minutes,
|
||||
context_fields=context_fields,
|
||||
)
|
||||
)
|
||||
system_prompt = prompt_section_without_trailing_newline(system_prompt)
|
||||
return (
|
||||
f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
|
||||
f"<|im_start|>user\n{instruction}<|im_end|>\n"
|
||||
@@ -664,6 +667,14 @@ def build_planning_prompt(
|
||||
)
|
||||
|
||||
|
||||
def prompt_section_without_trailing_newline(text: str) -> str:
|
||||
return str(text or "").rstrip("\n")
|
||||
|
||||
|
||||
def prompt_section_with_one_trailing_newline(text: str) -> str:
|
||||
return prompt_section_without_trailing_newline(text) + "\n"
|
||||
|
||||
|
||||
def training_jsonl_line(
|
||||
record: dict[str, Any],
|
||||
*,
|
||||
@@ -673,7 +684,7 @@ def training_jsonl_line(
|
||||
system_prompt: str,
|
||||
) -> str:
|
||||
payload = {
|
||||
"system": system_prompt,
|
||||
"system": prompt_section_without_trailing_newline(system_prompt),
|
||||
"instruction": build_training_instruction(
|
||||
record,
|
||||
session_num=session_num,
|
||||
|
||||
Reference in New Issue
Block a user