StarCoder2-Instruct: 面向程式碼生成的完全透明和寬鬆的自對齊

指令微調 (Instruction tuning) 是一種賦予大型語言模型 (LLM) 理解並遵循人類自然語言指令能力的微調方法。然而,對於程式設計任務,大多數模型要麼是基於人工編寫的指令(成本非常高)進行微調,要麼是基於由龐大且專有的 LLM 生成的指令(可能不被許可使用)進行微調。我們推出了 StarCoder2-15B-Instruct-v0.1,這是首個透過完全寬鬆和透明的流程進行訓練的、完全自對齊的程式碼 LLM。我們的開源流程使用 StarCoder2-15B 生成數千個指令-響應對,然後用這些資料來微調 StarCoder-15B 自身,無需任何人工標註或從龐大且專有的 LLM 中蒸餾的資料。
StarCoder2-15B-Instruct 在 HumanEval 上的得分為 72.6,甚至超過了 CodeLlama-70B-Instruct 的 72.0 分! 在 LiveCodeBench 上的進一步評估表明,自對齊模型甚至優於使用從 GPT-4 蒸餾的資料訓練的同一模型,這意味著 LLM 從其自身分佈內的資料中學習可能比從教師 LLM 的偏移分佈中學習更有效。
方法

我們的資料生成流程主要包括三個步驟
- 從 The Stack v1(一個包含大量寬鬆許可原始碼的語料庫)中提取高質量且多樣化的種子函式。
- 建立多樣化且貼近真實場景的程式碼指令,這些指令涵蓋種子函式中存在的不同程式碼概念(例如,資料反序列化、列表拼接和遞迴)。
- 對每條指令,透過執行引導的自驗證生成高質量的響應。
在接下來的部分中,我們將詳細探討這些方面。
收集種子程式碼片段
為了充分解鎖程式碼模型的指令遵循能力,模型應當接觸到涵蓋廣泛程式設計原則和實踐的多樣化指令。受 OSS-Instruct 的啟發,我們透過從開原始碼片段中挖掘程式碼概念來進一步促進這種多樣性,這些程式碼片段特別是來自 The Stack V1 中結構良好的種子 Python 函式。
對於我們的種子資料集,我們從 The Stack V1 中仔細提取了所有帶有文件字串的 Python 函式,使用 autoimport 推斷所需的依賴項,並對所有函式應用以下過濾規則
- 型別檢查: 我們使用 Pyright 啟發式型別檢查器來移除所有產生靜態錯誤的函式,這些錯誤可能表示程式碼項不正確。
- 去汙染:我們檢測並移除了所有我們用於評估的基準測試項。我們在解決方案和提示上都使用了精確字串匹配。
- 文件字串質量過濾:我們利用 StarCoder2-15B 作為評判員,移除文件質量差的函式。我們向基礎模型提供 7 個小樣本 (few-shot) 示例,要求它對是否保留該項回答“是”或“否”。
- 近似去重:我們利用 MinHash 和區域性敏感雜湊,以 0.5 的 Jaccard 相似度閾值來過濾資料集中的重複種子函式。這與應用於 StarCoder 訓練資料的流程相同。
這個過濾流程最終從 500 萬個帶有文件字串的函式中篩選出 25 萬個 Python 函式的資料集。這個過程很大程度上受到了 MultiPL-T 中資料收集流程的啟發。
Self-OSS-Instruct
收集完種子函式後,我們使用 Self-OSS-Instruct 來生成多樣化的指令。具體來說,我們採用上下文學習 (in-context learning) 的方式,讓基礎的 StarCoder2-15B 從給定的種子程式碼片段中自我生成指令。這個過程利用了 16 個精心設計的小樣本 (few-shot) 示例,每個示例的格式為 (程式碼片段,概念,指令)。指令生成過程分為兩個步驟
- 概念提取: 對於每個種子函式,提示 StarCoder2-15B 生成一個該函式中存在的程式碼概念列表。程式碼概念指的是程式設計中使用的基礎原則和技術,例如 模式匹配 和 資料型別轉換,這些對於開發者來說是必須掌握的關鍵知識。
- 指令生成: 然後提示 StarCoder2-15B 自我生成一個包含已識別程式碼概念的程式設計任務。
最終,這個過程生成了 23.8 萬條指令。
響應自驗證
有了從 Self-OSS-Instruct 生成的指令,我們的下一步是為每條指令匹配一個高質量的響應。以前的做法通常依賴於從更強的教師模型(如 GPT-4)中蒸餾響應,期望這些響應質量更高。然而,蒸餾專有模型會導致許可證不寬鬆,而且更強的教師模型也並非總是可用。更重要的是,教師模型也可能出錯,並且教師和學生模型之間的分佈差異可能是有害的。
我們提出透過明確指示 StarCoder2-15B 在生成包含自然語言的響應後,再生成用於自驗證的測試來進行自對齊。這個過程類似於開發者測試他們程式碼實現的方式。具體來說,對於每條指令,StarCoder2-15B 生成 10 個格式為 (自然語言響應,測試) 的樣本,我們在沙箱環境中過濾掉那些未能透過測試執行的樣本。然後,我們為每條指令隨機選擇一個透過測試的響應,加入最終的監督微調 (SFT) 資料集。我們總共為 23.8 萬條指令生成了 240 萬個(10 x 23.8 萬)響應(溫度設為 0.7),其中 50 萬個通過了執行測試。去重後,我們剩下 5 萬條指令,每條指令配對一個隨機的透過測試的響應,這最終構成了我們的 SFT 資料集。
評估
在流行且嚴謹的 EvalPlus 基準測試中,StarCoder2-15B-Instruct 脫穎而出,成為其規模級別中表現最佳的寬鬆許可 LLM,超過了規模更大的 Grok-1 Command-R+、DBRX,同時與 Snowflake Arctic 480B 和 Mixtral-8x22B-Instruct 的表現相當。據我們所知,StarCoder2-15B-Instruct 是首個透過完全透明和寬鬆流程達到 70+ HumanEval 分數的程式碼 LLM。它顯著優於 OctoCoder,後者是之前採用透明流程的最先進的寬鬆許可程式碼 LLM。
即使與具有限制性許可證的強大 LLM 相比,StarCoder2-15B-Instruct 仍然具有競爭力,超過了 Gemini Pro 和 Mistral Large,並與 CodeLlama-70B-Instruct 相當。此外,完全基於自生成資料訓練的 StarCoder2-15B-Instruct,其效能與在 GPT-3.5/4 蒸餾資料上微調 StarCoder2-15B 的 OpenCodeInterpreter-SC2-15B 不相上下。

除了 EvalPlus,我們還在 LiveCodeBench 上評估了類似或更小規模的最先進開源模型。LiveCodeBench 包含了 2023 年 9 月 1 日之後建立的新程式設計問題。我們還評估了針對資料科學程式的 DS-1000。在 LiveCodeBench 上,StarCoder2-15B-Instruct 在所有被評估的模型中取得了最佳成績,並且持續優於蒸餾了 GPT-4 資料的 OpenCodeInterpreter-SC2-15B。在 DS-1000 上,儘管 StarCoder2-15B-Instruct 的訓練資料中資料科學問題非常有限,但其表現仍然具有競爭力。

結論
StarCoder2-15B-Instruct-v0.1 首次證明,我們可以在不依賴於像 GPT-4 這樣的更強教師模型的情況下,創建出功能強大的指令微調程式碼模型。這個模型表明,自對齊——即模型利用自身生成的內容進行學習——對於程式碼領域同樣有效。它完全透明並允許蒸餾,這使其區別於其他規模更大但不夠透明的寬鬆許可模型,如 Snowflake-Arctic、Grok-1、Mixtral-8x22B、DBRX 和 CommandR+。我們已將我們的資料集和包括資料整理和訓練在內的整個流程完全開源。我們希望這項開創性的工作能夠激勵該領域未來更多的研究和發展。
資源
- StarCoder2-15B-Instruct-v0.1:指令微調模型
- starcoder2-self-align:自對齊流程
- StarCoder2-Self-OSS-Instruct:自生成的指令微調資料集
引用
@article{wei2024selfcodealign,
title={SelfCodeAlign: Self-Alignment for Code Generation},
author={Yuxiang Wei and Federico Cassano and Jiawei Liu and Yifeng Ding and Naman Jain and Zachary Mueller and Harm de Vries and Leandro von Werra and Arjun Guha and Lingming Zhang},
year={2024},
journal={arXiv preprint arXiv:2410.24198}
}