合成數據:利用開源技術節省資金、時間與碳排放
太長不看
您應該微調自己的模型還是使用大型語言模型(LLM)API?建立自己的模型可以讓您完全掌控,但需要資料收集、訓練和部署方面的專業知識。LLM API 則更容易使用,但您必須將資料傳送給第三方,並對 LLM 提供商產生昂貴的依賴。這篇博文將展示如何將 LLM 的便利性與定製模型的控制和效率相結合。
在一個識別新聞中投資者情緒的案例研究中,我們展示瞭如何使用開源 LLM 建立合成數據,以便在幾個步驟內訓練您的定製模型。我們最終定製的 RoBERTa 模型能夠以大約 2.7 美元的成本分析大量新聞語料庫,而 GPT4 則需要 3061 美元;它排放的二氧化碳量約為 0.12 公斤,而 GPT4 大致為 735 至 1100 公斤;其延遲為 0.13 秒,而 GPT4 通常需要數秒;同時,它在識別投資者情緒方面的表現與 GPT4 不相上下(兩者均為 94% 的準確率和 0.94 的 F1 宏觀分數)。我們提供了可重用的 Notebook,您可以將其應用於自己的用例。
目錄
1. 問題:您的用例缺乏資料
想象一下,您的老闆要求您為公司構建一個情感分析系統。您會在 Hugging Face Hub 上找到超過 100,000 個數據集,其中約 450 個數據集的標題中包含“情感”一詞,涵蓋了 Twitter、詩歌或希伯來語中的情感。這很棒,但如果您在金融機構工作,並且需要跟蹤投資組合中特定品牌的情感,那麼這些資料集都對您的任務沒有用。考慮到公司可以透過機器學習解決數百萬個任務,因此不太可能有人已經收集併發布了針對您公司正嘗試解決的確切用例的資料。
鑑於這種缺乏特定任務資料集和模型的情況,許多人轉向通用 LLM。這些模型非常龐大和通用,可以開箱即用地以令人印象深刻的準確性處理大多數任務。它們易於使用的 API 消除了微調和部署專業知識的需求。它們的主要缺點是規模和控制:這些模型擁有數千億或數萬億個引數,效率低下,並且只能在少數公司控制的計算叢集上執行。
2. 解決方案:利用合成數據培養高效“學生”模型
2023 年,一項發展根本性地改變了機器學習格局:大型語言模型(LLM)開始與人類資料標註者達到同等水平。現在有充分證據表明,最佳 LLM 在建立高質量(合成)資料方面超越了眾包工作者,並與專家達到了同等水平(例如 Zheng 等人 2023,Gilardi 等人 2023,He 等人 2023)。這項發展的重要性不言而喻。過去,建立定製模型的關鍵瓶頸在於招募和協調人工以建立定製訓練資料所需的資金、時間和專業知識。隨著 LLM 開始達到與人類同等的水平,現在可以透過 API 獲得高質量的標註工作;可復現的標註指令可以作為提示傳送;合成數據幾乎可以即時返回,計算是唯一的瓶頸。
2024 年,這種方法將變得具有商業可行性,並提升開源對小型和大型企業的價值。在 2023 年的大部分時間裡,由於 LLM API 提供商的限制性業務條款,LLM 用於標註工作的商業用途受到了阻礙。隨著 Mistral 的 Mixtral-8x7B-Instruct-v0.1 等模型的出現,LLM 標註工作和合成資料現在可以開放用於商業用途。Mixtral 的效能與 GPT3.5 不相上下,並且由於其 Apache 2.0 許可證,其合成數據輸出可以用作小型、專業模型(“學生”)的訓練資料,以用於商業用例。這篇博文提供了一個示例,說明這將如何顯著加快您自己的定製模型的建立,同時大幅降低長期推理成本。
3. 案例研究:監測金融情緒
假設您是一家大型投資公司的開發人員,負責監控投資組合中公司相關的經濟新聞情緒。直到最近,您主要有兩種選擇:
您可以微調自己的模型。這需要編寫標註指令、建立標註介面、招募(眾包)工人、引入質量保證措施以處理低質量資料、根據這些資料微調模型並進行部署。
或者,您可以將資料和指令傳送到 LLM API。您完全跳過了微調和部署,並將資料分析過程簡化為編寫指令(提示),然後將其傳送給 API 後端的“LLM 標註器”。在這種情況下,LLM API 是您的最終推理解決方案,您直接使用 LLM 的輸出進行分析。
儘管選項 2 在推理時成本更高,並且要求您將敏感資料傳送給第三方,但它比選項 1 設定起來更容易,因此被許多開發人員使用。
2024年,合成數據提供了第三種選擇:將選項1的成本效益與選項2的易用性相結合。簡單來說,您可以使用LLM(“教師”)為您標註少量資料,然後根據這些資料微調一個更小、更高效的LM(“學生”)。這種方法可以通過幾個簡單的步驟實現。
3.1 提示 LLM 標註您的資料
我們以 financial_phrasebank 情感資料集為例,但您可以將程式碼應用於任何其他用例。financial_phrasebank 任務是一個三分類任務,其中 16 位專家根據投資者視角(Malo 等人 2013)對芬蘭公司金融新聞中的句子進行了“積極”/“消極”/“中性”的標註。例如,該資料集包含句子“For the last quarter of 2010, Componenta's net sales doubled to EUR131m from EUR76m for the same period a year earlier”,該句子被標註者從投資者角度歸類為“積極”。
我們首先安裝一些必需的庫。
!pip install datasets # for loading the example dataset
!pip install huggingface_hub # for secure token handling
!pip install requests # for making API requests
!pip install scikit-learn # for evaluation metrics
!pip install pandas # for post-processing some data
!pip install tqdm # for progress bars
然後,我們可以下載帶有專家標註的示例資料集。
from datasets import load_dataset
dataset = load_dataset("financial_phrasebank", "sentences_allagree", split='train')
# create a new column with the numeric label verbalised as label_text (e.g. "positive" instead of "0")
label_map = {
i: label_text
for i, label_text in enumerate(dataset.features["label"].names)
}
def add_label_text(example):
example["label_text"] = label_map[example["label"]]
return example
dataset = dataset.map(add_label_text)
print(dataset)
# Dataset({
# features: ['sentence', 'label', 'label_text'],
# num_rows: 2264
#})
現在我們編寫一個針對 `financial_phrasebank` 任務的簡短標註指令,並將其格式化為 LLM 提示。此提示類似於您通常提供給眾包工作者的指令。
prompt_financial_sentiment = """\
You are a highly qualified expert trained to annotate machine learning training data.
Your task is to analyze the sentiment in the TEXT below from an investor perspective and label it with only one the three labels:
positive, negative, or neutral.
Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company.
Do not provide any explanations and only respond with one of the labels as one word: negative, positive, or neutral
Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
Label: positive
Text: The company generated net sales of 11.3 million euro this year.
Label: neutral
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.
Label: negative
Your TEXT to analyse:
TEXT: {text}
Label: """
在我們將此提示傳遞給 API 之前,我們需要對提示進行一些格式化。目前大多數 LLM 都使用特定的聊天模板進行微調。此模板由特殊標記組成,使 LLM 能夠區分聊天曆史中的使用者指令、系統提示和其自身響應。儘管我們在這裡不將模型用作聊天機器人,但省略聊天模板仍可能導致效能悄無聲息地下降。您可以使用 `tokenizer` 自動新增模型聊天模板的特殊標記(在此處閱讀更多)。對於我們的示例,我們使用 `Mixtral-8x7B-Instruct-v0.1` 模型。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
chat_financial_sentiment = [{"role": "user", "content": prompt_financial_sentiment}]
prompt_financial_sentiment = tokenizer.apply_chat_template(chat_financial_sentiment, tokenize=False)
# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ... [/INST]'
格式化的標註指令(提示)現在可以傳遞給 LLM API。我們使用免費的 Hugging Face 無伺服器推理 API。該 API 是測試流行模型的理想選擇。請注意,如果您向免費 API 傳送過多資料,可能會遇到速率限制,因為它由許多使用者共享。對於更大的工作負載,我們建議建立專用推理端點。專用推理端點本質上是您自己的個人付費 API,您可以靈活地啟用和停用它。
我們使用 `huggingface_hub` 庫登入,以便輕鬆安全地處理我們的 API 令牌。另外,您也可以將令牌定義為環境變數(請參閱文件)。
# you need a huggingface account and create a token here: https://huggingface.co/settings/tokens
# we can then safely call on the token with huggingface_hub.get_token()
import huggingface_hub
huggingface_hub.login()
然後我們定義一個簡單的 `generate_text` 函式,用於將我們的提示和資料傳送到 API。
import os
import requests
# Choose your LLM annotator
# to find available LLMs see: https://huggingface.co/docs/huggingface_hub/main/en/package_reference/inference_client#huggingface_hub.InferenceClient.list_deployed_models
API_URL = "https://api-inference.huggingface.co/models/mistralai/Mixtral-8x7B-Instruct-v0.1"
# docs on different parameters: https://huggingface.co/docs/api-inference/detailed_parameters#text-generation-task
generation_params = dict(
top_p=0.90,
temperature=0.8,
max_new_tokens=128,
return_full_text=False,
use_cache=False
)
def generate_text(prompt=None, generation_params=None):
payload = {
"inputs": prompt,
"parameters": {**generation_params}
}
response = requests.post(
API_URL,
headers={"Authorization": f"Bearer {huggingface_hub.get_token()}"},
json=payload
)
return response.json()[0]["generated_text"]
由於大型語言模型(LLM)返回的標籤格式可能並非總是完全一致,我們還定義了一個簡短的 `clean_output` 函式,用於將 LLM 的字串輸出對映到我們預設的三個可能標籤。
labels = ["positive", "negative", "neutral"]
def clean_output(string, random_choice=True):
for category in labels:
if category.lower() in string.lower():
return category
# if the output string cannot be mapped to one of the categories, we either return "FAIL" or choose a random label
if random_choice:
return random.choice(labels)
else:
return "FAIL"
現在我們可以將文字傳送到 LLM 進行標註。以下程式碼將每個文字傳送到 LLM API,並將其文字輸出對映到我們三個清晰的類別。注意:在實踐中,逐個文字迭代並單獨傳送到 API 是低效的。API 可以同時處理多個文字,您可以透過非同步傳送批處理文字到 API 來顯著加快 API 呼叫速度。您可以在此部落格文章的重現倉庫中找到最佳化後的程式碼。
output_simple = []
for text in dataset["sentence"]:
# add text into the prompt template
prompt_formatted = prompt_financial_sentiment.format(text=text)
# send text to API
output = generate_text(
prompt=prompt_formatted, generation_params=generation_params
)
# clean output
output_cl = clean_output(output, random_choice=True)
output_simple.append(output_cl)
基於此輸出,我們現在可以計算指標,以瞭解模型在未經訓練的情況下執行任務的準確程度。
from sklearn.metrics import classification_report
def compute_metrics(label_experts, label_pred):
# classification report gives us both aggregate and per-class metrics
metrics_report = classification_report(
label_experts, label_pred, digits=2, output_dict=True, zero_division='warn'
)
return metrics_report
label_experts = dataset["label_text"]
label_pred = output_simple
metrics = compute_metrics(label_experts, label_pred)
基於簡單的提示,LLM 正確分類了 91.6% 的文字(0.916 準確率和 0.916 F1 宏觀)。考慮到它未受過此特定任務的訓練,這已經相當不錯了。
我們可以透過使用兩種簡單的提示技術進一步改進這一點:思維鏈(CoT)和自洽性(SC)。CoT 要求模型首先思考正確標籤,然後做出標註決策,而不是立即決定正確標籤。SC 意味著將相同的提示與相同的文字多次傳送到同一個 LLM。SC 有效地為 LLM 提供了每個文字的多次嘗試,具有不同的推理路徑,如果 LLM 回覆“積極”兩次,“中性”一次,我們選擇多數(“積極”)作為正確標籤。這是我們更新後的 CoT 和 SC 提示:
prompt_financial_sentiment_cot = """\
You are a highly qualified expert trained to annotate machine learning training data.
Your task is to briefly analyze the sentiment in the TEXT below from an investor perspective and then label it with only one the three labels:
positive, negative, neutral.
Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company.
You first reason step by step about the correct label and then return your label.
You ALWAYS respond only in the following JSON format: {{"reason": "...", "label": "..."}}
You only respond with one single JSON response.
Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
JSON response: {{"reason": "An increase in operating profit is positive for investors", "label": "positive"}}
Text: The company generated net sales of 11.3 million euro this year.
JSON response: {{"reason": "The text only mentions financials without indication if they are better or worse than before", "label": "neutral"}}
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.
JSON response: {{"reason": "A decrease in profit is negative for investors", "label": "negative"}}
Your TEXT to analyse:
TEXT: {text}
JSON response: """
# we apply the chat template like above
chat_financial_sentiment_cot = [{"role": "user", "content": prompt_financial_sentiment_cot}]
prompt_financial_sentiment_cot = tokenizer.apply_chat_template(chat_financial_sentiment_cot, tokenize=False)
# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ... [/INST]'
這是一個 JSON 提示,我們要求 LLM 返回一個結構化的 JSON 字串,其中“reason”作為鍵,而“label”作為另一個鍵。JSON 的主要優點是我們可以將其解析為 Python 字典,然後提取“label”。如果需要理解 LLM 選擇此標籤的原因,我們還可以提取“reason”。
`process_output_cot` 函式解析 LLM 返回的 JSON 字串,如果 LLM 未返回有效的 JSON,它會嘗試使用上面定義的 `clean_output` 函式中的簡單字串匹配來識別標籤。
import ast
def process_output_cot(output):
try:
output_dic = ast.literal_eval(output)
return output_dic
except Exception as e:
# if json/dict parse fails, do simple search for occurrence of first label term
print(f"Parsing failed for output: {output}, Error: {e}")
output_cl = clean_output(output, random_choice=False)
output_dic = {"reason": "FAIL", "label": output_cl}
return output_dic
現在,我們可以重複使用上面定義的 `generate_text` 函式,配合新的提示,使用 `process_output_cot` 處理 JSON 思維鏈輸出,並多次傳送每個提示以實現自洽性。
self_consistency_iterations = 3
output_cot_multiple = []
for _ in range(self_consistency_iterations):
output_lst_step = []
for text in tqdm(dataset["sentence"]):
prompt_formatted = prompt_financial_sentiment_cot.format(text=text)
output = generate_text(
prompt=prompt_formatted, generation_params=generation_params
)
output_dic = process_output_cot(output)
output_lst_step.append(output_dic["label"])
output_cot_multiple.append(output_lst_step)
對於每個文字,我們的 LLM 標註器現在有三次嘗試,以三種不同的推理路徑來識別正確的標籤。下面的程式碼從這三種路徑中選擇多數標籤。
import pandas as pd
from collections import Counter
def find_majority(row):
# Count occurrences
count = Counter(row)
# Find majority
majority = count.most_common(1)[0]
# Check if it's a real majority or if all labels are equally frequent
if majority[1] > 1:
return majority[0]
else: # in case all labels appear with equal frequency
return random.choice(labels)
df_output = pd.DataFrame(data=output_cot_multiple).T
df_output['label_pred_cot_multiple'] = df_output.apply(find_majority, axis=1)
現在,我們可以再次將我們改進的 LLM 標籤與專家標籤進行比較並計算指標。
label_experts = dataset["label_text"]
label_pred_cot_multiple = df_output['label_pred_cot_multiple']
metrics_cot_multiple = compute_metrics(label_experts, label_pred_cot_multiple)
思維鏈(CoT)和自洽性(SC)將效能提升至 94.0% 的準確率和 0.94 的 F1 宏觀分數。我們透過給模型時間思考其標籤決策並給予其多次嘗試來提高了效能。請注意,CoT 和 SC 會增加額外的計算成本。我們基本上是在用計算成本換取標註準確性。
得益於這些簡單的 LLM API 呼叫,我們現在已經建立了一個合成訓練資料集。我們透過讓 LLM 在做出標籤決策之前嘗試三種不同的推理路徑來標註每個文字。結果是與人類專家高度一致的標籤以及一個可用於訓練更高效和更專業模型的高質量資料集。
df_train = pd.DataFrame({
"text": dataset["sentence"],
"labels": df_output['label_pred_cot_multiple']
})
df_train.to_csv("df_train.csv")
請注意,在此部落格文章的完整復現指令碼中,我們還純粹基於專家標註建立了一個測試集,以評估所有模型的質量。所有指標始終基於此人類專家測試集。
3.2 將開源模型與專有模型進行比較
使用開源 Mixtral 模型建立的這些資料的主要優勢在於,資料在法律上明確可用作商業用途。例如,使用 OpenAI API 建立的資料受 OpenAI 商業條款的約束,這些條款明確禁止使用模型輸出訓練與其產品和服務競爭的模型。這些條款的法律價值和含義尚不明確,但它們為使用 OpenAI 模型合成數據訓練的模型在商業用途方面帶來了法律不確定性。任何基於合成數據訓練的更小、更高效的模型都可能被視為競爭對手,因為它減少了對 API 服務的依賴。
Mistral 的開源 Mixtral-8x7B-Instruct-v0.1 與 OpenAI 的 GPT3.5 和 GPT4 之間合成數據的質量如何比較?我們使用 gpt-3.5-turbo-0613 和 gpt-4-0125-preview 運行了上述相同的流程和提示,並將結果報告在下表中。我們看到,根據提示型別,Mixtral 在此任務上的表現優於 GPT3.5,並與 GPT4 不相上下。(我們在此不顯示更新的 gpt-3.5-turbo-0125 的結果,因為出於某種原因,此模型的效能比舊的預設 gpt-3.5-turbo-0613 差。)
請注意,這並不意味著 Mixtral 總是優於 GPT3.5 並與 GPT4 持平。GPT4 在多個基準測試中表現更佳。主要資訊是開源模型現在可以建立高質量的合成數據。
3.3 理解並驗證您的(合成)資料
所有這一切在實踐中意味著什麼?到目前為止,結果只是由某個黑箱 LLM 標註的資料。我們之所以能夠計算指標,也僅僅是因為我們有示例資料集中的專家標註參考資料。如果我們在實際場景中沒有專家標註,我們如何信任 LLM 標註呢?
在實踐中,無論您使用何種標註器(人工標註器還是 LLM),您都只能信任您自己驗證過的資料。指令/提示總是存在一定程度的歧義。即使是完美智慧的標註器也會犯錯誤,並且在面對常常模糊的真實世界資料時,必須做出不明確的決策。
幸運的是,在過去幾年中,透過開源工具,資料驗證變得顯著更容易:Argilla 提供了一個免費介面,用於驗證和清理非結構化 LLM 輸出;LabelStudio 允許您以多種方式標註資料;CleanLab 提供了一個用於標註和自動清理結構化資料的介面;對於快速簡單的驗證,只在簡單的 Excel 檔案中進行標註也可能足夠。
花些時間標註文字對於理解資料及其模糊性至關重要。您很快就會發現模型犯了一些錯誤,但也會有一些例子,其中正確標籤不明確,有些文字您更同意 LLM 的決定,而不是建立資料集的專家。這些錯誤和模糊性是資料集建立的正常部分。事實上,在現實世界中,只有很少的任務能達到 100% 的人類專家一致性基線。人類資料是一個有缺陷的黃金標準,這是一個古老的見解,最近被機器學習文獻“重新發現”(Krippendorf 2004,Hosking et al. 2024)。
在標註介面中不到一小時,我們對資料有了更好的理解,並糾正了一些錯誤。然而,為了重現性和證明純合成數據的質量,我們在下一步中繼續使用未清理的 LLM 標註。
3.3 使用 AutoTrain 微調您高效且專業的模型
到目前為止,這只是透過 API 提示 LLM 並驗證輸出的標準工作流程。現在是實現顯著資源節省的額外步驟:我們利用 LLM 的合成數據微調一個更小、更高效、更專業的 LM。這個過程也稱為“蒸餾”,即利用大型模型(“教師”)的輸出訓練小型模型(“學生”)。雖然這聽起來很花哨,但它本質上只意味著我們從資料集中獲取原始 `text`,並將 LLM 的預測作為我們微調的 `labels`。如果您之前訓練過分類器,您會知道這些是您使用 `transformers`、`sklearn` 或任何其他庫訓練分類器所需的僅有的兩列。
我們使用 Hugging Face 的 AutoTrain 解決方案,使這個過程變得更加簡單。AutoTrain 是一個無程式碼介面,您可以在其中上傳一個帶有標註資料的 .csv 檔案,然後該服務會自動為您微調模型。這消除了自行訓練模型所需的編碼或深入微調專業知識。
在 Hugging Face 網站上,我們首先點選頂部的“Spaces”,然後點選“Create new Space”。接著選擇“Docker”>“AutoTrain”,並選擇一個小型 A10G GPU,每小時費用為 1.05 美元。AutoTrain 的 Space 將隨即初始化。然後,我們可以透過介面上傳我們的合成訓練資料和專家測試資料,並調整不同的欄位,如下圖所示。一旦所有資訊填寫完畢,我們就可以點選“Start Training”,您可以在 Space 的日誌中跟蹤訓練過程。在一個只有 1811 個數據點的小型 RoBERTa-base 模型(約 0.13 B 引數)上進行訓練速度非常快,不應超過幾分鐘。訓練完成後,模型會自動上傳到您的 HF 個人資料。訓練完成後,Space 將停止,整個過程最多需要 15 分鐘,費用不到 1 美元。
如果您願意,也可以在自己的硬體上完全本地使用 AutoTrain,請參閱我們的文件。高階使用者當然可以隨時編寫自己的訓練指令碼,但使用這些預設超引數,AutoTrain 的結果應該足以滿足許多分類任務的需求。
我們最終微調的約 0.13B 引數 RoBERTa-base 模型與更大的 LLM 相比表現如何?下面的條形圖顯示,在 1811 個文字上微調的定製模型達到了 94% 的準確率——與其教師 Mixtral 和 GPT4 相同!一個小型模型永遠無法與更大的 LLM 開箱即用地競爭,但對其進行高質量資料微調後,它可以在其專業任務中達到相同的效能水平。
3.4 不同方法的優缺點
我們開篇討論的三種方法(1)手動建立自己的資料和模型,(2)僅使用 LLM API,或(3)使用 LLM API 為專用模型建立合成數據)的總體優缺點是什麼?下表顯示了不同因素的權衡,我們將在下面根據我們的示例資料集討論不同的指標。
我們先從任務效能說起。如上所示,專用模型的效能與大型 LLM 不相上下。經過微調的模型只能完成我們訓練它的特定任務,但它能很好地完成這項特定任務。建立更多訓練資料以使模型適應新領域或更復雜的任務是微不足道的。得益於 LLM 生成的合成數據,由於缺乏專用資料而導致的低效能不再是問題。
其次,計算成本和推理速度。實踐中,主要的計算成本將是推理,即模型訓練完成後執行它。假設在您的生產用例中,您需要在給定時間段內處理 100 萬個句子。我們微調的 RoBERTa-base 模型在具有 16GB RAM 的小型 T4 GPU 上高效執行,在推理端點上每小時花費 0.6 美元。它的延遲為 0.13 秒,在 `batch_size=8` 時吞吐量為每秒 61 個句子。這導致處理 100 萬個句子的總成本為 2.7 美元。
使用 GPT 模型,我們可以透過計算 token 來計算推理成本。處理 100 萬個句子中的 token 大約需要 GPT3.5 花費 153 美元,GPT4 花費 3061 美元。這些模型的延遲和吞吐量計算起來更復雜,因為它們全天都會根據當前的伺服器負載而變化。然而,任何使用 GPT4 的人都知道,延遲通常可能達到數秒,並且受到速率限制。請注意,速度是任何 LLM(API)的問題,包括開源 LLM。許多生成式 LLM 僅僅因為太大了而無法快速執行。
訓練計算成本往往不那麼重要,因為 LLM 通常可以開箱即用而無需微調,並且小型模型的微調成本相對較小(微調 RoBERTa-base 的成本不到 1 美元)。只有在極少數情況下,您才需要投資從頭開始預訓練模型。當微調更大的生成式 LLM 以使其專門化於特定生成任務時,訓練成本才會變得相關。
第三,所需的時間和專業知識投入。這是 LLM API 的主要優勢。將指令傳送到 API 比手動收集資料、微調定製模型並部署它要簡單得多。這正是使用 LLM API 建立合成數據變得重要的原因。建立高質量的訓練資料變得顯著更容易。微調和部署可以由 AutoTrain 和專用推理端點等服務處理。
第四,控制。這可能是 LLM API 的主要缺點。根據設計,LLM API 使您依賴於 LLM API 提供商。您需要將敏感資料傳送到他人的伺服器,並且無法控制系統的可靠性和速度。訓練您自己的模型可以讓您選擇如何以及在哪裡部署它。
最後,環境影響。鑑於模型架構和硬體基礎設施資訊的缺乏,很難估算 GPT4 等封閉模型的能源消耗和二氧化碳排放量。我們能找到的最佳(但非常粗略的)估計顯示,每次 GPT4 查詢的能源消耗約為 0.0017 至 0.0026 千瓦時。這將導致分析 100 萬個句子大約需要 1700 - 2600 千瓦時。根據美國環保署的二氧化碳當量計算器,這相當於 0.735 - 1.1 公噸二氧化碳,或普通汽車行駛 1885 - 2883 英里。請注意,實際的二氧化碳排放量可能因 LLM 特定計算區域的能源結構而差異很大。使用我們的自定義模型進行估算要容易得多。使用自定義模型分析 100 萬個句子,在 T4 GPU 上大約需要 4.52 小時,而在美國東部弗吉尼亞州的 AWS 伺服器上,這導致大約 0.12 公斤的二氧化碳排放量(參見 ML CO2 影響計算器)。與具有約 0.13B 引數的專用模型相比,執行一個通用 LLM(如 GPT4,據稱具有 8x220B 引數)效率極其低下。
結論
我們已經展示了使用 LLM 建立合成數據以訓練更小、更高效模型所帶來的巨大好處。雖然此示例僅處理投資者情緒分類,但相同的流程可以應用於許多其他任務,從其他分類任務(例如客戶意圖檢測或有害內容檢測),到 token 分類(例如命名實體識別或 PII 檢測),或生成任務(例如摘要或問答)。
2024 年,公司建立自己的高效模型、控制自己的資料和基礎設施、減少二氧化碳排放、節省計算成本和時間,同時不損害準確性,變得前所未有的容易。
現在就自己試試吧!您可以在本部落格文章的重現倉庫中找到所有資料的完整重現程式碼,以及更高效的批處理非同步 API 呼叫函式。我們邀請您複製並調整我們的程式碼以適應您的用例!