首頁 > 科技週邊 > 人工智慧 > 抹布與微調:一個全面的教程,帶有實際示例

抹布與微調:一個全面的教程,帶有實際示例

Joseph Gordon-Levitt
發布: 2025-03-05 11:31:10
原創
119 人瀏覽過

>像GPT-4這樣的大多數大型語言模型(LLMS)經過廣泛的,通常過時的數據集培訓。儘管他們擅長回答一般問題,但他們在疑問最近的新聞,最新發展和特定領域的主題方面掙扎。在這種情況下,它們可能會幻覺或提供不准確的反應。 

儘管出現了諸如Claude 3.5十四行詩之類的表現更好的模型,但我們仍然需要進行微調來生成自定義響應,或者使用檢索結果(RAG)系統來為基本模型提供額外的背景。 在本教程中,我們將探索抹布和微調,這是兩種不同的技術,用於改善LLM響應。我們將檢查它們的差異,並通過評估結果將理論付諸實踐。 

此外,我們還將深入研究混合技術,將微調模型與抹布系統相結合,以利用兩全其美的世界。最後,我們將學習如何根據特定用例和要求在這三種方法之間進行選擇。

抹布和微調

概述 抹布和微調技術改善了域特異性查詢的響應生成,但它們本質上是完全不同的技術。讓我們了解它們。

>檢索增強生成(抹布)

>檢索增強的生成是一個使用外部數據源(例如GPT-4O)成為上下文感知的大型語言模型的過程。它是獵犬和發電機的組合。獵犬從Internet或Vector數據庫中獲取數據,並使用原始用戶的查詢將其提供給生成器。發電機使用其他上下文來生成高度準確且相關的響應。  

要了解更多信息,請閱讀我們的文章,什麼是檢索增強發電(RAG)?基礎知識的指南,並了解RAG應用程序的內部工作和各種用例。 

微調

微調是使用特定域數據集對預訓練模型進行調整的過程。預先訓練的模型在從互聯網上廢棄的多個大型一般數據集上進行了培訓。他們擅長回答一般問題,但是在回答特定領域的問題時,他們會掙扎甚至幻覺。 

例如,

預先訓練的模型可能會精通一般的對話能力,但是當被問及復雜的醫療程序或法律先例時可能會產生錯誤的答案。 

在醫療或法律數據集上對其進行微調,使該模型能夠以更準確和相關性理解和回答這些領域的問題。

遵循微調LLMS教程的介紹性指南,以了解使用視覺指南自定義預訓練的模型。 

rag vs.微調

>我們已經了解了每種方法來改善LLMS的響應生成。讓我們檢查一下以更好地理解它們的差異。 

1。學習樣式

rag使用動態學習樣式,允許語言模型訪問和使用來自數據庫,Internet甚至API的最新和最準確的數據。這種方法可確保生成的響應始終是最新和相關的。

>微調涉及靜態學習,該模型在訓練階段通過新數據集學習。儘管此方法允許該模型適應特定於域的響應生成,但如果不重新培訓,它就無法在培訓後整合新信息。

2。適應性

抹布最適合概括。它使用檢索過程從不同的數據源中獲取信息。抹布不會改變模型的響應;它只是提供了指導模型的額外信息。 

微調可以自定義模型輸出,並改善與培訓數據集緊密相關的特殊域上的模型性能。它還改變了響應的風格,有時比抹布系統提供更多相關的答案。 

3。資源強度

rag是資源密集型的,因為它是在模型推斷期間執行的。與沒有抹布的簡單LLM相比,RAG需要更多的內存和計算。 

>微調是計算密集型的,但一次執行一次。在培訓過程中,它需要多個GPU和高內存,但是此後,與RAG系統相比,它非常適合資源友好。 

4。費用

抹布需要頂級的嵌入模型和LLM,以更好地生成響應。它還需要一個快速的向量數據庫。 API和操作成本可能很快上升。

> 在培訓過程中,微調只能花費您一次,但是在那之後,您將為模型推理付費,這比RAG便宜。   

如果考慮到一切,總體而言,總體而言,平均而言,微調成本比抹布高。 

5。實施複雜性

抹布系統可以由軟件工程師構建,需要中等技術專長。您需要了解LLM設計,矢量數據庫,嵌入,及時的工程師等,這確實需要時間,但在一個月內易於學習。 

微調模型需要高技術專業知識。從準備數據集到設置調諧參數,再到監視模型性能,需要在自然語言處理領域的多年經驗。 

將理論與實際示例進行測試

>讓我們通過為微調模型,抹布應用和混合方法提供相同的提示來測試我們的理論,然後評估結果。混合方法將將微調模型與RAG應用程序相結合。在此示例中,我們將通過擁抱面孔使用Ruslanmv/Ai-Medical-Medical-Chatbot數據集,該數據集包含患者與醫生之間有關各種健康狀況的對話。

>使用Llama 3

構建抹布應用程序

我們將使用Llama 3和Langchain生態系統構建RAG應用程序。 

>您還可以學習使用LlamainDex構建抹布應用程序,然後遵循該代碼,與llamaindex的檢索增強生成。

1。安裝所有必要的python軟件包。

%%capture
%pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
登入後複製
登入後複製
登入後複製
2。從Langchain和Transformers庫中加載必要的功能。

from langchain.document_loaders import HuggingFaceDatasetLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline
from langchain_huggingface import HuggingFacePipeline
from langchain.chains import RetrievalQA
登入後複製
登入後複製
登入後複製
3。為了訪問受限制的模型和數據集,建議您使用API​​鍵登錄到擁抱麵線。

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(token = hf_token)
登入後複製
登入後複製
4。通過將數據集名稱和列名提供給HuggingFacedatAsetLoader加載數據集。 “醫生”列將是我們的主要文件,其餘的列將是元數據。 

5。將我們的數據集限制為第一個1000行。減少數據集將有助於我們減少矢量數據庫中的數據存儲時間。 

正如我們所看到的,“醫生”列是頁面內容,其餘的被視為元數據。 
# Specify the dataset name
dataset_name = "ruslanmv/ai-medical-chatbot"


# Create a loader instance using dataset columns
loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor")

# Load the data
doctor_data = loader_doctor.load()

# Select the first 1000 entries
doctor_data = doctor_data[:1000]

doctor_data[:2]
登入後複製
登入後複製

抹布與微調:一個全面的教程,帶有實際示例6。使用特定參數(例如啟用GPU加速度)加載嵌入模型。

7。通過提供示例文本來測試嵌入模型。

# Define the path to the embedding model
modelPath = "sentence-transformers/all-MiniLM-L12-v2"

# GPU acceleration
model_kwargs = {'device':'cuda'}

# Create a dictionary with encoding options
encode_kwargs = {'normalize_embeddings': False}

# Initialize an instance of HuggingFaceEmbeddings with the specified parameters
embeddings = HuggingFaceEmbeddings(
    model_name=modelPath,     
    model_kwargs=model_kwargs, 
    encode_kwargs=encode_kwargs
)
text = "Why are you a doctor?"
query_result = embeddings.embed_query(text)
query_result[:3]
登入後複製
8。將數據轉換為嵌入,並將其保存到矢量數據庫中。
[-0.059351932257413864, 0.08008933067321777, 0.040729623287916183]
登入後複製

9。將矢量數據庫保存在本地目錄中。

10。使用示例提示進行相似性搜索。

vector_db = FAISS.from_documents(doctor_data, embeddings)
vector_db.save_local("/kaggle/working/faiss_doctor_index")
question = "Hi Doctor, I have a headache, help me."
searchDocs = vector_db.similarity_search(question)
print(searchDocs[0].page_content)
登入後複製

抹布與微調:一個全面的教程,帶有實際示例11。將矢量數據庫實例轉換為回收器。這將有助於我們創建抹布鏈。

12。使用Llama 3 8B聊天型號加載令牌和模型。
retriever = vector_db.as_retriever()
登入後複製

13。使用它們來創建測試生成管道。

14。將管道轉換為Langchain LLM客戶端。

15。使用獵犬,用戶查詢,RAG提示和LLM創建一個問答鏈。
import torch
base_model = "/kaggle/input/llama-3/transformers/8b-chat-hf/1"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)

pipe = pipeline(
    "text-generation", 
    model=model, 
    tokenizer=tokenizer,
    max_new_tokens=120
)

llm = HuggingFacePipeline(pipeline=pipe)
登入後複製

16。通過向醫生提出問題來測試問答鏈。
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough


rag_prompt = hub.pull("rlm/rag-prompt")




qa_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | rag_prompt
    | llm
    | StrOutputParser()
)
登入後複製

>它與數據集非常相似,但是它不會拾取樣式。它已經理解了上下文,並用它以自己的風格編寫響應。 
question = "Hi Doctor, I have a headache, help me."
result = qa_chain.invoke(question)
print(result.split("Answer: ")[1])
登入後複製

抹布與微調:一個全面的教程,帶有實際示例

>讓我們再試一次問題。 

%%capture
%pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
登入後複製
登入後複製
登入後複製

這是一個非常直接的答案。也許我們需要微調模型,而不是為醫生和患者聊天機器人使用抹布方法。 

抹布與微調:一個全面的教程,帶有實際示例

如果您遇到運行代碼的困難,請諮詢Kaggle筆記本:使用Llama 3構建RAG應用程序。

通過遵循如何改善抹布性能來改善諸如塊,重讀和查詢轉換等技術的技術:5個與示例的示例教程。

>醫學數據的微調駱駝3

>我們不會在醫生和患者數據集上微調模型,因為我們已經在上一個教程中這樣做了:微調Llama 3並在本地使用它:逐步指南。我們要做的就是加載微調模型,並為其提供相同的問題來評估結果。在擁抱的臉和kaggle上可以使用微調模型。

>

如果您有興趣使用OpenAI API微調GPT-4型號,則可以參考易於遵循的DataCamp教程Fine-Tuning OpenAI的GPT-4:逐步指南。

抹布與微調:一個全面的教程,帶有實際示例來源:kingabzpro/llama-3-8b-chat-doctor

1。使用變壓器庫加載令牌和模型。

2。確保使用正確的參數將模型加載到Kaggle GPU T4 X2環境中。

3。將聊天模板應用於消息。
from langchain.document_loaders import HuggingFaceDatasetLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline
from langchain_huggingface import HuggingFacePipeline
from langchain.chains import RetrievalQA
登入後複製
登入後複製
登入後複製

4。使用模型和代幣器創建文本生成管道。

5。向管道對象提供提示並生成響應。

響應與數據集非常相似。樣式是相同的,但沒有給出直接答案,而是表明患者接受了進一步的測試。
from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(token = hf_token)
登入後複製
登入後複製

6。讓我們問第二個問題。 抹布與微調:一個全面的教程,帶有實際示例

樣式是相同的,並且反應是同理心和解釋性的。 

# Specify the dataset name
dataset_name = "ruslanmv/ai-medical-chatbot"


# Create a loader instance using dataset columns
loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor")

# Load the data
doctor_data = loader_doctor.load()

# Select the first 1000 entries
doctor_data = doctor_data[:1000]

doctor_data[:2]
登入後複製
登入後複製

如果您遇到運行代碼的困難,請諮詢Kaggle筆記本:微調Llama 3 HF推斷。 抹布與微調:一個全面的教程,帶有實際示例

雜交方法(抹布微調)

>現在,我們將為微調模型提供額外的上下文,以進一步調整響應並找到平衡。 

>而不是再次編寫所有代碼,我們將使用問答鏈直接潛入響應生成。如果您想查看我們如何將微調型號與抹布Q&A鏈組合在一起的完整代碼,請查看混合方法(抹布微調)Kaggle Notebook。 

為鏈條提供了與我們提出的抹布和微調模型相同的問題。

%%capture
%pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
登入後複製
登入後複製
登入後複製

答案非常準確,並且以醫生的方式產生了反應。 

抹布與微調:一個全面的教程,帶有實際示例

讓我們問第二個問題。

>
from langchain.document_loaders import HuggingFaceDatasetLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline
from langchain_huggingface import HuggingFacePipeline
from langchain.chains import RetrievalQA
登入後複製
登入後複製
登入後複製

這很奇怪。我們從未提供有關痤瘡是否充滿膿液的其他背景。也許混合模型不適用於某些查詢。 

抹布與微調:一個全面的教程,帶有實際示例

在醫生聊天機器人的情況下,微型模型在風格採用和準確性方面都擅長。但是,這可能在其他用例中有所不同,這就是為什麼進行大量測試以確定特定用例的最佳方法很重要的原因。

>

混合方法的官方術語是筏(檢索增強的微調)。通過閱讀什麼是筏子,了解有關它的更多信息?將抹布和微調結合起來,以使LLM適應專用域博客。

>如何在抹布與微調與筏

之間進行選擇

>這一切都取決於您的用例和可用資源。如果您是資源有限的初創公司,請嘗試使用打開的AI API和Langchain框架來構建抹布概念證明。為此,您將需要有限的資源,專業知識和數據集。 

您是一家中級公司,想微調以提高響應準確性並在雲上部署開源模型,則需要聘請數據科學家和機器學習操作工程師等專家。微調需要一流的GPU,大型內存,清潔的數據集和了解LLM的技術團隊。 

請參閱下表以獲取抹布,微調和筏解決方案的概述。

> rag 微調木筏優勢數據源管理,複雜性。 數據偏見,資源密集,高計算成本,大量內存需求,時間和專業知識密集。 實施中的複雜性,需要平衡檢索和微調過程。 高於及時工程。 高於抹布。需要高度技術專家。 這三個中最複雜的。 >動態>靜態>動態靜態很容易適應新的數據並不斷發展的事實。 > > 成本資源強度結論大型語言模型是當今AI發展的核心。公司正在尋找各種方法來改進和自定義這些模型,而無需花費數百萬美元的培訓。它們從參數優化和及時工程開始。他們要么選擇抹布或微調模型以獲得更好的響應並減少幻覺。雖然還有其他技術可以改善響應,但這些是最受歡迎的選擇。 在本教程中,我們通過理論和實際例子了解了抹布和微調之間的差異。我們還探索了混合模型,並比較了哪種方法可能最適合您。

>上下文理解,最小化幻覺,很容易適應新數據,成本效益。

特定於任務的專業知識,自定義,增強的精度,提高了魯棒性。

結合了抹布和微調的優勢,更深入的理解和背景。

缺點

>

實現複雜度

學習樣式

Adaptability

>將輸出自定義為特定的任務和域。

適應實時數據和特定任務。

中等

低。推理期間使用資源。 

中等。在微調過程中使用資源。 

>

要了解有關部署LLM和所涉及的各種技術的更多信息,請查看與LlamainDex的抹布有關的代碼,以及我們與Langchain部署LLM應用程序的課程。

以上是抹布與微調:一個全面的教程,帶有實際示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板