新智元報(bào)道
編輯:桃子 潤(rùn)
【新智元導(dǎo)讀】全球首個(gè)AI程序員Devin誕生之后,讓碼農(nóng)紛紛恐慌。沒(méi)想到,微軟同時(shí)也整出了一個(gè)AI程序員——AutoDev,能夠自主生成、執(zhí)行代碼等任務(wù)。網(wǎng)友驚呼,AI編碼發(fā)展太快了。
全球首個(gè)AI程序員Devin的橫空出世,可能成為軟件和AI發(fā)展史上一個(gè)重要的節(jié)點(diǎn)。
它掌握了全棧的技能,不僅可以寫代碼debug,訓(xùn)模型,還可以去美國(guó)最大求職網(wǎng)站Upwork上搶單。
一時(shí)間,網(wǎng)友們驚呼,「程序員不存在了」?
甚至連剛開(kāi)始攻讀計(jì)算機(jī)學(xué)位的人也恐慌,「10倍AI工程師」對(duì)未來(lái)的工作影響。
除了Cognition AI這種明星初創(chuàng)公司,美國(guó)的各個(gè)大廠也早就在想辦法用AI智能體降本增效了。
就在3月14日同一天,微軟團(tuán)隊(duì)也發(fā)布了一個(gè)「微軟AI程序員」——AutoDev。
論文地址:https://arxiv.org/pdf/2403.08299.pdf
與Devin這種極致追求效率和產(chǎn)出結(jié)果的方向有所不同。
AutoDev專為自主規(guī)劃、執(zhí)行復(fù)雜的軟件工程任務(wù)而設(shè)計(jì),還能維護(hù)Docker環(huán)境中的隱私和安全。
在此之前,微軟已有主打產(chǎn)品Github Copilot,幫助開(kāi)發(fā)人員完成軟件開(kāi)發(fā)。
然而,包括GitHub Copilot在內(nèi)的一些AI工具,并沒(méi)有充分利用IDE中所有的潛在功能,比如構(gòu)建、測(cè)試、執(zhí)行代碼、git操作等。
基于聊天界面的要求,它們主要側(cè)重于建議代碼片段,以及文件操作。
AutoDev的誕生,就是為了填補(bǔ)這一空白。
用戶可以定義復(fù)雜的軟件工程目標(biāo),AutoDev會(huì)將這些目標(biāo)分配給自主AI智能體來(lái)實(shí)現(xiàn)。
然后,這些AI智能體可以對(duì)代碼庫(kù)執(zhí)行各種操作,包括文件編輯、檢索、構(gòu)建過(guò)程、執(zhí)行、測(cè)試和git操作。
甚至,它們還能訪問(wèn)文件、編譯器輸出、構(gòu)建和測(cè)試日志、靜態(tài)分析工具等。
在HumanEval測(cè)試中,AutoDev分別在代碼生成和測(cè)試生成方面,分別取得了91.5%和87.8% Pass@1的優(yōu)秀結(jié)果。
網(wǎng)友表示,AI編碼發(fā)展太快了,2021年GitHub Copilot能解決28.8%的HumanEval問(wèn)題,到了2024年,AutoDev直接解決了91.5%的問(wèn)題。
不用人類插手,AutoDev自主完成任務(wù)
AutoDev工作流程如下圖所示,用戶定義一個(gè)目標(biāo),比如「測(cè)試特定方法」。
AI智能體將測(cè)試寫入一個(gè)新文件,并啟動(dòng)測(cè)試執(zhí)行命令,以上都在安全的評(píng)估環(huán)境中進(jìn)行。
然后,測(cè)試執(zhí)行的輸出(包括失敗日志)將合并到對(duì)話中。
AI智能體分析這些輸出,觸發(fā)檢索命令,通過(guò)編輯文件合并檢索到的信息,然后重新啟動(dòng)測(cè)試執(zhí)行。
最后,Eval環(huán)境提供有關(guān)測(cè)試執(zhí)行是否成功,以及用戶目標(biāo)完成情況的反饋。
整個(gè)過(guò)程由AutoDev自主協(xié)調(diào),除了設(shè)定初始目標(biāo)之外,無(wú)需要開(kāi)發(fā)人員干預(yù)。
相比之下,如果現(xiàn)有的AI編碼助手集成到IDE 中,開(kāi)發(fā)人員必須手動(dòng)執(zhí)行測(cè)試(比如運(yùn)行pytest)、向AI聊天界面提供失敗日志、可能需要識(shí)別要合并的其他上下文信息,并重復(fù)驗(yàn)證操作確保AI生成修改后的代碼后測(cè)試成功。
值得一提的是,AutoDev從以前許多在AI智能體領(lǐng)域的研究中汲取了靈感,比如AutoGen——編排語(yǔ)言模型工作流并推進(jìn)多個(gè)智能體之間的對(duì)話。
AutoDev的能力超越了對(duì)話管理,使智能體能夠直接與代碼存儲(chǔ)庫(kù)交互,自動(dòng)執(zhí)行命令和操作,從而擴(kuò)展了 AutoGen。
同樣,AutoDev的研究也借鑒了Auto-GPT。這是一種用于自主任務(wù)執(zhí)行的開(kāi)源AI智能體,通過(guò)提供代碼和IDE特定功能來(lái)支持執(zhí)行復(fù)雜的軟件工程任務(wù)。
AutoDev構(gòu)架
上圖是AutoDev架構(gòu)的簡(jiǎn)單示意圖。
AutoDev主要由4個(gè)功能模塊組成:
-用于跟蹤和管理用戶與代理對(duì)話的對(duì)話管理器(Conversation Manager);
-為代理提供各種代碼和集成開(kāi)發(fā)環(huán)境相關(guān)工具的工具庫(kù)(Tools library);
-用于調(diào)度各種代理的代理調(diào)度器(Agents Scheduler);
-以及用于執(zhí)行操作的評(píng)估環(huán)境(Evaluation Environment)。
下面就給大家詳細(xì)介紹每種功能模塊。
規(guī)則、行動(dòng)和目標(biāo)配置
用戶通過(guò)yaml文件配置規(guī)則和操作來(lái)啟動(dòng)流程。
這些文件定義了AI代理可以執(zhí)行的可用命令(操作)。
用戶可以通過(guò)啟用/禁用特定命令來(lái)利用默認(rèn)設(shè)置或細(xì)粒度權(quán)限,從而根據(jù)自己的特定需求量身定制AutoDev。
配置步驟目的是實(shí)現(xiàn)對(duì)AI代理能力的精確控制。
在這一階段,用戶可以定義人工智能代理的數(shù)量和行為,分配特定的責(zé)任、權(quán)限和可用操作。
例如,用戶可以定義一個(gè) 「開(kāi)發(fā)者 」代理和一個(gè) 「審核者 」代理,讓它們協(xié)同工作以實(shí)現(xiàn)目標(biāo)。
根據(jù)規(guī)則和操作配置,用戶可以指定AutoDev要完成的軟件工程任務(wù)或流程。
例如,用戶可以要求生成測(cè)試用例,并確保其語(yǔ)法正確、不包含錯(cuò)誤(這涉及編輯文件、運(yùn)行測(cè)試套件、執(zhí)行語(yǔ)法檢查和錯(cuò)誤查找工具)。
對(duì)話管理器(conversation manager)
會(huì)話管理器負(fù)責(zé)初始化會(huì)話歷史,在對(duì)正在進(jìn)行的會(huì)話進(jìn)行高級(jí)管理方面發(fā)揮著關(guān)鍵作用。它負(fù)責(zé)決定何時(shí)中斷對(duì)話進(jìn)程,并確保用戶、人工智能代理和整個(gè)系統(tǒng)之間的無(wú)縫交流。
它維護(hù)和管理的對(duì)話對(duì)象,主要包括來(lái)自代理的信息和來(lái)自評(píng)估環(huán)境(eval environment)的操作結(jié)果。
解析器
解析器解釋代理生成的響應(yīng),以預(yù)定格式提取指令和參數(shù)。它能確保指令格式正確,驗(yàn)證參數(shù)的數(shù)量和準(zhǔn)確性(例如,文件編輯指令需要文件路徑參數(shù))。
如果解析失敗,就會(huì)在對(duì)話中注入錯(cuò)誤信息,阻止對(duì)資源庫(kù)的進(jìn)一步操作。
通過(guò)強(qiáng)制執(zhí)行特定的代理權(quán)限和進(jìn)行額外的語(yǔ)義檢查,成功解析的命令會(huì)被進(jìn)一步分析。
它能確保建議的操作符合用戶指定的細(xì)粒度權(quán)限。
如果命令通過(guò)審查,對(duì)話管理器就會(huì)調(diào)用工具庫(kù)中的相應(yīng)操作。
輸出組織器
輸出組織器模塊主要負(fù)責(zé)處理從評(píng)估環(huán)境接收到的輸出。
它選擇關(guān)鍵信息(如狀態(tài)或錯(cuò)誤),有選擇地總結(jié)相關(guān)內(nèi)容,并將結(jié)構(gòu)良好的信息添加到對(duì)話歷史記錄中。
這可確保用戶對(duì)AutoDev的操作和結(jié)果有一個(gè)清晰、有條理的記錄。
對(duì)話終止器
會(huì)話管理器決定何時(shí)結(jié)束會(huì)話。這可能發(fā)生在代理發(fā)出任務(wù)完成信號(hào)(停止命令)、對(duì)話達(dá)到用戶定義的最大迭代次數(shù)/token、或在進(jìn)程或評(píng)估環(huán)境中檢測(cè)到問(wèn)題時(shí)。
AutoDev的全面設(shè)計(jì)確保了人工智能驅(qū)動(dòng)開(kāi)發(fā)的系統(tǒng)性和可控性。
代理調(diào)度程序(Multi-Agents)
代理調(diào)度器負(fù)責(zé)協(xié)調(diào)人工智能代理,以實(shí)現(xiàn)用戶定義的目標(biāo)。
配置了特定角色和可用命令集的代理協(xié)同運(yùn)行,執(zhí)行各種任務(wù)。調(diào)度器采用各種協(xié)作算法,如循環(huán)、基于令牌或基于優(yōu)先級(jí)的算法,來(lái)決定代理參與對(duì)話的順序和方式。
具體來(lái)說(shuō),調(diào)度算法包括但不限于以下幾種:
(i)循環(huán)協(xié)作,按順序調(diào)用每個(gè)代理,讓每個(gè)代理執(zhí)行預(yù)定數(shù)量的操作;
(ii)基于令牌的協(xié)作,讓一個(gè)代理執(zhí)行多個(gè)操作,直到它發(fā)出一個(gè)令牌,表示完成了分配的任務(wù);
(iii)基于優(yōu)先級(jí)的協(xié)作,按照代理的優(yōu)先級(jí)順序啟動(dòng)代理。代理調(diào)度器通過(guò)當(dāng)前對(duì)話調(diào)用特定代理。
代理
由OpenAI GPT-4等大型語(yǔ)言模型(LLM)和為代碼生成而優(yōu)化的小型語(yǔ)言模型(SLM)組成的代理通過(guò)文本自然語(yǔ)言進(jìn)行交流。
這些代理從代理調(diào)度程序(Agent Scheduler)接收目標(biāo)和對(duì)話歷史,并根據(jù)規(guī)則和行動(dòng)配置指定的行動(dòng)做出響應(yīng)。每個(gè)代理都有其獨(dú)特的配置,有助于實(shí)現(xiàn)用戶目標(biāo)的整體進(jìn)展。
工具庫(kù)(Tools Library)
AutoDev中的工具庫(kù)提供了一系列命令,使代理能夠?qū)Y源庫(kù)執(zhí)行各種操作。
這些命令旨在將復(fù)雜的操作、工具和實(shí)用程序封裝在簡(jiǎn)單直觀的命令結(jié)構(gòu)中。
例如,通過(guò)build和test <test_file>這樣的簡(jiǎn)單命令,就能抽象出與構(gòu)建和測(cè)試執(zhí)行有關(guān)的復(fù)雜問(wèn)題。
-文件編輯:該類別包含用于編輯文件(包括代碼、配置和文檔)的命令。
-該類別中的實(shí)用程序,如寫入、編輯、插入和刪除,提供了不同程度的精細(xì)度。
-代理可以執(zhí)行從寫入整個(gè)文件到修改文件中特定行的各種操作。例如,命令 write <filepath> <start_line>-<end_line> <content> 允許代理用新內(nèi)容重寫一系列行。
檢索:在這一類別中,檢索工具包括grep、find和ls等基本CLI工具,以及更復(fù)雜的基于嵌入的技術(shù)。
這些技術(shù)能讓代理查找類似的代碼片段,從而提高他們從代碼庫(kù)中檢索相關(guān)信息的能力。
例如,retrieve <content> 命令允許代理執(zhí)行與所提供內(nèi)容類似的基于嵌入的片段檢索。
-構(gòu)建與執(zhí)行:這類命令允許代理使用簡(jiǎn)單直觀的命令毫不費(fèi)力地編譯、構(gòu)建和執(zhí)行代碼庫(kù)。底層構(gòu)建命令的復(fù)雜性已被抽象化,從而簡(jiǎn)化了評(píng)估環(huán)境基礎(chǔ)架構(gòu)中的流程。這類命令的示例包括:構(gòu)建、運(yùn)行 <文件>。
-測(cè)試與驗(yàn)證:這些命令使代理能夠通過(guò)執(zhí)行單個(gè)測(cè)試用例、特定測(cè)試文件或整個(gè)測(cè)試套件來(lái)測(cè)試代碼庫(kù)。代理可以執(zhí)行這些操作,而無(wú)需依賴特定測(cè)試框架的底層命令。
這類工具還包括校驗(yàn)工具,如篩選器和錯(cuò)誤查找工具。這類命令的例子包括:檢查語(yǔ)法正確性的 syntax <file> 和運(yùn)行整個(gè)測(cè)試套件的 test。
-Git:用戶可以為Git操作配置細(xì)粒度權(quán)限。包括提交、推送和合并等操作。例如,可以授予代理只執(zhí)行本地提交的權(quán)限,或者在必要時(shí)將更改推送到源代碼庫(kù)。
-通信:代理可以調(diào)用一系列旨在促進(jìn)與其他代理和/或用戶交流的命令。值得注意的是,talk命令可以發(fā)送自然語(yǔ)言信息(不解釋為版本庫(kù)操作命令),ask命令用于請(qǐng)求用戶反饋,而stop命令可以中斷進(jìn)程,表示目標(biāo)已實(shí)現(xiàn)或代理無(wú)法繼續(xù)。
因此,AutoDev中的工具庫(kù)為人工智能代理提供了一套多功能且易于使用的工具,使其能夠與代碼庫(kù)進(jìn)行交互,并在協(xié)作開(kāi)發(fā)環(huán)境中進(jìn)行有效交流。
評(píng)估環(huán)境(Eval Environment)
評(píng)估環(huán)境在Docker容器中運(yùn)行,可以安全地執(zhí)行文件編輯、檢索、構(gòu)建、執(zhí)行和測(cè)試命令。
它抽象了底層命令的復(fù)雜性,為代理提供了一個(gè)簡(jiǎn)化的界面。評(píng)估環(huán)境會(huì)將標(biāo)準(zhǔn)輸出/錯(cuò)誤返回給輸出組織器模塊。
整合
用戶通過(guò)指定目標(biāo)和相關(guān)設(shè)置啟動(dòng)對(duì)話。
對(duì)話管理器初始化一個(gè)對(duì)話對(duì)象,整合來(lái)自人工智能代理和評(píng)估環(huán)境的信息。隨后,對(duì)話管理器將對(duì)話分派給負(fù)責(zé)協(xié)調(diào)人工智能代理行動(dòng)的代理調(diào)度器。
作為人工智能代理,語(yǔ)言模型(大型或小型 LM)通過(guò)文本互動(dòng)提出指令建議。
命令界面包含多種功能,包括文件編輯、檢索、構(gòu)建和執(zhí)行、測(cè)試以及 Git 操作。對(duì)話管理器會(huì)對(duì)這些建議的命令進(jìn)行解析,然后將其引導(dǎo)至評(píng)估環(huán)境,以便在代碼庫(kù)中執(zhí)行。
這些命令在評(píng)估環(huán)境的安全范圍內(nèi)執(zhí)行,并封裝在 Docker 容器中。
執(zhí)行后,產(chǎn)生的操作將無(wú)縫集成到對(duì)話歷史中,為后續(xù)迭代做出貢獻(xiàn)。
這種迭代過(guò)程一直持續(xù)到代理認(rèn)為任務(wù)完成、用戶干預(yù)發(fā)生或達(dá)到最大迭代限制為止。
AutoDev 的設(shè)計(jì)確保了系統(tǒng)、安全地協(xié)調(diào)人工智能代理,以自主和用戶控制的方式完成復(fù)雜的軟件工程任務(wù)。
實(shí)證評(píng)估設(shè)計(jì)
在研究人員的實(shí)證評(píng)估中,評(píng)估了AutoDev在軟件工程任務(wù)中的能力和有效性,研究它是否能夠提升人工智能模型的性能,而不僅僅是簡(jiǎn)單的推理。
此外,研究人員還評(píng)估了AutoDev在步驟數(shù)、推理調(diào)用和token方面的成本。
主要是確定了三個(gè)實(shí)驗(yàn)研究問(wèn)題:
-