山東大學專案實訓-基於LLM的中文法律文書生成系統(五)- ChatGLM(2)

H1S96發表於2024-05-31

ChatGLM3 對話格式

為了避免使用者輸入的注入攻擊,以及統一 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 Casetemperaturetop_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 生成的程式碼可探索其他解決方案和創造性方法。輸出較少受到既定模式的限制。

相關文章