>像GPT-4這樣的大多數大型語言模型(LLMS)經過廣泛的,通常過時的數據集培訓。儘管他們擅長回答一般問題,但他們在疑問最近的新聞,最新發展和特定領域的主題方面掙扎。在這種情況下,它們可能會幻覺或提供不准確的反應。
儘管出現了諸如Claude 3.5十四行詩之類的表現更好的模型,但我們仍然需要進行微調來生成自定義響應,或者使用檢索結果(RAG)系統來為基本模型提供額外的背景。 在本教程中,我們將探索抹布和微調,這是兩種不同的技術,用於改善LLM響應。我們將檢查它們的差異,並通過評估結果將理論付諸實踐。此外,我們還將深入研究混合技術,將微調模型與抹布系統相結合,以利用兩全其美的世界。最後,我們將學習如何根據特定用例和要求在這三種方法之間進行選擇。
抹布和微調概述
>檢索增強生成(抹布)
要了解更多信息,請閱讀我們的文章,什麼是檢索增強發電(RAG)?基礎知識的指南,並了解RAG應用程序的內部工作和各種用例。
微調是使用特定域數據集對預訓練模型進行調整的過程。預先訓練的模型在從互聯網上廢棄的多個大型一般數據集上進行了培訓。他們擅長回答一般問題,但是在回答特定領域的問題時,他們會掙扎甚至幻覺。
例如,預先訓練的模型可能會精通一般的對話能力,但是當被問及復雜的醫療程序或法律先例時可能會產生錯誤的答案。
在醫療或法律數據集上對其進行微調,使該模型能夠以更準確和相關性理解和回答這些領域的問題。>我們已經了解了每種方法來改善LLMS的響應生成。讓我們檢查一下以更好地理解它們的差異。
>微調涉及靜態學習,該模型在訓練階段通過新數據集學習。儘管此方法允許該模型適應特定於域的響應生成,但如果不重新培訓,它就無法在培訓後整合新信息。
2。適應性
3。資源強度
rag是資源密集型的,因為它是在模型推斷期間執行的。與沒有抹布的簡單LLM相比,RAG需要更多的內存和計算。
4。費用
> 在培訓過程中,微調只能花費您一次,但是在那之後,您將為模型推理付費,這比RAG便宜。
如果考慮到一切,總體而言,總體而言,平均而言,微調成本比抹布高。
微調模型需要高技術專業知識。從準備數據集到設置調諧參數,再到監視模型性能,需要在自然語言處理領域的多年經驗。
>讓我們通過為微調模型,抹布應用和混合方法提供相同的提示來測試我們的理論,然後評估結果。混合方法將將微調模型與RAG應用程序相結合。在此示例中,我們將通過擁抱面孔使用Ruslanmv/Ai-Medical-Medical-Chatbot數據集,該數據集包含患者與醫生之間有關各種健康狀況的對話。
>使用Llama 3>您還可以學習使用LlamainDex構建抹布應用程序,然後遵循該代碼,與llamaindex的檢索增強生成。
1。安裝所有必要的python軟件包。
%%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
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)
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]
[-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>
如果您有興趣使用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適應專用域博客。>如何在抹布與微調與筏
之間進行選擇您是一家中級公司,想微調以提高響應準確性並在雲上部署開源模型,則需要聘請數據科學家和機器學習操作工程師等專家。微調需要一流的GPU,大型內存,清潔的數據集和了解LLM的技術團隊。
rag |
| 微調
| 木筏
|
>上下文理解,最小化幻覺,很容易適應新數據,成本效益。 |
特定於任務的專業知識,自定義,增強的精度,提高了魯棒性。 |
結合了抹布和微調的優勢,更深入的理解和背景。
|
|
缺點
| 數據源管理,複雜性。
| 數據偏見,資源密集,高計算成本,大量內存需求,時間和專業知識密集。
| 實施中的複雜性,需要平衡檢索和微調過程。 >
|
實現複雜度
| 高於及時工程。
| 高於抹布。需要高度技術專家。
| 這三個中最複雜的。
|
學習樣式
| >動態
| >靜態
| >動態靜態
|
Adaptability
| 很容易適應新的數據並不斷發展的事實。
>將輸出自定義為特定的任務和域。 | >
適應實時數據和特定任務。 | >
|
|
中等 |
高 |
|
低。推理期間使用資源。 |
中等。在微調過程中使用資源。 |
高 |
| 結論
以上是抹布與微調:一個全面的教程,帶有實際示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!