GPT 3.5 財經新聞結構化輸出微調

在我們之前的文章中 GPT 3.5 微調,我們知道如何微調 GPT 3.5 用於創建一致的品牌聲音等任務。 在本指南中,我們將了解微調的另一個關鍵用例:結構化輸出格式。

具體來說,我們將研究如何進行微調 GPT 3.5 將財經新聞標題解析為結構化數據。

如果您不熟悉微調,例如 OpenAI 說:

微調通過訓練超出提示範圍的更多示例來改進小樣本學習,讓您在大量任務上取得更好的結果。

換句話說,我們正在“重新訓練”預先訓練的 3.5 Turbo 模型,以便根據我們自己的特定用例定制模型。

為此,我們將採取以下步驟:

  • 第 1 步:確定所需的結構化輸出
  • 第二步:填寫提示模板
  • 第 3 步:創建微調數據集
  • 第 4 步:創建微調作業
  • 第 5 步:測試微調後的模型

讓我們開始吧。

第 1 步:確定所需的結構化輸出

好吧,第 1 步我們需要決定每個輸入想要的結構化輸出。

這是一個(虛構的) example 我們如何進行微調 GPT 3.5 對於結構化輸出:

輸入: Apple 宣布新股後,公司股價飆升 5% iPhone 2023 年 9 月 1 日。

輸出: {"stock_symbol": "AAPL", "price_change": "5%", "event": "new iPhone announcement", "date": "September 1, 2023"}

正如您所看到的,我們正在從標題中提取關鍵信息,包括:

  • 股票代碼
  • 價格變化
  • 事件
  • 日期

第2步:結構化輸出提示模板

現在我們知道我們想要從每個輸入中獲得什麼輸出,我們創建了一個提示模板,它將幫助您根據您的要求創建微調數據集。

此提示模板旨在指導您完成創建微調數據集的過程。 首先,我們將回顧訓練數據集中所需的每個“角色”的準則。 通過回答每個部分中的問題,您將回答幾個問題來創建數據集。

系統角色

每次交互都以來自“系統”角色的消息開始,該消息為助手設置上下文。

例子: "You are a fine-tuned model trained to extract structured financial information."

用戶角色

用戶角色是一條消息,其中包含需要提取到我們所需的結構化輸出中的信息。

例子: "Apple Inc. stocks soared by 5% after announcing its new iPhone on September 1, 2023."

助理角色

助理角色提供所需輸出的訓練示例。 在結構化輸出微調的情況下,這將包含類似 JSON 格式的提取的結構化信息。

例子: {"stock_symbol": "AAPL", "price_change": "5%", "event": "new iPhone announcement", "date": "September 1, 2023"}

示例數據集條目

您可以遵循以下簡單格式來為結構化輸出創建微調數據集:

{
  "messages": [
    {"role": "system", "content": "Your context-setting message here"},
    {"role": "user", "content": "Your user-provided information here"},
    {"role": "assistant", "content": "Your structured output in JSON-like format here"}
  ]
}

第 3 步:創建微調數據集

好吧,在我們回答了上述問題並獲得了一些理想輸入/輸出的示例之後,我們可以簡單地將它們複製到 ChatGPT 以便生成 50 多個示例。

作為 OpenAI 強調:

要微調模型,您需要提供至少 10 個示例。 通過對 50 到 100 個訓練示例進行微調,我們通常會看到明顯的改進。

每次訓練 example 看起來像這樣:

{
  "messages": [
    {"role": "system", "content": "You are a fine-tuned model trained to extract structured financial information."},
    {"role": "user", "content": "Apple Inc. stocks soared by 5% after announcing its new iPhone on September 1, 2023."},
    {"role": "assistant", "content": "{"stock_symbol": "AAPL", "price_change": "5%", "event": "new iPhone announcement", "date": "September 1, 2023"}"}
  ]
}

創建此數據集後,我們需要做的就是將其保存為 JSONL 格式,然後就可以開始微調過程了。

我們還可以選擇通過以下方式運行數據集 數據格式化腳本 OpenAI 提供,如果格式正確,它將返回類似以下內容:

第 4 步:微調 GPT-3.5型號

使用我們的訓練數據集,下一步是將文件上傳到 OpenAI 對於微調,我們可以執行以下操作:

import openai

# Upload the file first
openai.File.create(
  file=open("/path/to/your_file.jsonl", "rb"),
  purpose="fine-tune"
)

接下來,我們準備創建微調作業,如下所示:

# Create the fine-tuning job
openai.FineTuningJob.create(training_file="file-abc123", model="gpt-3.5-turbo")

創建微調作業後,我們可以使用以下命令檢查它的狀態 ftjob-id 剛剛創建:

openai.FineTuningJob.retrieve("your-ftjob-id")

第 4 步:測試微調模型

微調工作完成後,真正的問題是我們是否看到與基本模型的顯著差異。 為了測試這一點,讓我們對微調模型和基本模型使用相同的系統和用戶消息:

微調模型

# Test with fine-tuned model
completion = openai.ChatCompletion.create(
  model="your-fine-tuned-model-id",
  messages=[
    {"role": "system", "content": "You are trained to extract structured financial information."},
    {"role": "user", "content": "Microsoft stocks jump 4.5% following the release of a breakthrough cloud computing technology on November 15, 2023.
  ]
)
print(completion.choices[0].message['content'])
{
  "role": "assistant",
  "content": "{"stock_symbol": "MSFT", "price_change": "4.5%", "event": "release of a breakthrough cloud computing technology", "date": "November 15, 2023"}"
}

看起來不錯! 我們可以看到我們已經得到了正確的輸出格式。

基礎型號

# Test with base model
completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are trained to extract structured financial information."},
    {"role": "user", "content": "Microsoft stocks jump 4.5% following the release of a breakthrough cloud computing technology on November 15, 2023."}
  ]
)
print(completion.choices[0].message['content'])

{
  "role": "assistant",
  "content": "It is not possible for me to provide real-time information as I am a language model trained on data up until September 2021. Therefore, I cannot provide the latest information on Microsoft stocks. I recommend checking a reliable financial news source or contacting a financial advisor for the most up-to-date information on stock prices."
}

如您所見,在沒有任何訓練示例的情況下,基本模型會以經典的方式響應(相當煩人) GPT 訓練截止反應…

當然,我們可以嘗試通過在系統消息中提供更多理想輸出的示例來更接近微調模型,但這會增加每個額外用戶查詢的令牌使用量,即增加總體 API 成本。

摘要:微調 GPT 3.5 結構化輸出

正如我們所看到的,通過一些數據準備和幾行代碼,我們可以進行微調 GPT 以我們理想的輸出格式提供結構化輸出。

總而言之,不要不斷地重新提示 GPT 或者使用系統消息提供訓練示例(並增加我們的令牌使用量),我們可以使用微調來提高性能,降低 API 成本,並以我們所需的格式可靠地輸出內容。