使用Deepseek-R1进行数据蒸馏
简介
数据蒸馏(DataDistill)通过调用教师大模型API进行数据增强,提供精准、高质量的数据响应生成服务。可以即时生成响应数据,同时通过连续的验证机制保证数据的准确性,从而显著提升数据蒸馏的质量。
主要特性
-
响应数据生成:
- 支持直接生成响应
- 支持生成相应数据进行答案验证,直到生成最终正确的响应, 提高蒸馏数据质量
- 支持使用 DeepSeek-R1 进行蒸馏
使用说明
数据格式
- 输入数据为需要蒸馏的题目与答案信息,支持json、jsonl格式
- 输出数据为题目与推理结果,支持输出json、jsonl格式
数据准备
输入格式
输入json格式示例:
[
{
"instruction": " <题目1>",
"output": "<可为带解析的标准答案>"
},
{
"instruction": " <题目2>",
"output": "<可为带解析的标准答案>"
}
]
输入jsonl格式示例:
{"instruction": " <题目1>","output": "<可为带解析的标准答案>"}
{"instruction": " <题目2>","output": "<可为带解析的标准答案>"}
输出格式
输出json格式示例:
[
{
"instruction": " <题目1>",
"output": "<生成响应>",
"False_flag": " <响应生成是否正确标识>"
},
{
"instruction": " <题目2>",
"output": "<生成响应>",
"False_flag": " <响应生成是否正确标识>"
}
]
输出jsonl格式示例:
{"instruction": " <题目1>","output": "<生成响应>","False_flag": " <响应生成是否正确标识>"}
{"instruction": " <题目2>","output": "<生成响应>","False_flag": " <响应生成是否正确标识>"}
默认蒸馏prompt
程序默认使用以下prompt进行数据蒸馏,快速开始可以使用默认prompt验证效果
你的任务是解一些问题,这些问题包含各种领域,请将你的答案放在boxed{{}}中。
# 你需要解决的问题{input}
请开始回答:
启动程序
# 进入程序目录
cd /workspace/DataEnhance/
# 设置环境变量,也可以直接传参
data_path="data/demo_data.jsonl"
model_name="DeepSeek-R1"
api_key="<api_key>"
api_url="https://api.deepseek.com/chat/completions"
python -m src.datagenerate.DataDistill.main
--input_file $data_path \
--tag_mission distill_verify \
--model $model_name \
--api_key $api_key \
--api_url $api_url \
--save_as jsonl \
--batch_size 50 \
参数说明
参数名 | 取值类型 | 是否必选 | 默认值 | 枚举值 | 描述 |
---|---|---|---|---|---|
tag_mission | str | 是 | distill | distill:直接生成响应 | distill为直接生成响应, distill_verify生成响应后验证答案, 一共验证5轮, 直到最后一轮没有正确答案则采用答案提示的方式生成正确的思考过程与答案。 |
num_epochs | int | 否 | 5 | NA | 验证模式下,总验证轮数 |
model | str | 是 | Deepseek-R1 | NA | 调用API的模型名称 |
api | bool | 否 | True | NA | 调用API模型 |
api_url | str | 是 | https://api.deepseek.com/chat/completions | NA | 调用API URL |
api_key | str | 是 | NA | 调用API KEY | |
input_file | str | 是 | data/ins_res.json | NA | 输入的文件地址 |
output_file | str | 是 | data/ins_res_output.jsonl | NA | 输出文件地址 |
batch_size | int | 否 | 100 | NA | 每次得到响应的批量大小 |
save_as | str | 否 | jsonl | jsonl | 存储格式 |
max_tokens | int | 否 | 8000 | NA | 生成最大token数量,受使用API的限制 |
temperature | float | 否 | 0.6 | NA | 模型生成token随机性, 数值越小随机性越大,反之随机性越小,范围[0.0, 1.0] |
repetition_penalty | float | 否 | 1.0 | NA | 生成token的重复性惩罚, 数值越大重复的token越少, 反之重复越多, 范围[1.0, 2.0] |
n | int | 否 | 1 | NA | 每次返回的响应数量 |
customize_prompt | str | 否 | 你的任务是解一些问题,这些问题包含各种领域,请将你的答案放在boxed{{}}中。\n# 你需要解决的问题{input}\n请开始回答: | NA | 自定义prompt |
distill_verify:生成响应后验证答案
json
自定义prompt
当给定的默认蒸馏prompt无法得到目标题目输出,可以通过自定义prompt
使用方法:
在运行启动脚本时,指定customize_prompt参数
# 进入程序目录
cd /workspace/DataEnhance/
# 设置环境变量,也可以直接传参
data_path="data/demo_data.jsonl"
model_name="DeepSeek-R1"
api_key="<api_key>"
api_url="https://api.deepseek.com/chat/completions"
python -m src.datagenerate.DataDistill.main
--input_file $data_path \
--tag_mission distill_verify \
--model $model_name \
--api_key $api_key \
--api_url $api_url \
--save_as jsonl \
--batch_size 50 \
--customize_prompt "请帮我解答下列问题, 答案请放在boxed{{}}中, 题目: {item}"
说明: 需要预留{item}占位符,程序会根据占位符拼接题目,如果缺少占位符则无法正确的到蒸馏的结果,在自定义上传prompt时也要注意答案的输出格式,建议放入boxed{{}}中, 目前程序提取答案逻辑为在boxed符号中提取,如果不规定输出有可能提取不出正确答案。
模式设置
distill(蒸馏模式)
该模式下,针对每一道输入的instruction会生成一条响应,响应会根据用户自定义prompt进行response。
distill_verify(验证模式)
在该模式下,会根据用户自定义的验证轮数(num_epochs)进行验证,每一轮如果有验证与答案一致的响应则直接写入输出。
如果在倒数第二轮还没有验证正确的响应,则会把答案添加入prompt中引导模型输出正确的解题过程与答案(如果num_epochs设置为1,则第一轮就会引导模型输出标准答案)。
如果最后一轮验证还是无法得到正确的答案则会在输出json中添加一个False_flag字段,值为:"Sorry {num_epochs} rounds verification, no correct answer"。
最后一轮验证默认prompt:
你的任务是通过给定的答案给出正确的推理过程。
# 要保证推理的步骤与最终的结果一致
# 除了推理结果和答案请不要输出其他任何多余的内容
题目:{input}
答案:{answer}
请输出你的回答:
最后一轮的用户自定义prompt逻辑:
<用户自定义的prompt>
<根据output字段获得的正确答案>
请根据答案给出正确的过程与最终答案: