使用Rag和Sem-Rag提供上下文增強(qiáng)AI編碼助手
通過(guò)將檢索增強(qiáng)生成和語(yǔ)義記憶納入 AI 編碼助手,提升開發(fā)人員的生產(chǎn)力、效率和準(zhǔn)確性。
譯自Enhancing AI Coding Assistants with Context Using RAG and SEM-RAG,作者 Janakiram MSV。
基本 AI 編碼助手雖然有幫助,但由于依賴對(duì)軟件語(yǔ)言和編寫軟件最常見模式的總體理解,因此常常無(wú)法提供最相關(guān)和上下文準(zhǔn)確的代碼建議。這些編碼助手生成的代碼適合解決他們負(fù)責(zé)解決的問(wèn)題,但通常不符合各個(gè)團(tuán)隊(duì)的編碼標(biāo)準(zhǔn)、慣例和風(fēng)格。這通常會(huì)導(dǎo)致需要修改或完善其建議,以便將代碼接受到應(yīng)用程序中。
AI 編碼助手通常通過(guò)依靠特定大型語(yǔ)言模型 (LLM)中包含的知識(shí),并在各種場(chǎng)景中應(yīng)用通用編碼原則來(lái)發(fā)揮作用。因此,典型的 AI 助手通常缺乏理解項(xiàng)目特定上下文的的能力,從而導(dǎo)致建議在語(yǔ)法上正確,但可能與團(tuán)隊(duì)的獨(dú)特指南、預(yù)期方法或架構(gòu)設(shè)計(jì)不一致。支持生成式 AI 系統(tǒng)的 LLM 基于一組固定的訓(xùn)練數(shù)據(jù)運(yùn)行,該數(shù)據(jù)不會(huì)隨著項(xiàng)目的進(jìn)行而動(dòng)態(tài)演變。這種靜態(tài)方法可能導(dǎo)致生成的代碼與項(xiàng)目的當(dāng)前狀態(tài)或要求不匹配,從而需要開發(fā)人員進(jìn)行進(jìn)一步的手動(dòng)調(diào)整。
使用 RAG 優(yōu)化 LLM
有一種誤解,即 AI 助手只是與 LLM 交互以生成用戶正在尋找的結(jié)果。無(wú)論您是生成文本、圖像還是代碼,最好的 AI 助手都會(huì)使用一組復(fù)雜的準(zhǔn)則來(lái)確保用戶要求的內(nèi)容(例如,完成特定任務(wù)的軟件功能)和生成的內(nèi)容(Java 函數(shù),在正確的版本中,具有正確的應(yīng)用程序參數(shù))保持一致。
從任何 LLM 獲得最佳輸出的已驗(yàn)證技術(shù)之一是使用提示提供附加上下文。這種方法稱為檢索增強(qiáng)生成 (RAG),已成為聊天機(jī)器人、AI 助手和成功服務(wù)于企業(yè)用例的代理的關(guān)鍵組成部分。
“使用對(duì)現(xiàn)有代碼庫(kù)和編碼標(biāo)準(zhǔn)了解不足的 AI 編碼助手就像從街上雇用一名訓(xùn)練有素的軟件工程師:樂(lè)于助人且用心良苦,但可能會(huì)創(chuàng)建需要修改才能適合您應(yīng)用程序的代碼”
— Peter Guagenti,Tabnine
AI 編碼助手與所有生成式 AI 工具一樣,使用 LLM 作為代碼生成的基礎(chǔ)。為編碼助手帶來(lái)高度定制的 RAG 使他們能夠生成更高質(zhì)量且與公司的現(xiàn)有代碼庫(kù)和工程標(biāo)準(zhǔn)更緊密對(duì)齊的代碼。
在聊天機(jī)器人的領(lǐng)域中,RAG 考慮了以結(jié)構(gòu)化和非結(jié)構(gòu)化格式提供的現(xiàn)有數(shù)據(jù)。通過(guò)全文或語(yǔ)義搜索,它僅檢索足夠多的上下文,并將其注入發(fā)送到 LLM 的提示中。
AI 編碼助手可以使用類似(盡管更復(fù)雜)的方法,通過(guò)集成開發(fā)環(huán)境從現(xiàn)有代碼庫(kù)中檢索上下文。高性能 AI 編碼助手可以抓取項(xiàng)目工作區(qū)以訪問(wèn)當(dāng)前文件、打開文件、Git 歷史記錄、日志、項(xiàng)目元數(shù)據(jù)甚至連接的 Git 存儲(chǔ)庫(kù)中的其他上下文。
RAG 賦能AI 編碼助手提供高度相關(guān)和精確的結(jié)果,方法是考慮項(xiàng)目的特定方面,例如現(xiàn)有的 API、框架和編碼模式。AI 助手不會(huì)提供通用解決方案,而是根據(jù)項(xiàng)目的既定實(shí)踐調(diào)整其指導(dǎo),例如建議與當(dāng)前實(shí)現(xiàn)一致的數(shù)據(jù)庫(kù)連接,或提供無(wú)縫集成私有 API 的代碼建議。通過(guò)利用 RAG,助手甚至可以生成反映現(xiàn)有測(cè)試的結(jié)構(gòu)、樣式和語(yǔ)法的測(cè)試函數(shù),確保代碼在上下文上準(zhǔn)確且符合項(xiàng)目的需要。
這種方法可以帶來(lái)無(wú)與倫比的個(gè)性化,開發(fā)人員可以立即接受。
RAG 在編碼助手中的工作原理
讓我們來(lái)看看在編碼助手上實(shí)現(xiàn) RAG 所涉及的步驟。
第一階段是索引和存儲(chǔ)。最初,當(dāng)編碼助手安裝并集成到開發(fā)環(huán)境中時(shí),它會(huì)執(zhí)行搜索并識(shí)別所有可以添加上下文的相關(guān)文檔。然后,它將每個(gè)文檔拆分為塊,并將它們發(fā)送到嵌入模型。嵌入模型負(fù)責(zé)將每個(gè)塊轉(zhuǎn)換為向量,而不會(huì)丟失其語(yǔ)義表示。生成的向量存儲(chǔ)在向量數(shù)據(jù)庫(kù)中以供將來(lái)檢索。編碼助手可能會(huì)定期掃描工作區(qū)并將文檔添加到向量數(shù)據(jù)庫(kù)中。
第二階段是編碼。在下一階段(編碼)中,開發(fā)人員可能會(huì)創(chuàng)建注釋或使用聊天助手生成特定函數(shù)。助手使用提示對(duì)存儲(chǔ)在向量數(shù)據(jù)庫(kù)中的先前索引集合執(zhí)行相似性搜索。檢索此搜索的結(jié)果并用于使用相關(guān)上下文擴(kuò)充提示。當(dāng) LLM 收到增強(qiáng)提示和上下文時(shí),它會(huì)生成與上下文中已有的代碼對(duì)齊的代碼片段。
圖片
將 RAG 應(yīng)用于編碼助手可以提高 LLM 生成的代碼的性能、準(zhǔn)確性和可接受性。它顯著增強(qiáng)了該工具的實(shí)用性,并減少了開發(fā)人員重寫或調(diào)整 AI 生成的代碼所花費(fèi)的時(shí)間。與項(xiàng)目的現(xiàn)有代碼庫(kù)直接對(duì)齊,可以提高代碼建議的準(zhǔn)確性,并極大地提高開發(fā)人員的生產(chǎn)力和代碼質(zhì)量。
“使用一個(gè)對(duì)你的現(xiàn)有代碼庫(kù)和編碼標(biāo)準(zhǔn)不夠了解的 AI 編碼助手就像在街上雇用一個(gè)訓(xùn)練有素的軟件工程師:樂(lè)于助人且用心良苦,但可能會(huì)創(chuàng)建需要修改才能適合你的應(yīng)用程序的代碼。當(dāng)你分層加入適當(dāng)級(jí)別的上下文(包括本地文件、項(xiàng)目或公司的代碼庫(kù)以及相關(guān)的非代碼信息來(lái)源)時(shí),就像讓一位在你的公司擁有多年經(jīng)驗(yàn)的高級(jí)工程師與你的開發(fā)人員坐在一起,”Tabnine總裁Peter Guagenti說(shuō)?!皵?shù)字證明了這一點(diǎn)。允許我們使用其現(xiàn)有代碼作為上下文的 Tabnine 用戶接受了多 40% 的代碼建議,而無(wú)需修改。當(dāng) Tabnine 連接到公司的整個(gè)存儲(chǔ)庫(kù)時(shí),這個(gè)數(shù)字會(huì)更高。”
這是 RAG 解決阻礙傳統(tǒng)編碼助手的可擴(kuò)展性和適應(yīng)性限制的一種方式。隨著項(xiàng)目的增長(zhǎng)和演變,配備 RAG 的工具會(huì)不斷學(xué)習(xí)和適應(yīng),根據(jù)從代碼庫(kù)中收集到的新模式和信息優(yōu)化其建議。這種演變能力使 RAG 成為動(dòng)態(tài)開發(fā)環(huán)境中非常強(qiáng)大的工具。
使用語(yǔ)義記憶增強(qiáng) RAG
語(yǔ)義檢索增強(qiáng)生成 (SEM-RAG) 是 RAG 技術(shù)的高級(jí)迭代,旨在擴(kuò)展 RAG 的準(zhǔn)確性和語(yǔ)境化。它通過(guò)使用語(yǔ)義記憶而不是向量搜索來(lái)增強(qiáng)編碼助手,從而將語(yǔ)義理解集成到檢索過(guò)程中。
與主要依賴向量空間模型來(lái)檢索相關(guān)代碼片段的傳統(tǒng) RAG 不同,SEM-RAG 采用了一種更細(xì)致的語(yǔ)義索引方法。此方法利用靜態(tài)分析來(lái)深入理解代碼庫(kù)的結(jié)構(gòu)和語(yǔ)義,識(shí)別代碼元素中的關(guān)系和依賴性。
例如,SEM-RAG 可以分析 Java 和 TypeScript 等語(yǔ)言中的導(dǎo)入語(yǔ)句,使其能夠從庫(kù)中提取上下文相關(guān)的代碼元素,即使無(wú)法直接訪問(wèn)源代碼。此功能允許 SEM-RAG 理解和利用導(dǎo)入庫(kù)的字節(jié)碼,有效地使用這些見解來(lái)豐富提供給語(yǔ)言模型的上下文。
雖然傳統(tǒng)的 RAG 通過(guò)將代碼片段的向量化表示與查詢進(jìn)行匹配,極大地提高了代碼建議的相關(guān)性,但它有時(shí)缺乏完全掌握復(fù)雜軟件項(xiàng)目語(yǔ)義細(xì)微差別的深度。SEM-RAG 通過(guò)關(guān)注代碼中的語(yǔ)義關(guān)系來(lái)解決此限制,從而與項(xiàng)目的編碼實(shí)踐實(shí)現(xiàn)更精確的對(duì)齊。例如,通過(guò)理解項(xiàng)目架構(gòu)中定義的關(guān)系和依賴性,SEM-RAG 可以提供不僅在上下文上準(zhǔn)確,而且在架構(gòu)上也一致的建議。這通過(guò)生成與現(xiàn)有系統(tǒng)無(wú)縫集成的代碼來(lái)增強(qiáng)性能,從而降低引入錯(cuò)誤或不一致的可能性。
SEM-RAG 的方法是將代碼視為相互關(guān)聯(lián)的元素,而不是孤立的片段,這比傳統(tǒng)的 RAG 提供了更深入的語(yǔ)境化。這種理解深度促進(jìn)了編碼任務(wù)中更高程度的自動(dòng)化,尤其是在代碼庫(kù)中相互依賴性至關(guān)重要的復(fù)雜領(lǐng)域。因此,SEM-RAG 不僅保留了傳統(tǒng) RAG 的所有優(yōu)點(diǎn),而且在理解代碼的更深層次語(yǔ)義和結(jié)構(gòu)方面至關(guān)重要的環(huán)境中超越了它。這使得 SEM-RAG 成為大規(guī)模和企業(yè)級(jí)軟件開發(fā)的寶貴工具,其中維護(hù)架構(gòu)完整性與代碼正確性一樣重要。
利用人工智能增強(qiáng)代碼質(zhì)量和開發(fā)人員生產(chǎn)力
選擇通過(guò) RAG 和 SEM-RAG 等高級(jí)技術(shù)融入上下文感知的人工智能編碼助手,標(biāo)志著軟件開發(fā)工具演變中的變革性一步。通過(guò)嵌入對(duì)代碼庫(kù)上下文的深入理解,這些助手顯著提高了他們生成的代碼的準(zhǔn)確性、相關(guān)性和性能。這種上下文集成有助于確保建議不僅在語(yǔ)法上正確,而且還符合您的特定編碼標(biāo)準(zhǔn)、架構(gòu)框架和特定于項(xiàng)目的細(xì)微差別,從而有效縮小了人工智能生成代碼與人類專業(yè)知識(shí)之間的差距。
支持 RAG 的人工智能助手顯著提高了開發(fā)人員的生產(chǎn)力并提高了代碼質(zhì)量。開發(fā)人員可以依靠這些增強(qiáng)的 AI 助手來(lái)生成不僅適合任務(wù)的代碼,而且無(wú)縫融入更大的項(xiàng)目上下文中,從而最大程度地減少修訂的需要并加速開發(fā)周期。通過(guò)以高度精確度自動(dòng)化編碼的更多方面,這些具有上下文感知的編碼助手正在為軟件開發(fā)設(shè)定新標(biāo)準(zhǔn),推動(dòng)人工智能工具像開發(fā)人員自己一樣全面地理解和適應(yīng)項(xiàng)目環(huán)境的復(fù)雜動(dòng)態(tài)。