LLM 課程文件
聊天模板
並獲得增強的文件體驗
開始使用
聊天模板
介紹
聊天模板對於構建語言模型與使用者之間的互動至關重要。無論是構建簡單的聊天機器人還是複雜的 AI 代理,瞭解如何正確格式化對話對於從模型中獲得最佳結果都至關重要。在本指南中,我們將探討聊天模板是什麼、為什麼它們很重要以及如何有效地使用它們。
模型型別和模板
基礎模型與指令模型
基礎模型透過原始文字資料訓練來預測下一個詞元,而指令模型則經過專門微調以遵循指令並進行對話。例如,SmolLM2-135M
是一個基礎模型,而 SmolLM2-135M-Instruct
是其經過指令微調的變體。
指令微調模型經過訓練以遵循特定的對話結構,使其更適合聊天機器人應用。此外,指令模型可以處理複雜的互動,包括工具使用、多模態輸入和函式呼叫。
要使基礎模型表現得像指令模型,我們需要以模型能夠理解的一致方式格式化我們的提示。這就是聊天模板的作用。ChatML 是一種這樣的模板格式,它透過明確的角色指示器(系統、使用者、助手)來組織對話。這裡是關於 ChatML 的指南。
常見模板格式
在深入特定實現之前,瞭解不同模型期望的對話格式非常重要。讓我們透過一個簡單的對話示例來探討一些常見的模板格式。
我們將使用以下對話結構作為所有示例的基礎:
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"},
{"role": "assistant", "content": "Hi! How can I help you today?"},
{"role": "user", "content": "What's the weather?"},
]
這是 SmolLM2 和 Qwen 2 等模型中使用的 ChatML 模板。
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
Hello!<|im_end|>
<|im_start|>assistant
Hi! How can I help you today?<|im_end|>
<|im_start|>user
What's the weather?<|im_start|>assistant
這是使用 mistral
模板格式。
<s>[INST] You are a helpful assistant. [/INST]
Hi! How can I help you today?</s>
[INST] Hello! [/INST]
這些格式之間的主要區別包括:
系統訊息處理:
- Llama 2 將系統訊息包含在
<<SYS>>
標籤中。 - Llama 3 使用
<|system|>
標籤,並以</s>
結尾。 - Mistral 將系統訊息包含在第一個指令中。
- Qwen 使用帶有
<|im_start|>
標籤的顯式system
角色。 - ChatGPT 使用
SYSTEM:
字首。
- Llama 2 將系統訊息包含在
訊息邊界:
- Llama 2 使用
[INST]
和[/INST]
標籤。 - Llama 3 使用角色特定標籤(
<|system|>
、<|user|>
、<|assistant|>
),並以</s>
結尾。 - Mistral 使用
[INST]
和[/INST]
,以及<s>
和</s>
。 - Qwen 使用角色特定的開始/結束標記。
- Llama 2 使用
特殊標記:
- Llama 2 使用
<s>
和</s>
作為對話邊界。 - Llama 3 使用
</s>
結束每條訊息。 - Mistral 使用
<s>
和</s>
作為輪次邊界。 - Qwen 使用角色特定的開始/結束標記。
- Llama 2 使用
理解這些差異是使用各種模型的關鍵。讓我們看看 transformers 庫如何幫助我們自動處理這些變化。
from transformers import AutoTokenizer
# These will use different templates automatically
mistral_tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
qwen_tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-7B-Chat")
smol_tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM2-135M-Instruct")
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"},
]
# Each will format according to its model's template
mistral_chat = mistral_tokenizer.apply_chat_template(messages, tokenize=False)
qwen_chat = qwen_tokenizer.apply_chat_template(messages, tokenize=False)
smol_chat = smol_tokenizer.apply_chat_template(messages, tokenize=False)
點選檢視模板示例
Qwen 2 和 SmolLM2 ChatML 模板
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
Hello!<|im_end|>
<|im_start|>assistant
Hi! How can I help you today?<|im_end|>
<|im_start|>user
What's the weather?<|im_start|>assistant
Mistral 模板
<s>[INST] You are a helpful assistant. [/INST]
Hi! How can I help you today?</s>
[INST] Hello! [/INST]
高階功能
聊天模板可以處理比僅僅對話互動更復雜的場景,包括:
- 工具使用:當模型需要與外部工具或 API 互動時
- 多模態輸入:用於處理影像、音訊或其他媒體型別
- 函式呼叫:用於結構化函式執行
- 多輪上下文:用於維護對話歷史
對於多模態對話,聊天模板可以包含影像引用或 Base64 編碼的影像。
messages = [
{
"role": "system",
"content": "You are a helpful vision assistant that can analyze images.",
},
{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image", "image_url": "https://example.com/image.jpg"},
],
},
]
這是一個帶有工具使用的聊天模板示例:
messages = [
{
"role": "system",
"content": "You are an AI assistant that can use tools. Available tools: calculator, weather_api",
},
{"role": "user", "content": "What's 123 * 456 and is it raining in Paris?"},
{
"role": "assistant",
"content": "Let me help you with that.",
"tool_calls": [
{
"tool": "calculator",
"parameters": {"operation": "multiply", "x": 123, "y": 456},
},
{"tool": "weather_api", "parameters": {"city": "Paris", "country": "France"}},
],
},
{"role": "tool", "tool_name": "calculator", "content": "56088"},
{
"role": "tool",
"tool_name": "weather_api",
"content": "{'condition': 'rain', 'temperature': 15}",
},
]
最佳實踐
一般準則
在使用聊天模板時,請遵循以下關鍵實踐:
- 一致的格式:在整個應用程式中始終使用相同的模板格式。
- 明確的角色定義:清晰指定每條訊息的角色(系統、使用者、助手、工具)。
- 上下文管理:在維護對話歷史時注意詞元限制。
- 錯誤處理:對工具呼叫和多模態輸入進行適當的錯誤處理。
- 驗證:在傳送到模型之前驗證訊息結構。
動手練習
讓我們透過一個真實世界的例子來練習實現聊天模板。
- 載入資料集
from datasets import load_dataset
dataset = load_dataset("HuggingFaceTB/smoltalk")
- 建立處理函式
def convert_to_chatml(example):
return {
"messages": [
{"role": "user", "content": example["input"]},
{"role": "assistant", "content": example["output"]},
]
}
- 使用您選擇的模型的分詞器應用聊天模板。
請記住驗證您的輸出格式是否符合目標模型的要求!