為了避免使用者輸入的注入攻擊,以及統一 Code Interpreter,Tool & Agent 等任務的輸入,ChatGLM3 採用了全新的對話格式。
整體結構
ChatGLM3 對話的格式由若干對話組成,其中每個對話包含對話頭和內容,一個典型的多輪對話結構如下
<|system|>
You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
<|user|>
Hello
<|assistant|>
Hello, I'm ChatGLM3. What can I assist you today?
對話頭
對話頭佔完整的一行,格式為
<|role|>{metadata}
其中 <|role|>
部分使用 special token 表示,無法從文字形式被 tokenizer 編碼以防止注入。metadata 部分採用純文字表示,為可選內容。
-
<|system|>
:系統資訊,設計上可穿插於對話中,但目前規定僅可以出現在開頭 -
<|user|>
:使用者-
不會連續出現多個來自
<|user|>
的資訊
-
-
<|assistant|>
:AI 助手-
在出現之前必須有一個來自
<|user|>
的資訊
-
-
<|observation|>
:外部的返回結果-
必須在
<|assistant|>
的資訊之後
-
樣例場景
為提升可讀性,下列樣例場景中表示角色的 special token 前均額外新增了一個換行符。實際使用及 tokenizer 實現中均無需額外新增這一換行。
多輪對話
-
有且僅有
<|user|>
、<|assistant|>
、<|system|>
三種 role
<|system|>
You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
<|user|>
Hello
<|assistant|>
Hello, I'm ChatGLM3. What can I assist you today?
工具呼叫
<|system|>
Answer the following questions as best as you can. You have access to the following tools:
[
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string"},
},
"required": ["location"],
},
}
]
<|user|>
今天北京的天氣怎麼樣?
<|assistant|>
好的,讓我們來檢視今天的天氣
<|assistant|>get_current_weather
tool_call(location="beijing", unit="celsius")
<|observation|>
{"temperature": 22}
<|assistant|>
根據查詢結果,今天北京的氣溫為 22 攝氏度。
程式碼執行
-
有
<|user|>
、<|assistant|>
、<|system|>
、<|observation|>
四種 role。其中<|assistant|>
的 metadata 只有 interpreter。
<|system|>
你是一位智慧AI助手,你叫ChatGLM3,你連線著一臺電腦,但請注意不能聯網。在使用Python解決任務時,你可以執行程式碼並得到結果,如果執行結果有錯誤,你需要儘可能對程式碼進行改進。你可以處理使用者上傳到電腦上的檔案,檔案預設儲存路徑是/mnt/data/。
<|user|>
#File: /mnt/data/metadata.jsonl
#Size: 35380
#File uploaded
檔案中是否存在缺失值或異常值?
<|assistant|>
首先,我將讀取您提供的檔案,並檢視其內容以確定是否存在缺失值或異常值。
我們從載入檔案開始:
<|assistant|>interpreter
import json
# Load the uploaded file
data = []
with open("/mnt/data/metadata.jsonl", 'r') as file:
for line in file:
data.append(json.loads(line))
# Display the first few records to get a sense of the data
data[:5]
<|observation|>
[{'file_name': 'aceinthehole.png',
'name': 'Ace in the Hole',
'type': 'survivor',
'description': 'Lady Luck always seems to be throwing something good your way.'},
{'file_name': 'adrenaline.png',
'name': 'Adrenaline',
'type': 'survivor',
'description': 'You are fuelled by unexpected energy when on the verge of escape.'},
{'file_name': 'aftercare.png',
'name': 'Aftercare',
'type': 'survivor',
'description': "Unlocks potential in one's aura reading ability."},
{'file_name': 'agitation.png',
'name': 'Agitation',
'type': 'killer',
'description': 'You get excited in anticipation of hooking your prey.'},
{'file_name': 'alert.png',
'name': 'Alert',
'type': 'survivor',
'description': 'Your acute senses are on high alert.'}]
<|assistant|>
該檔案看起來包含有關某些條目的後設資料,每個條目有以下欄位:
file_name: 檔名稱
name: 名稱
type: 型別(例如 "survivor" 或 "killer")
description: 描述
接下來,我將檢查這些欄位是否存在缺失值。
<|assistant|>interpreter
# Check for missing values in each column
missing_values = {key: sum(1 for item in data if key not in item) for key in data[0].keys()}
missing_values
<|observation|>
{'file_name': 0, 'name': 0, 'type': 0, 'description': 0}
<|assistant|>
每個欄位都沒有缺失值。這意味著每個條目都完整。
接下來,我們可以檢查是否存在任何潛在的異常值。這通常需要更深入的分析和對資料的瞭解,但我可以從一些基本的統計和分佈開始進行檢查。為了這樣做,我們可以檢視“type”欄位的值分佈,看看是否有任何意外的類別。
<|assistant|>interpreter
# Check the distribution of values in the 'type' column
type_distribution = {key: sum(1 for item in data if item['type'] == key) for key in set(item['type'] for item in data)}
type_distribution
<|observation|>
{'survivor': 116, 'killer': 103}
<|assistant|>
“type”欄位有兩個值:“survivor”和“killer”。其中,“survivor”有116個條目,而“killer”有103個條目。
從這個初步的檢查中,我們沒有發現任何明顯的異常值。
如果您有任何特定的標準或其他欄位需要檢查,我可以為您提供更詳細的分析。您還希望我檢查什麼呢?
<|user|>
幫我畫一個愛心
<|assistant|>interpreter
import numpy as np
import matplotlib.pyplot as plt
# 愛心形狀的引數方程
def heart(t):
x = 16 * np.sin(t) ** 3
y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)
return x, y
t = np.linspace(0, 2 * np.pi, 1000)
x, y = heart(t)
plt.figure(figsize=(6, 6))
plt.plot(x, y, color='red')
plt.axis('equal')
plt.axis('off')
plt.show()
超引數設定
ChatGLM3-6B共有以下引數可以設定
-
max_length: 模型的總token限制,包括輸入和輸出的tokens
-
temperature: 模型的溫度。溫度只是調整單詞的機率分佈。其最終的宏觀效果是,在較低的溫度下,我們的模型更具確定性,而在較高的溫度下,則不那麼確定。
-
top_p: 模型取樣策略引數。在每一步只從累積機率超過某個閾值 p 的最小單詞集合中進行隨機取樣,而不考慮其他低機率的詞。只關注機率分佈的核心部分,忽略了尾部部分。
對於以下場景,我們推薦使用這樣的引數進行設定
Use Case | temperature | top_p | 任務描述 |
---|---|---|---|
程式碼生成 | 0.2 | 0.1 | 生成符合既定模式和慣例的程式碼。 輸出更確定、更集中。有助於生成語法正確的程式碼 |
創意寫作 | 0.7 | 0.8 | 生成具有創造性和多樣性的文字,用於講故事。輸出更具探索性,受模式限制較少。 |
聊天機器人回覆 | 0.5 | 0.5 | 生成兼顧一致性和多樣性的對話回覆。輸出更自然、更吸引人。 |
呼叫工具並根據工具的內容回覆 | 0.0 | 0.7 | 根據提供的內容,簡潔回覆使用者的問題。 |
程式碼註釋生成 | 0.1 | 0.2 | 生成的程式碼註釋更簡潔、更相關。輸出更具有確定性,更符合慣例。 |
資料分析指令碼 | 0.2 | 0.1 | 生成的資料分析指令碼更有可能正確、高效。輸出更確定,重點更突出。 |
探索性程式碼編寫 | 0.6 | 0.7 |