1. 簡介
生成式 AI 產品相對新穎,因此應用程式行為可能比舊版軟體更多。因此,請務必探測使用的機器學習模型、檢視模型行為的示例,並調查出乎意料的驚喜。
學習可解釋性工具 (LIT、網站、GitHub) 是一個用於偵錯及分析機器學習模型的平台,可讓您瞭解模型背後的原因和運作方式。
在本程式碼研究室中,您將瞭解如何使用 LIT,進一步發揮 Google 的 Gemma 模型。本程式碼研究室說明如何使用序列顯著性 (可解釋性技術) 分析不同的提示工程做法。
學習目標:
- 瞭解序列顯著性及其在模型分析中的用途。
- 為 Gemma 設定 LIT,用於計算提示輸出內容和序列顯著性。
- 透過 LM Salience 模組使用序列顯著性,瞭解提示設計對模型輸出內容的影響。
- 在 LIT 中測試假設性提示改善項目,並瞭解其影響。
注意:本程式碼研究室採用 Gemma 的 KerasNLP 實作,以及用於後端的 TensorFlow v2。我們強烈建議使用 GPU 核心來跟著操作。
2. 序列顯著性及其在模型分析中的用途
文字轉文字生成式模型 (例如 Gemma) 會接收「符記化」文字形式的輸入序列,並產生一般後續符記,是該輸入輸入字串的後續字串。系統產生這種產生方式時,一次只會發生一個符記,每個新產生的符記會於輸入中附加 (迴圈),直到模型達到停止條件為止。例如模型產生序列 (EOS) 符記或達到預先定義的長度上限。
顯著性方法是一種可解釋的 AI (XAI) 技術類別,能說明輸入的哪些部分對模型的輸出內容至關重要。LIT 支援各種分類工作的顯著性方法,說明一連串輸入符記對預測標籤的影響。序列顯著性會將這些方法一般化為文字轉文字生成模型,並說明上述符記對產生的符記有何影響。
您將使用這裡的 Grad L2 Norm 方法以計算序列顯著性,藉此分析模型的梯度,並計算每個前一個符記對輸出內容的影響程度。這個方法簡單又有效率,並且經過證明在分類和其他設定中皆成效良好。顯著性分數越高,影響程度越高。這種方法用於 LIT,因為許多人都瞭解這種模型,而且能廣泛用於可解釋性研究社群。
更進階的梯度式顯著性方法包括:梯度 ⋅ 輸入和積分梯度。另有使用模糊處理為基礎的方法,例如 LIME 和 SHAP,這類方法較為可靠,但運算成本會大幅增加。如需不同顯著性方法的詳細比較資訊,請參閱這篇文章。
如要進一步瞭解顯著性方法的科學,請參閱這堂入門可探索的互動式探索文章。
3. 匯入、環境和其他設定程式碼
建議遵循新版 Colab 中的本程式碼研究室。建議您使用加速器執行階段,因為您將模型載入記憶體中,但請注意,加速器選項會隨時間變化,而且須遵守相關限制。如想使用更強大的加速器,Colab 提供付費訂閱方案。如果您的機器具備合適的 GPU,您也可以使用本機執行階段。
注意:系統可能會在表單中顯示一些警告
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. bigframes 0.21.0 requires scikit-learn>=1.2.2, but you have scikit-learn 1.0.2 which is incompatible. google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.
您可以放心忽略這些警告
安裝 LIT 和 Keras NLP
在這個程式碼研究室中,您需要最新版的 keras
(3) keras-nlp
(0.8.0) 和 lit-nlp
(1.1) 和 Kaggle 帳戶,才能下載基礎模型。
!pip install -q -U lit-nlp
!pip uninstall -y umap-learn
!pip install -q -U keras-nlp
!pip install -q -U keras
Kaggle 存取權
如要登入 Kaggle,可以在 ~/.kaggle/kaggle.json
中儲存 kaggle.json
憑證檔案,或在 Colab 環境中執行下列指令。詳情請參閱 kagglehub
套件說明文件。
import kagglehub
kagglehub.login()
請務必一併接受 Gemma 的授權協議。
4. 設定 LIT 模型
import os
os.environ["KERAS_BACKEND"] = "tensorflow"
import keras
import keras_nlp
# Run at half precision.
keras.config.set_floatx("bfloat16")
model_name = 'gemma_instruct_2b_en'
gemma_model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)
下列程式碼會初始化 LIT 包裝函式,支援 Gemma 模型上的顯著性。LIT 架構將這種架構稱為模型,但在此範例中,這兩個版本只是您在上方載入的同一個基礎 gemma_model
所用的端點不同。讓 LIT 能隨選計算生成、權杖化和顯著性。
from lit_nlp.examples.models import instrumented_keras_lms
batch_size = 1
max_sequence_length = 512
init_models = instrumented_keras_lms.initialize_model_group_for_salience
models = init_models(model_name, gemma_model,
batch_size=batch_size,
max_length=max_sequence_length)
5. 設定 LIT 資料集
Gemma 是文字轉文字生成模型,可接收文字輸入內容並產生文字輸出內容。LIT 的模型假設資料集會提供下列欄位以支援產生作業:
prompt
:KerasGenerationModel
的輸入內容。target
:選用的目標序列,例如「真值」(黃金) 的答案或模型預先產生的回應
LIT 包含少數 sample_prompts
,以及數個不同來源的範例,例如:
- GSM8K:透過少量樣本解決學校的數學問題。
- Gigaword Benchmark:一系列短篇文章的標題。
- 憲法提示:根據規範/界線生成物件的使用方式新想法。
您也可以輕鬆載入自己的資料,可以是內含欄位 prompt
及選用 target
(範例) 的 .jsonl
檔案,也可以使用 LIT 的 Dataset API,從任何格式載入資料。
執行下列儲存格來載入提示範例。
from lit_nlp.examples.datasets import lm as lm_data
datasets = {
'sample_prompts': lm_data.PromptExamples(
lm_data.PromptExamples.SAMPLE_DATA_PATH
),
}
6. 設定 LIT UI
LIT 是一種互動式模型理解工具,可讓人機迴圈評估及探測模型行為。LIT UI 可讓您執行下列操作:
- 即時透過圖表呈現資料集和模型輸出內容
- 執行顯著性方法,瞭解驅動模型行為的輸入符記。
- 建立反事實假設來檢驗假設。
LIT 可讓您在相同介面中完成上述所有作業,減少在不同工具間切換的阻礙。這對於提示工程等工作特別實用,我們稍後會在本程式碼研究室中將重心介紹。
這個 UI 版面配置可用於其他生成式語言模型。除了此處列出的功能外,如果您還感興趣,請參閱這裡的完整清單。
from lit_nlp.api import layout
modules = layout.LitModuleName
LM_SALIENCE_LAYOUT = layout.LitCanonicalLayout(
left={
'Data Table': [modules.DataTableModule],
'Datapoint Editor': [modules.DatapointEditorModule],
},
upper={ # if 'lower' not specified, this fills the right side
'Salience': [modules.LMSalienceModule],
},
layoutSettings=layout.LayoutSettings(leftWidth=40),
description='Custom layout for language model salience.',
)
這個程式碼會初始化 LIT 伺服器。可能需要幾秒鐘的時間,因為這個模型也會根據範例提示執行模型,並快取結果。
from lit_nlp import notebook as lit_notebook
lit_widget = lit_notebook.LitWidget(
models=models,
datasets=datasets,
layouts={'default': LM_SALIENCE_LAYOUT},
default_layout='default',
)
現在,您可以顯示 UI:
lit_widget.render(height=800)
您也可以在新分頁中以完整頁面開啟 LIT。執行此程式碼,並按一下畫面顯示的連結:
lit_widget.render(open_in_new_tab=True)
注意:如果您在一般 .py
指令碼中使用 LIT,請使用 lit_nlp.dev_server.Server()
開啟獨立伺服器,而不要使用 LitWidget
。詳情請參閱 LIT 說明文件。
7. LIT 中分析少數 Gemma 的提示
時至今日,提示與科學一樣不但是科學,而 LIT 可以協助你巧妙地改進 Gemma 等大型語言模型的提示。接下來,我們會示範如何使用 LIT 探索 Gemma 的行為、預測潛在問題及改善安全性。
找出複雜提示中的錯誤
如要建構高品質的 LLM 原型和應用程式,就有兩個最重要的提示技巧:少量樣本提示 (包括提示中期望的行為範例) 和思維鏈 (包括在 LLM 最終輸出內容前,形式提供說明或推理)。但要撰寫有效提示通常還是有挑戰性。
比方說,你可以提供一個範例,協助他人根據自己的品味評估他們是否喜歡食物。初步原型設計鏈提示範本可能如下所示:
def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
return f"""Analyze a menu item in a restaurant.
## For example:
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.
## Now analyze one more example:
Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""
您是否在這則提示中發現問題?LIT 會透過 LM 情緒化模組檢視提示。
8. 使用序列顯著性進行偵錯
顯著性是以最小的程度 (即每個輸入符記) 計算,但 LIT 可將符記顯著性匯總為更大可解釋的跨距,例如行數、句子或字詞。如要進一步瞭解這項服務,以及如何運用這項功能找出非預期的偏誤,請參閱「Saliency Explorable」一節。
首先,請為提示範本變數提供新的範例輸入:
food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""
prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)
fewshot_mistake_example = {'prompt': prompt} # you'll use this below
Analyze a menu item in a restaurant. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: You have to try it. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Baguette maison au levain Analysis: Home-made leaven bread in france is usually great Recommendation: Likely good. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Macaron in france Analysis: Sweet with many kinds of flavours Recommendation: You have to try it. ## Now analyze one more example: Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis:
如果已在上方儲存格或另一個分頁中開啟 LIT UI,則可使用 LIT 的資料點編輯器新增以下提示:
另一種方法是使用感興趣的提示直接重新轉譯小工具:
lit_widget.render(data=[fewshot_mistake_example])
注意令人驚訝的模型完成速度:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: A savoury tart with cheese and eggs Recommendation: You might not like it, but it's worth trying.
為何模型明白你明確表示不吃不可的東西?
依序顯著性有助於醒目顯示根本問題,這屬於少數樣本的例子。在第一個範例中,分析區段 it has cooked onions in it, which you don't like
中的想法推理鏈結與最終建議 You have to try it
不符。
在 LM Salience 模組中,選取「語句」然後選取所需的建議行UI 現在應如下所示:
因而標示出人為錯誤:不小心複製貼上最佳化建議部分,但未能更新!
現在來修正「建議」Avoid
,然後再試一次。LIT 已在範例提示中預先載入這個範例,因此您可以使用這個小型公用程式函式抓取該範例:
def get_fewshot_example(source: str) -> str:
for example in datasets['sample_prompts'].examples:
if example['source'] == source:
return example['prompt']
raise ValueError(f'Source "{source}" not found in the dataset.')
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])
現在,模型完成狀態會變為:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs and cheese, which you don't like. Recommendation: Avoid.
為減輕這個影響,我們特別準備了一項重點:及早設計原型能夠幫助您找出前所未有的風險,而語言模型的本質容易出錯,因此必須主動設計出錯誤內容。如要進一步瞭解這項功能,請參閱人員 + AI 指南,瞭解如何運用 AI 設計。
雖然經過修正的少量樣本提示成效較佳,但仍不夠正確:正確告知使用者避免使用雞蛋,但推論原因並非正確,但實際上,使用者已表示使用者無法吃蛋,但他們認為不像雞蛋。我們將在下一節為您介紹如何改善成效。
9. 測試假設以改善模型行為
LIT 可讓您在相同介面中測試提示變更。在這個例子中,您需測試加入憲法來改善模型行為。憲法是指按照原則設計提示,協助系統生成模型。最近使用的方法甚至可以實現憲法原則的互動式衍生。
讓我們運用這個提案進一步改善提示。在提示頂端新增有關生成原則的章節,現在開始如下:
Analyze a menu item in a restaurant. * The analysis should be brief and to the point. * The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: Avoid. ...
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])
這項更新可讓範例重新執行,並觀察結果截然不同的結果:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs, which you can't eat. Recommendation: Not suitable for you.
接著,您可以再次查看提示顯著性,瞭解變化發生的原因:
請注意,這項建議較為安全。此外,「不適合您」受到遵循飲食限制,以及分析 (所謂的「思想鏈」) 明確陳述合適度的原則所影響。這有助於讓輸出確信是基於適當原因發生。
10. 請非技術團隊參與模型探測和探索
「可解釋性」是指團隊合作,跨越 XAI、政策和法律等領域的專業知識。
在早期開發階段與模型互動,通常需要具備深厚的技術專業知識,讓部分協作者更難存取及探測模型。以往的原型設計階段早已不存在,因此工具無法協助這些團隊參與早期原型階段。
希望透過 LIT 這個模式可以改變。正如本程式碼研究室所述,LIT 運用視覺媒介和互動能力檢查顯著性及探索範例,有助於不同的相關人員分享及傳達發現結果。如此一來,就能讓更多元的團隊成員參與模型探索、探測和偵錯。將他們提供給這些技術方法,可加深他們對模型運作方式的理解。此外,在初期模型測試中具備多樣化的專業知識,也有助於找出不理想的結果並進一步改善。
11. 回顧
重點回顧:
- LIT UI 提供互動式模型執行作業的介面,讓使用者可以直接產生輸出內容並測試「假設」情境這在測試不同的提示變化版本時特別實用。
- LM Salience 模組以視覺化方式呈現顯著性,並提供可控制的資料精細程度,讓您瞭解以人為本的建構內容 (例如語句和字詞),而不是以模型為中心的結構 (例如符記)。
在模型評估作業中找到有問題的樣本時,將其帶入 LIT 以便偵錯。首先,請分析在邏輯上與模擬工作相關的最大合理內容單元,運用圖表查看模型正確或錯誤與提示內容的位置,然後進一步細查內容單元,進一步描述您看到的錯誤行為,並找出可能的修正方法。
最後:Lit 會不斷進步!如要進一步瞭解我們的功能及提供你的建議,請前往這裡。