使用 LIT 在 Keras 中分析 Gemma 模型

1. 簡介

生成式 AI 產品屬於新興技術,應用程式的行為可能會比早期形式的軟體更不一致。因此,您必須深入探究所使用的機器學習模型、檢查模型行為的範例,並調查意外情況。

學習技術可解釋性工具 (LIT;網站GitHub) 是一個調試和分析機器學習模型的平台,可瞭解機器學習模型的行為為何如此,以及如何運作。

在本程式碼研究室中,您將瞭解如何使用 LIT 充分運用 Google 的 Gemma 模型。本程式碼研究室示範如何使用可解讀性技術「序列醒目性」來分析不同的提示設計方法。

學習目標:

  1. 瞭解序列醒目性,以及在模型分析中如何使用。
  2. 為 Gemma 設定 LIT,以便計算提示輸出內容和序列醒目效果。
  3. 透過 LM Salience 模組使用序列醒目效果,瞭解提示設計對模型輸出的影響。
  4. 測試假設的 LIT 改善措施,並查看成效。

注意:本程式碼研究室使用 Gemma 的 KerasNLP 實作,並將 TensorFlow v2 用於後端。強烈建議您使用 GPU 核心來瞭解本教學課程。

LIT UI 示範

2. 序列醒目性及其在模型分析中的用途

文字轉文字生成式模型 (例如 Gemma) 會以剖析文字的形式接收輸入序列,並產生新符記,這些符記是該輸入內容的常見後續動作或完成動作。這項產生作業會一次產生一個符號,並在迴圈中將每個新產生的符號附加至輸入內容和先前產生的任何符號,直到模型達到停止條件為止。例如模型產生序列結束 (EOS) 符記,或達到預先定義的長度上限。

醒目顯示方法是一種可解釋的 AI (XAI) 技術,可告訴您輸入內容的哪些部分對模型的不同輸出內容很重要。LIT 支援各種分類作業的顯著方法,可說明一連串輸入符記對預測標籤的影響。序列醒目顯示功能會將這些方法推廣至文字轉文字生成模型,並說明前面符記對產生符記的影響。

您將使用 Grad L2 Norm 方法來計算序列醒目效果,該方法會分析模型的梯度,並提供每個前置符號對輸出結果影響的大小。這個方法簡單又有效率,且已證明在分類和其他設定中表現良好。醒目分數越高,影響力就越大。由於可解釋性研究社群廣泛使用且瞭解這種方法,因此 LIT 會採用這種方法。

更進階的梯度式顯著性方法包括 Grad ⋅ Input積分梯度。您也可以使用以消除法為基礎的方法,例如 LIMESHAP,這些方法雖然更健全,但運算成本也更高。如要進一步瞭解不同醒目效果方法的比較,請參閱這篇文章

如要進一步瞭解醒目效果方法的科學原理,請參閱這份醒目效果的互動式入門說明

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.14.) 和 lit-nlp (1.2),以及 Kaggle 帳戶來下載基礎模型。

pip install -q -U 'keras >= 3.0' 'keras-nlp >= 0.14' 'lit-nlp >= 1.2'

Kaggle Access

如要透過 Kaggle 進行驗證,您可以採取下列做法:

  • 將憑證儲存在檔案中,例如 ~/.kaggle/kaggle.json
  • 使用 KAGGLE_USERNAMEKAGGLE_KEY 環境變數;或
  • 在互動式 Python 環境 (例如 Google Colab) 中執行下列指令。
import kagglehub

kagglehub.login()

詳情請參閱 kagglehub 說明文件,並務必接受 Gemma 授權協議

設定 Keras

Keras 3 支援多個深度學習後端,包括 Tensorflow (預設)、PyTorch 和 JAX。後端會使用 KERAS_BACKEND 環境變數進行設定,必須在匯入 Keras 程式庫之前設定。以下程式碼片段說明如何在互動式 Python 環境中設定這個變數。

import os

os.environ["KERAS_BACKEND"] = "tensorflow"  # or "jax" or "torch"

4. 設定 LIT

您可以在 Python 筆記本中使用 LIT,也可以透過網路伺服器使用。本程式碼研究室著重於筆記本用途,建議您在 Google Colab 中進行操作。

在本程式碼研究室中,您將使用 KerasNLP 預設值載入 Gemma v2 2B IT。以下程式碼片段會初始化 Gemma,並在 LIT Notebook 小工具中載入範例資料集。

from lit_nlp.examples.prompt_debugging import notebook as lit_pdbnb

lit_widget = lit_pdbnb.make_notebook_widget(
    ['sample_prompts'],
    ["gemma2_2b_it:gemma2_instruct_2b_en"],
)

您可以透過兩種方式變更傳遞至兩個必要位置引數的值,藉此設定小工具:

  • datasets_config:字串清單,其中包含要載入的資料集名稱和路徑,格式為「dataset:path」,其中路徑可以是網址或本機檔案路徑。以下範例使用特殊值 sample_prompts 載入 LIT 發布項目中提供的提示範例。
  • models_config:字串清單,其中包含要載入的模型名稱和路徑,格式為「model:path」,其中路徑可以是網址、本機檔案路徑,或是已設定深度學習架構的預設值名稱。

將 LIT 設定為使用您感興趣的模型後,請執行下列程式碼片段,在 Notebook 中轉譯小工具。

lit_widget.render(open_in_new_tab=True)

使用自己的資料

Gemma 是文字轉文字生成模型,可接收文字輸入內容並產生文字輸出內容。LIT 會使用意見 API,將載入的資料集結構傳達給模型。LIT 中的大型語言模型 (LLM) 可搭配提供兩個欄位的資料集使用:

  • prompt:模型的輸入內容,系統會根據這項輸入內容產生文字。
  • target:選用的目標序列,例如人工評分人員的「基準真相」回應,或其他模型預先產生的回應。

LIT 包含一小組 sample_prompts,其中包含來自以下來源的範例,可支援本程式碼研究室和 LIT 的擴充提示偵錯教學課程

  • GSM8K:使用少量示例解決小學數學問題。
  • Gigaword Benchmark:為一系列短篇文章產生標題。
  • 憲政提示:針對如何使用具有規範/邊界的物件,提出新構想。

您也可以輕鬆載入自己的資料,無論是 .jsonl 檔案 (包含欄位 prompt 和選用的 target 的記錄),或是使用 LIT 的 Dataset API 從任何格式載入資料。範例

執行下方單元,載入範例提示。

5. 分析 Gemma 在 LIT 中的 Few Shot Prompt

目前提示的技術與科學一樣,都需要科學與藝術的結合,而 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 醒目顯示模組檢查提示。

6. 使用序列醒目顯示功能進行偵錯

系統會在最小可能的層級 (即每個輸入符號) 計算顯著性,但 LIT 可將符號顯著性匯總為更易解讀的較大區間,例如行、句子或字詞。如要進一步瞭解醒目性,以及如何運用醒目性來找出無意圖的偏誤,請參閱醒目性探索工具

我們先為提示提供新的範例輸入值,用於提示範本變數:

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 使用者介面,可以使用 LIT 的 Datapoint Editor 新增提示:

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 模組中,選取「Sentences」,然後選取推薦行。使用者介面現在應如下所示:

LIT 顯著性

這突顯了人為錯誤:不小心複製貼上建議部分,並未更新!

接下來,我們將第一個範例中的「Recommendation」修正為 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.

這項研究帶來的重要教訓是:及早製作原型可協助揭露您可能事先未考慮到的風險,而語言模型容易出錯的特性,也意味著必須主動設計錯誤處理機制。如要進一步瞭解這項功能,請參閱People + AI 設計指南,瞭解如何運用 AI 進行設計。

雖然修正後的提示訊息有所改善,但仍不太正確:雖然系統正確地告訴使用者避免食用雞蛋,但理由不正確,因為系統表示使用者不喜歡雞蛋,但實際上使用者表示自己不能吃雞蛋。在下一節中,您將瞭解如何改善成效。

7. 測試假設以改善模型行為

您可以使用 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.

接著,您可以重新檢查提示醒目度,瞭解發生這項變更的原因:

LIT 顯著性

請注意,建議的做法更加安全。此外,系統會根據飲食限制和分析結果 (所謂的思考鏈),根據「適合與否」原則明確指出適合性,因此「不適合你」的標示會受到影響。這有助於讓您更加確信輸出內容是基於正確原因而產生。

8. 在模型探查和探索作業中納入非技術團隊

可解釋性是團隊合作的成果,涵蓋 XAI、政策、法律等方面的專業知識。

在模型的早期開發階段與模型互動,傳統上需要大量的技術專業知識,這使得部分協作者更難存取及探查模型。過去從未有工具可讓這些團隊參與早期原型設計階段。

我們希望透過 LIT 改變這種典型印象。正如您在本程式碼研究室中看到的,LIT 的視覺媒體和互動功能可檢查醒目程度並探索範例,協助不同利益相關者分享和傳達研究結果。這樣一來,您就能邀請更多不同類型的團隊成員來探索、探測及偵錯模型。讓他們瞭解這些技術方法,有助於加深對模型運作方式的理解。此外,在早期模型測試中,多樣化的專家知識也能協助找出可改善的負面結果。

9. 重點回顧

重點回顧:

  • LIT UI 提供互動式模型執行介面,可讓使用者直接產生輸出內容,並測試「假設」情境。這在測試不同提示變化版本時特別實用。
  • LM 醒目顯示模組可提供醒目顯示的視覺化呈現方式,並提供可控的資料精細程度,讓您可以討論以人為本的結構 (例如句子和字詞),而非以模型為本的結構 (例如符記)。

如果在模型評估中發現有問題的示例,請將這些示例導入 LIT 進行偵錯。首先,請分析您認為與建模工作邏輯相關的最大可用內容單元,然後使用視覺化資料查看模型正確或不正確處理提示內容的情況,接著深入查看較小的內容單元,進一步描述您看到的錯誤行為,以便找出可能的修正方式。

最後,Lit 會持續改善!如要進一步瞭解我們的功能,並提供建議,請按這裡