從理論到實踐:RAG、Agent、微調等 6 種常見的大模型定製策略

大語言模型(LLM)是基於自監督學習預訓練的深度學習模型,訓練數據量龐大、訓練時間長,並且包含大量的參數。LLM 在過去兩年中徹底改變了自然語言處理領域,展現了在理解和生成類人文本方面的卓越能力。

然而,這些通用模型的開箱即用性能並不總能滿足特定的業務需求或領域要求。LLM 單獨使用時無法回答依賴於公司專有數據或封閉環境的問題,這使得它們在應用中顯得相對通用。

由於從零開始訓練一個 LLM 模型需要大量的訓練數據和資源,這對於中小型團隊來說基本不可行。因此,近年來開發了多種 LLM 定製策略,以便針對需要專業知識的不同場景調優模型。

定製策略大致可以分爲兩種類型:

  1. 使用凍結模型:這些技術不需要更新模型參數,通常通過上下文學習或提示工程來實現。由於它們通過改變模型的行爲而不需要大量訓練成本,因此具有成本效益,廣泛應用於工業界和學術界,每天都有新的研究論文發表。

  2. 更新模型參數:這是一種相對資源密集的方法,需要使用爲特定目的設計的自定義數據集來調優預訓練的 LLM。這包括如微調(Fine-Tuning)和基於人類反饋的強化學習(RLHF)這些流行的技術。

這兩種定製範式進一步分化爲各種專門的技術,包括 LoRA 微調、思維鏈(Chain of Thought)、檢索增強生成(RAG)、ReAct 和 Agent 框架等。每種技術在計算資源、實現複雜度和性能提升方面提供了不同的優勢和權衡。

**如何選擇 LLM?  **

定製 LLM 的第一步是選擇合適的基礎模型作爲基準。例如 Huggingface 這些基於社區的平臺,提供了由頂級公司或社區貢獻的各種開源預訓練模型,如 Meta 的 Llama 系列和 Google 的 Gemini。Huggingface 還提供了例如 Open LLM Leaderboard 這樣的排行榜,可以根據行業標準的指標和任務(如 MMLU)來比較 LLM。

雲服務提供商如 AWS(亞馬遜)和 AI 公司(如 OpenAI 和 Anthropic)也提供訪問專有模型的服務,這些通常是付費服務,且訪問受限。

選擇 LLM 時需要考慮以下幾個因素:

  1. 開源模型還是專有模型:開源模型允許完全定製和自託管,但需要技術專業知識,而專有模型則提供即時訪問,通常可以提供更好的響應質量,但成本較高。

  2. 任務和指標:不同的模型在不同任務上表現出色,包括問答、總結、代碼生成等。通過比較基準指標並在特定領域任務上進行測試,來確定合適的模型。

  3. 架構:一般來說,僅解碼器模型(如 GPT 系列)在文本生成方面表現更好,而編碼 - 解碼模型(如 T5)在翻譯任務上表現優秀。現在有更多的架構出現並展現出良好的結果,例如專家混合模型(MoE)DeepSeek。

  4. 參數數量和模型大小:較大的模型(70B-175B 參數)通常提供更好的性能,但需要更多的計算資源。較小的模型(7B-13B)運行更快且更便宜,但可能在能力上有所減少。

在確定了基礎 LLM 之後,讓我們來看一下六種最常見的 LLM 定製策略,按資源消耗從最少到最多的順序排列:

  1. 提示工程(Prompt Engineering)

  2. 解碼與採樣策略(Decoding and Sampling Strategy)

  3. 檢索增強生成(Retrieval Augmented Generation)

  4. Agent

  5. 微調(Fine Tuning)

  6. 基於人類反饋的強化學習(Reinforcement Learning from Human Feedback)

**提示工程  **

提示(Prompt)是發送給 LLM 的輸入文本,用於引發 AI 生成的響應,它可以由指令、上下文、輸入數據和輸出指示符組成。

提示工程(Prompt Engineering)涉及有策略地設計這些提示組件,以塑造和控制模型的響應。基本的提示工程技術包括零次提示(zero shot prompting)、一次提示(one shot prompting)和少量提示(few shot prompting)。用戶可以在與 LLM 互動時直接實現這些基本提示工程技術,從而高效地使模型的行爲與新目標對齊。API 實現也是一種選擇。

由於提示工程的高效性和有效性,人們也探索和開發出了越來越多的用於提升提示的邏輯結構的複雜方法。

像 CoT 和 ReAct 這樣的技術通常與 Agent 工作流結合使用,以增強其能力。這些技術將在接下來的 Agent 部分中詳細介紹。

**解碼與採樣策略  **

解碼策略可以通過推理參數(例如 temperature、top_p、top_k)在模型推理時進行控制,從而決定模型響應的隨機性和多樣性。貪婪搜索、束搜索和採樣是三種常見的自迴歸模型生成的解碼策略。

在自迴歸生成過程中,LLM 根據前一個 token 的條件,基於候選 token 的概率分佈逐個輸出 token。

默認情況下,使用貪婪搜索來生成概率最高的下一個 token。

與此不同,束搜索解碼會考慮多個下一個最佳 token 的假設,並選擇在整個文本序列中具有最高綜合概率的假設。以下代碼片段使用 transformers 庫,在模型生成過程中指定束搜索路徑的數量(例如,num_beams=5 表示考慮 5 個不同的假設):

from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
inputs = tokenizer(prompt, return_tensors="pt")
model = AutoModelForCausalLM.from_pretrained(model_name)
outputs = model.generate(**inputs, num_beams=5)

採樣策略是控制模型響應隨機性的第三種方法,通過調整這些推理參數:

  1. 溫度(Temperature):降低溫度會使概率分佈變得更加尖銳,從而增加生成高概率詞語的可能性,減少生成低概率詞語的可能性。當溫度 = 0 時,相當於貪婪搜索(最不具創意);當溫度 = 1 時,會生成最具創意的輸出。

  2. Top K 採樣:這種方法篩選出 K 個最可能的下一個 token,並在這些 token 之間重新分配概率。模型從這個篩選出的 token 集合中進行採樣。

  3. Top P 採樣:與從 K 個最可能的 token 中採樣不同,top-p 採樣從最小的 token 集合中選擇,該集合的累積概率超過閾值 p。

以下示例代碼片段從累積概率大於 0.95(top_p=0.95)的前 50 個最可能的 token 中進行採樣(top_k=50):

sample_outputs = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_k=50,
    top_p=0.95,
    num_return_sequences=3,
)

**RAG  **

檢索增強生成(Retrieval Augmented Generation,簡稱 RAG),最初在論文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出,已被證明是一種有前景的解決方案,能夠將外部知識集成進來,並在處理領域特定或專業查詢時減少常見的 LLM 幻覺問題。RAG 允許動態地從知識領域中提取相關信息,並且通常不涉及更新 LLM 參數的大規模訓練,使其成爲一種用於將通用 LLM 適配到特定領域的成本效益高的策略。

RAG 系統可以分爲檢索和生成兩個階段。

檢索過程的目標是通過對外部知識進行切塊、創建嵌入、索引和相似性搜索,找到與用戶查詢密切相關的知識庫內容。

  1. 切塊(Chunking):將文檔劃分爲較小的段落,每個段落包含一個獨立的信息單元。

  2. 創建嵌入(Create embeddings):嵌入模型將每個信息塊壓縮爲向量表示。用戶查詢也通過相同的向量化過程轉換爲向量表示,這樣用戶查詢就可以在相同的維度空間中進行比較。

  3. 索引(Indexing):這一過程將這些文本塊及其向量嵌入存儲爲鍵值對,從而實現高效且可擴展的搜索功能。對於超出內存容量的大型外部知識庫,向量數據庫提供高效的長期存儲。

  4. 相似性搜索(Similarity search):計算查詢嵌入與文本塊嵌入之間的相似性分數,用於搜索與用戶查詢高度相關的信息。

RAG 系統的生成過程則將檢索到的信息與用戶查詢結合,形成增強的查詢,並將其傳遞給 LLM,以生成豐富上下文的響應。

以下代碼片段首先指定 LLM 和嵌入模型,然後執行步驟將外部知識庫文檔切塊爲文檔集合。接着從文檔創建索引,基於索引定義查詢引擎,並使用用戶提示查詢查詢引擎。

from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import VectorStoreIndex
Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model="BAAI/bge-small-en-v1.5"
document = Document(text="\\n\\n".join([doc.text for doc in documents]))
index = VectorStoreIndex.from_documents([document])                                    
query_engine = index.as_query_engine()
response = query_engine.query(
    "Tell me about LLM customization strategies."
)

上述示例展示了一個簡單的 RAG 系統。基於此,改進後的高級 RAG 引入了預檢索和後檢索策略,以減少檢索和生成過程之間的協同作用有限等問題。例如,重新排序技術使用能夠理解雙向上下文的模型對檢索到的信息進行重新排序,並與知識圖譜集成,用於高級查詢路由。更多技巧可以參考《高階 RAG 技巧:探索提升 RAG 系統性能的不同技巧》。

**Agent  **

LLM Agent 是 2024 年的熱門話題,並且可能在 2025 年繼續成爲生成 AI 領域的主要關注點。

與 RAG 相比,Agent 在創建查詢路徑和規劃基於 LLM 的工作流方面表現更爲出色,具有以下優勢:

  1. 維護先前模型生成響應的記憶和狀態。

  2. 根據特定標準利用各種工具。這種工具使用能力使得 Agent 與基本的 RAG 系統不同,因爲它賦予 LLM 獨立選擇工具的控制權。

  3. 將複雜任務分解爲更小的步驟,並規劃一系列動作。

  4. 與其他 Agent 協作,形成一個協調的系統。

可以通過 Agent 框架實現如 CoT、ReAct 這幾種上下文學習技術,我們將詳細討論 ReAct。ReAct 代表 Synergizing Reasoning and Acting in Language Models(在語言模型中協同推理與行動),由三個關鍵元素組成——行動、思考和觀察。

這個框架由 Google Research 在普林斯頓大學提出,基於思維鏈(Chain of Thought)構建,將推理步驟與一個行動空間結合,使得工具使用和函數調用成爲可能。此外,ReAct 框架強調根據環境觀察來確定下一個最佳行動。

以下是原始論文中的一個示例,展示了 ReAct 的內部工作過程,其中 LLM 生成第一個思考並通過調用 “Search [Apple Remote]” 函數進行行動,然後觀察其第一次輸出的反饋。第二個思考基於先前的觀察,從而引導到不同的行動“Search [Front Row]”。這個過程會反覆進行,直到達到目標。研究表明,ReAct 通過與簡單的 Wikipedia API 交互,克服了在鏈式推理中常見的幻覺和錯誤傳播問題。此外,通過決策痕跡的實施,ReAct 框架還增強了模型的可解釋性、可信度和診斷能力。

下面使用 llamaindex 展示了一個基於 ReAct 的 Agent 實現。首先,它定義了兩個函數(multiply 和 add)。其次,這兩個函數被封裝爲 FunctionTool,形成了 Agent 的行動空間,並根據其推理執行。

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
# 創建基本的函數工具
def multiply(a: float, b: float) -> float:
    return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
def add(a: float, b: float) -> float:
    return a + b
add_tool = FunctionTool.from_defaults(fn=add)
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)

當結合自我反思或自我修正時,Agent 工作流的優勢更加顯著。這是一個日益增長的領域,目前正在探索各種 Agent 架構。

**微調  **

微調(Fine-tuning)是向 LLM 輸入特定的領域和專業數據集,以修改模型,使其更好地與某一目標對齊的過程。它不同於提示工程和 RAG,因爲它允許更新 LLM 的權重和參數。完全微調指的是通過反向傳播更新預訓練 LLM 的所有權重,這需要大量的內存來存儲所有權重和參數,並可能導致模型在其他任務上的能力顯著下降(即災難性遺忘)。

因此,PEFT(Parameter Efficient Fine Tuning,參數高效微調)被更廣泛地應用,以減輕這些問題,同時節省模型訓練的時間和成本。PEFT 方法主要分爲三類:

  1. 選擇性微調(Selective):選擇初始 LLM 參數的一個子集進行微調,相較於其他 PEFT 方法,這種方法在計算上可能更加密集。

  2. 重參數化(Reparameterization):通過訓練低秩表示的權重來調整模型權重。例如,低秩適應(Lower Rank Adaptation,LoRA)就是這一類方法之一,通過用兩個較小的矩陣表示權重更新,從而加速微調。

  3. 加性微調(Additive):向模型中添加額外的可訓練層,包括適配器(adapters)和軟提示(soft prompts)等技術。

微調過程與深度學習訓練過程類似,需要以下輸入:

以下是使用 transformers Trainer 實現微調的示例:

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
    output_dir=output_dir,
    learning_rate=1e-5,
    eval_strategy="epoch"
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    compute_metrics=compute_metrics,
)
trainer.train()

微調有廣泛的應用場景。例如,指令微調(instruction fine-tuning)通過在 prompt-completion(提示 - 完成)對上進行訓練,優化 LLM 進行對話和遵循指令的能力。另一個例子是領域適應(domain adaptation),這是一種無監督的微調方法,幫助 LLM 在特定的知識領域中專門化。

**RLHF  **

**RLHF(Reinforcement Learning from Human Feedback,人類反饋強化學習)**是一種強化學習技術,通過基於人類偏好的方式來微調 LLM。RLHF 的工作原理是通過人類反饋訓練一個獎勵模型,並將該模型用作獎勵函數,通過 PPO(Proximal Policy Optimization,近端策略優化)優化強化學習策略。這個過程需要兩組訓練數據:一組用於訓練獎勵模型的偏好數據集,和一組用於強化學習循環中的提示數據集。

讓我們將其分解成幾個步驟:

  1. 收集偏好數據集,由人工標註員對模型生成的不同回答進行評分,標註哪些回答符合人類偏好。偏好數據集的一個示例格式爲 {input_text, candidate1, candidate2, human_preference},表示哪個候選答案更受偏好。

  2. 使用偏好數據集訓練獎勵模型,該獎勵模型本質上是一個迴歸模型,輸出一個標量,表示模型生成回答的質量。獎勵模型的目標是最大化優勝候選答案與失敗候選答案之間的分數。

  3. 在強化學習循環中使用獎勵模型對 LLM 進行微調。目標是更新策略,使得 LLM 能夠生成最大化獎勵模型所產生獎勵的回答。這個過程使用提示數據集,提示數據集的格式爲 {prompt, response, rewards}。

開源庫 Trlx 被廣泛應用於實現 RLHF,它提供了一個模板代碼,展示了 RLHF 的基本設置:

# trl: Transformer Reinforcement Learning library
from trl import PPOTrainer, PPOConfig, AutoModelForSeq2SeqLMWithValueHead
from trl import create_reference_model
from trl.core import LengthSampler
# 初始化預訓練的模型和分詞器
model = AutoModelForCausalLMWithValueHead.from_pretrained(config.model_name)
tokenizer = AutoTokenizer.from_pretrained(config.model_name)
# 定義PPO算法的超參數
config = PPOConfig(
    model_name=model_name,    
    learning_rate=learning_rate,
    ppo_epochs=max_ppo_epochs,
    mini_batch_size=mini_batch_size,
    batch_size=batch_size
)
# 使用模型初始化PPO訓練器
ppo_trainer = PPOTrainer(
    config=config, 
    model=ppo_model, 
    tokenizer=tokenizer, 
    dataset=dataset["train"],
    data_collator=collator
)                      
# 通過獎勵逐步更新ppo_trainer
ppo_trainer.step(query_tensors, response_tensors, rewards)

RLHF 廣泛應用於使模型的回答與人類偏好對齊。常見的使用場景包括減少回答的有害性和模型的幻覺現象。然而,它的缺點是需要大量人工標註的數據,並且與策略優化相關的計算成本較高。因此,爲了緩解這些限制,提出瞭如 AI 反饋強化學習(Reinforcement Learning from AI feedback)和 直接偏好優化(Direct Preference Optimization,DPO)等替代方法。

https://towardsdatascience.com/6-common-llm-customization-strategies-briefly-explained/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/BmJMVgxj7YwmTj6X3Dkd6Q