大語言模型(LLM)是基于自監督學習預訓練的深度學習模型,訓練數據量龐大、訓練時間長,并且包含大量的參數。LLM在過去兩年中徹底改變了自然語言處理領域,展現了在理解和生成類人文本方面的卓越能力。
然而,這些通用模型的開箱即用性能并不總能滿足特定的業務需求或領域要求。LLM單獨使用時無法回答依賴于公司專有數據或封閉環境的問題,這使得它們在應用中顯得相對通用。
由于從零開始訓練一個LLM模型需要大量的訓練數據和資源,這對于中小型團隊來說基本不可行。因此,近年來開發了多種LLM定制策略,以便針對需要專業知識的不同場景調優模型。
定制策略大致可以分為兩種類型:
使用凍結模型:這些技術不需要更新模型參數,通常通過上下文學習或提示工程來實現。由于它們通過改變模型的行為而不需要大量訓練成本,因此具有成本效益,廣泛應用于工業界和學術界,每天都有新的研究論文發表。
更新模型參數: 這是一種相對資源密集的方法,需要使用為特定目的設計的自定義數據集來調優預訓練的LLM。這包括如微調(Fine-Tuning)和基于人類反饋的強化學習(RLHF)這些流行的技術。
這兩種定制范式進一步分化為各種專門的技術,包括LoRA微調、思維鏈(Chain of Thought)、檢索增強生成(RAG)、ReAct和Agent框架等。每種技術在計算資源、實現復雜度和性能提升方面提供了不同的優勢和權衡。
01 如何選擇LLM?
定制LLM的第一步是選擇合適的基礎模型作為基準。例如Huggingface這些基于社區的平臺,提供了由頂級公司或社區貢獻的各種開源預訓練模型,如Meta的Llama系列和Google的Gemini。Huggingface還提供了例如Open LLM Leaderboard這樣的排行榜,可以根據行業標準的指標和任務(如MMLU)來比較LLM。
云服務提供商如AWS(亞馬遜)和AI公司(如OpenAI和Anthropic)也提供訪問專有模型的服務,這些通常是付費服務,且訪問受限。
選擇LLM時需要考慮以下幾個因素:
開源模型還是專有模型:開源模型允許完全定制和自托管,但需要技術專業知識,而專有模型則提供即時訪問,通常可以提供更好的響應質量,但成本較高。
任務和指標:不同的模型在不同任務上表現出色,包括問答、總結、代碼生成等。通過比較基準指標并在特定領域任務上進行測試,來確定合適的模型。
架構:一般來說,僅解碼器模型(如GPT系列)在文本生成方面表現更好,而編碼-解碼模型(如T5)在翻譯任務上表現優秀。現在有更多的架構出現并展現出良好的結果,例如專家混合模型(MoE)DeepSeek。
參數數量和模型大小: 較大的模型(70B-175B參數)通常提供更好的性能,但需要更多的計算資源。較小的模型(7B-13B)運行更快且更便宜,但可能在能力上有所減少。
在確定了基礎LLM之后,讓我們來看一下六種最常見的LLM定制策略,按資源消耗從最少到最多的順序排列:
提示工程(Prompt Engineering)
解碼與采樣策略(Decoding and Sampling Strategy)
檢索增強生成(Retrieval Augmented Generation)
Agent
微調(Fine Tuning)
基于人類反饋的強化學習(Reinforcement Learning from Human Feedback)
02 提示工程
提示(Prompt)是發送給LLM的輸入文本,用于引發AI生成的響應,它可以由指令、上下文、輸入數據和輸出指示符組成。
指令:這是為模型如何執行任務提供的描述或指示。
上下文:這是外部信息,用于指導模型在特定范圍內進行響應。
輸入數據:這是你希望模型生成響應的輸入。
輸出指示符: 這指定了輸出的類型或格式。
提示工程(Prompt Engineering)涉及有策略地設計這些提示組件,以塑造和控制模型的響應。基本的提示工程技術包括零次提示(zero shot prompting)、一次提示(one shot prompting)和少量提示(few shot prompting)。用戶可以在與LLM互動時直接實現這些基本提示工程技術,從而高效地使模型的行為與新目標對齊。API實現也是一種選擇。
由于提示工程的高效性和有效性,人們也探索和開發出了越來越多的用于提升提示的邏輯結構的復雜方法。
思維鏈(Chain of Thought,CoT)要求LLM將復雜的推理任務分解為逐步的思維過程,從而提高多步驟問題的表現。每個步驟都會明確暴露其推理結果,并作為后續步驟的前置上下文,直到得出最終答案。
思維樹(Tree of Thought,ToT)是CoT的擴展,通過考慮多條不同的推理分支并自我評估選擇,決定下一步最佳行動。它對于涉及初步決策、未來策略和多種解決方案探索的任務更為有效。
自動推理和工具使用(Automatic Reasoning and Tool use,ART)在CoT的基礎上構建,它解構復雜任務,并允許模型使用預定義的外部工具(如搜索和代碼生成)從任務庫中選擇少量示例。
協同推理與行動(Synergizing Reasoning and Acting,ReAct) 結合了推理軌跡與行動空間,模型在行動空間中搜索,并基于環境觀察確定下一步最佳行動。
像CoT和ReAct這樣的技術通常與Agent工作流結合使用,以增強其能力。這些技術將在接下來的Agent部分中詳細介紹。
03 解碼與采樣策略
解碼策略可以通過推理參數(例如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)
采樣策略是控制模型響應隨機性的第三種方法,通過調整這些推理參數:
溫度(Temperature):降低溫度會使概率分布變得更加尖銳,從而增加生成高概率詞語的可能性,減少生成低概率詞語的可能性。當溫度 = 0 時,相當于貪婪搜索(最不具創意);當溫度 = 1 時,會生成最具創意的輸出。
Top K采樣:這種方法篩選出K個最可能的下一個token,并在這些token之間重新分配概率。模型從這個篩選出的token集合中進行采樣。
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,)
04 RAG
檢索增強生成(Retrieval Augmented Generation,簡稱RAG),最初在論文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出,已被證明是一種有前景的解決方案,能夠將外部知識集成進來,并在處理領域特定或專業查詢時減少常見的LLM幻覺問題。RAG允許動態地從知識領域中提取相關信息,并且通常不涉及更新LLM參數的大規模訓練,使其成為一種用于將通用LLM適配到特定領域的成本效益高的策略。
RAG系統可以分為檢索和生成兩個階段。
檢索過程的目標是通過對外部知識進行切塊、創建嵌入、索引和相似性搜索,找到與用戶查詢密切相關的知識庫內容。
切塊(Chunking):將文檔劃分為較小的段落,每個段落包含一個獨立的信息單元。
創建嵌入(Create embeddings):嵌入模型將每個信息塊壓縮為向量表示。用戶查詢也通過相同的向量化過程轉換為向量表示,這樣用戶查詢就可以在相同的維度空間中進行比較。
索引(Indexing):這一過程將這些文本塊及其向量嵌入存儲為鍵值對,從而實現高效且可擴展的搜索功能。對于超出內存容量的大型外部知識庫,向量數據庫提供高效的長期存儲。
相似性搜索(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引入了預檢索和后檢索策略
,以減少檢索和生成過程之間的協同作用有限
等問題。例如,重新排序技術使用能夠理解雙
向上下文的模型對檢索到的信息進行重新排序,
并與知識圖譜集成,用于高級查詢路由。
05 Agent
LLM Agent是2024年的熱門話題,并且可能在2025年繼續成為生成AI領域的主要關注點。
與RAG相比,Agent在創建查詢路徑和規劃基于LLM的工作流方面表現更為出色,具有以下優勢:
維護先前模型生成響應的記憶和狀態。
根據特定標準利用各種工具。這種工具使用能力使得Agent與基本的RAG系統不同,因為它賦予LLM獨立選擇工具的控制權。
將復雜任務分解為更小的步驟,并規劃一系列動作。
與其他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架構。
06 微調
微調(Fine-tuning)是向LLM輸入特定的領域和專業數據集,以修改模型,使其更好地與某一目標對齊的過程。它不同于提示工程和RAG,因為它允許更新LLM的權重和參數。完全微調指的是通過反向傳播更新預訓練LLM的所有權重,這需要大量的內存來存儲所有權重和參數,并可能導致模型在其他任務上的能力顯著下降(即災難性遺忘)。
因此,PEFT(Parameter Efficient Fine Tuning,參數高效微調)被更廣泛地應用,以減輕這些問題,同時節省模型訓練的時間和成本。PEFT方法主要分為三類:
選擇性微調(Selective):選擇初始LLM參數的一個子集進行微調,相較于其他PEFT方法,這種方法在計算上可能更加密集。
重參數化(Reparameterization):通過訓練低秩表示的權重來調整模型權重。例如,低秩適應(Lower Rank Adaptation,LoRA)就是這一類方法之一,通過用兩個較小的矩陣表示權重更新,從而加速微調。
加性微調(Additive):向模型中添加額外的可訓練層,包括適配器(adapters)和軟提示(soft prompts)等技術。
微調過程與深度學習訓練過程類似,需要以下輸入:
訓練和評估數據集
訓練參數,定義超參數(例如學習率、優化器)
預訓練LLM模型
計算度量和算法應優化的目標函數
以下是使用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在特定的知識領域中專門化。
07 RLHF
RLHF(Reinforcement Learning from Human Feedback,人類反饋強化學習)是一種強化學習技術,通過基于人類偏好的方式來微調LLM。RLHF的工作原理是通過人類反饋訓練一個獎勵模型,并將該模型用作獎勵函數,通過PPO(Proximal Policy Optimization,近端策略優化)優化強化學習策略。這個過程需要兩組訓練數據:一組用于訓練獎勵模型的偏好數據集,和一組用于強化學習循環中的提示數據集。
讓我們將其分解成幾個步驟:
收集偏好數據集,由人工標注員對模型生成的不同回答進行評分,標注哪些回答符合人類偏好。偏好數據集的一個示例格式為{input_text, candidate1, candidate2, human_preference},表示哪個候選答案更受偏好。
使用偏好數據集訓練獎勵模型,該獎勵模型本質上是一個回歸模型,輸出一個標量,表示模型生成回答的質量。獎勵模型的目標是最大化優勝候選答案與失敗候選答案之間的分數。
在強化學習循環中使用獎勵模型對LLM進行微調。目標是更新策略,使得LLM能夠生成最大化獎勵模型所產生獎勵的回答。這個過程使用提示數據集,提示數據集的格式為{prompt, response, rewards}。
開源庫 Trlx 被廣泛應用于實現RLHF,它提供了一個模板代碼,展示了RLHF的基本設置:
#: Transformer Reinforcement Learning library
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_trainerppo_trainer.step(query_tensors, response_tensors, rewards)
RLHF廣泛應用于使模型的回答與人類偏好對齊。常見的使用場景包括減少回答的有害性和模型的幻覺現象。然而,它的缺點是需要大量人工標注的數據,并且與策略優化相關的計算成本較高。因此,為了緩解這些限制,提出了如 AI反饋強化學習(Reinforcement Learning from AI feedback)和 直接偏好優化(Direct Preference Optimization,DPO)等替代方法。
來源 | PyTorch研習社(ID:pytorchlab)
作者 | 南七無名式 ; 編輯 | 荔枝
內容僅代表作者獨立觀點,不代表早讀課立場
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.