返回文章列表

LangChain提示範本範例選擇器與應用

本文深入探討 LangChain 中的提示範本與範例選擇器,包含相似度、最大邊際相關性 (MMR)、長度和 Ngram 等選擇策略,並提供例項說明如何建立和應用 FewShotPromptTemplate,以及如何根據長度限制選擇相關範例,提升模型生成答案的品質和效率。

機器學習 自然語言處理

LangChain 提供多種範例選擇器,用於構建提示範本,例如根據相似度、最大邊際相關性(MMR)、長度和 Ngram 重疊等方法。選擇器能根據輸入內容,從範例函式庫中挑選最相關的範例,動態組裝提示,提升模型理解問題的效率和準確性。 FewShotPromptTemplate 則是一個更進階的工具,它能整合範例選擇器,根據不同輸入,選擇不同的範例,更彈性地控制提示內容。 透過範例選擇器,我們可以有效控制提示長度,避免超過模型的上下文視窗限制,同時確保提示內容與輸入高度相關,進而提升模型生成答案的品質。

2. 最大邊際相關性(MMR)範例選擇器

最大邊際相關性(MMR)範例選擇器旨在平衡所選範例的相關性和多樣性。它使用最大邊際相關性的概念,同時考慮輸入和範例之間的相似性以及所選範例之間的差異性。這種方法確保所選範例不僅與輸入相關,而且也具有多樣性,從而減少冗餘性並增加對輸入相關不同方面的覆寫率。

3. 長度範例選擇器

長度範例選擇器著重於根據指定的長度限制選擇範例。這種選擇器在您有有限的上下文視窗或想要控制提示大小時很方便。這有助於為語言模型提供多樣化的範例集,同時保持在長度限制之內。

4. Ngram 範例選擇器

Ngram 範例選擇器使用輸入和範例之間的 Ngram 重疊來確定哪些範例進行選擇。Ngram 是給定文字中 n 個專案(詞彙或字元)的連續序列。透過這種選擇器,範例中與輸入分享共同短語或詞彙序列的範例被優先選擇,從而可能提高模型生成相關輸出的能力。

選擇範例選擇器的因素

在選擇範例選擇器時,請考慮以下因素:

  • 相關性:如果生成高度相關的輸出至關重要,相似性或 MMR 範例選擇器可能是合適的選擇。
  • 多樣性:如果您想要涵蓋輸入相關的不同方面,MMR 範例選擇器可以幫助平衡相關性和多樣性。
  • 長度限制:如果您對提示有嚴格的長度限制,長度範例選擇器可以幫助選擇符合這些限制的範例。
  • 短語匹配:如果您想要強調與輸入分享共同短語或詞彙序列的範例,Ngram 範例選擇器可以有效。

少數示範提示範本

少數示範提示範本是一種技術,其中模型從極少量的訓練資料中學習執行任務。它涉及提供少量示範(射擊)以幫助模型瞭解任務上下文和期望的輸出格式。

為問題回答建立少數示範提示範本

在本文中,您將學習如何建立一個少數示範提示範本,以教導語言模型根據一組示範生成自問問題並查詢答案。

步驟 1:準備示範集

首先,建立一個少數示範集。每個示範應該是一個包含問題和相應答案的字典:

示範 = [
    {
        "問題": "太陽系中最大的行星是哪個?",
        "答案": "木星是太陽系中最大的行星。"
    },
    {
        "問題": "蒙娜麗莎是誰畫的?",
        "答案": "蒙娜麗莎是由達芬奇畫的。"
    },
    {
        "問題": "日本的貨幣是什麼?",
        "答案": "日本的貨幣是日元。"
    }
]

步驟 2:格式化少數示範

接下來,使用 PromptTemplate 將示範格式化為一串字串,以呈現給語言模型。它接受問題和答案作為輸入變數,並將其格式化為字串:

from langchain.prompts import PromptTemplate

示範提示 = PromptTemplate(
    輸入變數=["問題", "答案"],
    範本="問題:{問題}\n答案:{答案}"
)

步驟 3:建立少數示範提示範本

現在,您將建立一個 FewShotPromptTemplate ,它將作為語言模型學習所提供示範的框架。

FewShotPromptTemplate 的應用

FewShotPromptTemplate 是一個強大的工具,能夠幫助我們建立高品質的提示範本。下面,我們將探討如何使用 FewShotPromptTemplate 來建立一個自定義的提示範本。

建立 FewShotPromptTemplate

首先,我們需要匯入必要的函式庫:

from langchain.prompts import FewShotPromptTemplate

然後,我們可以建立一個 FewShotPromptTemplate 例項:

prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="問題:{input}",
    input_variables=["input"]
)

在這個例子中,我們傳遞了 examplesexample_promptsuffix 作為引數。suffix 引數指定了將被追加到示例和輸入變數的字串。

預覽格式化範本

我們可以使用 format() 方法預覽格式化範本:

print(prompt.format(input="澳大利亞的首都是什麼?"))

輸出結果將是:

問題:澳大利亞的首都是什麼?
答案:澳大利亞的首都是堪培拉。
問題:太陽系中最大的行星是什麼?
答案:木星是太陽系中最大的行星。
問題:誰畫了蒙娜麗莎?
答案:蒙娜麗莎是由玄貓畫的。
問題:日本的貨幣是什麼?
答案:日本的貨幣是日元。
問題:澳大利亞的首都是什麼?

選擇示例

如果您有一個大型示例集,您可以使用示例選擇器。下面,我們將初始化一個 LengthBasedExampleSelector 例項:

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=50
)

然後,我們可以使用 select_examples() 方法選擇最相關的示例:

selected_examples = example_selector.select_examples({"question": "誰雕刻了自由女神像?"})

這將傳回最相關的示例,根據示例的長度。

圖表翻譯:

內容解密:

在這個例子中,我們使用了 FewShotPromptTemplate 來建立一個自定義的提示範本。然後,我們使用 format() 方法預覽格式化範本。最後,我們使用示例選擇器選擇最相關的示例。這些步驟可以幫助我們建立高品質的提示範本,從而提高模型的效能。

使用 LengthBasedExampleSelector 選擇相關範例

在建立 FewShotPromptTemplate 時,我們可以使用 LengthBasedExampleSelector 來選擇最相關的範例。這個選擇器根據範例的長度來選擇範例,目的是在指定的最大長度內包含盡可能多的範例。

LengthBasedExampleSelector 的工作原理

當初始化 LengthBasedExampleSelector 時,我們需要提供範例列表(examples)、範例提示範本(example_prompt)和最大長度(max_length)。然後,選擇範例的方法(select_examples)會被呼叫,傳入一個包含輸入問題的字典。

LengthBasedExampleSelector 會遍歷範例列表,並根據範例的長度來選擇範例。它嘗試包含盡可能多的範例,同時確保選擇的範例的總長度不超過指定的 max_length。其目的是在指定的長度限制內最大化包含的範例數量。

將範例選擇器整合到提示範本中

由玄貓介紹,選擇的範例可以動態地包含在提示中,根據輸入問題的相關性。這種方法允許更有針對性和高效地使用範例,從而提高生成回應的品質和相關性。

from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector

# 定義範例列表和範例提示範本
examples = [...]
example_prompt = "..."

# 初始化 LengthBasedExampleSelector
example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=...
)

# 建立 FewShotPromptTemplate
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="問題:{input}",
    input_variables=["input"]
)

# 載入 OpenAI 語言模型
llm = OpenAI(
    model_name="gpt-3.5-turbo",
    openai_api_key="你的 OpenAI 金鑰",
    temperature=0.7,
)

圖表翻譯:LengthBasedExampleSelector 的工作流程

圖表翻譯:

LengthBasedExampleSelector 的工作流程可以分為四個步驟:初始化、遍歷範例列表、根據範例長度選擇範例和確保選擇的範例總長度不超過最大長度。最終,選擇器會傳回選擇的範例。

玄貓對於 Prompt Templates 的理解和應用

玄貓是一位頂尖的技術專家,擁有豐富的實務經驗和國際級的知識。以下是玄貓對於 Prompt Templates 的理解和應用:

Prompt Template 的基本概念

Prompt Template 是一種用於生成答案的範本,通常包含一個問題和一個答案。玄貓認為,Prompt Template 是一種有效的方法,可以用於生成高品質的答案。

Prompt Template 的型別

玄貓認為,Prompt Template 有兩種型別:帶有例子選擇器的 Prompt Template 和不帶有例子選擇器的 Prompt Template。帶有例子選擇器的 Prompt Template 可以根據問題的長度選擇相關的例子,而不帶有例子選擇器的 Prompt Template 則會包含所有提供的例子。

Prompt Template 的應用

玄貓認為,Prompt Template 可以用於生成答案、回答問題和提供解釋。例如,玄貓可以使用 Prompt Template 來回答問題,如「什麼是澳大利亞的首都?」或「誰雕刻了大衛像?」。

玄貓的 Prompt Template 實踐

玄貓在實踐中使用了兩種型別的 Prompt Template:帶有例子選擇器的 Prompt Template 和不帶有例子選擇器的 Prompt Template。玄貓發現,帶有例子選擇器的 Prompt Template 可以根據問題的長度選擇相關的例子,而不帶有例子選擇器的 Prompt Template 則會包含所有提供的例子。

內容解密:

上述內容是對於 Prompt Templates 的理解和應用。玄貓認為,Prompt Template 是一種有效的方法,可以用於生成高品質的答案。以下是對於上述內容的詳細解釋:

  • Prompt Template 的基本概念:Prompt Template 是一種用於生成答案的範本,通常包含一個問題和一個答案。
  • Prompt Template 的型別:玄貓認為,Prompt Template 有兩種型別:帶有例子選擇器的 Prompt Template 和不帶有例子選擇器的 Prompt Template。
  • Prompt Template 的應用:玄貓認為,Prompt Template 可以用於生成答案、回答問題和提供解釋。
  • 玄貓的 Prompt Template 實踐:玄貓在實踐中使用了兩種型別的 Prompt Template:帶有例子選擇器的 Prompt Template 和不帶有例子選擇器的 Prompt Template。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain提示範本範例選擇器與應用

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

上述圖表展示了 Prompt Template 的工作流程。首先,輸入一個問題,然後使用 Prompt Template 進行處理,最後輸出答案。

從技術架構視角來看,LangChain 的 Prompt Templates 與範例選擇器機制為大語言模型的應用開發提供了一個結構化且高效能的框架。透過 PromptTemplate 和 FewShotPromptTemplate,開發者得以將輸入變數與預先設計的提示範本結合,有效引導模型生成預期輸出。不同型別的範例選擇器,如根據相似度、MMR、長度或 Ngram 的選擇器,則進一步提升了提示的精準度和靈活性,尤其在少量示範學習場景中,能有效控制提示長度並提升模型學習效率。然而,選擇器本身的計算複雜度,特別是 MMR 演算法,在面對大規模範例函式庫時可能成為效能瓶頸。此外,如何針對特定任務和模型特性選擇最佳的範例選擇策略和引陣列態,仍需更多實務經驗和研究來指導。玄貓認為,隨著大語言模型應用日趨普及,Prompt Engineering 的重要性將持續提升,而 LangChain 提供的 Prompt Templates 和範例選擇器機制,將成為構建高效能、可擴充套件且易於維護的 LLM 應用程式不可或缺的工具。未來發展方向將聚焦於更精細的範例選擇演算法、自動化提示最佳化策略,以及與向量資料函式庫和知識圖譜等外部知識源的深度整合。對於追求最佳效能的開發者而言,深入理解不同範例選擇器的特性和應用場景,並根據實際需求進行客製化組態,將是釋放 Prompt Engineering 潛力的關鍵。