在上一节中,我们讲解了模型蒸馏的基本概念,了解到对大模型数据进行蒸馏并提供给学生模型进行训练,是一个很好的解决办法。本节将演示从数据获取开始,通过在线DeepSeek 蒸馏获得一整套完整的mini 蒸馏集的过程。
13.2.1 模型蒸馏的前置准备
对于模型蒸馏的前置准备工作,其核心要点在于依据特定要求精准获取相应的数据。在前面的讲解中,我们深入剖析了在线与离线这两种截然不同的大模型蒸馏方法。尽管二者在操作流程和实施细节上存在差异,但追根溯源,它们的本质都是通过向模型输入精心设计的特定问题,进而获取契合规范标准的数据。
无论最终选择在线蒸馏方法还是离线蒸馏方法,数据的准备工作都犹如大厦之基石,起着至关重要的作用。而在从教师模型获取数据的众多方案中,采用特定的system_prompt 进行提示,无疑是最简便且高效的方式之一。通过巧妙地设计system_prompt ,我们能够引导教师模型生成完全符合需求的问题与答案。下面为读者展示一个简单的示例:
system_prompt = """请按照以下要求生成数据:
1. 随机创建一个包含多轮对话的任务场景
2. 对话必须包含用户(user)和助手(assistant)的交替对话
3. 第一轮必须是用户提出的具体任务需求
4. 最后一轮必须由助手完成回答
5. 使用严格JSON格式返回,格式示例:
{"conversations": [
{"content": "任务描述...", "role": "user"},
{"content": "任务响应...", "role": "assistant"},
......
{"content": "后续指令...", "role": "user"},
{"content": "后续响应...", "role": "assistant"}
]}
"""
通过这种方式,我们能够充分利用教师模型的强大生成能力,快速且批量地获取高质量的数据。这些数据不仅符合我们预先设定的格式要求,而且在语义和逻辑上也具有较高的连贯性和合理性。
在实际应用中,这种基于system_prompt 的数据生成方式具有诸多优势。一方面,它大大提高了数据获取的效率,避免了烦琐的人工标注和整理过程。另一方面,由于教师模型本身经过了大量的训练,其生成的数据往往具有较高的质量和多样性,能够更好地覆盖各种可能的任务场景和对话情况。
此外,我们还可以根据具体的需求对system_prompt 进行灵活调整和优化。例如,我们可以增加对对话长度、话题范围、语言风格等方面的限制,以生成更符合特定应用场景的数据。通过这种方式, 我们能够构建出更加完善、更具针对性的数据集,为后续的模型蒸馏工作提供坚实的数据基础,从而有效提升蒸馏后模型的性能和表现。
13.2.2 通过在线DeekSeek API 进行蒸馏处理
本小节将通过DeekSeek 提供的API 完成数据的准备,首先我们来看一下DeepSeek 提供的基本API 代码,如下所示:
from openai import OpenAI client = OpenAI(api_key="", base_url="https://api.deepseek.com") response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "You are a helpful assistant"}, {"role": "user", "content": "Hello"}, ], stream=False ) print(response.choices[0].message.content)
上面这段代码通过OpenAI 客户端库与DeepSeek 的对话API 进行交互,首先初始化客户端并配置认证信息(需替换实际API Key ),然后调用chat.completions.create 方法向deepseek-chat 模型发送对话请求。请求中包含系统角色设定(定义助手行为规范)和用户输入消息("Hello" ),通过stream=False 参数确保同步获取完整响应结果,最终提取并输出模型生成的回复内容。该实现展示了标准的LLM 对话流程,包括身份验证、请求构造、模型调用和响应处理等核心环节。
从上面代码上来看,这里核心分成两部分,首先是对模型的定义,即角色扮演应该是什么角色,其次就是发送的messages 信息的内容,因此我们下面依次对这二者进行定义处理。
1. system_prompt 的处理
首先是system_prompt 的处理问题,在这里我们的目标是构造并设置一个需要指导模型完成随机生成的一组多轮对话,并将其按格式返回的角色。因此,在设置上根据我们的目标任务首先设置一个系统指令:
system_prompt = """请按照以下要求生成数据:
1. 随机创建一个包含多轮对话的任务场景
2. 对话必须包含用户(user)和助手(assistant)的交替对话
3. 第一轮必须是用户提出的具体任务需求
4. 最后一轮必须由助手完成回答
5. 使用严格JSON格式返回,格式示例:
{"conversations": [
{"content": "任务描述...", "role": "user"},
{"content": "任务响应...", "role": "assistant"},
......
{"content": "后续指令...", "role": "user"},
{"content": "后续响应...", "role": "assistant"}
]}
"""
在上面代码中,我们要求在线DeepSeek 分步骤输入任务进行问答,我们构建一个能自主生成符合蒸馏数据格式要求的动态对话系统,具体如下:
l 生成包含完整语义的多轮对话场景。
l 严格遵循用户(user )与助手(assistant )的交替对话结构。
l 首轮必须由用户发起具体任务指令。
l 末轮必须由助手完成最终响应。
l 输出符合指定JSON Schema 的格式化数据。
2. 用户发送message 的处理
下面就是配合设定的角色发送对应的角色信息,我们根据需要完成一轮或者多轮对话,并且根据需要获取的文本长度完成返回文本信息长度的获取,完整代码如下所示:
def generate_distilled_data():
# 构造生成指令
system_prompt = """请按照以下要求生成数据:
1. 随机创建一个包含多轮对话的任务场景
2. 对话必须包含用户(user)和助手(assistant)的交替对话
3. 第一轮必须是用户提出的具体任务需求
4. 最后一轮必须由助手完成回答
5. 使用严格JSON格式返回,格式示例:
{"conversations": [
{"content": "任务描述...", "role": "user"},
{"content": "任务响应...", "role": "assistant"},
......
{"content": "后续指令...", "role": "user"},
{"content": "后续响应...", "role": "assistant"}
]}
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "请生成一个新的多轮对话任务,包含至少两轮或者两轮以上的问答,使用中文且内容保持专业。"}
],
temperature=0.70,
max_tokens=8192,
stream=False
)
# 提取并处理响应
raw_output = response.choices[0].message.content
# 清洗响应内容(处理可能的代码块标记)
cleaned_output = raw_output.replace(''''json', '').replace(''''', '').strip()
try:
# 转换为标准JSON格式
result = json.loads(cleaned_output)
# 格式验证
if not all(isinstance(item, dict) for item in result["conversations"]):
raise ValueError("Invalid conversation format")
return result
except json.JSONDecodeError as e:
print(f"JSON解析失败:{str(e)}")
print("原始响应内容:")
print(raw_output)
return None
从上面代码可以看到,此时我们首先通过设定的角色和信息发送对应的信息内容给DeepSeek ,之后获得反馈与结果,而参数设置可以使得我们获取到更多的不同信息与长度。
最后的响应处理和格式转换,也使得我们能够将对应的内容进行转换,从而得到输出结果。下面是一个输出示例:
生成的数据蒸馏结果:
{
"conversations": [
{
"content": "我需要为即将到来的产品发布会准备一份详细的市场分析报告,你能帮我整理一下最近的市场趋势和竞争对手的动态吗?",
"role": "user"
},
{
"content": "当然可以。首先,我将为你整理最近三个月的市场趋势数据,包括消费者行为变化、技术创新以及行业政策的影响。同时,我会分析主要竞争对手的产品发布、市场策略和财务状况。你需要我重点关注哪些方面?",
"role": "assistant"
},
{
"content": "请特别关注技术创新和竞争对手的市场策略,尤其是他们在数字营销和用户体验方面的做法。",
"role": "user"
},
{
"content": "明白了。我将深入分析竞争对手在数字营销方面的策略,包括他们的社交媒体活动、SEO优化和内容营销。同时,我会评估他们在用户体验设计上的创新,比如界面优化、个性化推荐等。报告将在两天内完成并提供给你。",
"role": "assistant"
}
]
}
对话轮次:4 轮
1. user: 我需要为即将到来的产品发布会准备一份详细的市场分析报告,你能帮我整理一下最近的市场趋势和竞争对手的动态吗?...
2. assistant: 当然可以。首先,我将为你整理最近三个月的市场趋势数据,包括消费者行为变化、技术创新以及行业政策的影响。同时,我会分析主要竞争对手的产品发布、市场策略和财务状况。你需要我重点关注哪些方面?...
3. user: 请特别关注技术创新和竞争对手的市场策略,尤其是他们在数字营销和用户体验方面的做法。...
4. assistant: 明白了。我将深入分析竞争对手在数字营销方面的策略,包括他们的社交媒体活动、SEO优化和内容营销。同时,我会评估他们在用户体验设计上的创新,比如界面优化、个性化推荐等。报告将在两天内完成并提供给你。...
读者可以自行尝试运行代码。
本文节选自《DeepSeek原生应用与智能体开发实践》一书,获出版社和作者授权发布,仅供读者个人学习使用。
