自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用GPT-4生成訓(xùn)練數(shù)據(jù)微調(diào)GPT-3.5 RAG管道

人工智能
OpenAI在2023年8月22日宣布,現(xiàn)在可以對GPT-3.5 Turbo進行微調(diào)了。也就是說,我們可以自定義自己的模型了。然后LlamaIndex就發(fā)布了0.8.7版本,集成了微調(diào)OpenAI gpt-3.5 turbo的功能。

OpenAI在2023年8月22日宣布,現(xiàn)在可以對GPT-3.5 Turbo進行微調(diào)了。也就是說,我們可以自定義自己的模型了。然后LlamaIndex就發(fā)布了0.8.7版本,集成了微調(diào)OpenAI gpt-3.5 turbo的功能。

也就是說,我們現(xiàn)在可以使用GPT-4生成訓(xùn)練數(shù)據(jù),然后用更便宜的API(gpt-3.5 turbo)來進行微調(diào),從而獲得更準(zhǔn)確的模型,并且更便宜。所以在本文中,我們將使用NVIDIA的2022年SEC 10-K文件來仔細研究LlamaIndex中的這個新功能。并且將比較gpt-3.5 turbo和其他模型的性能。

RAG vs 微調(diào)

微調(diào)到底是什么?它和RAG有什么不同?什么時候應(yīng)該使用RAG和微調(diào)?以下兩張總結(jié)圖:

這兩個圖像總結(jié)了它們基本的差別,為我們選擇正確的工具提供了很好的指導(dǎo)。

但是,RAG和微調(diào)并不相互排斥。將兩者以混合方式應(yīng)用到同一個應(yīng)用程序中是完全可行的。

RAG/微調(diào)混合方法

LlamaIndex提供了在RAG管道中微調(diào)OpenAI gpt-3.5 turbo的詳細指南。從較高的層次來看,微調(diào)可以實現(xiàn)下圖中描述的關(guān)鍵任務(wù):

  1. 使用DatasetGenerator實現(xiàn)評估數(shù)據(jù)集和訓(xùn)練數(shù)據(jù)集的數(shù)據(jù)生成自動化。
  2. 在微調(diào)之前,使用第1步生成的Eval數(shù)據(jù)集對基本模型gpt-3.5-turbo進行Eval。
  3. 構(gòu)建向量索引查詢引擎,調(diào)用gpt-4根據(jù)訓(xùn)練數(shù)據(jù)集生成新的訓(xùn)練數(shù)據(jù)。
  4. 回調(diào)處理程序OpenAIFineTuningHandler收集發(fā)送到gpt-4的所有消息及其響應(yīng),并將這些消息保存為.jsonl (jsonline)格式,OpenAI API端點可以使用該格式進行微調(diào)。
  5. OpenAIFinetuneEngine是通過傳入gpt-3.5-turbo和第4步生成的json文件來構(gòu)造的,它向OpenAI發(fā)送一個微調(diào)調(diào)用,向OpenAI發(fā)起一個微調(diào)作業(yè)請求。
  6. OpenAI根據(jù)您的要求創(chuàng)建微調(diào)的gpt-3.5-turbo模型。
  7. 通過使用從第1步生成的Eval數(shù)據(jù)集來對模型進行微調(diào)。

簡單的總結(jié)來說就是,這種集成使gpt-3.5 turbo能夠?qū)pt-4訓(xùn)練的數(shù)據(jù)進行微調(diào),并輸出更好的響應(yīng)。

步驟2和7是可選的,因為它們僅僅是評估基本模型與微調(diào)模型的性能。

我們下面將演示這個過程,在演示時,使用NVIDIA 2022年的SEC 10-K文件。

主要功能點

1、OpenAIFineTuningHandler

這是OpenAI微調(diào)的回調(diào)處理程序,用于收集發(fā)送到gpt-4的所有訓(xùn)練數(shù)據(jù),以及它們的響應(yīng)。將這些消息保存為.jsonl (jsonline)格式,OpenAI的API端點可以使用該格式進行微調(diào)。

2、OpenAIFinetuneEngine

微調(diào)集成的核心是OpenAIFinetuneEngine,它負(fù)責(zé)啟動微調(diào)作業(yè)并獲得一個微調(diào)模型,可以直接將其插件到LlamaIndex工作流程的其余部分。

使用OpenAIFinetuneEngine, LlamaIndex抽象了OpenAI api進行微調(diào)的所有實現(xiàn)細節(jié)。包括:

  • 準(zhǔn)備微調(diào)數(shù)據(jù)并將其轉(zhuǎn)換為json格式。
  • 使用OpenAI的文件上傳微調(diào)數(shù)據(jù)。創(chuàng)建端點并從響應(yīng)中獲取文件id。
  • 通過調(diào)用OpenAI的FineTuningJob創(chuàng)建一個新的微調(diào)作業(yè)。創(chuàng)建端點。
  • 等待創(chuàng)建新的微調(diào)模型,然后使用新的微調(diào)模型。

我們可以使用OpenAIFinetuneEngine的gpt-4和OpenAIFineTuningHandler來收集我們想要訓(xùn)練的數(shù)據(jù),也就是說我們使用gpt-4的輸出來訓(xùn)練我們的自定義的gpt-3.5 turbo模型

from llama_index import ServiceContext
 from llama_index.llms import OpenAI
 from llama_index.callbacks import OpenAIFineTuningHandler
 from llama_index.callbacks import CallbackManager
 
 # use GPT-4 and the OpenAIFineTuningHandler to collect data that we want to train on.
 finetuning_handler = OpenAIFineTuningHandler()
 callback_manager = CallbackManager([finetuning_handler])
 
 gpt_4_context = ServiceContext.from_defaults(
    llm=OpenAI(model="gpt-4", temperature=0.3),
    context_window=2048, # limit the context window artifically to test refine process
    callback_manager=callback_manager,
 )
 
 # load the training questions, auto generated by DatasetGenerator
 questions = []
 with open("train_questions.txt", "r") as f:
    for line in f:
        questions.append(line.strip())
 
 from llama_index import VectorStoreIndex
 
 # create index, query engine, and run query for all questions
 index = VectorStoreIndex.from_documents(documents, service_cnotallow=gpt_4_context)
 query_engine = index.as_query_engine(similarity_top_k=2)
 
 for question in questions:
    response = query_engine.query(question)
 
 # save fine-tuning events to jsonl file
 finetuning_handler.save_finetuning_events("finetuning_events.jsonl")
 
 from llama_index.finetuning import OpenAIFinetuneEngine
 
 # construct OpenAIFinetuneEngine 
 finetune_engine = OpenAIFinetuneEngine(
    "gpt-3.5-turbo",
    "finetuning_events.jsonl"
 )
 
 # call finetune, which calls OpenAI API to fine-tune gpt-3.5-turbo based on training data in jsonl file.
 finetune_engine.finetune()
 
 # check current job status
 finetune_engine.get_current_job()
 
 # get fine-tuned model
 ft_llm = finetune_engine.get_finetuned_model(temperature=0.3)

需要注意的是,微調(diào)函數(shù)需要時間,對于我測試的169頁PDF文檔,從在finetune_engine上啟動finetune到收到OpenAI的電子郵件通知我新的微調(diào)工作已經(jīng)完成,這段時間大約花了10分鐘。下面的電子郵件如下。

在收到該電子郵件之前,如果在finetune_engine上運行g(shù)et_finetuned_model,會得到一個錯誤,提示微調(diào)作業(yè)還沒有準(zhǔn)備好。

3、ragas框架

ragas是RAG Assessment的縮寫,它提供了基于最新研究的工具,使我們能夠深入了解RAG管道。

ragas根據(jù)不同的維度來衡量管道的表現(xiàn):忠實度、答案相關(guān)性、上下文相關(guān)性、上下文召回等。對于這個演示應(yīng)用程序,我們將專注于衡量忠實度和答案相關(guān)性。

忠實度:衡量給定上下文下生成的答案的信息一致性。如果答案中有任何不能從上下文推斷出來的主張,則會被扣分。

答案相關(guān)性:指回答直接針對給定問題或上下文的程度。這并不考慮答案的真實性,而是懲罰給出問題的冗余信息或不完整答案。

在RAG管道中應(yīng)用ragas的詳細步驟如下:

  • 收集一組eval問題(最少20個,在我們的例子中是40個)來形成我們的測試數(shù)據(jù)集。
  • 在微調(diào)之前和之后使用測試數(shù)據(jù)集運行管道。每次使用上下文和生成的輸出記錄提示。
  • 對它們中的每一個運行ragas評估以生成評估分?jǐn)?shù)。
  • 比較分?jǐn)?shù)就可以知道微調(diào)對性能的影響有多大。

代碼如下:

contexts = []
 answers = []
 
 # loop through the questions, run query for each question
 for question in questions:
    response = query_engine.query(question)
    contexts.append([x.node.get_content() for x in response.source_nodes])
    answers.append(str(response))
 
 from datasets import Dataset
 from ragas import evaluate
 from ragas.metrics import answer_relevancy, faithfulness
 
 ds = Dataset.from_dict(
    {
        "question": questions,
        "answer": answers,
        "contexts": contexts,
    }
 )
 
 # call ragas evaluate by passing in dataset, and eval categories
 result = evaluate(ds, [answer_relevancy, faithfulness])
 print(result)
 
 import pandas as pd
 
 # print result in pandas dataframe so we can examine the question, answer, context, and ragas metrics
 pd.set_option('display.max_colwidth', 200)
 result.to_pandas()

評估結(jié)果

最后我們可以比較一下微調(diào)前后的eval結(jié)果。

基本gpt-3.5-turbo的評估請看下面的截圖。answer_relevance的評分不錯,但忠實度有點低。

經(jīng)過微調(diào),模型的性能在答案相關(guān)性中略有提高,從0.7475提高到0.7846,提高了4.96%。

使用gpt-4生成訓(xùn)練數(shù)據(jù)對gpt-3.5 turbo進行微調(diào)確實看到了改善。

一些有趣的發(fā)現(xiàn)

1、對小文檔進行微調(diào)會導(dǎo)致性能下降

最初用一個小的10頁PDF文件進行了實驗,我發(fā)現(xiàn)eval結(jié)果與基本模型相比性能有所下降。然后又繼續(xù)測試了兩輪,結(jié)果如下:

第一輪基本模型:Ragas_score: 0.9122, answer_relevance: 0.9601, faithfulness: 0.8688

第一輪微調(diào)模型:Ragas_score: 0.8611, answer_relevance: 0.9380, faithfulness: 0.7958

第二輪基本模型:Ragas_score: 0.9170, answer_relevance: 0.9614, faithfulness: 0.8765

第二輪微調(diào)模型:Ragas_score: 0.8891, answer_relevance: 0.9557, faithfulness: 0.8313

所以換衣小文件可能是微調(diào)模型比基本模型表現(xiàn)更差的原因。所以使用了NVIDIA長達169頁的SEC 10-K文件。對上面的結(jié)果做了一個很好的實驗——經(jīng)過微調(diào)的模型表現(xiàn)得更好,忠實度增加了4.96%。

2、微調(diào)模型的結(jié)果不一致

原因可能是數(shù)據(jù)的大小和評估問題的質(zhì)量

盡管169頁文檔的微調(diào)模型獲得了預(yù)期的評估結(jié)果,但我對相同的評估問題和相同的文檔運行了第二輪測試,結(jié)果如下:

第二輪基本模型:Ragas_score: 0.8874, answer_relevance: 0.9623, faithfulness: 0.8233

第二輪微調(diào)模型:Ragas_score: 0.8218, answer_relevance: 0.9498, faithfulness: 0.7242

是什么導(dǎo)致了eval結(jié)果的不一致?

數(shù)據(jù)大小很可能是導(dǎo)致不一致的微調(diào)計算結(jié)果的根本原因之一?!爸辽傩枰?000個微調(diào)數(shù)據(jù)集的樣本?!边@個演示應(yīng)用顯然沒有那么多的微調(diào)數(shù)據(jù)集。

另一個根本原因很可能在于數(shù)據(jù)質(zhì)量,也就是eval問題的質(zhì)量。我將eval結(jié)果打印到一個df中,列出了每個問題的問題、答案、上下文、answer_relevance和忠實度。

通過目測,有四個問題在忠實度中得分為0。而這些答案在文件中沒有提供上下文。這四個問題質(zhì)量很差,所以我從eval_questions.txt中刪除了它們,重新運行了評估,得到了更好的結(jié)果:

基本模型eval:Ragas_score: 0.8947, answer_relevance: 0.9627, faithfulness: 0.8356

微調(diào)模型eval:Ragas_score: 0.9207, answer_relevance: 0.9596, faithfulness: 0.8847

可以看到在解決了這四個質(zhì)量差的問題后,微調(diào)版的上升了5.9%。所以評估問題和訓(xùn)練數(shù)據(jù)需要更多的調(diào)整,以確保良好的數(shù)據(jù)質(zhì)量。這確實是一個非常有趣的探索領(lǐng)域。

3、微調(diào)的成本

經(jīng)過微調(diào)的gpt-3.5-turbo的價格高于基本模型的。我們來看看基本模型、微調(diào)模型和gpt-4之間的成本差異:

比較gpt-3.5-turbo (4K環(huán)境)、微調(diào)gpt-3.5-turbo和gpt-4 (8K環(huán)境),可以看到:

  • 經(jīng)過微調(diào)的gpt-3.5 turbo在輸入和輸出使用方面的成本是基本模型的8倍。
  • 對于輸入使用,Gpt-4的成本是微調(diào)模型的2.5倍,對于輸出使用則是3.75倍。
  • 對于輸入使用,Gpt-4的成本是基本模型的20倍,對于輸出使用情況是30倍。
  • 另外使用微調(diào)模型會產(chǎn)生$0.008/1K 令牌的額外成本。

總結(jié)

本文探索了LlamaIndex對OpenAI gpt-3.5 turbo微調(diào)的新集成。我們通過NVIDIA SEC 10-K歸檔分析的RAG管道,測試基本模型性能,然后使用gpt-4收集訓(xùn)練數(shù)據(jù),創(chuàng)建OpenAIFinetuneEngine,創(chuàng)建了一個新的微調(diào)模型,測試了它的性能,并將其與基本模型進行了比較。

可以看到,因為GPT4和gpt-3.5 turbo的巨大成本差異(20倍),在使用微調(diào)后,我們可以得到近似的效果,并且還能節(jié)省不少成本(2.5倍)

如果你對這個方法感興趣,源代碼在這里:

https://colab.research.google.com/github/wenqiglantz/nvidia-sec-finetuning/blob/main/nvidia_sec_finetuning.ipynb

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2023-08-06 08:06:30

OpenAIChatGPTGPT-4

2024-02-05 09:00:00

2023-05-05 09:42:12

2024-01-26 08:36:07

OpenAIGPT-4?人工智能

2023-10-31 15:26:02

阿里云通義千問

2023-07-04 14:01:26

GPT-4模型

2023-06-21 13:37:41

模型研究

2023-05-29 09:29:52

GPT-4語言模型

2023-08-23 12:17:26

OpenAIChatGPT

2023-06-19 08:19:50

2023-12-12 13:57:00

GPT-3.5MistralAI

2023-08-23 12:02:49

數(shù)據(jù)OpenAIGPT-3.5

2025-04-16 09:35:03

2023-04-28 09:07:28

2024-07-09 12:54:57

2023-10-16 13:28:00

數(shù)據(jù)AI

2023-03-27 16:02:39

GPT-4AR眼鏡

2023-05-30 13:29:25

2023-08-23 08:54:59

OpenAIGPT-3.5

2023-06-08 11:27:10

模型AI
點贊
收藏

51CTO技術(shù)棧公眾號