基于模型蒸馏的大模型文案生成最佳实践

背景

大语言模型在生成高质量文案方面表现优异,然而其巨大的计算资源消耗和存储需求,使得实际应用尤其是在资源受限场景中的应用充满挑战。企业在寻求高效的文案生成时,常常面临着在性能和资源之间权衡的困境。在这种背景下,模型蒸馏技术为解决这一问题提供了新的思路。模型蒸馏是一种优化技术,旨在通过将知识从大型复杂模型中提取并转移到更小、计算更高效的模型中,使得这些小型模型能够在保留大多数性能优势的情况下显著降低资源需求。这一技术在大模型文案生成领域的应用,不仅能够保持生成质量接近原有大模型,还极大地减少了计算成本和部署难度。本文介绍如何使用EasyDistill算法框架以及PAI产品,实现基于模型蒸馏的大模型文案生成,通过这种方式节省人力成本,同时提高用户体验,推动业务的可持续增长。

部署教师大语言模型

部署模型服务

您可以按照以下操作步骤,部署教师大语言模型生成对应回复。

在PAI-Model Gallery选择DeepSeek-V3模型或者其他教师大模型,在模型部署区域,系统已默认配置了模型服务信息和资源部署信息,您也可以根据需要进行修改,参数配置完成后单击部署按钮。以DeepSeek-V3为例,其模型卡片如下所示:


模型部署和调用

PAI 提供的DeepSeek-V3预置了模型的部署配置信息,可以选择SGLang 部署/vLLM部署/Transformers部署,用户仅需提供推理服务的名称以及部署配置使用的资源信息即可将模型部署到PAI-EAS推理服务平台。

推理服务同样支持以OpenAI API兼容的方式调用,调用示例如下:

from openai import OpenAI##### API 配置 #####
openai_api_key = "<EAS API KEY>"
openai_api_base = "<EAS API Endpoint>/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)models = client.models.list()
model = models.data[0].id
print(model)def main():stream = Truechat_completion = client.chat.completions.create(messages=[{"role": "user","content": [{"type": "text","text": "你好,介绍一下你自己,越详细越好。",}],}],model=model,max_completion_tokens=1024,stream=stream,)if stream:for chunk in chat_completion:print(chunk.choices[0].delta.content, end="")else:result = chat_completion.choices[0].message.contentprint(result)if __name__ == "__main__":main()

更多细节可以参考“一键部署DeepSeek-V3、DeepSeek-R1模型”。

构建训练数据

构建SFT训练数据

您可以按照以下操作步骤,构建SFT训练数据。用户可以根据如下输入数据批量调用教师大模型,输入数据格式如下所示:

[{"instruction": "xxx"},{"instruction": "xxx"},{"instruction": "xxx"}
]

其中,instruction为调用大模型的prompt,由任务模版和实际输入数据组成。这里,我们给出一个任务模版供您参考,实际内容可以根据业务场景和数据特征进行调整:

你是短视频文案生成专家,专注于根据视频原始标题、视频内容,生成文案的标题和内容。
你的任务是确保文案与视频核心内容高度匹配,并且吸引用户点击。要求
1: 信息匹配度:确保文案准确反映视频核心看点,禁止出现视频中未呈现的虚构内容。
2. 情绪契合度:文案情绪需与视频内容保持一致。严肃悲伤类内容不要使用搞笑戏谑风格。
3. 内容规范度:确保句意表达清晰、完整、通顺、连贯,没有出现无意义字符。
4. 严格按照JSON格式输出:
{"title": "","body": ""
}避免出现情况
1. 标题要求在10个汉字以内。
2. 内容要求在30个汉字以内。
3. 禁止标题党,和过度夸张的表述。
4. 不得出现高敏感内容,或者低俗用语。请严格按照JSON格式输出内容,不要在输出中加入解析和说明等其他内容。视频原始标题和视频内容分别如下所示:

给定上述输入数据,我们可以批量调用教师大模型生成回复,示例代码如下:

import json
from openai import OpenAI##### API 配置 #####
openai_api_key = "<EAS API KEY>"
openai_api_base = "<EAS API Endpoint>/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)# 获取模型
models = client.models.list()
model = models.data[0].id
print(model)# 读取输入数据
def read_input_data(file_path):with open(file_path, 'r', encoding='utf-8') as file:return json.load(file)# 调用大模型获取输出
def get_model_output(instruction):chat_completion = client.chat.completions.create(messages=[{"role": "user","content": [{"type": "text","text": instruction,}],}],model=model,max_completion_tokens=1024,stream=False,)return chat_completion.choices[0].message.content# 处理输入数据并生成输出
def process_data(input_data):results = []for item in input_data:instruction = item.get("instruction")output = get_model_output(instruction)results.append({"instruction": instruction,"output": output})return results# 保存输出数据到文件
def save_output_data(file_path, data):with open(file_path, 'w', encoding='utf-8') as file:json.dump(data, file, ensure_ascii=False, indent=2)def main(input_file_path, output_file_path):input_data = read_input_data(input_file_path)output_data = process_data(input_data)save_output_data(output_file_path, output_data)print("Data processing complete.")if __name__ == "__main__":# 指定你的输入和输出文件路径input_file_path = "input.json"output_file_path = "output.json"main(input_file_path, output_file_path)

当运行完上述代码后,我们得到构造好的SFT训练数据,格式如下:

[{"instruction": "xxx","output": "xxx"},{"instruction": "xxx","output": "xxx"},{"instruction": "xxx","output": "xxx"}
]

为了保证SFT训练数据集的高质量,我们建议采用如下设置:

  1. 训练数据量至少应在3000条以上,而且需要尽可能覆盖输入视频的各种主题;
  2. 生成文案的任务模版可以按照实际业务需求进行修改,需要根据明确的业务需求,用自然语言精确描述生成的文案要求达到的效果和避免出现的情况;
  3. 为了保证生成文案的高质量,使用的教师大模型底座参数量需要尽可能高,例如使用满血版的DeepSeek-V3,一般不需要使用深度思考的模型,例如DeepSeek-R1或QwQ-32B;
  4. 在输入中,视频的内容可以通过OCR、ASR等多种途径从原始视频中抽取出来,需要保证抽取出来的内容具有较高的准确性;
  5. 建议在生成SFT训练数据集后人工抽样进行质量校验,并且根据校验结果,反复调整调用大模型的任务模版,以达到满意的效果。

构建DPO训练数据

如果您需要通过DPO算法继续优化较小的学生模型,则需要构造用于DPO算法训练的数据集。我们可以基于构造好的SFT训练数据进行继续构造流程。其中,DPO数据格式示例如下所示:

[{"prompt": "xxx","chosen": "xxx","rejected": "xxx"},{"prompt": "xxx","chosen": "xxx","rejected": "xxx"},{"prompt": "xxx","chosen": "xxx","rejected": "xxx"}
]

其中,prompt对应SFT训练数据集的instruction,chosen可以使用SFT训练数据集的output字段,rejected为DPO算法中提供的低质量文案。在DPO算法的训练过程中,我们鼓励大模型生成高质量的chosen文案,惩罚大模型生成类似rejected的文案。因此,我们需要额外生成rejected文案。我们可以同样采用教师大模型生成rejected文案,利用SFT训练数据集作为输入,我们需要改变上文使用的任务模版。这里我们给出一个示例供您参考:

你是视频文案生成初学者,尝试根据视频原始标题、视频内容生成不够吸引人的文案标题和内容。
目标是生成逻辑不清、可能误导、不够吸引用户点击的文案。要求
1. 信息匹配度:不要求准确反映视频核心看点,甚至可以与视频内容无关。
2. 情绪契合度:文案情绪可以与视频内容不一致。
3. 内容规范度:表达可以不清晰、不完整、不通顺、不连贯,可以出现无意义字符。
4. 可不用严格按照JSON格式输出。视频原始标题和视频内容分别如下所示:

我们同样给出一个批量推理的脚本,生成上述数据,我们假设输入数据格式与SFT训练数据集相同,但是instruction字段采用上文生成低质量文案的任务模版:

import json
from openai import OpenAI##### API 配置 #####
openai_api_key = "<EAS API KEY>"
openai_api_base = "<EAS API Endpoint>/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)# 获取模型
models = client.models.list()
model = models.data[0].id
print(model)# 读取输入数据
def read_input_data(file_path):with open(file_path, 'r', encoding='utf-8') as file:return json.load(file)# 调用大模型获取低质量文案
def get_rejected_output(instruction):chat_completion = client.chat.completions.create(messages=[{"role": "user","content": [{"type": "text","text": instruction,}],}],model=model,max_completion_tokens=1024,stream=False,)return chat_completion.choices[0].message.content# 处理输入数据并生成输出
def process_data(input_data):results = []for item in input_data:instruction = item.get("instruction")chosen = item.get("output")rejected = get_rejected_output(instruction)results.append({"prompt": instruction,"chosen": chosen,"rejected": rejected})return results# 保存输出数据到文件
def save_output_data(file_path, data):with open(file_path, 'w', encoding='utf-8') as file:json.dump([data], file, ensure_ascii=False, indent=2)def main(input_file_path, output_file_path):input_data = read_input_data(input_file_path)output_data = process_data(input_data)save_output_data(output_file_path, output_data)print("Data processing complete.")if __name__ == "__main__":# 指定你的输入和输出文件路径input_file_path = "input.json"output_file_path = "output.json"main(input_file_path, output_file_path)

为了保证DPO训练数据集的高质量,我们建议采用如下设置:

  1. 训练数据量至少应在1000条以上,而且需要尽可能覆盖输入视频的各种主题;
  2. 生成rejected文案的任务模版可以按照实际业务需求进行修改,需要和chosen文案在质量上有明显的差距,特别可以注重生成chosen文案中避免出现的情况(即负向样本);
  3. 为了保证生成文案质量满足要求,使用的教师大模型底座参数量需要尽可能高,例如使用满血版的DeepSeek-V3,一般不需要使用深度思考的模型,例如DeepSeek-R1或QwQ-32B;
  4. 在输入中,视频的内容可以通过OCR、ASR等多种途径从原始视频中抽取出来,需要保证抽取出来的内容具有较高的准确性;
  5. 建议在生成DPO训练数据集后人工抽样进行质量校验,并且根据校验结果,反复调整调用大模型的任务模版,以达到满意的效果。

通过SFT算法蒸馏训练较小的学生模型

接下来我们使用EasyDistill算法框架,利用准备好的训练数据,训练学生模型。在PAI-DSW中,根据“阿里云人工智能平台PAI开源EasyDistill框架助力大语言模型轻松瘦身”一文安装EasyDistill算法包后使用如下命令进行SFT模型训练:

python easydistill/kd/train.py --config=sft.json

其中,sft.json为SFT蒸馏训练的配置文件,示例如下:

{"job_type": "kd_black_box_api","dataset": {"labeled_path": "sft_train.json","template" : "chat_template_kd.jinja","seed": 42},"models": {"student": "model/Qwen/Qwen2.5-0.5B-Instruct/"},"training": {"output_dir": "result_sft/","num_train_epochs": 3,"per_device_train_batch_size": 1,"gradient_accumulation_steps": 8,"save_steps": 1000,"logging_steps": 1,"learning_rate": 2e-5,"weight_decay": 0.05,"warmup_ratio": 0.1,"lr_scheduler_type": "cosine"}
} 

其中,sft_train.json为SFT训练数据集,model/Qwen/Qwen2.5-0.5B-Instruct/为学生模型路径,这里以Qwen2.5-0.5B-Instruct为示例,result_sft/为模型输出路径。您可以根据实际需要,在training字段中调整训练使用的超参数。

通过DPO算法继续优化较小的学生模型

由于SFT训练过程中提供给学生模型唯一的正确答案,因此这种训练存在两个限制条件:一为模型的泛化能力有限,二为缺乏更加细粒度的模型对齐。DPO算法通过提供chosen和rejected的模型回复,进一步提升模型的对齐能力。根据准备好的DPO训练数据,我们在SFT训练完的模型Checkpoint基础上,使用EasyDistill的如下命令,进行DPO模型训练:

python easydistill/rank/train.py --config=dpo.json

其中,dpo.json为DPO蒸馏训练的配置文件,示例如下:

{"job_type": "rank_dpo_api","dataset": {"labeled_path": "dpo_train.json","template" : "chat_template_kd.jinja","seed": 42},"models": {"student": "result_sft/"},"training": {"output_dir": "result_dpo/","num_train_epochs": 3,"per_device_train_batch_size": 1,"gradient_accumulation_steps": 8,"save_steps": 1000,"logging_steps": 1,"beta": 0.1,"learning_rate": 2e-5,"weight_decay": 0.05,"warmup_ratio": 0.1,"lr_scheduler_type": "cosine"}
}

其中,dpo_train.json为SFT训练数据集,result_sft/为SFT训练之后的学生模型路径,result_dpo/为模型输出路径。您可以根据实际需要,在training字段中调整训练使用的超参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91036.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用通义千问大模型实现流式对话

前言 我使用的是硅基流动中通义千问免费的大模型&#xff1a;我的技术栈使用的 Next14.2 全栈框架。 代码结构 需要使用的库&#xff1a; npm i ai openai目录结构&#xff1a; 基础测试页面 test-openai/page.tsx&#xff1a; use client;import { useChat } from ai/react;ex…

如何搭建Linux环境下的flink本地集群

第一步&#xff0c;搭建Linux环境 这里我使用的是 WSL2 安装前&#xff0c;先用管理员打开终端&#xff0c;执行以下三条命令&#xff0c;目的是开启安装 WSL2所需要的环境 //开启适用于windows的Linux子系统 dism.exe /online /enable-feature /featurename:Microsoft-Wind…

算法:链表part02:24. 两两交换链表中的节点 + 19. 删除链表的倒数第 N 个结点 + 面试题 02.07. 链表相交

24. 两两交换链表中的节点题目&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 讲解&#xff1a;https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html 复习可以先…

【Linux学习】(11)进程的概念

前言在上一章我们知道了什么是进程&#xff0c;并简单了解了PCB。 本文我们将继续深入学习进程概念相关知识点&#xff1a; 学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害了解进程调度&#xff0c;Linux进程优先级&a…

UniappDay04

1.登录模块-小程序快捷登录定义接口&#xff0c;封装 import { http } from /utils/httptype loginParams {code: stringencryptedData: stringiv: string } export const postLoginWxMinAPI (data: loginParams) > {return http({method: POST,url: /login/wxMin,data,})…

NPM/Yarn完全指南:前端开发的“基石“与“加速器“

开篇:当你第一次运行npm install时... "这node_modules文件夹怎么比我的项目代码还大100倍?!" —— 每个前端新手第一次看到node_modules时的反应都出奇地一致。别担心,今天我要带你彻底搞懂这个让项目"膨胀"的"罪魁祸首",以及如何用NPM/Y…

vue页面自定义滚动条

效果图实现思路 固定整个灰色滚动条的长度计算可滚动区域占整个可视视图的比例&#xff0c;来确定橙色块的长度监听页面滚动&#xff0c;计算橙色块向右偏移距离 主要代码 template&#xff1a; <div v-show"showBar" ref"barRef" class"scrollbar…

企业级JWT验证最佳方案:StringUtils.hasText()

在企业级Java开发中&#xff0c;判断JWT令牌是否有效的最全面且常用的方式是结合以下两种方法&#xff1a; ✅ 推荐方案&#xff1a;StringUtils.hasText(jwt)&#xff08;Spring框架&#xff09; import org.springframework.util.StringUtils;if (!StringUtils.hasText(jwt))…

灵动画布:快手可灵 AI 推出的多人协作 AI 创意工作台

灵动画布&#xff1a;快手可灵 AI 推出的多人协作 AI 创意工作台 来源&#xff1a;Poixe AI 一、什么是灵动画布 灵动画布是快手旗下可灵 AI 于 2025 世界人工智能大会期间发布的全新创意工作台功能。该功能集无限可视化画布空间、多人实时协作及 AI 智能辅助于一体&#xf…

【Linux篇】进程间通信:进程IPC

目录 共享内存空间 共享内存是在用户空间还是内核空间&#xff1f;——用户空间 共享内存的生命周期 如何使用共享内存 共享内存的权限 共享内存是进程间通信中&#xff0c;速度最快的方式&#xff1a; 共享内存的缺点&#xff1a; 进程间通信标准&#xff1a; system …

Kubernetes 存储入门

目录 Volume 的概念 Volume 的类型 通过 emptyDir 共享数据 编写 emptyDir 的 Deployment 文件 部署该 Deployment 查看部署结果 登录 Pod 中的第一个容器 登录 Pod 中的第二个容器查看 /mnt 下的文件 删除此 Pod 使用 HostPath 挂载宿主机文件 编写 Deployment 文件…

深入理解Redission释放锁过程

lock.unlock();调用unlock方法&#xff0c;往下追Override public void unlock() {try {// 1. 执行异步解锁操作并同步等待结果// - 获取当前线程ID作为锁持有者标识// - unlockAsync()触发Lua脚本执行实际解锁// - get()方法阻塞直到异步操作完成get(unlockAsync(Thread.curre…

四、计算机组成原理——第4章:指令系统

目录 4.1指令系统 4.1.1指令集体系结构 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定长操作码指令格式 4.1.4扩展操作码指令格式 4.1.5指令的操作类型 1.数据传送 2.算术和逻辑运算 3.移位操作 4.转移操作 …

RAG面试内容整理-检索器与生成器的解耦架构

在RAG系统中,检索器(Retriever)与生成器(Generator)的解耦架构是实现灵活高效的关键设计。所谓解耦,即将检索相关文档和生成答案两个步骤分开,由不同的模块或模型负责。这种架构带来的直接好处是模块独立优化:我们可以针对检索任务微调或更换检索模型,而不必影响生成模…

【2026毕业论文鸿蒙系统毕设选题】最新颖的基于HarmonyOS鸿蒙毕业设计选题汇总易过的精品毕设项目分享(建议收藏)✅

文章目录前言最新毕设选题&#xff08;建议收藏起来&#xff09;最新颖的鸿蒙毕业设计选题汇总100套易过的精品毕设项目分享毕设作品推荐&#x1f447;&#x1f447;&#x1f447;文未可免费咨询毕设相关问题&#xff0c;点赞留言可送系统源码&#x1f447;&#x1f447;&#…

超全!Linux 面试 100 题精选解析:网络篇|16 个 Linux 网络排查与配置必考题详解

网络&#xff0c;是 Linux 系统的神经系统。 一台服务器再强大&#xff0c;没有网络连接也如孤岛。尤其在实际运维与面试场景中&#xff0c;“网络相关的问题”是高频重灾区&#xff0c;比如&#xff1a; IP 配置错乱&#xff0c;连不上公网DNS 无响应&#xff0c;域名解析失败…

在 CentOS 上安装 FFmpeg

在 CentOS 上安装 FFmpeg 可以通过以下两种推荐方法实现&#xff08;以 CentOS 7/8 为例&#xff09;&#xff1a; 方法一&#xff1a;通过 RPM Fusion 仓库安装&#xff08;推荐&#xff09; # 1. 安装 EPEL 仓库 sudo yum install epel-release# 2. 启用 RPM Fusion 仓库 # C…

数据结构——图(一、图的定义)

一、图的定义1、什么是图&#xff1f;图G(V,E) 如图&#xff0c;无向图G顶点集V{,,...,}&#xff0c;用|V|表示图G的顶点个数如&#xff1a;V{A,B,C,D} ,|V|4边集E{(u,v)|uV, vV}&#xff0c; 用|E|表示图G的边的条数如&#xff1a;E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推导式与生成器表达式

Python 列表推导式与生成器表达式在 Python 中&#xff0c;列表推导式&#xff08;List Comprehension&#xff09;和生成器表达式&#xff08;Generator Expression&#xff09;是处理序列数据的高效工具。它们不仅能简化代码&#xff0c;还能提升数据处理的效率。本文将详细介…

XCF32PVOG48C Xilinx Platform Flash PROM

XCF32PVOG48C 是 Xilinx 公司推出的一款高容量、低功耗的 Platform Flash PROM&#xff08;平台闪存配置芯片&#xff09;&#xff0c;专为 Xilinx FPGA 和 CPLD 系列产品提供非易失性配置存储支持。凭借其 32 Mbit 的大容量与出色的系统兼容性&#xff0c;该芯片成为中高端 FP…