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

大語言模型(LLM)是基於自監督學習預訓練的深度學習模型,訓練資料量龐大、訓練時間長,並且包含大量的引數。LLM在過去兩年中徹底改變了自然語言處理領域,展現了在理解和生成類人文字方面的卓越能力。
然而,這些通用模型的開箱即用效能並不總能滿足特定的業務需求或領域要求。LLM單獨使用時無法回答依賴於公司專有資料或封閉環境的問題,這使得它們在應用中顯得相對通用。
由於從零開始訓練一個LLM模型需要大量的訓練資料和資源,這對於中小型團隊來說基本不可行。因此,近年來開發了多種LLM定製策略,以便針對需要專業知識的不同場景調優模型。
定製策略大致可以分為兩種型別:
  1. 使用凍結模型:這些技術不需要更新模型引數,通常透過上下文學習或提示工程來實現。由於它們透過改變模型的行為而不需要大量訓練成本,因此具有成本效益,廣泛應用於工業界和學術界,每天都有新的研究論文發表。
  2. 更新模型引數:這是一種相對資源密集的方法,需要使用為特定目的設計的自定義資料集來調優預訓練的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時需要考慮以下幾個因素:
  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)
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,AutoTokenizertokenizer= 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,)
04 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 OpenAIfrom llama_index.embeddings.openai import OpenAIEmbeddingfrom llama_index.core import VectorStoreIndexSettings.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的工作流方面表現更為出色,具有以下優勢:
  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 ReActAgentfrom llama_index.core.tools import FunctionTool# 建立基本的函式工具defmultiply(a: float, b: float) -> float:return a * bmultiply_tool = FunctionTool.from_defaults(fn=multiply)defadd(a: float, b: float) -> float:return a + badd_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方法主要分為三類:
  1. 選擇性微調(Selective):選擇初始LLM引數的一個子集進行微調,相較於其他PEFT方法,這種方法在計算上可能更加密集。
  2. 重引數化(Reparameterization):透過訓練低秩表示的權重來調整模型權重。例如,低秩適應(Lower Rank Adaptation,LoRA)就是這一類方法之一,透過用兩個較小的矩陣表示權重更新,從而加速微調。
  3. 加性微調(Additive):向模型中新增額外的可訓練層,包括介面卡(adapters)和軟提示(soft prompts)等技術。
微調過程與深度學習訓練過程類似,需要以下輸入:
  • 訓練和評估資料集
  • 訓練引數,定義超引數(例如學習率、最佳化器)
  • 預訓練LLM模型
  • 計算度量和演算法應最佳化的目標函式
以下是使用transformers Trainer實現微調的示例:
from transformers import TrainingArguments, Trainertraining_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,近端策略最佳化)最佳化強化學習策略。這個過程需要兩組訓練資料:一組用於訓練獎勵模型的偏好資料集,和一組用於強化學習迴圈中的提示資料集。
讓我們將其分解成幾個步驟:
  1. 收集偏好資料集,由人工標註員對模型生成的不同回答進行評分,標註哪些回答符合人類偏好。偏好資料集的一個示例格式為{input_text, candidate1, candidate2, human_preference},表示哪個候選答案更受偏好。
  2. 使用偏好資料集訓練獎勵模型,該獎勵模型本質上是一個迴歸模型,輸出一個標量,表示模型生成回答的質量。獎勵模型的目標是最大化優勝候選答案與失敗候選答案之間的分數。
  3. 在強化學習迴圈中使用獎勵模型對LLM進行微調。目標是更新策略,使得LLM能夠生成最大化獎勵模型所產生獎勵的回答。這個過程使用提示資料集,提示資料集的格式為{prompt, response, rewards}。
開源庫 Trlx 被廣泛應用於實現RLHF,它提供了一個模板程式碼,展示了RLHF的基本設定:
#: Transformer Reinforcement Learning librarytrl import PPOTrainer, PPOConfig, AutoModelForSeq2SeqLMWithValueHeadfrom trl import create_reference_modelfrom 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
作者 南七無名式  ;  編輯 | 荔枝
內容僅代表作者獨立觀點,不代表早讀課立場


相關文章