使用 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,因為許多人都瞭解這種模型,而且能廣泛用於可解釋性研究社群。

更進階的梯度式顯著性方法包括:梯度 ⋅ 輸入積分梯度。另有使用模糊處理為基礎的方法,例如 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.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 的模型假設資料集會提供下列欄位以支援產生作業:

  • promptKerasGenerationModel 的輸入內容。
  • 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 UI 示範

您也可以在新分頁中以完整頁面開啟 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 資料點編輯者

另一種方法是使用感興趣的提示直接重新轉譯小工具:

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 現在應如下所示:

LIT Salience

因而標示出人為錯誤:不小心複製貼上最佳化建議部分,但未能更新!

現在來修正「建議」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.

接著,您可以再次查看提示顯著性,瞭解變化發生的原因:

LIT Salience

請注意,這項建議較為安全。此外,「不適合您」受到遵循飲食限制,以及分析 (所謂的「思想鏈」) 明確陳述合適度的原則所影響。這有助於讓輸出確信是基於適當原因發生。

10. 請非技術團隊參與模型探測和探索

「可解釋性」是指團隊合作,跨越 XAI、政策和法律等領域的專業知識。

在早期開發階段與模型互動,通常需要具備深厚的技術專業知識,讓部分協作者更難存取及探測模型。以往的原型設計階段早已不存在,因此工具無法協助這些團隊參與早期原型階段。

希望透過 LIT 這個模式可以改變。正如本程式碼研究室所述,LIT 運用視覺媒介和互動能力檢查顯著性及探索範例,有助於不同的相關人員分享及傳達發現結果。如此一來,就能讓更多元的團隊成員參與模型探索、探測和偵錯。將他們提供給這些技術方法,可加深他們對模型運作方式的理解。此外,在初期模型測試中具備多樣化的專業知識,也有助於找出不理想的結果並進一步改善。

11. 回顧

重點回顧:

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

在模型評估作業中找到有問題的樣本時,將其帶入 LIT 以便偵錯。首先,請分析在邏輯上與模擬工作相關的最大合理內容單元,運用圖表查看模型正確或錯誤與提示內容的位置,然後進一步細查內容單元,進一步描述您看到的錯誤行為,並找出可能的修正方法。

最後:Lit 會不斷進步!如要進一步瞭解我們的功能及提供你的建議,請前往這裡