LLM 課程文件

聊天模板

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Ask a Question Open In Colab

聊天模板

介紹

聊天模板對於構建語言模型與使用者之間的互動至關重要。無論是構建簡單的聊天機器人還是複雜的 AI 代理,瞭解如何正確格式化對話對於從模型中獲得最佳結果都至關重要。在本指南中,我們將探討聊天模板是什麼、為什麼它們很重要以及如何有效地使用它們。

聊天模板對於以下方面至關重要: - 保持一致的對話結構 - 確保正確的角色識別 - 管理跨多個輪次的上下文 - 支援工具使用等高階功能

模型型別和模板

基礎模型與指令模型

基礎模型透過原始文字資料訓練來預測下一個詞元,而指令模型則經過專門微調以遵循指令並進行對話。例如,SmolLM2-135M 是一個基礎模型,而 SmolLM2-135M-Instruct 是其經過指令微調的變體。

指令微調模型經過訓練以遵循特定的對話結構,使其更適合聊天機器人應用。此外,指令模型可以處理複雜的互動,包括工具使用、多模態輸入和函式呼叫。

要使基礎模型表現得像指令模型,我們需要以模型能夠理解的一致方式格式化我們的提示。這就是聊天模板的作用。ChatML 是一種這樣的模板格式,它透過明確的角色指示器(系統、使用者、助手)來組織對話。這裡是關於 ChatML 的指南。

使用指令模型時,請務必驗證您使用的是正確的聊天模板格式。使用錯誤的模板可能會導致模型效能不佳或出現意外行為。最簡單的方法是檢查 Hub 上的模型分詞器配置。例如,`SmolLM2-135M-Instruct` 模型使用此配置

常見模板格式

在深入特定實現之前,瞭解不同模型期望的對話格式非常重要。讓我們透過一個簡單的對話示例來探討一些常見的模板格式。

我們將使用以下對話結構作為所有示例的基礎:

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]

這些格式之間的主要區別包括:

  1. 系統訊息處理:

    • Llama 2 將系統訊息包含在 <<SYS>> 標籤中。
    • Llama 3 使用 <|system|> 標籤,並以 </s> 結尾。
    • Mistral 將系統訊息包含在第一個指令中。
    • Qwen 使用帶有 <|im_start|> 標籤的顯式 system 角色。
    • ChatGPT 使用 SYSTEM: 字首。
  2. 訊息邊界:

    • Llama 2 使用 [INST][/INST] 標籤。
    • Llama 3 使用角色特定標籤(<|system|><|user|><|assistant|>),並以 </s> 結尾。
    • Mistral 使用 [INST][/INST],以及 <s></s>
    • Qwen 使用角色特定的開始/結束標記。
  3. 特殊標記:

    • Llama 2 使用 <s></s> 作為對話邊界。
    • Llama 3 使用 </s> 結束每條訊息。
    • Mistral 使用 <s></s> 作為輪次邊界。
    • Qwen 使用角色特定的開始/結束標記。

理解這些差異是使用各種模型的關鍵。讓我們看看 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]

高階功能

聊天模板可以處理比僅僅對話互動更復雜的場景,包括:

  1. 工具使用:當模型需要與外部工具或 API 互動時
  2. 多模態輸入:用於處理影像、音訊或其他媒體型別
  3. 函式呼叫:用於結構化函式執行
  4. 多輪上下文:用於維護對話歷史
實現高階功能時: - 使用您的特定模型進行徹底測試。視覺和工具使用模板尤其多樣。 - 仔細監控每個功能和模型之間的詞元使用情況。 - 記錄每個功能的預期格式。

對於多模態對話,聊天模板可以包含影像引用或 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}",
    },
]

最佳實踐

一般準則

在使用聊天模板時,請遵循以下關鍵實踐:

  1. 一致的格式:在整個應用程式中始終使用相同的模板格式。
  2. 明確的角色定義:清晰指定每條訊息的角色(系統、使用者、助手、工具)。
  3. 上下文管理:在維護對話歷史時注意詞元限制。
  4. 錯誤處理:對工具呼叫和多模態輸入進行適當的錯誤處理。
  5. 驗證:在傳送到模型之前驗證訊息結構。
要避免的常見陷阱: - 在同一應用程式中混合使用不同的模板格式 - 對話歷史過長導致超出詞元限制 - 未正確轉義訊息中的特殊字元 - 忘記驗證輸入訊息結構 - 忽略模型特定的模板要求

動手練習

讓我們透過一個真實世界的例子來練習實現聊天模板。

按照以下步驟將 `HuggingFaceTB/smoltalk` 資料集轉換為 ChatML 格式:
  1. 載入資料集
from datasets import load_dataset

dataset = load_dataset("HuggingFaceTB/smoltalk")
  1. 建立處理函式
def convert_to_chatml(example):
    return {
        "messages": [
            {"role": "user", "content": example["input"]},
            {"role": "assistant", "content": example["output"]},
        ]
    }
  1. 使用您選擇的模型的分詞器應用聊天模板。

請記住驗證您的輸出格式是否符合目標模型的要求!

其他資源

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.