揭祕ChatGPT,如何打造自己的自定義指令

2023-08-31 12:00:34

一、ChatGPT-0720更新

又在深夜,正要開啟ChatGPT官網測試下pdf對話功能,發現ChatGPT又有更新。本次更新總結有2點:

1.對於Plus使用者,GPT-4的使用限額從25條/3h提升至50條(整整提升1倍~ $20的訂閱費又更超值了)

2.新增 Custom instructions (個性化指令),簡單可以理解為個人角色和期望回答定義

Why instructions?

Custom instructions中文翻譯過來叫 個性化指令 會比較準確,為什麼是instruction這個單詞?在大語言模型的訓練中,經常會看到 Instruct Tuning(指令微調)這個單詞,GPT家族中也有一個 InstructGPT的模型(指令微調後的GPT),通過指令微調的LLM會更按照我們期望的方式輸出。一些LLM的訓練語料中也會採用instruction的形式:

{
"instruction": "將不同顏色混合後的結果",
"input": "紅色、黃色",
"output": "橙色"
}


對比指令和提示詞,指令更像是引導指示命令的意思,提示詞更像是可參考可參照的意思,這種語意上的細微差別,還是相當有意思的~

二、體驗個性化指令

1、開啟

ChatGPT的plus使用者,在Beta features開啟後,個人面板中會新增Custom instructions 選單。

2、設定

然後開啟Custom instructions 進行自定義指令的輸入。指令的輸入分為2部分:

設定項:個人簡介

官網的提示資訊如下,簡單來說就是一些關於個人資訊的關鍵提取:

  • Where are you based? — 所在地點
  • What do you do for work? — 工作內容
  • What are your hobbies and interests? — 興趣愛好
  • What subjects can you talk about for hours? — 最近交談關注的事項
  • What are some goals you have? — 目標與計劃

設定項:如何回答

官網的提示資訊如下,主要是關於GPT輸出格式和風格的定義:

  • How formal or casual should ChatGPT be? -- 聊天語氣
  • How long or short should responses generally be? -- 回答的長短
  • How do you want to be addressed? — 你希望被如何稱呼
  • Should ChatGPT have opinions on topics or remain neutral? — 對話題持有觀點還是保持中立

3、對比

接下來簡單測試下ChatGPT開啟 Custom instructions 前後的變化

對比效果(未開啟)

提問在專案中整合單元測試,GPT不知道我的工作領域(前端),在輸出時也沒有針對性得給到解決方案,而是在做整體介紹:

對比效果(開啟個性化指令)

開啟個性化指令(前端工程師 # 程式碼 解決方案 Typescript),相同的問題GPT的輸出會參考我的身份和我所期望的回答內容,建議採用Jest,並且給出完整的安裝設定教學。

4、總結

Custom instructions 技術上就是提前注入一條使用者自己定義的提示詞,解決的問題是使用者每次新建對話不需要重複輸入使用者身份和期望的回答,OpenAI官方微博也提到:

我們在使用者反饋中發現,每次開始ChatGPT對話都需要重新加上固定提示詞所帶來的不便。通過與22個國家的使用者進行交流,我們加深了對角色定義和操作定義在使用LLM時的重要性認識,這些定義指令能夠有效反映各種背景和每個人獨特需求方面。

三、HiBox如何實現?

通過收藏提示詞實現

公司內部同學在使用HiBox中也遇到類似的問題,例如使用HiBox進行IT領域單詞的翻譯,每次開啟都要重新定義,最後給他的解決方案也是使用提前注入Prompt實現:

你是一個同時精通漢語和英語的研發工程師,請將我後續傳送的內容翻譯成英文


這個提示詞其實就是自定義指令

那為什麼OpenAI不通過提示詞的方式,而是另外做個性化指令來實現呢?我覺得原因有2個:

一方面,使用者有些 通用的共性的 資訊(例如:性別、年齡、地區、工作領域等),通過設定個性化指令,不需要每次都拼接在提示詞裡面。

另一方面,個性化指令的方式後續可延伸沉澱,例如系統根據使用者最近的問答行為,自動推測使用者的資訊和喜好,類似打造專屬的私人助手。

通過systemMessage實現

systemMessage是什麼?

GPT介面的messages是一個訊息物件集合,每個訊息中都有一個欄位 role ,取值有:

1.system(系統)

2.assistant(GPT助手)

3.user(使用者)

其中 system 就是用來定義當前對話的系統層面的資訊,並且它在GPT的推理過程中,權重高於其它兩種訊息(Function_calling的實現就用到了systemMessage)。

參考GPT官網的實現(使用者個人簡介、回答傾向性),通過一般分析總結,我們補充1個對GPT助手的簡介,共有3塊內容。以面試場景為例:

1.AssistantProfile(助手簡介): 京東資深前端工程師、面試官

2.UserProfile(使用者簡介): 前端實習生,名字叫小方

3.AssistantReplyStyle(助手回覆風格): 主動提問、嚴肅客觀、全面考察

將上述內容組裝到role=system的message裡,理論上就能實現類似官網個性化指令的效果。

一個典型的messages如下:

[
	{
		"role": "system",
		"content": "#AssistantProfile: 京東面試官\\n #Userprofile: 應屆前端實習生\\n #AssistantReplyStyle: 主動提問、嚴肅客觀、全面考察"
	},
	{
		"role": "user",
		"content": "你好面試官,我準備好了"
	}
]




關鍵程式碼實現如下:

1、外掛設定新增GPTProfile

新增指令設定項,支援設定多個,支援使用者切換

"HiBox.config.chatgptProfiles": {
  "type": "array",
  "default": [{ "assistantProfile": "由OpenAI訓練的大語言模型-ChatGPT", "userProfile": "", "answerStyle": "簡潔" }],
  "markdownDescription": "呼叫ChatGPT時自定義的指令,支援設定多個",
  "items": {
    "type": "object",
    "properties": {
      "assistantProfile": {
        "type": "string",
        "description": "定義ChatGPT的角色/名稱等,例如:面試官、名字是小愛同學"
      },
      "userProfile": {
        "type": "string",
        "description": "定義你的個人資訊,例如:我叫小明,在京東集團做前端開發"
      },
      "AssistantReplyStyle": {
        "type": "string",
        "description": "定義ChatGPT的回答傾向,例如:詳細、中文、儘量用程式碼回答"
      }
    }
  }
}




2、在呼叫GPT時讀取Profile傳給systemMessage

這裡需要注意,對於GPT來說英文描述的權重會高於中文描述 ,算是一個小小的Prompt Trick

export function getSystemMessageWithProfile() {
  // 讀取使用者設定的個性化指令(中文模板,易於使用者理解)
  const profileStr = GlobalState.get('chatgptCurrentProfile');
  // 改成英文(英文模板,提升權重)
  return profileStr
    .replace('[系統簡介]', '#AssistantProfile')
    .replace(' [個人簡介]', '\\n#UserProfile')
    .replace(' [回答風格]', '\\n#AssistantReplyStyle');
}

// 請求GPT的時候
const body = {
		// ...
    systemMessage: getSystemMessageWithProfile() || '你是ChatGPT,由OpenAI訓練的大型語言模型,請儘可能簡潔地回答。',
};


HiBox中測試一下

本地測試下翻譯官和模擬面試場景,效果基本複合預期

HiBox是公司內部自研的VSCode外掛,HiBox在 v2.9.1 開始支援使用者設定自定義指令,總體使用效果可對齊ChatGPT官網。

作者:京東零售 陳隆德

來源:京東雲開發者社群 轉載請註明來源