LLaMA Factory微調后的大模型在vLLM框架中對齊對話模版

LLaMA Factory微調后的大模型Chat對話效果,與該模型使用vLLM推理架構中的對話效果,可能會出現不一致的情況。

下圖是LLaMA Factory中的Chat的對話

下圖是vLLM中的對話效果。

模型回答不穩定:有一半是對的,有一半是無關的。
1、未收斂;

模型回答與LLaMA Factory訓練chat界面的不一致。
1、對話模版chat_template不一致。

本文來講解下對話模版不一致的情況的解決方法。

一、原因分析

1、LLaMA Factory在微調訓練需要選擇模型名稱,自動帶出對話模版,比如qwen。這個對話模版是LLaMA Factory項目根據qwen官方提供的對話模版改編,與大模型自身的對話模版并不相等。

2、LLaMA Factory的對話模版的源碼在LLaMA-Factory/src/llamafactory/data/template.py這個類里。獲取對話模版的方法(私有方法)_get_jinja_template ,可以用公共方法fix_jinja_template來調用該私有方法。

大模型的默認對話模版在?tokenizer_config.json里chat_template字段。

3、可以看到LLaMA Factory微調訓練時的對話模版與大模型的默認對話模版并不相同。

二、解決方案

既然是因為兩邊不一致,那么只要保證兩邊一致即可。也就是模版對話對齊。

我們可以將LLaMA Factory中的模版修改掉,需要修改源碼;也可以在vLLM、ollama或LMDeploy等推理框架在運行大模型時候手動指定對話模版。兩種方法都可以,這里我們先使用后者來操作。

1、獲取LLaMA Factory中的對話模版

在微調訓練中,界面中選擇大模型后,自定帶出對話模版,記住名稱,比如qwen 。

寫一個python代碼,獲取對話模版,get_chat_template.py 。

# get_chat_template.py
import sys
import os# 將項目根目錄添加到 Python 路徑
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
sys.path.append(root_dir)from llamafactory.data.template import TEMPLATES
from transformers import AutoTokenizer# 1. 初始化分詞器(任意支持的分詞器均可)
tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/llm/Qwen/Qwen2.5-0.5B-Instruct")# 2. 獲取模板對象
template_name = "qwen"  # 替換為你需要查看的模板名稱
template = TEMPLATES[template_name]# 3. 修復分詞器的 Jinja 模板
template.fix_jinja_template(tokenizer)# 4. 直接輸出模板的 Jinja 格式
print("=" * 40)
print(f"Template [{template_name}] 的 Jinja 格式:")
print("=" * 40)
print(tokenizer.chat_template)

需要修改2個地方,(1)初始化分詞器,地址要寫本地存在的大模型;?(2)獲取模版對象,template_name一定要寫你微調界面上選擇的對話模版名稱,比如qwen? 。

將該文件放在目錄LLaMA-Factory/src/llamafactory/data下。

運行該文件。

python get_chat_template.py 

結果如下:?

將內容復制,從====的下一行{% 開始復制。保存到一個文件中,格式為.jinja? ?,比如? qwen.jinja 。

2、vLLM運行大模型指定jinja文件

為了使語言模型支持聊天協議,vLLM 要求模型在其 tokenizer 配置中包含一個聊天模板。聊天模板是一個 Jinja2 模板,它指定了角色、消息和其他特定于聊天對 tokens 如何在輸入中編碼。

可以在?--chat-template?參數中手動指定聊天模板的文件路徑或字符串形式。

https://vllm.hyper.ai/docs/serving/openai-compatible-server#%E8%81%8A%E5%A4%A9%E6%A8%A1%E6%9D%BF

vllm serve <model> --chat-template ./path-to-chat-template.jinja

比如:

vllm serve /root/autodl-tmp/llm/Qwen/Qwen2.5-0.5B-Instruct-merge --chat-template /root/autodl-tmp/project/day07/qwen.jinja 

這樣就可以保證對話模版一致了。

3、ollama創建ModelFile的內容

創建一個python文件,獲取內容:get_ollama_modelfile.py

# mytest.py
import sys
import os# 將項目根目錄添加到 Python 路徑
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
sys.path.append(root_dir)from llamafactory.data.template import TEMPLATES, get_template_and_fix_tokenizer
from transformers import AutoTokenizer
from llamafactory.hparams import DataArguments# 1. 初始化分詞器(任意支持的分詞器均可)
tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/llm/Qwen/Qwen2.5-0.5B-Instruct")# 2. 獲取模板對象
template_name = "qwen"  # 替換為你需要查看的模板名稱
template = TEMPLATES[template_name]# 3. 修復分詞器的 Jinja 模板
template.fix_jinja_template(tokenizer)# 4. ollama制作ModelFile的內容template = get_template_and_fix_tokenizer(tokenizer, DataArguments(template=template_name))
# template.get_ollama_modelfile(tokenizer)
print("=" * 40)
print(f"Template [{template_name}] 的 Modelfile 格式:")
print("=" * 40)
print(template.get_ollama_modelfile(tokenizer))

3、LMDeploy框架指定對話模版

https://lmdeploy.readthedocs.io/zh-cn/latest/advance/chat_template.html

LMDeploy支持json格式的對話模版,需要將jinja2格式的轉成json格式。我們可以使用AI搜索來做。比如我們使用DeepSeek來轉換。

打開https://chat.deepseek.com/? ,上傳jinja2文件,并且輸入文字:


文件中是一個jinja2格式的qwen的對話模版,我需要轉成lmdeploy框架支持的的json格式的對話模版,json模版格式如下:{"model_name": "your awesome chat template name","system": "<|im_start|>system\n","meta_instruction": "You are a robot developed by LMDeploy.","eosys": "<|im_end|>\n","user": "<|im_start|>user\n","eoh": "<|im_end|>\n","assistant": "<|im_start|>assistant\n","eoa": "<|im_end|>","separator": "\n","capability": "chat","stop_words": ["<|im_end|>"]
}

返回結果:

{"model_name": "qwen","system": "<|im_start|>system\n","meta_instruction": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant.","eosys": "<|im_end|>\n","user": "<|im_start|>user\n","eoh": "<|im_end|>\n","assistant": "<|im_start|>assistant\n","eoa": "<|im_end|>","separator": "\n","capability": "chat","stop_words": ["<|im_end|>", "</tool_call>", "<|im_start|>", "<|im_end|>\n"],"tool_spec": {"tool_call_start": "<tool_call>","tool_call_end": "</tool_call>","tool_response_start": "<tool_response>","tool_response_end": "</tool_response>"}
}

字段說明

  • system/eosys:對應系統消息的開始和結束標記。
  • user/eoh:用戶消息的起止標記。
  • assistant/eoa:助理消息的起止標記。
  • meta_instruction:使用原模板中的默認系統提示。
  • separator:消息間的換行符(\n)。
  • stop_words:添加?<|im_end|>?和其他可能的終止標記(如工具調用相關標簽)。

工具調用擴展

  • 雖然 LMDeploy 基礎模板不直接支持工具調用,但通過?tool_spec?字段擴展了工具調用的起止標記,以兼容原模板中的?<tool_call>?和?<tool_response>?邏輯。

注意事項

  • 若 LMDeploy 嚴格限制字段,需移除?tool_spec?字段。

  • 若需要動態系統消息(根據輸入切換),需在 LMDeploy 框架中額外處理,此 JSON 模板僅保留靜態默認值。

三、Open WebUI對話模版說明

Open WebUI有自己的一套對話模版,所以微調后的大模型在使用推理框架(vLLM,ollama,LMDeploy)+Open WebUI,結果可能會產生偏差。所以一般不建議微調后的大模型使用Open WebUI來做界面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76210.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

004 健身房個性化訓練計劃——金丹期(體態改善)

個人筆記使用。 01 肱骨前移 1.放松肩前束 2.放松肩后束 2.5kg啞鈴側展 泡沫軸上下滾 招財貓 肱二頭 02 溜肩 寬距的坐姿劃船 上頂

【已開源】UniApp+vue3跨端應用從0到1開發指南、uniapp+vue3模板應用

在跨端開發日益成為主流的今天&#xff0c;如何高效構建規范、可維護的企業級應用&#xff1f;本文以UniAppVue3* *TypeScript**為核心技術棧&#xff0c;手把手帶你從零搭建高標準的跨平臺項目。 通過本文&#xff0c;你將系統掌握&#xff1a; ? 環境配置&#xff1a;Node…

線程池設計

線程池實際上也是一個生產者消費者模型&#xff0c;線程池可以讓多個線程去任務隊列中取任務&#xff0c;執行任務&#xff0c;適用于需要大量的線程來完成任務且完成任務的時間較短。 #include "log.hpp" #include <mutex> #include <condition_variable&…

黑盒測試的正交實驗法

背景: 利用因果圖法、判定表法可以幫助我們對于輸入數據的組合情況進行用例設計&#xff0c;但當輸入數據的組合數量巨大時&#xff0c;由于不太可能覆蓋到每個輸入組合的測試情況&#xff0c;因果圖法或判定表法可能就不太適用了&#xff0c;可以采用正交實驗法、來合理地減少…

Linux內核編程

linux 系 統 在 2 4 4 0 上 的 啟 動 過 程 分 三個 階 段 u-boot的啟動 1.先分清寄存器的分類 RAM的分類 ROM的分類 Mini2440開發板的存 儲器配置 Mini2440開發板板載: 1. 64MB sdram; 2. 256MB nand-flash; 3. 2MB nor-flash; 4. s3c2440內部還有4KB iram; Mini2440的啟…

黑盒測試的判定表法(能對多條件依賴關系進行設計測試點)

定義: 判定表是分析和表達多邏輯條件下執行不同操作的工具。就是指把所有的輸入條件、所有可能采取的動作按表格列出來&#xff0c;每一種條件和動作的組合構成一條規則&#xff0c;也即一條用例。 1.判定表法的引用 等價類邊界值分析法主要關注單個輸入類條件的測試并未考慮…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.1.2ONNX格式轉換與TensorRT部署

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 從零構建大語言模型全棧開發指南-第四部分:工程實踐與部署4.1.2 ONNX格式轉換與TensorRT部署1. 模型部署的核心挑戰與價值2. ONNX格式轉換技術詳解2.1 ONNX技術棧組成2.2 轉換流程與關鍵技術2.3 轉換常…

免費下載 | 2025年網絡安全報告

報告總結了2024年的網絡安全態勢&#xff0c;并對2025年的安全趨勢進行了預測和分析。報告涵蓋了勒索軟件、信息竊取軟件、云安全、物聯網設備安全等多個領域的安全事件和趨勢&#xff0c;并提供了安全建議和最佳實踐。 一、報告背景與目的 主題&#xff1a;2024企業信息安全峰…

基于Real-Sim-Real循環框架的機器人策略遷移方法

編輯&#xff1a;陳萍萍的公主一點人工一點智能 基于Real-Sim-Real循環框架的機器人策略遷移方法本文通過嚴謹的理論推導和系統的實驗驗證&#xff0c;構建了一個具有普適性的sim-to-real遷移框架。https://mp.weixin.qq.com/s/cRRI2VYHYQUUhHhP3bw4lA 01 摘要 本文提出的Rea…

語義分析(編譯原理)

1.什么是語義分析: 前兩個階段&#xff0c;詞法分析是從字符到單詞的一級識別&#xff0c;保證了每個單詞的形式是正確的&#xff0c; 語法分析是由單詞到語法樹的一級識別&#xff0c;如果不符合語法規則就不能建樹&#xff0c;因此保證了各個語法成分的構成是正確的 詞法分…

藍橋杯備考---》貪心算法之矩陣消除游戲

我們第一次想到的貪心策略一定是找出和最大的行或者列來刪除&#xff0c;每次都更新行和列 比如如圖這種情況&#xff0c;這種情況就不如直接刪除兩行的多&#xff0c;所以本貪心策略有誤 so我們可以枚舉選的行的情況&#xff0c;然后再貪心的選擇列和最大的列來做 #include …

LeetCode hot 100—二叉搜索樹中第K小的元素

題目 給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 小的元素&#xff08;從 1 開始計數&#xff09;。 示例 示例 1&#xff1a; 輸入&#xff1a;root [3,1,4,null,2], k 1 輸出&#xff1a;1示例 2&#xff1a; …

【Java SE】Arrays類

參考筆記&#xff1a; Java中Arrays類(操作數組的工具)_java arrays-CSDN博客 Java——Arrays 類詳解_java arrays類-CSDN博客 目錄 1.Arrays類簡介 2.Arrays.toString 2.1 使用示例 2.2 源碼 3. Arrays.copyOf 3.1 使用示例 3.2 源碼 4.Arrays.sort 4.1 默認排序使…

git命令簡陋版本

git push git pull 臨時倉庫暫存區 ##############創建提交################ git init #創建git地址 git config --global user.name "***YQ1007" git config --global user.email "***gmail.com" git remote…

6. 王道_網絡協議

1 網絡協議和網絡模型 2 TCP/IP協議族概覽 2.1 四層模型的各層實體 2.2 協議數據單元的轉換 2.3 常見協議以及分層 2.4 ifconfig 2.5 本地環回設備 3 以太網 3.1 以太網和交換機 3.2 以太網幀 MAC地址大小 48位 6字節 IP地址 32位 4字節 port 16位 2字節 3.3 ARP協議 4 IP協…

minecraft.service 文件配置

minecraft.service 文件配置 # /etc/systemd/system/minecraft.service [Unit] DescriptionMinecraft Fabric Server Afternetwork.target Wantsnetwork-online.target[Service] Usermcfabricuser Groupmcfabricuser WorkingDirectory/minecraft/1.21.1-fabric-server ExecStar…

python leetcode簡單練習(2)

20 有效括號 方法思路 要判斷一個僅由括號組成的字符串是否有效&#xff0c;可以使用棧這一數據結構。核心思路是遍歷字符串中的每個字符&#xff0c;遇到左括號時壓入棧中&#xff0c;遇到右括號時檢查棧頂的左括號是否匹配。若匹配則彈出棧頂元素&#xff0c;否則返回false。…

AI 數字人短視頻數字人口播源碼:短視頻內容生產的新引擎?

在當下信息爆炸的時代&#xff0c;短視頻已成為主流的信息傳播與娛樂方式之一。在如此龐大的市場需求下&#xff0c;如何高效、創新地生產短視頻內容成為了行業關注的焦點。AI 數字人短視頻數字人口播源碼應運而生&#xff0c;為短視頻內容生產帶來了全新的變革。? 一、行業背…

AI對傳統IT行業的變革

傳統 IT 行業長期以來面臨著諸多挑戰。系統類型繁雜、復雜度高&#xff0c;不少環節依賴人工操作&#xff0c;智能化水平偏低&#xff0c;極大地制約了業務運營效率。此外&#xff0c;傳統 IT 企業背負沉重的歷史包袱&#xff0c;重構系統不僅成本高昂&#xff0c;由于現有系統…

mapbox基礎,使用geojson加載cluster聚合圖層

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??circle點圖層樣式二、??使用geojson加…