基于模型蒸餾的大模型文案生成最佳實踐

背景

大語言模型在生成高質量文案方面表現優異,然而其巨大的計算資源消耗和存儲需求,使得實際應用尤其是在資源受限場景中的應用充滿挑戰。企業在尋求高效的文案生成時,常常面臨著在性能和資源之間權衡的困境。在這種背景下,模型蒸餾技術為解決這一問題提供了新的思路。模型蒸餾是一種優化技術,旨在通過將知識從大型復雜模型中提取并轉移到更小、計算更高效的模型中,使得這些小型模型能夠在保留大多數性能優勢的情況下顯著降低資源需求。這一技術在大模型文案生成領域的應用,不僅能夠保持生成質量接近原有大模型,還極大地減少了計算成本和部署難度。本文介紹如何使用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
英文地址,請注明出處:http://en.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…