大型語言模型的有效性在很大程度上取決於我們提供的指示。提示工程是指以某種方式設計問題,從 LLM 取得最佳輸出的過程。這是實作以 LLM 為基礎的功能的關鍵步驟。
提示工程是一項疊代程序。如果您曾嘗試使用不同的 LLM,可能會發現需要調整提示才能獲得更好的結果。
這項做法也適用於不同大小的模型。
採用大型語言模型 (例如 Gemini 或 ChatGPT) 的聊天介面,通常只需少量提示,就能提供令人滿意的結果。不過,如果使用未經精細調整的預設小型 LLM,就需要調整做法。
較小的 LLM 效能較低,可參考的資訊來源也較少。
「較小的 LLM」是什麼意思?
定義大型語言模型大小相當複雜,而且製造商不一定會公開這些資訊。
在本文件中,「較小的 LLM」是指參數少於 30B 的任何模型。截至目前,在消費者級裝置上,瀏覽器可以實際執行的模型參數數量介於數百萬到數十億之間。
較小的 LLM 適用於哪些情況?
- 裝置端/瀏覽器端生成式 AI,例如使用 Gemma 2B 搭配 MediaPipe 的 LLM 推論 API (甚至適用於僅 CPU 裝置),或是在瀏覽器中搭配 Transformers.js 使用 DistilBert。只有使用較小的 LLM,才能下載模型並在使用者的裝置上執行推論,以便合理執行網路下載作業,並符合裝置的記憶體和 GPU/CPU 限制。
- 自訂伺服器端生成式 AI:您可以使用 Gemma 2B、Gemma 7B 或 Gemma 27B 等小型開放權重模型,在自己的伺服器上執行 (並視需要進行微調)。
開始使用
採用大型語言模型 (如 Gemini 或 ChatGPT) 的聊天介面,通常只需少量提示就能提供令人滿意的結果。不過,如果使用較小的 LLM,就必須調整做法。較小的 LLM 效能較低,可參考的資訊來源也較少。
提供背景資訊和精確的格式操作說明
如要透過小型 LLM 取得最佳結果,請設計更詳細且具體的提示。
例如:
Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.
Review: "${review}"
Rating:
輸入內容 (評論) | 輸出內容 (評分) | |
---|---|---|
較大的 LLM (Gemini 1.5) | 較小的 LLM (Gemma 2B) | |
我非常喜歡這款鞋子!重量分布均勻,即使長時間健行也能保持舒適。推薦。 | 5 | 4 顆星 (滿分 5 顆星)** |
背帶很脆弱,在負重下會開始勒到我的肩膀。 | 1 | 2/5' |
雖然 Gemini 1.5 可透過這項簡單的提示提供所需輸出內容,但 Gemma 的輸出內容並不理想:
- 格式不正確。我們要求評分為整數。
- 評分似乎不太準確。第一則評論非常熱情,足以獲得 5 顆星。
為解決這個問題,我們需要使用提示工程技術,包括單樣本、少量樣本和多樣本提示,以及思考鏈提示。我們也必須提供明確的格式操作說明,並堅持模型應使用完整的評分範圍。
例如:
`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
\n\n
Here are some examples of reviews and their corresponding analyses and
ratings:
\n\n
Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
use, but it's perfect for urban exploring.'
Analysis: The reviewer appreciates the product's style and basic
functionality. They express some uncertainty about its ruggedness but
overall find it suitable for their intended use, resulting in a positive,
but not top-tier rating.
Rating (integer): 4
\n\n
Review: 'It's a solid backpack at a decent price. Does the job, but nothing
particularly amazing about it.'
Analysis: This reflects an average opinion. The backpack is functional and
fulfills its essential purpose. However, the reviewer finds it unremarkable
and lacking any standout features deserving of higher praise.
Rating (integer): 3
\n\n
Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
Rating (integer): 1
\n\n
Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
Rating (integer): 5
\n\n
Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
Rating (integer): 1
\n\n
Now, here is the review you need to assess:
\n
Review: "${review}" \n`;
輸入內容 (評論) | 使用較小的 LLM 輸出 (Gemma 2B) |
---|---|
我非常喜歡這款鞋子!重量分布均勻,即使長時間健行也能保持舒適。推薦。 |
分析:這則評論非常正面,強調產品的尺寸和舒適度,表示消費者對產品非常滿意。因此,我們給予高分。 評分 (整數):5 |
背帶很脆弱,在負重下會開始勒到我的肩膀。 |
**分析:** 這則評論強調了肩帶的舒適性有重大問題。這也表示產品可能不適合負重或長時間外出。 **評分:** 1 (最低) |
我們採用更精細的提示,搭配少量示例提示和思維鏈結提示技巧,可提供更準確的評分。
預期手動剖析輸出內容
雖然您應該一律手動清理並解讀 LLM 的輸出內容,但對於較小的 LLM 尤其如此,因為這類模型可能會產生較不精緻的結果,且可能需要思維鏈結提示。
在第一個範例中,我們使用了思維鏈條提示,因此輸出內容包含分析和評分,我們需要手動剖析評分。請注意,上一個部分的輸出內容格式不一致:模型有時會輸出 Markdown,但並非每次都會。
// Use try/catch to catch (parsing) errors
try {
// Parse the output for a rating
const int = /[1-5]/;
const ratingAsString = llmOutput.match(int)[0];
// Parse as int
const ratingAsInt = parseInt(ratingAsString);
// `checkRating` checks the rating is a number between 1 and 5, since the
// regEx may catch a number like "100"
const finalRating = checkRating(ratingAsInt);
} catch (e) {
console.error('Error', e);
}
Mind API 差異
LLM 雲端 API (例如 Gemini API 或 OpenAI) 通常是大型 LLM 的入口,提供方便的提示功能。舉例來說,Gemini 1.5 Pro 提供系統指示和 JSON 模式。
目前,這些功能不一定適用於自訂模型的使用方式,也不一定適用於使用瀏覽器內 AI API 存取的小型 LLM,例如 MediaPipe LLM 推論 API 或 Transformers.js。雖然這不一定是技術限制,但瀏覽器內 AI API 通常較為精簡。
注意符記限制
由於較小的 LLM 提示需要包含範例或更詳細的操作說明,因此提示內容可能會較長,並占用更多輸入符代碼限制 (如有)。
此外,較小的模型通常有較小的輸入符記限制。舉例來說,Gemini 1.5 Pro 的輸入符記限制為 100 萬個,而 Gemma 模型的脈絡窗口為 8K。
請使用符記計數函式,避免達到上限。
調整預估時間
在工程師的時間估算中,考量提示設計和測試所需的時間。
由於 API 差異和符號限制,您可能需要花費更多時間和精力,為較小的 LLM 編寫提示,而非較大的 LLM。測試及驗證 LLM 的輸出內容也可能需要較大的努力。
提示工程師與微調
對於網頁開發人員而言,提示工程是比自訂訓練和微調更適合利用生成式 AI 的做法。不過,即使是進階提示設計,在某些用途上也可能不夠,尤其是在使用較小的 LLM 時。
在下列情況下使用精細調整:
- 您需要針對特定工作達到最高準確度和效能。精細調整會直接調整模型的內部參數,以取得最佳結果。
- 您已妥善整理與任務相關的資料,並標示出偏好的輸出內容。您需要這項資料才能有效微調。
- 您會重複使用模型來達成相同目的。微調作業可一次完成,並用於特定工作。