定製策略大致可以分為兩種型別:
-
使用凍結模型:這些技術不需要更新模型引數,通常透過上下文學習或提示工程來實現。由於它們透過改變模型的行為而不需要大量訓練成本,因此具有成本效益,廣泛應用於工業界和學術界,每天都有新的研究論文發表。
-
更新模型引數:這是一種相對資源密集的方法,需要使用為特定目的設計的自定義資料集來調優預訓練的LLM。這包括如微調(Fine-Tuning)和基於人類反饋的強化學習(RLHF)這些流行的技術。


選擇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)

提示(Prompt)是傳送給LLM的輸入文字,用於引發AI生成的響應,它可以由指令、上下文、輸入資料和輸出指示符組成。
-
指令:這是為模型如何執行任務提供的描述或指示。
-
上下文:這是外部資訊,用於指導模型在特定範圍內進行響應。
-
輸入資料:這是你希望模型生成響應的輸入。
-
輸出指示符:這指定了輸出的型別或格式。
由於提示工程的高效性和有效性,人們也探索和開發出了越來越多的用於提升提示的邏輯結構的複雜方法。
-
思維鏈(Chain of Thought,CoT)要求LLM將複雜的推理任務分解為逐步的思維過程,從而提高多步驟問題的表現。每個步驟都會明確暴露其推理結果,並作為後續步驟的前置上下文,直到得出最終答案。
-
思維樹(Tree of Thought,ToT)是CoT的擴充套件,透過考慮多條不同的推理分支並自我評估選擇,決定下一步最佳行動。它對於涉及初步決策、未來策略和多種解決方案探索的任務更為有效。
-
自動推理和工具使用(Automatic Reasoning and Tool use,ART)在CoT的基礎上構建,它解構複雜任務,並允許模型使用預定義的外部工具(如搜尋和程式碼生成)從任務庫中選擇少量示例。
-
協同推理與行動(Synergizing Reasoning and Acting,ReAct)結合了推理軌跡與行動空間,模型在行動空間中搜索,並基於環境觀察確定下一步最佳行動。

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。
sample_outputs = model.generate(
**model_inputs,
max_new_tokens=40,
do_sample=True,
top_k=50,
top_p=0.95,
num_return_sequences=3,)

檢索過程的目標是透過對外部知識進行切塊、建立嵌入、索引和相似性搜尋,找到與使用者查詢密切相關的知識庫內容。
-
切塊(Chunking):將文件劃分為較小的段落,每個段落包含一個獨立的資訊單元。
-
建立嵌入(Create embeddings):嵌入模型將每個資訊塊壓縮為向量表示。使用者查詢也透過相同的向量化過程轉換為向量表示,這樣使用者查詢就可以在相同的維度空間中進行比較。
-
索引(Indexing):這一過程將這些文字塊及其向量嵌入儲存為鍵值對,從而實現高效且可擴充套件的搜尋功能。對於超出記憶體容量的大型外部知識庫,向量資料庫提供高效的長期儲存。
-
相似性搜尋(Similarity search):計算查詢嵌入與文字塊嵌入之間的相似性分數,用於搜尋與使用者查詢高度相關的資訊。
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引入了預檢索和後檢索策略
,以減少檢索和生成過程之間的協同作用有限
等問題。例如,重新排序技術使用能夠理解雙
向上下文的模型對檢索到的資訊進行重新排序,
並與知識圖譜整合,用於高階查詢路由。

-
維護先前模型生成響應的記憶和狀態。 -
根據特定標準利用各種工具。這種工具使用能力使得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
# 建立基本的函式工具
defmultiply(a: float, b: float) -> float:
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
defadd(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的所有權重,這需要大量的記憶體來儲存所有權重和引數,並可能導致模型在其他任務上的能力顯著下降(即災難性遺忘)。
-
選擇性微調(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)
作者 | 南七無名式 ; 編輯 | 荔枝
內容僅代表作者獨立觀點,不代表早讀課立場


