文章目錄
- 一. LLM 的演進:從規則到智能的躍遷 💫
- 1.1 語言模型的蹣跚起步 👶
- 1.2 RNN 與 LSTM:序列建模的嘗試 🧐
- 1.3 Transformer 的橫空出世:自注意力機制的革命 💥
- 1.4 LLM :從預測到創造的飛躍 🚀
- 1.4.1 大語言模型族譜
- 1.4.2 GPT的貢獻
- GPT-1(2018年) 預訓練+微調的模型架構
- GPT-2(2019年) 遷移學習能力
- GPT-3(2020年) 上下文學習能力和涌現
- GPT-3.5(2021~2022年) 代碼能力和指令遵循能力
- 二. Token 與 Embedding:LLM 的微觀世界 🔬
- 2.1 Tokenization 的精妙之處 🧩
- 2.1.1 空格分詞
- 2.1.2 字節對編碼(BPE)
- 2.1.3 WordPiece:
- 2.1.4 Unigram
- 2.2 Embedding 的力量:語義空間的構建 🌌
- 三. LLM 的訓練:數據、算法與藝術的融合 🎨
- 3.1 預訓練:海量數據的自監督學習 📚
- 3.1.1 語言建模(Language Modeling, LM)
- 3.1.2 去噪自編碼(Denoising Autoencoding, DAE)
- 3.1.3 混合去噪器(Mixture-of-Denoisers, MoD)
- 3.2 微調:任務定制的藝術 🛠?
- 3.2.1 為什么要微調
- 3.2.2 何時微調
- 3.2.3 三種微調方式
- 方式一:Prompt-tuning
- 方式二:Prefix-tuning
- 方式三:LoRA
- 3.3 強化學習微調(RLHF):對齊人類偏好 🤖
- 3.3.1 有監督微調
- 3.3.2 訓練獎勵模型
- 3.3.3 強化學習微調
- 3.4 大模型訓練的挑戰:算力、數據與倫理 🤯
- 四. Prompt 工程:解鎖 LLM 潛能的鑰匙 🗝?
- 4.1 Prompt 的力量:人機交互的橋梁 🌉
- 4.2 多樣化的 Prompt 設計 🌈
- 4.3 Prompt 工程的實踐技巧
- 五. LLM 的挑戰:理性看待幻覺與倫理 🤔
- 5.1 幻覺的根源:LLM 的認知缺陷 😵?💫
- 5.2 如何馴服幻覺:增強 LLM 的可靠性 💪
- 5.3 LLM 的倫理考量:責任與公平 ??
- 5.4 可信賴 AI 的構建 ?
- 六. RAG 與 Agent:拓展 LLM 的邊界 🚀
- 6.1 RAG:知識與生成的深度融合 🧠
- 6.2 Agent:LLM 的執行能力 🦾
- 七. 國內 LLM 的崛起:挑戰與機遇并存 🇨🇳
- 7.1 國內 LLM 的現狀:百舸爭流,各具特色 🌊
- 7.2 面臨的挑戰:數據、算法與生態 🚧
- 7.3 未來的機遇:潛力無限,前景廣闊 🌟
- 7.4 LLM 的未來:責任與創新并肩而行 🤝
- 參考文獻
大型語言模型(LLM)的崛起,猶如一場科技的奇點,正以驚人的速度重塑著我們與信息、與世界的互動模式。它們不再是冰冷的機器,而是具備理解、生成、甚至創造能力的智能體,展現出前所未有的潛力。然而,在這令人興奮的機遇背后,也隱藏著復雜的技術挑戰和深刻的倫理思考。本文將基于一系列精選參考文獻[1-9],從概念、技術、應用、挑戰等多個維度,以抽絲剝繭的方式深入剖析LLM,共同揭開LLM的神秘面紗。
一. LLM 的演進:從規則到智能的躍遷 💫
1.1 語言模型的蹣跚起步 👶
早期的語言模型,如N-gram模型,依賴于統計詞語或短語在文本中出現的頻率來預測下一個詞。這種方法簡單易懂,例如,當輸入“今天天氣”時,基于大規模語料庫的 N-gram 模型可能會預測“很好”作為下一個詞,因為它在訓練數據中經常與“今天天氣”同時出現。然而,N-gram模型存在嚴重的局限性。它們無法捕捉長距離的依賴關系和上下文信息,例如,在句子 “今天天氣雖然很冷,但我仍然想去戶外散步” 中,N-gram 模型很難理解 “冷” 對后面 “散步” 的語義影響。此外,基于規則的系統也因為無法應對語言的復雜性和多樣性而顯得非常脆弱,往往只能在特定領域或特定場景下工作。這些系統高度依賴人工規則,缺乏對語言上下文的理解,難以處理歧義和復雜結構,維護和擴展成本極高[1]。
思考: 為什么早期的基于規則的系統如此脆弱?它們在處理復雜語言時遇到了哪些無法逾越的障礙?
🤔 規則系統需要人為定義大量的規則,維護成本非常高,并且無法處理語言的模糊性、歧義性和動態性。此外,語言的演化和更新速度很快,人為定義的規則很難跟上這種變化。基于規則的系統無法進行有效的泛化,一個領域或場景的規則無法直接應用到另一個領域或場景。
案例: 考慮這樣一個句子:“The cat, which was black and white, jumped over the lazy brown dog.” (貓,它是黑白相間的,跳過了懶惰的棕色狗。)。 N-gram 模型在預測 “jumped” 后面的詞時,可能會錯誤地認為 “over” 之后應該是一個名詞,但實際上是介詞短語 "over the lazy brown dog"作為一個整體。這說明N-gram模型缺乏對句子結構和長距離依賴的理解,無法捕捉句子中詞語之間的復雜關系。 😥
1.2 RNN 與 LSTM:序列建模的嘗試 🧐
循環神經網絡(RNN)的出現,為序列數據建模提供了一種新的思路。RNN 可以被看作一個“具有記憶”的系統,它在處理序列數據的每一個元素時,都會保留之前處理過的信息,并在后續處理中利用這些信息。這種循環的結構使得 RNN 可以處理長度可變的序列數據。長短期記憶網絡(LSTM)是 RNN 的一種改進版本,它通過引入“門”機制(包括輸入門、遺忘門和輸出門)來解決 RNN 的梯度消失/爆炸問題,并能夠更好地處理長序列信息。 LSTM 可以選擇性地保留或遺忘歷史信息,從而更有效地學習長距離依賴。然而,即使是LSTM,在處理非常長的序列時,仍然會面臨信息遺忘和計算效率低下的挑戰[1]。這是因為LSTM在處理長序列時,需要按順序處理每個時間步,無法并行計算,導致計算效率較低。此外,LSTM 在處理更長的序列時,依然無法完全避免信息丟失的問題,尤其是在序列中較早出現的信息。這限制了它們在復雜語言任務中的應用,尤其是當序列過長時。 😫
思考: 為什么 RNN 和 LSTM 雖然能夠處理序列數據,但在處理復雜語言時仍然表現不佳? 😓
主要原因在于它們在處理長序列時容易出現梯度消失/爆炸,且計算效率相對較低,難以捕捉長距離依賴關系。同時,RNN的循環結構也使得它難以并行計算,限制了訓練的速度和規模。
1.3 Transformer 的橫空出世:自注意力機制的革命 💥
Transformer 架構的出現,徹底改變了自然語言處理領域。Transformer 摒棄了傳統的循環結構,采用自注意力機制來實現對序列數據的建模。自注意力機制的核心思想是,讓每一個詞都關注句子中的其他所有詞,并根據它們之間的關聯性動態調整自身的表示。可以把自注意力機制比作一個“社交網絡”,每個詞都與其他詞相互連接,并根據它們之間的“關系”來更新自己的“社交地位”[1]。 自注意力機制允許模型并行地處理整個輸入序列,極大地提高了計算效率。具體來說,自注意力機制通過三個矩陣:Query (Q)、Key (K) 和 Value (V) 來計算詞之間的關聯度。對于每一個詞,計算它與其他所有詞的 Q·K^T 的結果(點積)來得到注意力權重,然后用這些權重加權 V 矩陣,得到該詞的上下文表示。公式如下:
Attention(Q, K, V) = softmax(QK^T / sqrt(dk))V
其中,dk是K的維度。softmax函數將注意力權重歸一化,sqrt(dk) 用于縮放點積結果,防止梯度消失。 多頭注意力機制 (Multi-head Attention) 是自注意力機制的擴展,它允許模型從不同的角度關注句子中的其他詞,捕捉更豐富的語義信息[1]。 例如,在句子“The cat chased the mouse because it was hungry.” 中,自注意力機制可以幫助模型理解 “it” 指的是 “cat” 而不是 “mouse”,因為它通過分析句子中所有詞之間的關系,發現了 “it” 與 “cat” 的關聯性更強。Transformer 的編碼器-解碼器結構進一步增強了其能力。編碼器將輸入文本轉化為具有語義信息的隱藏表示,解碼器則根據編碼器的輸出,逐步生成目標文本。 Transformer 的并行計算能力也顯著提升了訓練效率,為LLM的快速發展奠定了基礎[1]。 這使得可以使用更大的數據集和模型進行訓練,從而獲得更好的性能。 😎
案例:考慮句子 “The company acquired a small startup that was working on AI.”。在自注意力機制下,當處理 “startup” 這個詞時,模型會同時關注句子中的所有其他詞,并根據它們的關聯性,動態地為每個詞分配權重。例如, “startup” 可能與 “company”, “acquired”, “working”, “AI” 等詞產生較高的關聯度,從而幫助模型捕捉 “startup” 在這個句子中的具體含義。多頭注意力機制允許模型同時關注 “startup” 與 “company” 的關系,以及 “startup” 與 “AI” 的關系,從而更全面地理解 “startup” 的含義。 🧐
思考: Transformer 架構的并行計算能力如何顯著提升了訓練效率,從而推動了LLM的快速發展? 🤔
Transformer 的自注意力機制讓每一個詞都可以同時和其他所有詞計算關聯度,這使得模型可以并行處理整個句子,從而大幅減少了訓練時間,而RNN需要按順序處理,無法并行。同時,Transformer 的自注意力機制可以更好地捕捉長距離的依賴關系,從而更好地理解語言的上下文信息。
1.4 LLM :從預測到創造的飛躍 🚀
大型語言模型不再僅僅是 “預測下一個詞” 的工具,它們擁有了對語言的深層次理解、生成、和創造能力[1]。LLM 不僅可以理解復雜概念,進行推理,還能適應各種不同的場景和任務,表現出驚人的智能水平。LLM 的核心挑戰在于如何構建一個能夠泛化到不同任務,適應各種場景的模型,并能夠真實理解人類的意圖,這需要模型具備強大的知識表示、推理和泛化能力。LLM 的一個關鍵能力是 “涌現能力” (Emergent Abilities),即模型在達到一定規模后,會突然展現出一些在較小規模模型上沒有的能力,例如上下文學習、多步推理和指令遵循[1]。 ?
1.4.1 大語言模型族譜
谷歌機器翻譯團隊提出了由多組 Encoder/Decoder 構成的機器翻譯模型 Transformer,而 Transformer 模型也成為了一切的起點。之后,大模型的發展大致走上了兩條路:
一條路是舍棄 Decoder 部分,僅僅使用 Encoder 部分的自編碼語言模型,其最出名的代表就是 Bert 家族。
一條路是舍棄 Encoder 部分,僅僅基于 Decoder 部分的自回歸語言模型,而 ChatGPT 背后的 GPT 家族則屬于 Decoder-only 的分支。
1.4.2 GPT的貢獻
由于GPT在LLM的發展中一騎絕塵,貢獻最突出,所以這部分重點說一下 GPT 對 LLM 發展的核心貢獻。
GPT-1(2018年) 預訓練+微調的模型架構
2018 年,OpenAI 發表了論文 ,這就是 GPT-1。GPT-1 提出的預訓練+微調的方法可以更好的利用大量的預訓練數據,從而讓模型能夠更好的適應各種特定任務。雖然當時還存在一些局限性,例如當時還不能根據一個給定的標題來生成一篇新聞報道,但是 GPT-1 所開創的這種 預訓練+微調 的模型架構,對 NLP 的后續發展具有深遠的影響。
在預訓練階段,模型會在大規模無標注文本上進行無監督學習,提取通用的語言特征。
在微調階段,模型會在特定任務上進行有監督的學習,以適應不同的任務需求。
GPT-2(2019年) 遷移學習能力
為了解決 GPT-1 的問題,2019 年,OpenAI 發布了 GPT-2。通過增加模型參數和數據量,GPT-2 極大的提高了模型的泛化能力和生成能力。除了在特定任務上表現較好(例如根據標題生成文章)之外,GPT-2 還初步表現出一定的零樣本或少量樣本學習能力。這使得 GPT-2 能夠適用于多種自然語言處理任務,例如:翻譯,問答,摘要生成,文本生成等,而在 GPT-2 之前,這些特殊任務需要設計專門的模型來分別實現。GPT-2 通過實踐證明通過海量數據和大量參數訓練出來的詞向量模型在不經過額外的特殊訓練下就可以遷移到不同類別的任務。
GPT-2 最大的貢獻也在于他通過實踐驗證了大模型的遷移學習能力。
GPT-3(2020年) 上下文學習能力和涌現
2020 年,OpenAI 發布了 1750 億參數規模的、性能更加強大的 GPT-3。GPT-3 提出了上下文學習(ICL:in-context learning)的概念。ICL 可以指導 LLM 理解以自然語言形式呈現的任務,利用 ICL 的能力,我們可以通過優化給 LLM 的輸入以獲取更好的結果。在 ICL 的加持下,提示詞工程才得以成為可能。GPT-3 在多種自然語言處理任務上展現出了驚人的性能,甚至可以僅通過簡單的提示詞來適應不同的處理任務。研究人員并未在 GPT-3 訓練完成之前預測到該模型具備如此強大的能力。GPT-3 的實踐證明,LLM 可以具備涌現能力(Emergent Ability)。
GPT-3.5(2021~2022年) 代碼能力和指令遵循能力
為了進一步提升模型的性能,OpenAI 繼續探索了兩種主要方法:基于代碼數據訓練和RLHF技術,與人類偏好保持一致。
2021 年,OpenAI推出了在大量 GitHub 代碼語料庫上微調的 GPT 模型——Codex。Codex 可以解決非常復雜的編程問題,并且還可以顯著提高解決數學問題的性能。目前,大名鼎鼎的 Github Copilot 就是基于 Codex 模型而研發。
2022 年,OpenAI推出了基于 RLHF 技術的增強版 GPT-3——InstructGPT。InstructGPT 在指令遵循方面對 GPT-3 模型做了微調,使得其更善于遵循用戶的意圖。
代碼能力和指令遵循能力進一步增強了 GPT-3 模型的能力,OpenAI 將其稱之為 GPT-3.5。而 ChatGPT 剛剛推出的時候,其背后默認的模型就是 GPT-3.5。
所以,從整個的 GPT 的歷程看,從 2018 年 ~ 2022 年,在長達 5 年多的時間里,OpenAI 一步一步通過探索和實踐,讓大模型應該具備的相關能力一點一點的浮出水面,進入我們的視野。
二. Token 與 Embedding:LLM 的微觀世界 🔬
2.1 Tokenization 的精妙之處 🧩
把輸入/輸出文本拆分為 LLM AI 模型可以處理的、更小單元的過程,我們稱之為:Token 化。token 可以是單詞、字符、子單詞或符號。文本 Token 化之后,模型可以在 token 的基礎上處理不同的語言、詞匯和格式,并降低處理過程的計算成本和資源成本。Token 化還可以通過影響 token 的含義和上下文來影響生成文本的質量和多樣性。
Tokenization 是將文本分解成更小單元(tokens)的過程,是自然語言處理中的重要步驟。不同的Token 化策略會直接影響LLM的性能、計算效率和泛化能力。Tokenization 的目標是在保證語義信息完整性的前提下,盡可能地減小詞匯表的大小,提高計算效率[2]。常見的 Tokenization 方法包括:
2.1.1 空格分詞
最簡單的分詞方法,它根據空格將文本分割成 token。 然而,它無法處理復雜單詞和多語言,如 “don’t” 會被分成兩個 token,導致信息丟失。同時,空格分詞對于處理中文等不使用空格的語言效果很差。 😥
2.1.2 字節對編碼(BPE)
BPE(Byte Pair Encoding)最早是一種數據壓縮算法,其思想是將經常一起出現的數據對替換為不在數據串中的其他字符,然后再通過一個 merge 表來恢復原始數據。OpenAI 所采用的 tokenization 算法就是 BPE 算法。BPE 可以幫助模型處理罕見的、或者看不見的單詞,并創建更緊湊和一致的文本表示。BPE 還允許模型通過組合現有單詞或 token 來生成新單詞或 token。詞匯量越大,模型生成的文本就越多樣化和富有表現力。然而,詞匯表越大,模型需要的內存和計算資源就越多。因此,詞匯大小的選擇取決于模型的質量和效率之間的權衡。
BPE是一種基于統計的 tokenization 方法,它可以平衡詞匯表大小和語義表達能力,廣泛應用于 LLM。 BPE 通過迭代合并文本中頻繁出現的字節對來構建詞匯表。 BPE可以有效地處理未知詞(out-of-vocabulary words),并能夠保持相對較小的詞匯表,從而提高計算效率[2]。 😎
算法過程
1.準備語料庫,確定期望的 subword 詞表大小等參數
2.通常在每個單詞末尾添加后綴 ,統計每個單詞出現的頻率,例如,low 的頻率為 5,那么我們將其改寫為 "l o w </ w>”:5 注:停止符 的意義在于標明 subword 是詞后綴。舉例來說:st 不加 可以出現在詞首,如 st ar;加了 表明該子詞位于詞尾,如 we st,二者意義截然不同
3.將語料庫中所有單詞拆分為單個字符,用所有單個字符建立最初的詞典,并統計每個字符的頻率,本階段的 subword 的粒度是字符
4.挑出頻次最高的符號對 ,比如說 t 和 h 組成的 th,將新字符加入詞表,然后將語料中所有該字符對融合(merge),即所有 t 和 h 都變為 th。 注:新字符依然可以參與后續的 merge,有點類似哈夫曼樹,BPE 實際上就是一種貪心算法 。
5.重復遍歷 2 和 3 操作,直到詞表中單詞數達到設定量 或下一個最高頻數為 1 ,如果已經打到設定量,其余的詞匯直接丟棄
舉一個完整的例子,來直觀地看一下這個過程:
-
獲取語料庫,這樣一段話為例:”FloydHub is the fastest way to build, train and deploy deep learning models. Build deep learning models in the cloud. Train deep learning models.“
-
拆分,加后綴,統計詞頻:
-
建立詞表,統計字符頻率(順便排個序):
-
以第一次迭代為例,將字符頻率最高的
d
和e
替換為de
,后面依次迭代:
-
更新詞表
繼續迭代直到達到預設的subwords詞表大小或下一個最高頻的字節對出現頻率為1。
2.1.3 WordPiece:
與 BPE 類似,但在處理罕見詞時具有優勢。 WordPiece 使用貪心算法來構建詞匯表,它可以更好地處理罕見詞,并可以更好地處理一些語言的形態變化。 例如,它可能將 “running” 分解為 “run” 和 “ing”,從而更好地理解詞根的含義。 🤓
WordPiece 與 BPE 的主要的差別在于,BPE 按頻率來選擇合并的 token 對,而 WordPiece 按 token 間的互信息來進行合并。WordPiece 可以較好的平衡詞表大小和 OOV 問題,但是可能會產生不太合理的、錯誤的切分,并且 WordPeice 對拼寫錯誤非常敏感,同時其對前綴的支持也不夠好。
2.1.4 Unigram
ULM 是一種基于語言模型的分詞算法,這種語言模型可以給多種分詞結果賦予概率,從而可以學到其中的噪聲,其使用的訓練算法可以利用所有可能的分詞結果。但是,ULM 的效果與初始詞表息息相關,初始詞表的好還會影響到最終的結果。 🧐
思考: 選擇合適的 Tokenization 策略如何直接影響模型的性能、計算效率和泛化能力?🤔
tokenization 的目標是找到平衡:既能有效地表示文本,又不會導致詞匯表過于龐大,影響計算效率和泛化能力。不同的 tokenization 方法適用于不同的場景,沒有絕對的優劣之分。 需要根據具體的任務和語言選擇合適的 tokenization 策略。
拓展: SentencePiece 和 Tiktoken 是新一代的 Tokenization 工具,它們提供了更加靈活和高效的 tokenization 解決方案,已經被越來越多的 LLM 使用。 SentencePiece 可以處理多語言和不同字符集,并且可以更好地處理未知詞。 Tiktoken 是 OpenAI 開發的快速 tokenization 工具,可以高效地處理大量文本數據[2]。 🚀
2.2 Embedding 的力量:語義空間的構建 🌌
在機器學習和自然語言處理中,embedding 是指將高維度的數據(例如文字、圖片、音頻)映射到低維度空間的過程。embedding 向量通常是一個由實數構成的向量,它將輸入的數據表示成一個連續的數值空間中的點。簡單來說,embedding 就是一個N維的實值向量,它幾乎可以用來表示任何對象,如文本、音樂、視頻等。
embedding 將離散的 token 映射到連續的向量空間,從而捕捉詞語之間的語義關系和上下文信息[3]。可以將 embedding 看作是詞語在語義空間中的“坐標”,語義相似的詞在向量空間中距離更近。例如,“國王”、“女王”和“王子”在向量空間中會比較接近,而“國王”和“香蕉”的詞向量則會相對較遠。LLM 的 Embedding 模型是通過學習大量的文本數據來不斷調整詞向量的,它們能夠更好地理解上下文,并在不同語境下捕捉詞語的不同含義。Embedding 的維度通常很高,例如,幾百到幾千維,從而可以捕捉詞語之間的復雜關系[3]。 🤩
案例: 我們可以使用降維技術(如 t-SNE 或 PCA)來可視化詞向量。將 “國王”、“女王”、“男人”、“女人” 這些詞對應的詞向量映射到二維空間,會發現 “國王” 和 “男人” 之間,“女王” 和 “女人” 之間,以及 “國王” 和 “女王” 之間都相對接近,而 “國王” 和 “女人” 則較遠。這說明 Embedding 確實捕捉到了這些詞語的語義關系。在更高維度空間中,詞向量之間的關系更加復雜,可以捕捉到詞語之間更微妙的差異。
拓展: 預訓練的詞向量(如 Word2Vec、GloVe、FastText)是構建 LLM 的基礎。然而,LLM Embedding 與傳統的詞向量不同, LLM 的 Embedding 具備更強的上下文感知能力,能夠根據語境動態調整詞向量的表示,使得同一個詞在不同的語境下具有不同的 embedding。 例如,“bank” 在“river bank” 和 “bank account” 中的 embedding 是不同的。 這使得LLM可以更好地理解上下文信息[3]。 ?
思考: Embedding 如何讓模型理解詞語的含義、上下文關系,以及它們之間的相似性和差異性? 🤔
Embedding 將詞語映射到高維的向量空間,通過向量之間的距離和角度,反映詞語的語義關系,從而使得模型可以通過計算詞向量之間的相似度來進行語義分析。同時,LLM 的 Embedding 可以在不同的上下文中調整詞向量的表示,從而更好地理解上下文信息。
三. LLM 的訓練:數據、算法與藝術的融合 🎨
3.1 預訓練:海量數據的自監督學習 📚
LLM 強大的能力來自于海量數據的自監督學習[1]。預訓練過程不需要人工標注數據,模型通過學習文本中詞語之間的關系,從而學習通用的語言知識、語法結構和語義關系。 預訓練是 LLM 能夠涌現出強大能力的關鍵所在。
目前,大語言模型常用的預訓練任務可以分為三類:語言建模(Language Modeling, LM)、去噪自編碼(Denoising Autoencoding, DAE)以及混合去噪器(Mixture-of-Denoisers, MoD)
3.1.1 語言建模(Language Modeling, LM)
語言建模任務是最廣泛采用的預訓練任務,其核心在于“預測下一個token”,經常被用于訓練基于解碼器的大語言模型, 例如 GPT-3、PaLM 等。形式化來說,給定一個token序列 u={u1,…,uT},語言建模任務旨在基于序列當前位置之前的token序列 u<t,采用自回歸的方式對目標token ui 進行預測。在訓練過程中,模型根據下面公式所示的似然函數進行優化:
可以發現,語言建模任務與人類生成語言數據(如口語表達、書面寫作等)的方式十分相似,都是基于前序內容生成(或預測)后續的內容。盡管這種方式形式簡單,但當預訓練數據足夠豐富時,大語言模型便能夠學習到自然語言的生成規律與表達模式。
此外,語言建模任務還可以看作是一種多任務學習過程。例如,在預測前綴“這部電影劇情飽滿,演員表演得也很棒,非常”中的“好看”時,模型實際上在進行情感分析任務;而預測句子前綴“小明有三塊糖,給了小紅兩塊糖,還剩下”中的“一塊糖”時,則是在進行數學算術任務。
語言建模的一個變種是前綴語言建模(Prefix Language Modeling)任務,該任務專門為采用前綴解碼器架構的模型設計。在訓練階段, 每個文本序列 u 會根據隨機選擇的位置 k(1≤k≤T) 切分為前綴 uprefix={u1,…,uk} 和后綴 usuffix={uk+1,…,uT} 兩個部分,然后僅將后綴中token的損失計入總損失,其目標函數可以表示為下式:
但是,由于前綴語言建模任務并未將所有token的損失都納入計算,當使用相同規模的數據集進行訓練時,采用前綴語言建模訓練的模型在性能上通常會稍遜于使用標準語言建模任務訓練的模型。
語言建模的另一個重要變種是中間填充任務,該任務通過重新調整輸入序列的順序,旨在訓練模型對于中間缺失信息的填充能力。具體來說,輸入序列 u 會被劃分為三個部分:前綴 uprefix、中間部分 umiddle 和后綴 usuffix,然后將中間部分移至序列末尾,最后要求模型自回歸地對新序列 uprefix⊕usuffix⊕umiddle 進行預測。這樣模型就能夠學習到填充中間缺失信息的能力。其訓練函數可表示為下式:
中間填充任務經常被用于訓練代碼預訓練模型以提升模型在代碼補全等實際應用場景中的表現。
3.1.2 去噪自編碼(Denoising Autoencoding, DAE)
去噪自編碼任務是另一種常見的語言模型預訓 練任務,廣泛應用于 BERT、T5 等預訓練語言模型中。在去噪自編碼任務中,輸入文本經過一系列隨機替換或刪除操作,形成損壞的文本 u?u~,然后要求模型根據損壞的文本恢復出被替換或刪除的詞元片段 u~,其訓練目標可以表示為下式:
與語言建模相比,去噪自編碼任務的實現更為復雜,需要設定額外的優化策略,如詞元替換策略、替換片段長度、替換詞元比例等。這些策略的選擇會直接影響模型的訓練效果。目前使用去噪自編碼進行預訓練的大語言模型較為有限,代表性模型包括 Flan-T5。
典型任務包括:
掩碼語言模型(MLM): 隨機遮蓋句子中的某些詞語,然后讓模型預測被遮蓋的詞。 例如,在句子 “The quick brown fox jumps over the [MASK] dog.” 中,模型需要預測 “lazy” 。 MLM 可以幫助模型學習詞語的上下文信息。 模型通過學習預測被遮蓋的詞,從而理解了詞語之間的關系和句子的結構。
下一句預測(NSP): 給定兩個句子,模型需要判斷第二個句子是否是第一個句子的下一句。 NSP 可以幫助模型學習句子之間的關系。 這有助于模型理解篇章結構和上下文信息。 然而,NSP任務在某些研究中被認為效果有限,一些新的預訓練任務如 “sentence order prediction” 等被提出來取代 NSP。
句子順序預測: 給定一組打亂順序的句子,模型需要預測正確的句子順序。這可以幫助模型更好地理解篇章結構和邏輯關系。
文本填充: 給定一段文本,其中一些部分被刪除,模型需要預測被刪除的部分。這可以幫助模型學習更復雜的語言模式和結構。
3.1.3 混合去噪器(Mixture-of-Denoisers, MoD)
混合去噪器,又稱 UL2 損失,通過將語言建模和去噪自編碼的目標均視為不同類型的去噪任務,對預訓練任務進行了統一建模。具體來說,混合去噪器定義了三種去噪器:S-去噪器、R-去噪器和 X-去噪器。
S-去噪器與前綴語言建模的目標相同,旨在學習基于給定前綴信息生成合理后綴文本的能力。而 R-去噪器和 X-去噪器 與去噪自編碼任務的優化目標更為相似,二者僅在被掩蓋片段的跨度和損壞比例上有所區別。混合去噪器被應用于訓練 UL2 和 PaLM-2 等大語言模型。
思考: 預訓練階段如何有效利用數據中的上下文信息,從而學習到語言的深層結構? 🤔 如何選擇合適的預訓練數據集?
關鍵在于使用恰當的預訓練任務,讓模型學習到詞語之間的關系,同時需要選擇高質量、多樣化、具有代表性的訓練數據集,以確保模型學習到更全面的知識。 此外,預訓練數據的規模對于模型的性能至關重要,通常需要使用數十億甚至數萬億 tokens 的數據進行訓練[1]。 😮
拓展: 預訓練過程中可能會出現偏見和負面影響,例如,模型可能會學習到社會上的刻板印象,或者會生成帶有攻擊性的內容。 數據清洗、過濾、數據增強等技術可以幫助減輕這些問題。同時,需要在訓練過程中使用一些正則化方法,防止模型過擬合訓練數據。 😓
3.2 微調:任務定制的藝術 🛠?
微調是將預訓練的 LLM 應用于特定下游任務的關鍵步驟[4]。 通過在高質量標注數據集上訓練預訓練模型,使其適應特定任務,例如情感分析、文本分類、問答、機器翻譯等。 微調需要選擇合適的損失函數(如交叉熵損失函數、Focal Loss等)、優化算法(如 AdamW、SGD等)和超參數(如學習率、batch size、weight decay等)。微調過程通常比預訓練過程更短,所需的計算資源也相對較少。
高質量的標注數據集: 選擇與特定任務高度相關的數據集,并進行精確的標注,是微調成功的關鍵。 數據集的規模和質量直接影響微調的效果。 ?
合適的損失函數: 根據任務的性質,選擇合適的損失函數,例如,分類任務可以使用交叉熵損失函數,回歸任務可以使用均方誤差損失函數。 損失函數定義了模型預測結果與真實結果之間的差異,模型的目標是最小化損失函數。 🧐
優化算法的選擇和參數調整: 選擇合適的優化算法,并調整算法的超參數,可以加速模型的收斂并提升性能。 AdamW 是常用的優化算法,它可以自適應地調整學習率,從而加速模型的收斂。 超參數的調整是一個迭代的過程,需要根據實驗結果進行調整。 🤓
正則化方法: 使用正則化方法,例如dropout, weight decay 等,可以防止模型過擬合,提高模型的泛化能力。 💪
3.2.1 為什么要微調
除了成本因素之外,微調在機器學習中具有如此重要意義的原因還包括:
數據效率:微調允許使用有限的特定任務數據進行有效的模型自適應。可以使用現有的預先訓練模型,并根據任務對其進行優化,而不是收集和標注新的數據集。因此,從數據處理效率層面而言,微調會節省更多的時間和資源。
時間效率:從頭開始訓練模型需要很長時間,而因為微調是從模型已經學習的特征開始,因此減少了收斂所需的時間,進而加快了訓練的過程,提升了訓練的效率。
知識遷移:預訓練模型在最初的訓練中已經從大量數據集中學習到了有價值的特征和模式。微調可以將所獲得的知識轉移到特定任務中,微調可以使預訓練模型在特定任務上有一種增強的效果。
專業化:微調可以允許我們自定義一個模型,使其在特定任務中表現更加出色。通過調整模型的設置,可以創建一個在特定情況下非常有效的工具。
3.2.2 何時微調
雖然微調的成本比從頭預訓練大模型的成本要小的多的多,但是對模型進行微調仍然需要我們投入時間和精力。微調不是沒有成本,只是和預訓練大模型相比成本小而已。
因此,在準備微調之前,我們最好先嘗試通過提示工程、RAG、或通過類似 Agent的函數調用來獲得更好的結果。
在準備微調之前,我們需要進行仔細的分析和考慮:
模型在許多任務上可能最初表現不佳,但使用正確的提示詞可以改善結果,此時可能不需要微調。
迭代微調需要創建數據集并運行訓練任務,因此迭代提示詞比迭代微調快得多。
3.2.3 三種微調方式
方式一:Prompt-tuning
什么是Prompt-tuning?Prompt-tuning通過修改輸入文本的提示(Prompt)來引導模型生成符合特定任務或情境的輸出,而無需對模型的全量參數進行微調。這種方法利用了預訓練語言模型(PLM)在零樣本或少樣本學習中的強大能力,通過修改輸入提示來激活模型內部的相關知識和能力。
核心原理:PLM(預訓練模型)不變,W(模型的權重)不變,X(模型輸入)改變。
如何進行Prompt-tuning?小模型適配下游任務設計任務相關提示模板,并微調提示嵌入以引導預訓練模型適應特定任務。僅需微調少量提示嵌入(Prompt Embeddings),而非整個模型參數。
方式二:Prefix-tuning
什么是Prefix-tuning?Prefix-tuning是Prompt-tuning的一種變體,它通過在輸入文本前添加一段可學習的“前綴”來指導模型完成任務。
這個前綴與輸入序列一起作為注意力機制的輸入,從而影響模型對輸入序列的理解和表示。由于前綴是可學習的,它可以在微調過程中根據特定任務進行調整,使得模型能夠更好地適應新的領域或任務。
核心原理:PLM(預訓練模型)不變,W(模型的權重)不變,X(模型輸入)不變,增加W’(前綴嵌入的權重)。
如何進行Prefix-tuning?在 Transformer 中適配下游任務
在Transformer模型的輸入層或各層輸入前添加可學習的前綴嵌入,并通過訓練這些前綴嵌入來優化模型在特定任務上的表現。
初始化前綴嵌入
在Transformer模型的輸入層之前,初始化一個固定長度的前綴嵌入矩陣。
將前綴嵌入與輸入序列拼接
將初始化好的前綴嵌入與原始輸入序列的詞嵌入進行拼接,形成新的輸入表示。這個新的輸入表示將作為Transformer模型各層的輸入。
訓練模型
在訓練過程中,模型會根據輸入序列(包括前綴嵌入)和標簽數據進行學習。通過反向傳播算法,模型會更新前綴嵌入的參數。
方式三:LoRA
什么是LoRA?LoRA(Low-Rank Adaptation)通過分解預訓練模型中的部分權重矩陣為低秩矩陣,并僅微調這些低秩矩陣的少量參數來適應新任務。
對于預訓練權重矩陣W0∈Rd×d,LoRa限制了其更新方式,即將全參微調的增量參數矩陣ΔW表示為兩個參數量更小的矩陣A、B,即ΔW = AB。
其中,B∈Rd×r和A∈Rr×d為LoRA低秩適應的權重矩陣,秩r遠小于d。
核心原理:W(模型的權重)不變,X(模型輸入)不變,分解ΔW(分解為兩個低秩矩陣A、B)。
如何進行LoRA微調?在凍結預訓練模型權重的基礎上,通過優化算法訓練低秩矩陣A和B以近似增量參數,最小化下游任務損失,從而實現高效的模型微調。
設置LoRA模塊
在預訓練模型的基礎上,添加LoRA模塊。LoRA模塊通常包含兩個參數量較少的矩陣A和B,它們的乘積用于近似全參數微調中的增量參數。
初始化矩陣A和B,通常使用高斯函數進行初始化,以確保訓練開始時LoRA的旁路(即BA)為0,從而與全參數微調有相同的起始點。
訓練LoRA模塊
在訓練過程中,凍結預訓練模型的權重,僅訓練LoRA模塊中的矩陣A和B。
通過優化算法(如Adam)更新矩陣A和B的參數,以最小化下游任務的損失函數。
LoRA參數主要包括秩(lora_rank,影響性能和訓練時間)、縮放系數(lora_alpha,確保訓練穩定)和Dropout系數(lora_dropout,防止過擬合),它們共同影響模型微調的效果和效率。
- 秩(Rank)
參數名稱:lora_rank
描述:秩是LoRA中最重要的參數之一,它決定了低秩矩陣的維度。
常用值:對于小型數據集或簡單任務,秩可以設置為1或2;對于更復雜的任務,秩可能需要設置為4、8或更高。
- 縮放系數(Alpha)
參數名稱:lora_alpha
描述:縮放系數用于在訓練開始時對低秩矩陣的更新進行縮放。
常用值:縮放系數的具體值取決于秩的大小和任務的復雜度。
- Dropout系數
參數名稱:lora_dropout
描述:Dropout系數決定了在訓練過程中隨機丟棄低秩矩陣中元素的概率。
常用值:Dropout系數的常用值范圍在0到1之間。
思考: 如何有效地進行微調,從而最大化模型在特定任務上的性能?🤔 如何防止微調過程中的過擬合現象?
微調需要在精度、泛化性和計算成本之間找到平衡, 需要仔細選擇和調整微調參數,使用合適的正則化方法,避免過擬合。同時,需要根據具體的任務選擇合適的微調策略,例如,full fine-tuning, parameter-efficient fine-tuning (PEFT) 等。
3.3 強化學習微調(RLHF):對齊人類偏好 🤖
強化學習微調(RLHF)旨在提高 LLM 輸出質量,使其更好地對齊人類偏好[4]。 RLHF 通過人類反饋來訓練一個獎勵模型,用來評價LLM生成內容的質量,然后通過強化學習,讓模型生成更高質量、更符合人類期望的文本。 RLHF 包括以下步驟:
-
有監督微調: 在預訓練模型上進行SFT(Supervised fine-tuning)。 🧠
-
訓練獎勵模型: 使用人類標注的數據(如 “好” 和 “不好” 的回答)來訓練一個獎勵模型,該模型可以預測 LLM 生成文本的質量。人類標注的數據需要根據特定的標準進行標注,確保標注的質量。獎勵模型可以使用多種方法進行訓練,例如,可以使用Transformer 模型,或者使用其他機器學習模型。 💯
-
強化學習微調: 使用強化學習算法,根據獎勵模型的反饋,調整 LLM 的參數,從而讓 LLM 生成更高質量的文本。常用的強化學習算法包括 Proximal Policy Optimization (PPO) 等。強化學習的目標是最大化獎勵模型的預測值。 ?
3.3.1 有監督微調
在第一階段,我們利用已有的監督數據對大模型進行微調。這個過程與傳統的fine-tuning類似,旨在使模型具有基本的任務執行能力。通過這一階段,模型可以學習到一些基本的語言規則和任務相關的知識。
SFT (Supervised fine-tuning) 數據集是一些 (prompt, answer) 對,prompt 來源既有標注工人寫的,也有用戶真實輸入的。
SFT 就是在預訓練模型上利用這些人工標注的數據進一步微調。另外還有一個概念叫指令微調 (Instruction fine tuning, IFT),IFT 的主要目的是讓模型適應、聽從人類的指令,比如當 prompt 出現 “summarize” 時,模型就應該知道現在的任務是總結。IFT 可以算作 SFT 的一個子集,或者說先驅步驟。
經過 IFT 后,模型學會了聽從指令,但生成的內容卻不一定安全可靠。為了提升幫助性、降低有害性,人們繼續做 SFT。通過給模型展示無害的、有幫助性的回答,規訓模型的生成內容。
3.3.2 訓練獎勵模型
在第二階段,我們需要訓練一個獎勵模型(Reward model)。獎勵模型是一個能夠評估模型生成的文本序列是否符合人類偏好的模型。它的輸入是一個文本序列,輸出是一個數值,表示該序列的獎勵程度。訓練獎勵模型的數據通常是同一個數據用不同的語言模型生成結果,然后人工對這些結果打分。打分標準可以是語法的正確性、邏輯的連貫性、情感的適宜性等。通過訓練獎勵模型,我們可以得到一個能夠評估模型行為是否符合人類期望的工具。
Reward model 的輸入是 (prompt+answer),輸出是一個標量,衡量回答的好壞。可以把 SFT 模型最后的分類頭去掉,加上回歸頭,作為獎勵模型的初始化,在此基礎上微調。但考慮到計算成本和訓練穩定性,一般會選擇小幾號的模型(架構不變,參數更少)。對于 175B 的 SFT,OpenAI 用了 6B 的獎勵模型。
訓練獎勵模型是一個回歸任務。一般情況下,數據集應該長這樣:input (prompt+answer); label (score given by human). 但一個現實的問題:給定一個 prompt 和回答,很難量化地去衡量這個回答的好壞。這個回答看起來不錯,到底應該給 7 分,8 分還是 9 分呢?很難確定。
OpenAI 的做法是:對不同的回答進行排序。具體來說,從 prompt set 里拿一些 prompt 出來,對于每個 prompt,讓 SFT 模型生成 K 個回答 (K=9),人工對這些回答進行排序。有了排序,就有了回答間的相對好壞。一個 prompt 對應九個回答,那么就有 C92=36 對 (good answer, bad answer)
損失函數就定為排序中常見的 pairwise ranking loss。其中 rθ 是獎勵模型的輸出標量; yw 是一對回答中相對較好的那個; yl 是相對較差的那個回答。
訓練過程中,InstructGPT 將每個 prompt 的 36 對回答作為一個單獨的 batch。這樣一來,只需要進行 9 次前向傳播(計算 9 個 r(x,y) )就可以進行 36 次參數更新,避免了重復的計算。
RM 數據集包含 33k 個 prompt,既有標注工人寫的,也有用戶真實輸入的。注意:每個 prompt 對應 36 對回答,所以實際訓練 RM 用到的數據量要比 prompt 大一個數量級。
3.3.3 強化學習微調
在第三階段,我們利用強化學習算法PPO和獎勵模型來訓練RL模型。強化學習算法的目標是通過與環境的交互,學習到一種策略,使得在該策略下,模型能夠獲得的獎勵最大化。在RLHF中,環境就是模型生成文本序列的過程,而獎勵則是由獎勵模型給出的。在訓練RL模型時,我們需要定義狀態空間、動作空間、策略函數和價值函數等概念。狀態空間通常定義為輸入序列的分布,而動作空間則是模型可以生成的所有token。策略函數就是我們微調的大模型,它根據當前的狀態(輸入序列)選擇下一個動作(生成的token)。價值函數則是由獎勵模型和策略約束結合得到的,它表示在某個狀態下采取某個動作所能獲得的期望獎勵。
這部分就是利用PPO微調LLM,在 PPO 微調階段,我們有四個模型:
SFT LM:第一階段 SFT 過后得到的模型,它在 PPO 階段參數凍結,作為 reference model,不進行更新。
RL LM:我們要微調的 LLM,初始參數與 ref LM 一致。用強化學習的術語,可以稱它為 actor model
reward model:第二階段得到的獎勵模型,在 PPO 階段參數凍結。
critic model:用于估算 PPO 中的狀態值函數,是一種值函數近似(value function approximation),參數與 RL LM 一起更新
PPO 中通常的做法是讓 actor model 與 critic model 共享參數,然后一起訓練。此時應該把 policy gradient 的損失函數與 critic model 的損失函數(通常是 MSE)加權求和,作為總的損失。critic model 就是在 actor model (RL LM) 的基礎上加了一個全連接層,讓每個 token 對應一個標量,作為該 token 對應的狀態下,之后能獲得的累積(折扣)回報。所以 critic model 的輸出形狀與輸入是一致的,都是 (batch size, seq_len) 。
思考: 如何設計出更加有效的獎勵模型?🤔 RLHF 是否會導致其他方面的潛在問題,如公平性、透明度等?
設計高效的獎勵模型是一個挑戰,它需要能夠準確地捕捉人類的偏好。獎勵模型的設計需要在準確性、魯棒性和可解釋性之間進行權衡。RLHF 可能會導致模型過度擬合獎勵模型, 從而在某些方面表現優秀,但在其他方面表現較差,需要進行多方面的考慮和平衡。同時,需要關注 RLHF 過程中的偏見問題,確保 RLHF 的結果是公平的。 😓
3.4 大模型訓練的挑戰:算力、數據與倫理 🤯
LLM 的訓練面臨著巨大的挑戰:
巨大的算力需求: LLM 的訓練需要大量的算力資源,包括高性能的 GPU、TPU、分布式計算框架等。 如何優化訓練過程,降低資源消耗是一個重要的研究方向。 可以使用模型并行、數據并行等技術來加速訓練過程。 💻
高質量訓練數據的稀缺性: LLM 的性能很大程度上取決于訓練數據的質量和規模。 獲取高質量、多樣化的訓練數據是一個巨大的挑戰。同時, 如何使用生成模型生成高質量的合成數據也是一個重要的研究方向。 數據增強技術,例如數據擴充,可以用來增加數據的多樣性。 📚
模型訓練過程中的倫理問題: LLM 可能繼承訓練數據中的偏見,導致不公平的輸出。 隱私泄露、濫用等倫理問題也是需要考慮的。 如何進行倫理審查、構建公平可信的模型,是LLM發展的重要方向。需要在模型訓練過程中加入一些技術措施來減少模型的偏見,并確保模型的公平性。 ??
四. Prompt 工程:解鎖 LLM 潛能的鑰匙 🗝?
4.1 Prompt 的力量:人機交互的橋梁 🌉
提示工程起源于對預訓練模型如何將知識應用于具體任務的探討。
預訓練語言模型通常在大規模語料庫上進行預訓練,從而學習到大量的語言知識。然而,將這些知識應用于具體任務時,往往需要對模型進行微調(SFT:Supervised Fine Tuning)。微調過程中,模型需要根據標注的任務數據學習任務相關的知識。
這種根據專有數據進行微調的方法,在許多情況下取得了很好的效果,但仍然存在一些問題。例如:
微調過程可能需要大量的標注數據,而這些數據往往難以獲得。
微調后的模型可能會存在過擬合現象,導致模型的泛化能力下降。
為了解決這些問題,研究人員開始關注如何通過優化輸入和問題表述來引導模型產生更好的輸出結果,而無須進行昂貴的微調,這種方法被稱提示詞工程。
通過精心設計提示詞(Prompt ),我們可以引導模型關注輸入數據中的關鍵信息,從而提高模型在各種自然語言處理任務上的性能。提示詞工程的核心思想是: 將問題表述為一種容易被模型理解和解答的形式。
Prompt 不僅僅是 “輸入文本”,它更是人機交互的關鍵媒介,決定著 LLM 的行為方式和輸出結果[5]。Prompt 的設計至關重要,它需要仔細規劃和迭代優化,才能充分發揮 LLM 的潛力。一個好的 Prompt 可以引導 LLM 產生高質量、符合預期的結果,而一個糟糕的 Prompt 則可能導致 LLM 輸出錯誤或不相關的信息。Prompt 工程是一門結合了科學和藝術的領域,它需要對 LLM 的工作原理有深入的理解,同時需要具備一定的創造力和迭代優化能力[5]。 ?
案例: 對比以下兩個 Prompt:“寫一篇關于人工智能的文章” 和 “寫一篇 500 字的關于人工智能在醫療領域應用的科普文章,重點介紹人工智能如何幫助醫生診斷疾病”。 顯然,第二個 Prompt 更加具體和明確,可以引導 LLM 生成更符合用戶需求的文章。 一個好的 Prompt 需要清晰地表達用戶的意圖,并給出必要的約束條件。
4.2 多樣化的 Prompt 設計 🌈
Prompt 設計的類型多種多樣,常見的 Prompt 類型包括:
零樣本 Prompt: 直接給出任務描述,不提供任何示例,挑戰 LLM 的泛化能力和推理能力。 例如,“Translate ‘Hello, world!’ to French.” 零樣本 Prompt 通常適用于簡單的任務,但對于復雜的任務,其效果可能不如其他 Prompt 類型。 🧐
少樣本 Prompt: 提供少量示例,引導模型學習任務的模式,適用于復雜任務。 例如,提供幾個英文和法文翻譯的例子,然后讓模型翻譯新的英文句子。 少樣本 Prompt 可以幫助模型更好地理解用戶的意圖,并生成更符合預期的輸出。 🤓
思維鏈 Prompt: 鼓勵模型進行推理,輸出中間步驟,提高結果的可解釋性。 例如,在求解數學題時,要求模型先列出解題步驟,再給出最終答案。 思維鏈 Prompt 可以幫助模型進行更復雜的推理,提高模型解決問題的能力。 🤔
角色扮演 Prompt: 讓模型模擬特定角色,進行更有針對性的回答。 例如,讓模型扮演一位歷史學家,回答關于某個歷史事件的問題。 角色扮演 Prompt 可以引導模型更好地理解用戶的意圖,并生成更具針對性的輸出。 😎
ReAct Prompt: 結合了推理(Reasoning)和行動(Acting),允許模型在生成回答時,先進行推理,然后再采取行動(例如,檢索外部知識庫),從而提高回答的準確性和可靠性。 🚀
案例: 對于一個邏輯推理問題, 零樣本 prompt 可能會直接讓模型回答,而思維鏈 prompt 會讓模型先輸出推理步驟,最后輸出答案。 思維鏈 prompt 通常能夠提高模型的推理準確率和可解釋性。 例如,在解決 “如果小明比小紅高,小紅比小剛高,那么誰最高” 時,思維鏈 Prompt 會讓模型先分析各個人的身高關系,最后給出正確的答案。
思考: 如何根據不同的任務和需求,選擇合適的 Prompt 類型? 🤔
選擇合適的 Prompt 類型需要根據任務的復雜度、模型的泛化能力和所需結果的精度來決定。零樣本 Prompt 適用于簡單的任務,少樣本 Prompt 適用于復雜的任務,思維鏈 Prompt 適用于需要推理的任務,角色扮演 Prompt 適用于需要模擬特定角色的任務。
4.3 Prompt 工程的實踐技巧
Prompt 工程是一門精細的藝術,以下是一些常用的 Prompt 工程技巧:
清晰明確的指令: 避免使用模糊的表達,確保 LLM 理解用戶的意圖。 Prompt 指令應該盡可能地簡潔和明確。 ?
上下文提示: 提供必要的背景信息,幫助模型更好地理解任務。 提供足夠的上下文信息可以幫助模型更好地理解用戶的意圖,并生成更符合預期的輸出。 📖
格式約束: 使用特定的格式,例如 JSON、列表等,來引導模型輸出。 格式約束可以幫助模型更好地組織輸出內容,并提高輸出結果的可用性。 🗂?
分解復雜任務: 將復雜任務分解為多個子任務,逐步引導模型。 分解復雜任務可以降低模型的難度,并提高任務的完成質量。 🧩
反向思維:利用反向思維,讓 LLM 從不同角度思考問題。 例如,可以要求模型從不同的角度分析某個問題,從而獲得更全面的視角。 🔄
迭代優化: 不斷嘗試和調整 Prompt,直到獲得理想的結果。 Prompt 工程是一個迭代的過程,需要不斷地測試和優化。 ??
使用示例: 在 Prompt 中加入一些示例可以幫助模型更好地理解用戶的意圖,并生成更符合預期的輸出。 💡
使用提示詞: 使用一些提示詞,例如 “請給出步驟”, “請解釋原因”, 可以引導模型生成更詳細的輸出。 📝
案例: 假設我們想讓 LLM 生成一份關于某個產品的市場分析報告, 我們可以通過迭代的方式逐步完善 Prompt。 首先,我們可以先要求模型生成一份簡單的市場分析框架,然后逐步添加細節,例如 “請詳細分析該產品的競爭對手”、“請給出 SWOT 分析” 等,從而逐步引導模型生成高質量的市場分析報告。 可以通過多次迭代,不斷完善 Prompt,最終獲得一個高質量的市場分析報告。
思考: 如何構建一個有效的 Prompt 工程流程,從而快速設計出高質量的 Prompt? 🤔
一個有效的 Prompt 工程流程需要包括需求分析、Prompt 設計、Prompt 測試和迭代優化等步驟。需要根據用戶的需求分析,設計合適的 Prompt,然后對 Prompt 進行測試,并根據測試結果進行迭代優化。
五. LLM 的挑戰:理性看待幻覺與倫理 🤔
5.1 幻覺的根源:LLM 的認知缺陷 😵?💫
LLM 可能會產生幻覺(Hallucination),即輸出與事實不符或不合理的信息[6]。幻覺的產生原因主要有以下幾個方面:
訓練數據中的偏差: 訓練數據可能包含錯誤的信息、偏見,或者缺乏多樣性。如果訓練數據中存在偏差,模型可能會學習到這些偏差,并將其反映在輸出結果中。 😔
模型知識的局限性: LLM 可能缺乏常識、領域知識,或無法理解復雜的邏輯關系。LLM 的知識主要來源于訓練數據,如果訓練數據中沒有包含相關的知識,模型可能無法正確回答相關的問題。 📚
模型生成的機制: LLM 采用的自回歸生成方式,有時會導致輸出不合理的信息,例如,在沒有足夠上下文的情況下,可能會生成不符合常識的語句。自回歸生成方式的特點是逐個生成 tokens,這種生成方式有時會導致模型偏離事實。 😥
過分自信: 有時,LLM 會過于自信地生成一些不正確的信息,而沒有意識到自己的錯誤。 🙄
思考: 我們應該如何看待 LLM 的 “創造力” 和 “真實性” 之間的平衡? 🤔如何確保 LLM 輸出的可靠性?
LLM 的“創造力” 與 “真實性” 之間存在一定的張力。 我們需要采取多種措施來提高 LLM 輸出的可靠性,并對其輸出結果進行驗證。需要認識到 LLM 的局限性,不能盲目相信其輸出結果。
5.2 如何馴服幻覺:增強 LLM 的可靠性 💪
減少 LLM 幻覺的策略主要有以下幾種:
使用更高質量的訓練數據: 清洗和過濾訓練數據,確保數據的準確性、多樣性和代表性。 可以使用一些數據驗證工具來檢查訓練數據的質量。 ?
增強模型的知識和推理能力: 將外部知識庫與 LLM 結合,或者使用知識圖譜增強模型的推理能力。可以使用 RAG (Retrieval-Augmented Generation) 技術來實現。 🤓
引入事實性驗證機制: 使用外部工具或知識庫來驗證 LLM 輸出的真實性。 可以使用一些搜索引擎或者知識庫API來驗證 LLM 的輸出結果。 🔍
模型微調和增強: 使用特定的方法來微調 LLM,減少其生成幻覺的可能性。 例如,可以使用一些專門設計的損失函數或者正則化方法。 🛠?
Prompt 工程技巧: 通過精心設計的 Prompt 來引導 LLM 生成更準確的輸出。 例如,可以要求模型給出引用來源,或者使用思維鏈 Prompt 來引導模型進行推理。
案例: 我們可以使用 RAG (Retrieval-Augmented Generation) 技術,讓 LLM 在生成答案之前先檢索外部知識庫,從而提高答案的準確性和可靠性。 例如,當 LLM 回答關于某個事件的問題時,可以先從維基百科中檢索相關信息,然后結合檢索到的信息生成答案。
思考: 如何構建更加可信、可靠的 LLM?🤔
構建可信賴的 LLM 需要多方面的努力,包括提高數據質量、增強模型能力、引入驗證機制等。同時,需要不斷地進行實驗和研究,探索減少 LLM 幻覺的方法。
5.3 LLM 的倫理考量:責任與公平 ??
LLM 的發展和應用面臨著許多倫理問題:
偏見: LLM 可能繼承訓練數據中的偏見,導致對特定群體的不公平待遇。這需要我們在訓練數據選擇、模型訓練、以及模型評估等各個環節進行仔細的考慮和改進。 😔
隱私: LLM 在訓練過程中可能泄露用戶的個人隱私。需要使用一些技術手段來保護用戶的隱私,例如,使用差分隱私技術。 🔒
濫用: LLM 可能被用于生成虛假信息、惡意代碼等,從而造成危害。需要制定一些法律法規來規范 LLM 的使用,防止其被濫用。 🚨
責任歸屬: LLM 出現錯誤時,如何界定責任?需要明確 LLM 的使用者和開發者的責任,并建立相應的責任追究機制。 🤔
思考: 如何開發出更負責任、更公平的 LLM?🤔如何制定相應的法律法規來規范 LLM 的發展? 開發負責任的 LLM 需要在技術、倫理和法律層面進行綜合考慮。需要加強倫理審查,并建立相應的監管機制。
5.4 可信賴 AI 的構建 ?
可信賴 AI (Trustworthy AI) 強調在人工智能系統的開發和應用中,除了性能,還需要考慮透明度、公平性、魯棒性、安全性、隱私保護等重要因素。構建可信賴的 LLM 系統需要:
透明度: 確保模型的決策過程透明可解釋。可以使用一些可解釋性技術來理解 LLM 的決策過程,例如,注意力可視化。 👁?
公平性: 避免模型輸出對特定群體產生歧視。可以使用一些公平性評估指標來評估模型的公平性。 ??
魯棒性: 保證模型在不同場景下都能穩定運行。可以使用一些對抗訓練技術來提高模型的魯棒性。 💪
安全性: 防止模型被惡意利用。可以使用一些安全技術來保護模型,例如,防止模型被攻擊。 🛡?
隱私保護: 保護用戶數據的隱私。可以使用一些隱私保護技術來保護用戶的數據,例如,差分隱私技術。 🔒
六. RAG 與 Agent:拓展 LLM 的邊界 🚀
6.1 RAG:知識與生成的深度融合 🧠
RAG (Retrieval-Augmented Generation) 是一種知識增強策略,它可以彌補 LLM 知識不足的缺陷,提高生成內容的準確性和可靠性[7]。 RAG 的工作流程包括:
-
信息檢索: 根據用戶輸入,從外部知識庫中檢索相關信息。 可以使用一些信息檢索技術來快速地找到相關信息,例如,基于向量相似度的檢索技術。 🔍
-
上下文增強: 將檢索到的信息添加到用戶的 Prompt 中。 將檢索到的信息添加到 Prompt 中,可以為 LLM 提供更多的上下文信息,從而生成更準確的輸出。 📖
-
文本生成: LLM 基于增強后的 Prompt 生成文本。 LLM 利用增強后的 Prompt 生成最終的答案。 ??
案例: 如果用戶詢問:“2023年諾貝爾物理學獎得主是誰?”,LLM 本身可能不知道答案,但 RAG 可以從維基百科等知識庫中檢索相關信息,然后根據檢索到的信息生成準確的答案。 RAG 可以有效地解決 LLM 知識不足的問題。
思考: 如何構建高效的檢索系統,從而快速找到與用戶輸入相關的信息?🤔如何優化 RAG 的流程,從而提高整體性能?
RAG 的關鍵是構建一個高效的檢索系統,同時優化檢索策略和融合策略,以便更好地利用檢索到的信息。例如,可以使用一些向量數據庫來高效地存儲和檢索知識。
6.2 Agent:LLM 的執行能力 🦾
Agent 可以被視為擁有 LLM 大腦的智能體,它能夠自主地完成各種復雜的任務,與外部環境進行交互,并調用各種工具和服務[8]。 Agent 的組成和工作流程包括:
-
規劃: Agent 根據用戶需求制定任務執行計劃。 Agent 需要根據用戶的輸入來制定一個合理的任務執行計劃,并將復雜的任務分解成多個子任務。 🗺?
-
執行: Agent 執行計劃,調用各種工具和服務。 Agent 需要能夠調用各種工具和服務來實現任務的目標。例如,可以調用一些搜索引擎、數據庫、API等。 🛠?
-
監控: Agent 監控任務執行過程,并根據情況調整計劃。 Agent 需要能夠監控任務的執行過程,并在出現錯誤時進行調整。 🧐
-
反饋: Agent 向用戶提供任務執行結果。 Agent 需要能夠向用戶提供任務執行結果,并解釋任務執行過程。 📢
案例: Agent 可以用來自動預定會議、根據用戶需求推薦產品、生成個性化的旅游行程等。例如,用戶可以說 “幫我預定明天上午10點在XX會議室的會議”, Agent 會自動完成查找會議室、發送邀請等任務。 Agent 可以提高工作效率,并幫助用戶完成各種復雜的任務。 🤩
思考: 如何設計更靈活、更強大的 Agent,使其能夠更好地服務于人類? 🤔 如何處理 Agent 在執行任務過程中可能出現的錯誤和異常情況?
Agent 的設計需要考慮其靈活性、魯棒性和安全性。需要使用一些技術手段來提高 Agent 的魯棒性,例如,使用異常檢測機制。
拓展: LangChain 和 AutoGPT 是常見的 Agent 框架,它們提供了方便的工具和接口,可以幫助開發者快速構建 Agent 應用。LangChain 提供了一系列的工具和模塊,可以幫助開發者快速地構建 Agent 應用,例如,提供了 Prompt 模板、各種工具的接口、以及記憶機制等。 AutoGPT 是一個基于 LLM 的自主 Agent,它能夠獨立地完成各種任務,而不需要人為的干預。這些框架的出現,大大降低了開發Agent應用的難度,加速了Agent應用的普及。 🚀
七. 國內 LLM 的崛起:挑戰與機遇并存 🇨🇳
7.1 國內 LLM 的現狀:百舸爭流,各具特色 🌊
國內的 LLM 發展迅速,涌現出了一批優秀的 LLM 產品[9]。這些模型在中文理解和生成方面表現出色,并不斷拓展應用場景。例如:
深度求索的DeepSeek-R1: 在硅谷,DeepSeek被稱作“來自東方的神秘力量”。OpenAI前政策主管、Anthropic聯合創始人Jack Clark認為,DeepSeek“雇傭了一批高深莫測的奇才”,還認為中國制造的大模型,“將和無人機、電動汽車一樣,成為不容忽視的力量”。
阿里的通義千問: 強調多語言能力和用戶體驗,在電商等領域具有廣泛的應用場景。通義千問在多語言處理方面表現突出,能夠處理多種語言的文本。阿里巴巴在電商領域積累了豐富的經驗,為通義千問在電商場景中的應用提供了支持。 🛍?
百度的文心一言: 側重于中文理解和生成,在中文信息處理方面具有優勢。文心一言在知識問答、文本創作、代碼生成等方面表現出色,并不斷拓展在各個行業的應用。百度在搜索引擎技術和中文自然語言處理方面積累了豐富的經驗,為文心一言的研發提供了強有力的支持。 💯
華為的盤古: 專注于跨模態和行業應用,在行業領域具有一定的競爭力。盤古模型具有強大的跨模態能力,能夠處理文本、圖像、音頻等多種模態的數據。華為在硬件、云計算等領域具有強大的實力,為盤古模型的訓練和部署提供了良好的平臺。 🦾
騰訊的混元: 致力于打造通用大模型,在多領域和多場景下表現優異。騰訊在社交、游戲等領域具有豐富的經驗,為混元模型的研發提供了有力支持。 🎮
科大訊飛的星火: 專注于語音交互和教育領域,在語音識別和合成方面具有優勢。科大訊飛在語音技術方面具有領先地位,為星火模型在語音交互領域的應用提供了堅實的基礎。 🗣?
國內 LLM 在某些領域具有獨特優勢,例如中文處理、本土化應用、行業知識積累等。這些優勢為國內 LLM 的發展提供了良好的基礎。
思考: 國內 LLM 如何在激烈的競爭中脫穎而出? 🤔
國內 LLM 需要在技術創新、數據積累、應用場景等方面不斷突破,才能在激烈的競爭中脫穎而出。需要加強核心算法的研發,并探索一些新的預訓練任務和微調方法。 同時,需要加強行業知識的積累,并開發一些具有特色的行業應用。 另外,需要加強開源社區的建設,吸引更多的開發者參與到 LLM 的發展中來。
7.2 面臨的挑戰:數據、算法與生態 🚧
國內 LLM 發展面臨的挑戰主要有:
數據質量和規模: 國內高質量的數據資源相對匱乏,訓練數據質量還有待提高。高質量的數據對于訓練出性能優異的LLM至關重要。 需要加強數據資源的建設,并探索一些新的數據增強方法。同時,需要加強數據的清洗和標注,以確保數據的質量。 📚
核心算法: 在 Transformer 架構的基礎上,需要進行更多的創新,以提高模型效率和性能。 Transformer 架構雖然性能強大,但依然存在一些局限性,需要進行一些新的探索,例如,探索新的注意力機制,以及一些更高效的模型結構。 ??
生態建設: 需要構建更加完善的 LLM 生態,包括工具、框架、應用和人才培養等。一個完善的生態系統對于LLM的發展至關重要,可以吸引更多的開發者和用戶。需要提供完善的開發工具和框架,并建立一些相關的社區。 🌳
人才培養: 國內LLM人才儲備還相對不足。需要加強對LLM人才的培養,并吸引一些國際人才。 可以在高校開設相關課程,并提供相關的培訓機會。 👨?🎓👩?🎓
算力資源: 大規模的LLM訓練需要大量的算力資源,這對于許多中小企業來說是一個巨大的挑戰。需要加強算力資源的建設,并提供一些公共的算力平臺。 💻
監管和倫理: 需要制定一些相應的監管政策,并建立一些倫理規范,以確保LLM的健康發展。需要加強對LLM的倫理風險評估,并采取相應的措施來降低風險。 ??
思考: 如何加速國內 LLM 的發展,從而縮小與國際先進水平的差距? 🤔 需要加強技術研發,加大對LLM生態的投入,吸引人才,加強國內外交流合作。 需要堅持自主創新,并加強產學研合作。同時,需要積極參與國際合作,學習國際先進的經驗。
7.3 未來的機遇:潛力無限,前景廣闊 🌟
國內 LLM 的發展機遇包括:
龐大的市場需求: 中國擁有巨大的市場,對 LLM 的需求潛力無限。各行各業都對LLM有著巨大的需求,例如,金融、醫療、教育等。 💰
政策支持: 政府對人工智能產業的發展給予了高度重視和政策支持。政府出臺了一系列政策來支持人工智能產業的發展,并加大對人工智能領域的投入。 📜
本土化優勢: 國內 LLM 可以更好地適應中文環境和本土用戶需求。國內LLM在中文理解和生成方面具有天然的優勢,可以更好地滿足國內用戶的需求。 🇨🇳
數據資源: 中國擁有海量的數據資源,這些數據資源為國內LLM的發展提供了強大的支持。需要充分利用這些數據資源,并進行有效的處理和分析。 📊
應用場景: 國內LLM具有廣泛的應用場景,例如,智能客服、智能寫作、智能教育等。這些應用場景為國內LLM的發展提供了廣闊的空間。 💡
7.4 LLM 的未來:責任與創新并肩而行 🤝
LLM 的發展是人工智能領域的一項重大突破,它將深刻改變我們的生活和工作。LLM 不僅僅是一項技術,更是一種工具,可以用來改變社會,但也需要謹慎使用。
LLM 的未來發展趨勢包括:
更加智能化的模型: 具有更強的理解、推理和創造能力。未來的LLM將具有更強大的認知能力,可以更好地理解人類的意圖,并進行更復雜的推理。 🧠
更加廣泛的應用場景: 滲透到我們生活和工作的各個方面。未來的LLM將在各個行業得到廣泛應用,例如,醫療、金融、教育、交通等。 🌍
更加人性化的交互方式: 使人機交互更加自然流暢。未來的LLM將能夠與人類進行更自然、更流暢的交互,例如,通過語音、手勢等多種方式進行交互。 👋
更加透明和負責任的開發和使用: 確保 LLM 能夠為人類帶來福祉。未來的LLM的開發和使用將更加透明和負責任,需要建立一些相應的監管機制和倫理規范。 🛡?
多模態能力: 未來的LLM將具有更強的多模態能力,能夠處理文本、圖像、音頻、視頻等多種模態的數據。 👁??🗨?
個性化定制: 未來的LLM將能夠進行個性化定制,以更好地滿足用戶的需求。 🎁
邊緣計算: 未來的LLM將能夠部署在邊緣設備上,以提高響應速度和保護隱私。 📱
持續學習: 未來的LLM將能夠進行持續學習,以不斷提高自身的性能。 📈
參考文獻
[1] https://wangwei1237.github.io/LLM_in_Action/llm_intro.html
[2] https://wangwei1237.github.io/LLM_in_Action/tokens.html
[3] https://wangwei1237.github.io/LLM_in_Action/embedding.html
[4] https://wangwei1237.github.io/LLM_in_Action/sft.html
[5] https://wangwei1237.github.io/LLM_in_Action/prompt_engineer.html
[6] https://wangwei1237.github.io/LLM_in_Action/hallucination.html
[7] https://wangwei1237.github.io/LLM_in_Action/rag_intro.html
[8] https://wangwei1237.github.io/LLM_in_Action/agent_intro.html
[9] https://www.sohu.com/a/742740997_121124363