預訓練大語言模型(LLM)奠定了自然語言處理的基礎,但要將其應用於特定任務,微調和提示工程至關重要。微調技術如監督式微調(SFT)、人類反饋強化學習(RLHF)以及低秩調整(LoRA)能有效提升模型在特定領域的表現。同時,提示工程技巧如零次學習、少次學習及上下文學習,則能引導模型生成更符合預期的輸出。本文將深入探討這些技術的原理、應用和實務操作,並提供程式碼範例和圖表說明,幫助讀者掌握 LLM 的精髓。

溫度

溫度引數是控制文字生成的不可預測性和決定性的關鍵。較低的溫度設定會產生更確定和集中輸出,而較高的溫度設定會引入隨機性,產生多樣化的輸出。

停止序列

停止序列是指定的字元序列,當它們出現在輸出中時會終止文字生成過程。這些序列可以控制生成文字的長度和結構,確保輸出符合規範。

頻率和存在罰金

頻率和存在罰金是管理生成文字中詞彙重複的機制。頻率罰金會降低模型重複使用詞彙的機率,而存在罰金會防止模型重複使用任何已經出現在文字中的詞彙。

預訓練和微調LLM

預訓練LLM可以從大量文字資料中吸收知識,允許它們執行多種語言相關任務。微調可以將LLM最佳化為專門的應用,允許它們完成複雜的工作。

預訓練

預訓練LLM涉及訓練模型在大量文字資料上,以便它們可以學習語言的模式和結構。這種方法可以使LLM學習到語言的基本知識和技能。

微調

微調LLM涉及調整預訓練模型的引數,以便它們可以適應專門的應用。這種方法可以使LLM學習到特定的知識和技能,從而完成複雜的工作。

預訓練大語言模型(LLMs)

預訓練大語言模型(LLMs)已經徹底改變了人工智慧的格局。這些模型透過在海量的文字資料集上進行訓練,提高了其語言能力。這種廣泛的訓練使得它們能夠發展出對語法、上下文和語義的全面理解,從而有效地掌握語言的細微差別。

預訓練LLMs已經展示了在文字生成以外的各種任務中的多功能性。這在2020年的GPT-3論文“語言模型是少次學習者”中尤其明顯。該研究表明,足夠大的LLMs是“少次學習者”,能夠使用只有一些任務特定的示例來推斷使用者需求的底層邏輯。這一突破代表了自然語言處理(NLP)領域的一個重大進展,之前該領域依賴於為每個任務單獨訓練模型。

微調LLMs

微調是一種必要的技術,用於改進預訓練模型在專門任務中的能力。雖然預訓練的LLMs具有深刻的語言理解,但其全部潛力可以透過微調來實作。微調將LLMs轉化為專家,允許預訓練模型調整其內部引數和表示,以更好地適應特定的任務。這種定製的適應性顯著提高了它們在領域特定任務中的效能。

例如,一個在醫學問題答案資料集上微調的模型將能夠高效地回答醫學相關問題。對微調的需求源於預訓練模型的通用性。雖然它們對語言有廣泛的理解,但它們並不內在地具備特定任務的上下文。例如,當處理金融新聞的情感分析時,微調就變得至關重要。

指令微調:建立通用助手

指令微調是一種不同的微調形式,將模型轉化為通用助手。它旨在建立一個理解提示作為指令而非文字的LLM。例如,考慮以下提示:“法國的首都是什麼?”一個指令微調的LLM可能會將提示解釋為指令並給出以下答案:“巴黎。”然而,一個普通的LLM可能會認為我們正在為地理學生編寫一份練習題,並繼續生成最可能的令牌,這可能是一個新問題:“義大利的首都是什麼?”

指令微調擴充套件了模型的能力。該過程指導模型產生符合我們願景的結果。例如,當你提示模型“分析這段文字的情感並判斷它是否為正面”,你就會以精確的命令指導模型。透過指令微調,明確的指示被給出,塑造模型的行為以反映我們的預期目標。

指令微調訓練模型使用指令執行多個任務。這使LLMs能夠學習透過額外的指令執行新任務。這種方法不需要大量的任務特定資料,而是依靠文字指令來引導學習過程。傳統的微調使模型熟悉特定與任務相關的資料集。指令微調進一步發展了這種方法,給予開發人員對模型更大的控制權,允許他們塑造結果,鼓勵某些行為,並引導模型的回應。

微調技術

有多種方法關注用於微調的學習演算法,例如:

  • 全面微調:這種技術調整預訓練的大語言模型(LLM)中的所有引數,以使其適應特定的任務。雖然有效,但全面微調需要大量的計算資源,使其價值降低。
  • 低秩適應(LoRA):LoRA在LLMs的下游層上採用低秩近似。這種技術透過最佳化計算資源和費用來最佳化計算資源。另外,LoRA的一種變體QLoRA,透過引數量化引入進一步的最佳化。
  • 監督微調(SFT):SFT是一種標準方法,已經訓練好的LLM使用有限的示例資料進行監督微調。示例資料通常包括示例資料、提示和相應的回應。模型從這些資料中學習並生成符合預期輸出的回應。SFT甚至可以用於指令微調。
  • 人類反饋強化學習(RLHF):RLHF方法訓練模型在多次迭代中與人類反饋保持一致。這種方法比SFT更有效,因為它允許根據人類輸入的持續改進。類似的方法包括直接偏好最佳化(DPO)和人工智慧反饋強化學習(RLAIF)。

回顧

雖然LLMs在某些任務中表現出色,但瞭解其侷限性是廣泛採用人工智慧的關鍵一步。當模型生成不根據現實且不正確的文字時,就會發生“幻覺”。這種現象涉及模型自信地生成沒有基礎的回應。開發有效的策略來應對這些挑戰是必不可少的。這些策略應包括預處理和控制輸入的措施、模型組態的調整、增強機制以及增加上下文和知識的技術。將倫理納入模型中以確保公平和可信的輸出至關重要。

在實踐中,提高LLMs的效率需要準確評估其效能。目標函式和評估指標是機器學習模型的關鍵元件。目標函式或損失函式引導演算法減少損失分數。對於LLMs,交叉熵損失是一種常用的目標函式。評估指標提供了對模型能力的可理解評估。困惑度是一種內在指標,用於衡量LLM預測樣本或單詞序列的能力。

LLM評估涉及一系列挑戰,從瞭解模型如何理解和生成類似人類的文字到評估其執行特定任務的能力,例如語言翻譯、摘要或問答。基準測試作為標準化的任務或資料集,模型在此基礎上進行測試,提供了比較不同架構和迭代的基礎。同時,指標提供了可量化的效能衡量標準,允許研究人員和開發人員評估模型行為的各個方面,例如準確性、流暢度、連貫性和效率。

評估策略衡量輸出相關性,而方法如解碼、引數如溫度和頻率以及提示技術如零次提示、少次提示、預訓練和微調可以在生成過程之前/期間提高模型的有效性。

解碼方法

解碼方法是LLMs使用的基本技術。在解碼過程中,LLM為語彙中的每個令牌分配一個分數,分數越高,表示該令牌被選為下一個令牌的可能性越大。然而,最高機率的令牌並不總是最佳選擇。解碼方法,如貪婪搜尋、取樣、束搜尋、Top-K取樣和Top-p(Nucleus)取樣,旨在在立即選擇具有最高機率的令牌之間找到平衡,並允許一些探索。

引數和提示技術

引數如溫度、停止序列、頻率和存在罰則以及引數是精煉文字生成控制的基本組成部分。調整這些引數允許模型生成符合特定要求的輸出,從確定和集中到多樣和創新的輸出。預訓練為LLMs奠定了基礎。微調則將通用理解與專門知識之間的差距聯絡起來,從而使LLMs在特定領域中出類拔萃。指令微調將LLMs轉化為可適應的助手,允許透過明確的指令對其行為進行精確控制。微調策略,如全面的微調和資源意識的低秩適應(LoRA),以及學習方法,如監督微調(SFT)和人類反饋強化學習(RLHF),都是LLMs生態系統的重要組成部分。

什麼是提示工程?

提示工程是一種學科,專門研究如何建立和最佳化提示,以便在各種應用和研究領域中發揮語言模型的作用。這個領域對於瞭解大語言模型(LLM)的優勢和侷限性至關重要,並在許多自然語言處理(NLP)任務中發揮著重要作用。

提示的重要性

提示是人類和AI之間的橋樑,讓我們可以與AI溝通並生成符合我們特定需求的結果。要充分利用生成AI的能力,瞭解如何提出正確的問題和如何詢問是非常重要的。以下是提示的重要性:

  • 提示可以引導模型生成最相關的輸出,讓輸出在特定情境中保持一致和特定的格式。
  • 提示可以增加控制和解釋性,並減少潛在的偏見。
  • 不同的模型會對相同的提示做出不同的反應。瞭解如何為特定的模型建立正確的提示可以生成精確的結果。
  • 生成模型可能會產生幻覺。提示可以引導模型朝正確的方向發展。
  • 提示可以讓我們嘗試使用不同的資料型別和呈現方式來與語言模型進行互動。
  • 提示可以讓我們定義什麼是好的結果和壞的結果。
  • 提示可以提高模型的安全性,防止使用者透過提示來產生不想要的行為。

將提示整合到程式碼範例中

以下是如何使用OpenAI API和LangChain套件來建立一個簡單的故事生成程式:

import os
import openai

# 設定OpenAI API Key
os.environ['OPENAI_API_KEY'] = "<OPENAI_API_KEY>"

# 安裝LangChain和OpenAI套件
# pip install -q langchain==0.0.208 openai==0.27.8

# 定義系統提示和使用者提示
prompt_system = "您是一個幫助助手,目的是幫助寫故事。"
prompt = """繼續以下的故事。寫不超過50個字。
從前,在一個動物可以說話的世界裡,一隻勇敢的老鼠名叫本傑明決定"""

# 建立OpenAI ChatCompletion物件
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": prompt_system},
        {"role": "user", "content": prompt}
    ]
)

# 列印生成的故事
print(response.choices[0]['message']['content'])

內容解密:

上述程式碼使用OpenAI API和LangChain套件來建立一個簡單的故事生成程式。程式碼定義了一個系統提示和一個使用者提示,然後使用OpenAI API建立一個ChatCompletion物件。最後,程式碼列印生成的故事。

圖表翻譯:

以下是程式碼的Mermaid圖表:

  graph LR
    A[系統提示] --> B[使用者提示]
    B --> C[OpenAI API]
    C --> D[ChatCompletion物件]
    D --> E[生成故事]
    E --> F[列印故事]

圖表展示了程式碼的邏輯流程,從系統提示和使用者提示到OpenAI API和ChatCompletion物件,最後到生成故事和列印故事。

產品描述:豪華手工限量版鋼筆

我們的限量版鋼筆是由優質玫瑰木和金屬打造,具有精湛的手工工藝和豪華的設計。每一支鋼筆都是獨一無二的藝術品,體現了工匠的卓越技藝和對細節的關注。玫瑰木的自然紋理和金屬的光澤完美融合,創造出一款既優雅又時尚的寫作工具。

提示技巧

1. 零次提示(Zero-Shot Prompting)

零次提示是指語言模型在沒有任何示例的情況下被要求產生輸出。許多工都在大語言模型的能力範圍內,因此即使沒有示例或深入,也能夠提供優秀的結果。以下是另一個示例,語言模型被要求寫一首關於夏天的短詩:

import openai
prompt_system = "您是一個幫助助手,目的是撰寫短詩。"
prompt = "請為 {topic} 撰寫一首短詩。"

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": prompt_system},
        {"role": "user", "content": prompt.format(topic="夏天")}
    ]
)

print(response.choices[0]['message']['content'])

2. 上下文學習和少次提示(In-Context Learning And Few-Shot Prompting)

上下文學習是一種方法,語言模型從提示中的示例或示範中學習。少次提示是一種上下文學習的子集,向語言模型提供少量相關的示例或示範。這種策略可以幫助語言模型泛化和提高其在更複雜任務上的效能。

少次提示允許語言模型從少量樣本中學習。這種適應性使其能夠處理各種任務,只需少量訓練樣本。與零次提示不同,語言模型為完全新的任務生成輸出,少次提示利用上下文示例來提高效能。

以下是使用少次提示的示例:

import openai
prompt_system = "您是一個幫助助手,目的是撰寫短詩。"
prompt = "請為 {topic} 撰寫一首短詩,以下是幾個示例:..."

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": prompt_system},
        {"role": "user", "content": prompt.format(topic="夏天")}
    ]
)

print(response.choices[0]['message']['content'])

這些提示技巧可以幫助語言模型更好地理解任務要求和上下文,從而生成更高品質的輸出。

人工智慧與自然語言處理

人工智慧(AI)在近年來取得了飛速的發展,尤其是在自然語言處理(NLP)領域。NLP是一個結合了電腦科學、語言學和認知科學的跨學科領域,旨在使電腦能夠理解、解釋和生成人類語言。

Few-Shot Prompting

Few-Shot Prompting是一種NLP技術,允許人工智慧模型在少量的訓練資料下學習和完成任務。這種方法透過提供少量的示例資料,讓模型學習到任務的模式和結構,從而能夠應用到新的、未見過的資料上。

LangChain 框架

LangChain是一個開源框架,提供了一個簡單和統一的方式來使用不同的NLP模型和技術,包括Few-Shot Prompting。LangChain允許開發者建立和定製自己的NLP工作流程,從而能夠解決複雜的NLP任務。

示例:情感識別

以下是一個使用LangChain框架和Few-Shot Prompting技術的示例,旨在識別特定顏色所 liên結的情感。

from langchain import PromptTemplate, FewShotPromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI

# 初始化LLM模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# 定義示例資料
examples = [
    {"color": "red", "emotion": "passion"},
    {"color": "blue", "emotion": "serenity"},
    {"color": "green", "emotion": "tranquility"},
]

# 定義示例格式化範本
example_formatter_template = """
Color: {color}
Emotion: {emotion}\n
"""

# 定義示例提示範本
example_prompt = PromptTemplate(
    input_variables=["color", "emotion"],
    template=example_formatter_template,
)

# 定義Few-Shot Prompting範本
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="""Here are some examples of colors and the emotions associated with them:\n\n""",
    suffix="""\n\nNow, given a new color, identify the emotion associated with it:\n\nColor: {input}\nEmotion:""",
    input_variables=["input"],
    example_separator="\n",
)

# 格式化提示
formatted_prompt = few_shot_prompt.format(input="purple")

# 建立LLMChain
chain = LLMChain(llm=llm, prompt=PromptTemplate(template=formatted_prompt, input_variables=[]))

# 執行LLMChain
response = chain.run({})

這個示例使用Few-Shot Prompting技術和LangChain框架,識別特定顏色所聯結的情感。透過提供少量的示例資料,模型能夠學習到任務的模式和結構,從而能夠應用到新的、未見過的資料上。

人工智慧模型的角色指令

人工智慧模型的角色指令是一種強大的技術,能夠讓模型根據特定的角色或身份來執行任務。這種技術可以讓模型更好地理解使用者的需求和需求的背景。

角色指令的工作原理

角色指令的工作原理是透過定義一個角色或身份來指導模型的行為。這個角色或身份可以是一個簡單的描述,例如「作為一名編輯,」或者是一個更複雜的描述,例如「作為一名未來的機器人樂隊指揮,」。然後,模型會根據這個角色或身份來生成一個回應。

角色指令的優點

角色指令的優點是可以讓模型更好地理解使用者的需求和需求的背景。這種技術可以讓模型生成更相關和更有用的回應。另外,角色指令也可以讓模型更好地學習和適應新的任務和情境。

角色指令的應用

角色指令的應用非常廣泛。例如,可以使用角色指令來生成創意的歌曲標題,或者來建立一個對話系統。另外,角色指令也可以用於自然語言處理、文字生成和其他相關領域。

例項:未來的機器人樂隊指揮

以下是一個使用角色指令的例項:

from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI

# 初始化模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# 定義角色指令
template = """
作為一名未來的機器人樂隊指揮,我需要你幫我想出一個歌曲標題。
什麼是一個很酷的歌曲標題,關於 {theme}{year} 年?
"""

# 建立角色指令
prompt = PromptTemplate(
    input_variables=["theme", "year"],
    template=template,
)

# 建立模型鏈
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)

# 輸入資料
input_data = {"theme": "星際旅行", "year": "3030"}

# 建立模型鏈
chain = LLMChain(llm=llm, prompt=prompt)

# 執行模型
output = chain(input_data)

# 輸出結果
print(output)

這個例項使用角色指令來生成一個歌曲標題,關於「星際旅行」在「3030」年。模型會根據這個角色指令來生成一個回應。

瞭解 Chain Prompting 的概念

Chain Prompting 是一種創新的方法,涉及將多個提示連線在一起,形成一個序列,每個提示的輸出都會作為下一個提示的輸入。這種方法可以讓模型更好地理解使用者的意圖,從而產生更合適的回應。

從技術架構視角來看,本文深入淺出地介紹了大語言模型的預訓練、微調、提示工程以及相關技術,如溫度引數、停止序列、頻率和存在罰金等。分析段落清晰地闡述了指令微調、不同微調技術的優劣,以及提示工程的重要性、技巧和應用範例。文章也指出了大語言模型的侷限性,例如「幻覺」現象,並提出了應對策略,展現了務實平衡的觀點。文章的前瞻性體現在對LLM評估指標、解碼方法、引數和提示技術的探討,預示了這些技術在未來LLM發展中的重要性。對於希望深入瞭解並應用大語言模型的開發者而言,本文提供了寶貴的實務建議,建議技術團隊深入研究不同微調技術和提示策略,以充分釋放LLM的潛力。隨著技術的持續發展,我們預見LLM的應用門檻將大幅降低,並在更多領域展現其 transformative power。