01-神魔宇宙 ***宇宙天國首部曲 彌勒天書閣 https://maitreya-books.com/ 神話從來就不是怪力亂神,而是原始先民在日常生活情況的觀察之中,所建立的真實認知。唯有相信神話中的真實,才能感受到神話的詩意隱喻背後,所具有的神聖力量。打開你的想像,打開你的相信,你才能知道神話告訴了你什麼宇宙生命的資訊。 生命起源於宇宙之中,生長於宇宙之中,結束於宇宙之中,因此,宇宙的起源就是生命背景的起源。生命形成的每一個階段,其實都在述說著生命的本能,也就是生命本就存在的一種力量,在此雖是說明一種狀況,然而將這狀況投射在生命的生活行動之中,你就會明白自己究竟有哪些不可思議的本能!

Github2.5k星,Karpathy轉贊,「流程工程」讓LLM代碼能力瞬間翻倍,直接淘汰提示工程

2024021713:23


【新智元導讀】Karpathy力推代碼生成任務增強流程,讓GPT-4在CodeContests從19%提升到44%,不用微調不用新數據集訓練,讓大模型代碼能力大幅提升。

代碼生成可以說是大模型應用中效果最好,使用人群最廣的一項任務了。

但是由于編程語言衆多,要應對各種不同的邊緣場景,代碼生成任務又是對模型能力要求最高的任務,一般的自然語言提示,甚至是CoT等方法,對于代碼生成任務來說,效果也不是很好。

但是最近在GitHub上有一個項目大火,它通過一系列針對大模型代碼生成任務的優化,將提示詞工程升級爲一個更加複雜的「流程工程」,能夠大幅提升模型輸出的代碼質量。



項目地址:https://github.com/Codium-ai/AlphaCodium

就連AK看了,都很興奮地轉發,認爲如果代碼生成任務能夠以更科學的流程,而不是簡單的問答方式來和大語言模型互動的話,性能確實還有不少提升的空間。



作者把這個項目稱爲AlphaCodium ,一種基于測試的、多階段、面向代碼的叠代流程。

他們在由谷歌DeepMind提出的一個非常有難度的代碼測試集CodeContests上進行測試,將GPT-4的成績從19%提高到了44%。

由于CodeContests代碼生成問題的複雜性,簡單的提示優化,甚至CoT提示,無法獲得有意義的性能提高。

最主要是因爲就算強如GPT-4,也難以理解和「消化」問題,會不斷産生錯誤的代碼。

適用于自然語言任務的通用流程可能不適用于像CodeContests上這種有難度代碼生成任務。

CodeContests數據集

CodeContests是Google Deepmind推出的一個具有挑戰性的代碼生成數據集,其中包括了很多像Codeforces等競賽性編程平台編寫的問題。

這個數據集包含約一萬個可用于訓練LLM的問題,以及用于評估LLM解決具有挑戰性的代碼生成問題的能力的驗證和測試集。

作者沒有訓練專用模型,而是開發了一個面向代碼的流程,這個流程可以應用于任何能夠用于編碼任務的預訓練的LLM,例如GPT或DeepSeek。

下圖展示了一個 CodeContests 數據集中的典型問題示例:



爲什麽CodeContests是一個評估代碼生成任務的LLM的優秀數據集?

主要原因是:

1)CodeContests與許多其他競爭性編程數據集不同,它利用一套全面的不公開的測試來避免錯誤檢測——每個問題包含約200個生成的代碼解決方案,輸出和輸入都要通過這個測試。

2)LLM通常不擅長關注小細節,因爲他們通常會將問題描述轉換爲某種「平均」描述,接近于模型接受訓練時的常見案例。

另一方面,現實世界的問題經常包含正確解決問題內容中至關重要的小細節。

CodeContests 數據集的一個關鍵特征是,問題描述在設計上是複雜而冗長的,並且存在一些小細節和細微差別(參見上圖中的典型問題描述)。

作者認爲增加這種問題理解的自由度是有益的,因爲它能真實模擬現實生活中的問題,這些問題通常很複雜,涉及多種因素和考慮因素。

這與更常見的代碼數據集(例如 HumanEval)形成對比。



作者認爲適當的自我反思會使問題更加清晰、更加連貫。這說明了問題理解作爲流程的一部分的重要性,它很可能導致正確的代碼解決方案。

爲了應對這種和現實問題很接近的測試集,作者提出了這樣一個流程:



該流程主要是一個叠代過程,作者根據輸入輸出測試反複運行和修正生成的代碼。

這種以代碼爲導向的流程有兩個關鍵要素:

    預處理階段是一個線性流程,用自然語言對問題進行推理。在預處理階段生成額外的數據,如自我反省和公共測試推理,以幫助叠代過程;

    代碼叠代階段包括根據特定測試生成、運行和修複代碼的叠代階段。這個階段使用人工智能生成的額外測試來豐富公共測試。

面向代碼的設計理念

AlphaCodium 流程廣泛使用了以下設計概念:

YAML 結構化輸出

結構化輸出的使用——要求模型生成 YAML 格式的輸出,相當于給定的 Pydantic 類——是我們提出的流程中的關鍵組件。此類指令的示例:

Your goal is to present possible solutions to the problem.Make sure that each solution fully addresses the problem goals, rules, and constraints.

The output must be a YAML object equivalent to type $PossibleSolutions, according to the following Pydantic definitions:
class Solution(BaseModel):name: str = Field(description="The name of the solution")content: str = Field(description="A description of the solution")why_it_works: str = Field(description="Why this solution is correct. Be specific and detailed regarding the problem rules and goals")complexity: str = Field(description="The complexity of the solution")
class PossibleSolutions(BaseModel):possible_solutions: List[Solution] = Field(max_items=3, description="A list of possible solutions to the problem. Make sure each solution fully addresses the problem rules and goals, and has a reasonable runtime - less than three seconds on a modern computer, given the problem constraints for large inputs.")

結構化輸出消除了「提示工程」所需的大部分麻煩和黑暗知識,而是允許以簡單的、類似代碼的方式呈現複雜的任務。它還使得獲得涉及多個階段的複雜答案成爲可能,代表邏輯和有條理的思維過程。

要點分析

當要求 LLM 推理問題時,要求輸出采用要點格式通常會獲得更好的結果。

要點鼓勵對問題的深入理解,並迫使模型將輸出劃分爲邏輯語義部分,從而改進結果。

例如,通過對問題的要點進行自我反思(見上圖),每個要點代表對問題不同部分的語義理解——一般描述、目標和規則、輸入結構和輸出結構。

LLM在生成模塊化代碼時做得更好

當要求 LLM生成單個冗長函數時,結果往往很差 - 代碼通常包含錯誤或邏輯錯誤。

更糟糕的是,單個整體代碼損害了執行叠代修複的能力——即使給出了錯誤消息,模型也難以查明和修複問題。

具有雙重驗證的軟決策

LLM往往會在需要思考、推理並做出嚴格、重要決策的代碼任務中遇到困難。

以針對問題生成附加測試的任務爲例。很多時候,模型生成的一些測試是完全錯誤的。

通過雙重驗證過程,作者添加了一個額外的步驟,在給定生成的輸出的情況下,要求模型重新生成相同的輸出,但在需要時進行更正。

例如,將生成的 AI 測試作爲輸入,要求模型重新生成相同的測試,同時糾正錯誤的輸出(如果存在)。我們發現,雙重驗證的這一步驟在鼓勵模型批判性和推理性的同時,比直接問「是/否」問題更有效:「這個測試正確嗎?」

推遲決策,盡量避免直接提問,並留出探索的空間

向模型提出有關複雜問題的直接問題時,我們總是會看到幻覺和錯誤答案。

采用逐步數據積累的流程,從簡單的任務到困難的任務:

從最簡單的任務開始 – 對問題的自我反思,並對公共測試進行推理。

開始生成額外的人工智能測試以及問題的可能解決方案。

只有在獲得模型對上述任務的答案後,我們才會開始實際的代碼生成和運行修複叠代。

測試錨點

即使經過雙重驗證,一些人工智能生成的測試也會是錯誤的。

這使得叠代變得具有挑戰性——當測試失敗時,我們如何知道是因爲代碼錯誤,還是因爲測試錯誤?

當我們直接詢問模型「誰錯了」時,經常會看到幻覺,並可能最終得到錯誤修複的代碼。

爲了解決這個問題,作者使用了「測試錨點」技術:

– 首先叠代公共測試,我們知道這是正確的。完成後,將所有通過的測試設置爲錨定測試。

– 然後,一項一項地叠代人工智能生成的測試。如果測試通過,則將其添加到測試錨點列表中

-如果測試失敗,假設是因爲代碼不正確,並嘗試修複代碼。

然而,要求固定代碼也通過已經獲得的所有測試錨點。因此,測試錨點將保護輸出免受錯誤固定代碼的影響。

測試錨點的另一個優化是將人工智能生成的測試從易到難進行排序。這樣,叠代過程就有更多機會在過程開始時獲得錨點,這可以在以後叠代更複雜的人工智能測試時用作保護,因爲錯誤測試輸出的可能性更高。

結果

直接使用提示詞 Vs AlphaCodium

將 AlphaCodium 結果與通過單個精心設計的直接提示獲得的結果進行了比較。



可以看出,AlphaCodium流程一致且顯著提高了LLM在CodeContests問題上的性能。

對于開源 (DeepSeek) 和閉源 (GPT) 模型以及驗證集和測試集都是如此。---[新智元報導*編輯:潤/來源: 新智元 ]

參考資料:https://www.codium.ai/blog/alphacodium-state-of-the-art-code-generation-for-code-contests/