共用方式為


使用微調自訂模型

Azure AI Foundry 模型中的 Azure OpenAI 可讓您使用稱為 微調的程式,為個人數據集量身打造我們的模型。 藉由提供下列內容,此自訂步驟可讓您來獲得更多服務:

  • 相較於直接從提示工程獲得的結果,可將品質提升至更高層次
  • 能夠針對超出模型最大要求內容限制的範例進行定型。
  • 由於提示較短而節省權杖
  • 低延遲要求,尤其是使用較小模型時。

相較於小樣本學習,微調會針對遠超出提示容納量的範例進行定型來改善模型,讓您在大量工作中取得更好的結果。 由於微調會調整基底模型的權數,以提升特定工作的效能,因此您不必在提示中盡可能包含更多範例或說明。 這表示每次 API 呼叫時傳送的文字和處理的權杖更少,從而可能節省成本並改善要求延遲。

我們會使用 LoRA 或低等級調整,以降低其複雜度的方式微調模型,而不會大幅影響其效能。 這個方法的運作方式是將原始高排名矩陣與較低的排名一近似,因此只會微調受監督定型階段中較小的重要參數子集,讓模型更容易管理且更有效率。 對於使用者來說,這可讓定型比其他技術更快且價格更合理。

Azure AI Foundry 入口網站中有兩種獨特的微調體驗:

如果您只是微調 Azure OpenAI 模型,建議您流覽至 https://ai.azure.com/resource/overview,以 Azure OpenAI 為中心的微調體驗。

重要

本文中標示為 (預覽) 的項目目前處於公開預覽狀態。 此預覽版本沒有服務等級協定,不建議將其用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

必要條件

支援的模型

請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。

或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。

檢閱 Azure AI Foundry 入口網站的工作流程

花點時間檢閱使用 Azure AI Foundry 入口網站的微調工作流程:

  1. 準備您的定型和驗證資料。
  2. 使用 Azure AI Foundry 入口網站中的 [建立微調模型 ] 對話框來定型您的自定義模型。
    1. 選擇訓練方法。
    2. 選取基底模型。
    3. 選擇您的訓練類型
    4. 選擇定型資料
    5. (選擇性) 選擇您的驗證資料
    6. 或者, 為微調作業設定工作參數
    7. 選擇性地為產生的自定義模型 啟用自動部署
    8. 檢閱您的選擇,並定型新的自訂模型
  3. 檢查自訂微調模型的狀態。
  4. 部署自訂模型以供使用。
  5. 使用您的自訂模型。
  6. (選擇性) 分析自訂模型以取得效能並加以調整。

準備您的定型和驗證資料

您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。

您使用的訓練和驗證資料 必須 格式化為 JSON Lines (JSONL) 檔,並且必須格式化為 聊天完成 API 所使用的對話格式。

通常建議使用您在每一個訓練範例中找到的最佳指示和提示。 這可協助您取得最佳結果,特別是如果您有少於一百個範例時。

範例檔案格式

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

多回合聊天檔格式 Azure OpenAI

在 jsonl 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 weight 索引鍵值組。 目前 weight 可設定為 0 或 1。

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

具有視覺的聊天完成

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

除了 JSONL 格式之外,定型和驗證資料檔案還必須以 UTF-8 進行編碼,並包含位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

數據集大小考慮

您擁有的定型範例越多越好。 微調作業需要至少10個訓練範例才能繼續,但如此少量不足以明顯影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。 建議以50個精心製作的訓練資料開始。

一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。

建立微調的模型

Azure AI Foundry 入口網站提供 [建立微調的模型 ] 對話框,因此您可以在一個位置輕鬆建立和定型 Azure 資源的微調模型。

  1. 移至 Azure AI Foundry 入口網站, https://ai.azure.com/ 並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間,選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  2. 在 Azure AI Foundry 入口網站中,流覽至 [>] 窗格,然後選取 [微調模型]。

    顯示如何在 Azure AI Foundry 入口網站中存取 [建立自定義模型精靈] 的螢幕快照。

  3. 選取要微調的模型,然後選取 [ 下一步 ] 繼續。

    Azure AI Foundry 入口網站中模型選取對話框的螢幕快照。

您現在應該會看到 [建立微調的模型] 對話框。

[建立微調模型] 對話框的螢幕快照。

選擇您的訓練方式

第一個步驟是確認模型選擇和定型方法。 並非所有模型都支援所有訓練方法。

  • 受監督的微調 (SFT):所有非推理型模型都支援。
  • 直接偏好優化(預覽) (DPO):支援 GPT-4o。
  • 增強式微調 (預覽) (RFT): 支援推理模型,例如 o4-mini。

選取模型時,您也可以選取 先前微調的模型

選擇訓練類型

選取您要用於微調作業的訓練層級:

  • 標準:訓練會在目前的 Azure OpenAI 資源所在的區域中進行,以提供數據駐留。
  • 全域 (預覽): 每個令牌訓練更實惠,不提供 數據存放

如果您沒有數據駐留需求,選擇 全球性 可以充分利用超出您目前所在區域的訓練容量。 在公開預覽期間, 全域 可能無法在您的目前區域內使用。 諮詢

在某些情況下, 標準 可能無法在您的目前區域內使用。 如果您需要資料駐留,請參閱您所選模型的模型可用性中所列的區域。

選擇定型資料

下一個步驟是選擇現有的備妥訓練數據,或在自定義模型時,選擇 [新增訓練數據] 上傳要使用的新備妥訓練數據。

[訓練資料] 對話框會顯示現有的已上傳資料集,並提供上傳新訓練資料的選項。

Azure AI Foundry 入口網站中 [建立自定義模型精靈] 的訓練數據窗格螢幕快照。

  • 如果您的訓練數據已上傳至服務,請選取已連接的 AI 資源中的檔案

    • 從顯示的下拉式清單中選取檔案。
  • 若要上傳新的定型資料,請使用下列其中一個選項:

    • 選取 [上傳檔案 ] 以從本機檔案上傳訓練數據。
    • 選取 [Azure Blob] 或其他共用 Web 位置 ,以從 Azure Blob 或其他共用 Web 位置匯入訓練數據。

若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?

注意

定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

選擇您的驗證資料(選擇性)

如果您有驗證數據集,請選取 [新增訓練數據]。 您可以選擇現有的備妥驗證數據,或上傳自定義模型時要使用的新備妥驗證數據。

[ 驗證數據] 對話框會顯示任何先前上傳的定型和驗證數據集,並提供您可以上傳新驗證數據的選項。

Azure AI Foundry 入口網站中 [建立自定義模型精靈] 的 [驗證數據] 窗格螢幕快照。

  • 如果您的驗證資料已上傳至服務,請選取 [選擇資料集]

    • 從 [驗證資料] 窗格所顯示的清單中選取檔案。
  • 若要上傳新的驗證資料,請使用下列其中一個選項:

    • 選取 [本機檔案 ] 以從本機檔案上傳驗證數據。
    • 選取 [Azure Blob] 或其他共用 Web 位置 ,以從 Azure Blob 或其他共用 Web 位置匯入驗證數據。

若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。

注意

類似於定型資料檔案,驗證資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

讓您的模型成為可識別的 (選擇性)

我們也建議您加入 suffix 參數,讓您更輕鬆地區分微調模型的不同版本。 suffix會採用最多 18 個字元的字串,並在命名產生的微調模型時使用。

設定定型參數 (選擇性)

您可以提供可選的種子,並調整其他超參數。

種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,系統會為您隨機產生一個種子。

Azure AI Foundry 入口網站中建立自定義模型向導參數區段的詳細螢幕截圖。

下列超參數可透過 Azure AI Foundry 入口網站進行微調:

名稱 類型 說明
批次大小 整數 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。
學習速率乘數 數值 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。
Epoch 數目 整數 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。

開啟自動部署(選擇性)

若要節省時間,您可以選擇性地為產生的模型啟用自動部署。 如果定型成功完成,將會使用選取的 部署類型來部署模型。 部署將根據為您的自定義模型生成的唯一名稱以及您稍早提供的選擇性後綴來進行命名。

Azure AI Foundry 入口網站中 [建立自定義模型精靈] 中自動部署切換的螢幕快照。

注意

目前僅支援全球標準和開發者部署的自動部署。 這兩個選項都未提供 數據駐留。 如需詳細資訊,請參閱 部署類型 檔。

檢閱選擇並定型模型

檢閱您的選擇,然後選取 [提交] 以開始定型新的微調模型。

檢查自訂模型的狀態

提交微調工作之後,您會看到一個頁面,其中包含微調模型的詳細數據。 您可以在 Azure AI Foundry 入口網站的 微調頁面上, 找到微調模型的狀態和詳細資訊。

您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。

檢查點

當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度擬合之前提供快照。 微調作業完成時,您將有三個最新版本的模型可供部署。

分析您的自訂模型

每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對 Azure AI Foundry 入口網站的 [模型] 窗格上的 [結果檔案識別符] 資料行中的每個自定義模型列出。 您可以使用檔案識別碼,從 Azure AI Foundry 入口網站的 [資料檔 ] 窗格識別並下載結果檔案。

結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:

資料行名稱 描述
step 定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。
train_loss 定型批次的遺失。
train_mean_token_accuracy 模型正確預測定型批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
valid_loss 驗證批次的遺失。
validation_mean_token_accuracy 模型正確預測驗證批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
full_valid_loss 在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。
full_valid_mean_token_accuracy 在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。

您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。

隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。

部署微調模型

一旦您對微調作業所得的計量結果感到滿意,或者只是想進行推斷,您必須部署模型。

如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試

如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南

使用已部署的微調模型

部署微調模型後,您就能如同使用其他部署模型般使用該模型。 您可以使用 Azure AI Foundry 中的遊樂場來實驗您的新部署。 您也可以使用 REST API,從自己的應用程式呼叫微調模型。 您甚至可以開始在提示流程中使用此新微調模型,以建置生成式 AI 應用程式。

注意

對於聊天模型,您用於引導微調模型的系統訊息 (無論是否已部署或可在遊樂場中進行測試),必須與用於定型的系統訊息相同。 如果您使用不同的系統訊息,模型可能無法如預期般執行。

持續微調

建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。

若要對先前微調的模型執行微調,您會使用與 建立微調模型 中所述的相同程式,而不是指定已微調的模型泛型基底模型名稱。 自訂微調模型看起來會像 gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft

[建立自訂模型] UI 的螢幕擷取畫面,其中已醒目提示微調模型。

清除部署、自訂模型和定型檔案

當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。

刪除模型部署

重要

部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」

刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Azure AI Foundry Models 中的 Azure OpenAI 定價所述,部署的每個自定義(微調)模型都會產生每小時主機成本,無論是否有將完成或聊天完成呼叫送至該模型。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。

您可以在 Azure AI Foundry 入口網站的 [部署] 窗格上,刪除自定義模型的部署。 選取要刪除的部署,然後選取 [刪除] 以刪除部署。

刪除您的自訂模型

您可以在 Azure AI Foundry 入口網站的 [模型] 窗格中刪除自定義模型。 從 [自訂模型] 索引標籤中選取要刪除的自訂模型,然後選取 [刪除] 以刪除自訂模型。

注意

如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂模型。

刪除定型檔案

您可以選擇性地在 Azure AI Foundry 入口網站的 [管理>資料 + 索引] 窗格上,刪除您上傳的定型和驗證檔案,以及定型期間產生的結果檔案。 選取要刪除的檔案,然後選取 [刪除] 以刪除檔案。

必要條件

注意

REST API 目前不支援 全域 訓練作業。 透過 API 檢查全域訓練作業可能會傳回不正確的資訊。

支援的模型

請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。

或者,您可以對先前微調的模型再次進行微調,格式為 base-model.ft-{jobid}

檢閱 Python SDK 的工作流程

請花一點時間檢閱搭配 Azure OpenAI 使用 Python SDK 的微調工作流程:

  1. 準備您的定型和驗證資料。
  2. 選取基底模型。
  3. 上傳定型資料。
  4. 定型新的自訂模型。
  5. 檢查自訂模型的狀態。
  6. 部署自訂模型以供使用。
  7. 使用自訂模型。
  8. (選擇性) 分析自訂模型以取得效能並加以調整。

準備您的定型和驗證資料

您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。

您使用的訓練和驗證資料 必須 格式化為 JSON Lines (JSONL) 檔,並且必須格式化為 聊天完成 API 所使用的對話格式。

如需微調 gpt-4o-mini-2024-07-18 的逐步解說,請參閱 Azure OpenAI 微調教學課程 (機器翻譯)

範例檔案格式

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

多回合聊天檔案格式

在 jsonl 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 weight 索引鍵值組。 目前 weight 可設定為 0 或 1。

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

具有視覺的聊天完成

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

除了 JSONL 格式之外,定型和驗證資料檔案還必須以 UTF-8 進行編碼,並包含位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

建立您的定型和驗證資料集

您擁有的定型範例越多越好。 微調工作不會繼續至少 10 個定型範例,但如此少量不足以明顯影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。

一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。

上傳定型資料集

下一個步驟是選擇現有的備妥定型資料,或上傳自訂模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:

若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?

注意

定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

下列 Python 範例會使用 Python SDK 上傳本機定型和驗證檔案,並擷取傳回的檔案識別碼。

# Upload fine-tuning files

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  # This API version or later is required to access seed/events/checkpoint capabilities
)

training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

# Upload the training and validation dataset files to Azure OpenAI with the SDK.

training_response = client.files.create(
    file=open(training_file_name, "rb"), purpose="fine-tune"
)
training_file_id = training_response.id

validation_response = client.files.create(
    file=open(validation_file_name, "rb"), purpose="fine-tune"
)
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

建立自訂模型

上傳定型和驗證檔案之後,您就可以開始微調作業。

下列 Python 程式碼示範如何使用 Python SDK 建立新的微調作業範例:

在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
    seed = 105  # seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。

目前支援用於微調的超參數如下:

名稱 類型 說明
batch_size 整數 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。
learning_rate_multiplier 數值 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。
n_epochs 整數 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。
seed 整數 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。

若要使用 1.x 版的 OpenAI Python API 來設定自訂超參數:

from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  # This API version or later is required
)

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
  hyperparameters={
    "n_epochs":2
  }
)

檢查微調作業狀態

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

列出微調事件

若要檢查定型期間產生的個別微調事件,您可能需要使用 pip install openai --upgrade 將 OpenAI 用戶端連結庫升級至最新版本,才能執行此命令。

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

檢查點

當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度擬合之前提供快照。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。

您可以執行清單檢查點命令,以擷取與個別微調作業相關聯的檢查點清單。 您可能需要使用 pip install openai --upgrade 將 OpenAI 用戶端連結庫升級至最新版本,才能執行此命令。

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

分析自訂模型

每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 Python SDK 來擷取檔案識別碼和下載結果檔案進行分析。

下列 Python 範例會擷取附加至自定義模型微調作業之第一個結果檔的檔案識別符,然後使用 Python SDK 將檔案下載到您目前的工作目錄進行分析。

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:

資料行名稱 描述
step 定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。
train_loss 定型批次的遺失。
train_mean_token_accuracy 模型正確預測定型批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
valid_loss 驗證批次的遺失。
validation_mean_token_accuracy 模型正確預測驗證批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
full_valid_loss 在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。
full_valid_mean_token_accuracy 在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。

您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。

隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。

部署微調模型

一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。

如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試

有別於先前的 SDK 命令,您必須使用控制平面 API 來完成部署,而這需要個別的授權、不同的 API 路徑和不同的 API 版本。

變數 定義
代幣 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。
訂閱 相關聯 Azure OpenAI 資源的訂閱識別碼。
資源群組 Azure OpenAI 資源的資源群組名稱。
資源名稱 Azure OpenAI 資源名稱。
模型部署名稱 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。
微調過的模型 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

在這裡深入瞭解跨區域部署和使用已 部署的模型

如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南

持續微調

建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。

若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  
)

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。 suffix 會接受字串,並設定用於識別微調模型。 OpenAI Python API 支援最多 18 個字元的字串,該字串會新增至微調的模型名稱中。

如果您不確定現有微調模型的標識符,您可以在 Azure AI Foundry 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。

清除部署、自訂模型和定型檔案

當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。

刪除模型部署

重要

部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」

刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Azure AI Foundry Models 中的 Azure OpenAI 定價所述,部署的每個自定義(微調)模型都會產生每小時主機成本,無論是否有將完成或聊天完成呼叫送至該模型。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。

您可以使用各種方法來刪除自訂模型的部署:

刪除自訂模型

同樣地,您可以使用各種方法來刪除自訂模型:

注意

如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。

刪除定型檔案

您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:

下列 Python 範例會使用 Python SDK 來刪除自訂模型的定型、驗證和結果檔案:

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

必要條件

注意

REST API 目前不支援 全域 訓練作業。 透過 API 檢查全域訓練作業可能會傳回不正確的資訊。

支援的模型

請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。

或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。

檢閱 REST API 的工作流程

請花一點時間檢閱搭配 Azure OpenAI 使用 REST API 和 Python 的微調工作流程:

  1. 準備您的定型和驗證資料。
  2. 選取基底模型。
  3. 上傳定型資料。
  4. 定型新的自訂模型。
  5. 檢查自訂模型的狀態。
  6. 部署自訂模型以供使用。
  7. 使用自訂模型。
  8. (選擇性) 分析自訂模型以取得效能並加以調整。

準備您的定型和驗證資料

您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。

您使用的訓練和驗證資料 必須 格式化為 JSON Lines (JSONL) 檔,並且必須格式化為 聊天完成 API 所使用的對話格式。

如需微調 gpt-4o-mini-2024-07-18 的逐步解說,請參閱 Azure OpenAI 微調教學課程 (機器翻譯)

範例檔案格式

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

多回合聊天檔案格式

在 jsonl 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 weight 索引鍵值組。 目前 weight 可設定為 0 或 1。

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

具有視覺的聊天完成

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

除了 JSONL 格式之外,定型和驗證資料檔案還必須以 UTF-8 進行編碼,並包含位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

建立您的定型和驗證資料集

您擁有的定型範例越多越好。 微調工作不會繼續至少 10 個定型範例,但如此少量不足以明顯影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。

一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。

上傳定型資料集

下一個步驟是選擇現有的備妥定型資料,或上傳微調模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:

若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?

注意

定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。

上傳定型資料

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/files?api-version=2023-12-01-preview \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

上傳驗證資料

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/files?api-version=2023-12-01-preview \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

建立自訂模型

上傳定型和驗證檔案之後,您就可以開始微調作業。 下列程式碼示範如何使用 REST API 建立新微調作業 (部分機器翻譯) 的範例。

在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下,可能會有所不同。 如果未指定種子,將會為您產生一個種子。

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2024-10-21 \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>", 
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。

目前支援用於微調的超參數如下:

名稱 類型 說明
batch_size 整數 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。
learning_rate_multiplier 數值 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。
n_epochs 整數 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。
seed 整數 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。

檢查自訂模型的狀態

啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。 下列範例會使用 REST API 來檢查微調作業的狀態。 此範例會使用上一個範例傳回的作業識別碼,擷取作業的相關資訊:

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/<YOUR-JOB-ID>?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY"

列出微調事件

若要檢查訓練期間產生的個別微調事件:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/{fine_tuning_job_id}/events?api-version=2024-10-21 \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

檢查點

當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度擬合之前提供快照。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。

您可以執行清單檢查點命令來擷取與個別微調作業相關聯的檢查點清單:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints?api-version=2024-10-21 \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

分析自訂模型

每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 REST API 來擷取檔案識別碼和下載結果檔案進行分析。

下列 Python 範例會使用 REST API 擷取附加至自訂模型微調作業中第一個結果檔案的檔案識別碼,然後將檔案下載至工作目錄進行分析。

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/<JOB_ID>?api-version=2023-12-01-preview" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/files/<RESULT_FILE_ID>/content?api-version=2023-12-01-preview" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:

資料行名稱 描述
step 定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。
train_loss 定型批次的遺失。
train_mean_token_accuracy 模型正確預測定型批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
valid_loss 驗證批次的遺失。
validation_mean_token_accuracy 模型正確預測驗證批次中的權杖百分比。
例如,如果批次大小設定為 3,且您的資料包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。
full_valid_loss 在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。
full_valid_mean_token_accuracy 在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。

您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。

隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。

部署微調模型

一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。

如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試

如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南

變數 定義
代幣 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。
訂閱 相關聯 Azure OpenAI 資源的訂閱識別碼。
資源群組 Azure OpenAI 資源的資源群組名稱。
資源名稱 Azure OpenAI 資源名稱。
模型部署名稱 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。
微調過的模型 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

在這裡深入瞭解跨區域部署和使用已 部署的模型

持續微調

建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。

若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2023-12-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。 suffix 會接受字串,並設定用於識別微調模型。 尾碼最多可包含 40 個字元 (a-z、A-Z、0-9 和 _),這些字元會新增至微調模型名稱中。

如果您不確定微調模型的標識符,您可以在 Azure AI Foundry 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。

清除部署、自訂模型和定型檔案

當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。

刪除模型部署

您可以使用各種方法來刪除自訂模型的部署:

刪除自訂模型

同樣地,您可以使用各種方法來刪除自訂模型:

注意

如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。

刪除定型檔案

您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:

下一步