![]()
這項由麻省理工學院的達里亞·克雷沃舍耶娃和德國柏林Jina AI公司的薩巴·斯圖魯阿、邁克爾·吉恩特、斯科特·馬滕斯、韓曉等研究人員共同完成的研究,發表于2025年8月的arXiv預印本平臺。感興趣的讀者可以通過論文編號arXiv:2508.21290v1訪問完整論文內容。
當程序員在龐大的代碼庫中尋找特定功能的代碼片段時,就像在圖書館的海量藏書中尋找一本特定的書。傳統的搜索方法往往讓人感到力不從心,特別是當你想用自然語言描述你需要什么代碼時。研究團隊開發了一套名為jina-code-embeddings的代碼嵌入模型,就像為每段代碼配備了一個智能索引系統,能夠精準理解程序員的自然語言需求,并快速找到匹配的代碼片段。
這套系統的獨特之處在于它采用了一種全新的構建思路。傳統的代碼搜索系統就像一個只會按照固定規則工作的機器人,而這個新系統更像一個既懂編程又懂人話的助手。它基于專門用于代碼生成的大型語言模型進行改造,通過一種稱為"最后標記池化"的技術生成代碼的向量表示。這種方法讓系統能夠更好地理解代碼的語義含義,而不僅僅是表面的文字匹配。
研究團隊開發了兩個不同規模的模型版本:一個擁有4.94億參數的輕量級版本和一個擁有15.4億參數的增強版本。盡管這些模型的體積相對較小,但在各項測試中的表現卻非常出色,甚至超越了許多體積更大的競爭對手。這就好比一個身手敏捷的小個子選手在比賽中擊敗了眾多身材高大的對手,證明了技巧比單純的體量更重要。
一、代碼搜索的挑戰與機遇
在現代軟件開發中,程序員面臨著一個看似簡單卻極其復雜的問題:如何在海量的代碼中快速找到自己需要的部分。這個問題就像在一個巨大的工具箱中尋找特定的工具,而這個工具箱里的工具不僅數量龐大,而且每個工具的用途和特征都不盡相同。
傳統的代碼搜索主要依賴于關鍵詞匹配,這種方法就像只能通過工具的名稱來尋找工具一樣局限。當程序員想要尋找"能夠處理用戶登錄驗證的函數"時,他們往往需要猜測代碼中可能使用的具體變量名或函數名,這個過程既低效又不準確。更復雜的情況是,不同的程序員可能用完全不同的方式實現相同的功能,就像不同的廚師用不同的方法做同一道菜一樣。
代碼嵌入技術的出現為這個問題提供了新的解決思路。它的工作原理類似于為每段代碼創建一個獨特的"指紋",這個指紋不僅包含代碼的表面特征,還包含其深層的語義信息。當程序員用自然語言描述需求時,系統能夠理解這個描述的本質含義,并找到功能相似的代碼片段,即使這些代碼片段在表面上看起來完全不同。
然而,構建高質量的代碼嵌入模型面臨著一個根本性的挑戰:訓練數據的稀缺性。就像教一個學生理解文學作品需要大量的優質閱讀材料一樣,訓練代碼嵌入模型也需要大量高質量的配對數據,即自然語言描述與對應代碼片段的組合。但是,現實中這樣的配對數據非常有限,主要來源于代碼注釋、文檔字符串和一些教學示例,這些數據往往無法覆蓋復雜的實際開發場景。
研究團隊意識到,雖然高質量的配對數據稀缺,但互聯網上存在著海量的未配對代碼和自然語言文檔。這些資源就像散落在各處的珍貴材料,如果能夠巧妙地利用,就能為模型訓練提供豐富的養分。關鍵在于找到一種方法,讓模型能夠從這些看似無關的數據中學習到代碼和自然語言之間的深層聯系。
與此同時,現代AI開發環境的興起也為代碼嵌入技術的發展提供了新的動力。像Cursor和Claude Code這樣的AI驅動開發工具正在改變軟件工程的面貌,而代碼嵌入模型正是這些工具的關鍵基礎設施。這些工具需要能夠理解現有代碼庫的上下文、API使用模式和集成需求,然后生成符合項目規范的新代碼。這個過程天然地需要檢索增強生成架構的支持,其中嵌入模型承擔著關鍵的檢索組件角色。
二、創新的模型設計思路
面對傳統方法的局限性,研究團隊提出了一個頗具創新性的解決方案:不是從零開始構建代碼嵌入模型,而是改造已經在代碼生成任務上表現優異的大型語言模型。這種思路就像改造一個已經很擅長寫作的作家,讓他同時具備快速理解和分類文章的能力。
團隊選擇了Qwen2.5-Coder系列模型作為基礎架構。這些模型原本是自回歸解碼器,專門設計用于根據前面的內容逐個生成后續的代碼標記。就像一個經驗豐富的程序員能夠根據項目需求逐步編寫代碼一樣,這類模型在代碼生成方面已經展現出了強大的能力。研究團隊的巧思在于,既然這些模型已經深刻理解了代碼的結構和語義,那么它們同樣應該能夠生成高質量的代碼表示。
為了將生成式模型轉換為嵌入模型,研究團隊采用了"最后標記池化"技術。這種技術的工作原理類似于讓一個善于寫作的人在讀完一段文字后,用一句話總結其核心要點。具體來說,當模型處理完整個代碼片段后,它會將最后一個隱藏層的輸出作為整個代碼片段的向量表示。這個向量就像代碼的"身份證",包含了該代碼片段的所有重要信息。
研究團隊通過實驗發現,最后標記池化在他們的任務中表現最佳,超越了傳統的平均池化和最新的潛在注意力池化方法。這個發現很有趣,因為它表明對于代碼嵌入任務,模型在處理完所有輸入后的最終狀態包含了最豐富和最有用的信息。
為了讓模型能夠適應不同類型的代碼相關任務,研究團隊進行了詳細的任務分析,將代碼嵌入應用場景分為五個主要類別。第一類是自然語言到代碼的檢索,就像程序員說"我需要一個排序算法",系統能找到相應的排序代碼。第二類是技術問答,類似于在編程論壇中根據問題找到最合適的答案。第三類是代碼到代碼的檢索,幫助找到功能相似但實現不同的代碼片段。第四類是代碼到自然語言的檢索,能夠為給定的代碼找到最合適的注釋或文檔。第五類是代碼補全檢索,幫助程序員找到合適的代碼片段來完成未完成的代碼。
針對每個任務類別,研究團隊設計了專門的指令前綴。這些前綴就像給模型的工作指南,告訴它當前需要完成什么類型的任務。比如,當處理自然語言到代碼檢索任務時,查詢文本會被加上"根據以下查詢找到最相關的代碼片段"的前綴,而候選代碼則被加上"候選代碼片段"的前綴。這種設計讓模型能夠根據不同的任務需求調整其內部處理機制,從而提供更精準的結果。
這種基于預訓練代碼生成模型的方法帶來了顯著的優勢。首先,這些模型已經在大量代碼和文本數據上進行了預訓練,具備了豐富的編程知識和語言理解能力。其次,自回歸架構天然地適合處理變長序列,能夠很好地處理不同長度的代碼片段。最后,這種方法能夠更好地利用現有的模型資源,避免了從頭開始訓練大型模型的巨大成本。
三、精心設計的訓練策略
將一個代碼生成模型轉換為代碼嵌入模型,就像訓練一個原本專長于創作的作家同時具備文學批評和分類的能力。這個過程需要精心設計的訓練策略和高質量的訓練數據。
研究團隊采用了對比學習的訓練方法,使用InfoNCE損失函數作為核心訓練目標。這種訓練方式的核心思想類似于教一個學生通過比較來學習。在訓練過程中,模型會同時看到相關的查詢-文檔對和不相關的配對,學習將相關的內容在向量空間中拉近,將不相關的內容推遠。
具體的訓練過程就像一個精心編排的學習游戲。在每個訓練步驟中,系統會準備一批查詢-文檔對,比如自然語言問題和對應的代碼答案。模型需要為所有這些文本生成標準化的向量表示,然后計算所有查詢和文檔之間的余弦相似度。正確的配對應該具有高相似度,而錯誤的配對應該具有低相似度。通過不斷調整模型參數來優化這個目標,模型逐漸學會了識別語義相關性。
為了讓模型適應實際應用中的資源限制,研究團隊在訓練過程中引入了Matryoshka表示學習技術。這種技術就像制作俄羅斯套娃一樣,讓生成的向量具有多層次的表示能力。用戶可以根據自己的計算資源和精度要求,選擇使用向量的前128維、256維、512維或完整的768維。這種靈活性讓模型能夠在不同的應用場景中找到精度和效率之間的最佳平衡點。
訓練數據的收集和處理是另一個關鍵挑戰。研究團隊采用了多元化的數據來源策略,就像一個營養師為了保證營養均衡而從各種不同的食物中獲取養分。他們使用了MTEB代碼任務的訓練數據和CoSQA+數據集作為基礎,同時適配了多個公開數據集來滿足訓練需求。更重要的是,他們還利用GPT-4o生成了一些合成數據集,以填補真實數據稀缺的領域。
合成數據的生成過程體現了研究團隊的創新思維。他們發現某些領域的訓練數據極度稀缺,比如深度學習框架之間的代碼轉換。于是他們利用GPT-4o生成了SyntheticDLTrans數據集,包含了不同深度學習框架之間的代碼翻譯示例。他們還基于原有的CodeChef數據集,生成了多語言版本的編程解決方案,將原本只有C++和Python的解決方案擴展到了十種編程語言。
數據質量控制是訓練過程中不可忽視的環節。就像一個嚴格的質檢員會仔細檢查每件產品一樣,研究團隊對所有合成數據都進行了人工抽樣檢查,確保生成的示例符合質量標準。這種做法保證了訓練數據的可靠性,避免了因為低質量數據而導致的模型性能下降。
訓練過程的技術細節也經過了精心優化。研究團隊使用了相對較小的溫度參數0.05,這個參數控制著模型對相似度差異的敏感程度,較小的值讓模型能夠更好地區分細微的相似度差異。批次大小根據模型規模進行調整:0.5B參數模型使用512的批次大小,1.5B參數模型使用256的批次大小。序列長度統一設置為512,在處理效率和信息完整性之間取得了平衡。
整個訓練過程在四塊80GB顯存的A100 GPU上進行,0.5B參數模型的訓練耗時約8.3小時,1.5B參數模型耗時約12小時。這種相對較短的訓練時間體現了方法的高效性,證明了基于預訓練模型進行適配比從零開始訓練更加經濟實用。
四、全面的性能驗證
為了驗證新模型的實際效果,研究團隊進行了一系列全面的測試,就像一個新車型在上市前需要經過各種路況和使用場景的嚴格測試一樣。他們選擇了MTEB-CoIR基準測試作為主要評估平臺,這個基準包含了10個不同的任務,覆蓋了文本到代碼、代碼到文本、代碼到代碼以及混合代碼檢索等多種類型。
測試結果令人印象深刻。在25個不同的基準測試中,jina-code-embeddings模型展現出了穩定而優異的性能。0.5B參數版本的平均得分達到了78.41%,而1.5B參數版本的平均得分為79.04%。這個成績不僅超越了同等規模的通用嵌入模型Qwen3-Embedding-0.6B(73.49%),還超過了體積更大的jina-embeddings-v4模型(74.11%)和gemini-embedding-001模型(77.38%)。
在具體的任務表現上,新模型展現出了很好的全面性。在自然語言到代碼檢索任務中,模型能夠準確理解程序員的需求并找到合適的代碼片段。比如在MBPP任務中,兩個版本的模型都取得了89%以上的高分,證明了它們在理解編程問題描述和匹配相應解決方案方面的強大能力。
在代碼到代碼檢索任務中,模型同樣表現出色。CodeChef任務的結果特別引人注目,1.5B版本取得了96.89%的高分,顯著超越了其他競爭對手。這說明模型不僅能理解代碼的功能,還能識別不同實現方式之間的語義相似性。
技術問答任務的表現進一步驗證了模型的實用性。在StackOverflowQA這類真實世界問答場景中,模型能夠準確地將技術問題與相關答案匹配起來,這對于實際的開發工作具有重要意義。程序員經常需要在大量的技術討論和解決方案中找到與自己問題相關的內容,而這個模型恰好能夠勝任這項工作。
跨語言代碼檢索是另一個亮點。在CodeChefXLang任務中,兩個模型都取得了99%以上的驚人成績,證明了它們在理解不同編程語言中相同算法實現方面的卓越能力。這種能力對于需要在多種編程語言間進行代碼轉換或尋找類似實現的開發者來說極其有價值。
為了確保評估的全面性,研究團隊還在多個代碼相關的MTEB任務上進行了測試,包括Humaneval、DS-1000、WikiSQL等知名基準。這些測試覆蓋了從基礎編程能力到復雜數據科學任務的各個方面,結果顯示新模型在各個領域都保持了穩定的高性能表現。
特別值得注意的是模型的效率優勢。盡管在某些任務上可能略遜于更大規模的專業模型,但考慮到其相對較小的體積和更低的計算成本,jina-code-embeddings模型提供了極佳的性能價比。這種優勢在實際部署中尤為重要,因為許多應用場景需要在有限的計算資源下提供實時的代碼檢索服務。
研究團隊還進行了詳細的消融實驗,專門比較了不同池化方法的效果。他們發現最后標記池化確實是最佳選擇,在大部分任務上都優于平均池化和潛在注意力池化。這個發現為未來類似模型的設計提供了重要的指導原則。
五、實際應用的廣闊前景
jina-code-embeddings模型的成功不僅體現在基準測試的優異成績上,更重要的是它為實際的軟件開發工作開辟了新的可能性。這些可能性就像一扇通往更高效編程世界的大門,為開發者提供了前所未有的便利。
在現代集成開發環境中,智能代碼搜索已經成為提高開發效率的關鍵工具。傳統的搜索功能往往局限于簡單的文本匹配,而基于jina-code-embeddings的搜索系統能夠理解開發者的真實意圖。當程序員輸入"處理CSV文件并計算平均值"這樣的自然語言查詢時,系統能夠找到所有相關的代碼片段,無論這些代碼使用了什么具體的變量名或函數名。這種能力大大減少了開發者在代碼庫中尋找相關功能的時間。
代碼重構是軟件維護中的一項重要工作,而這個模型為重構工作提供了強大的支持。開發者可以利用模型的代碼到代碼檢索能力,快速找到項目中功能相似但實現不同的代碼片段。這種能力幫助識別重復代碼、發現重構機會,并確保重構后的代碼保持功能一致性。就像一個經驗豐富的建筑師能夠識別建筑中的結構問題并提出改進方案一樣,這個模型幫助程序員維護代碼庫的健康狀態。
在代碼審查環節,模型同樣發揮著重要作用。審查者可以利用模型快速找到類似的代碼實現,比較不同的解決方案,并確保新代碼符合項目的既定模式和最佳實踐。這種輔助不僅提高了代碼審查的效率,還有助于維護代碼庫的一致性和質量。
對于技術寫作和文檔維護,模型的代碼到自然語言檢索能力提供了寶貴支持。技術文檔作者可以利用這個功能為代碼片段自動生成初始的文檔說明,或者驗證現有文檔與代碼實現的一致性。當代碼發生變化時,系統能夠幫助識別需要更新的相關文檔部分。
教育領域是另一個重要的應用場景。編程教育者可以利用模型構建智能的代碼示例庫,學生能夠通過自然語言描述快速找到相關的編程示例。這種工具特別適合初學者,因為他們往往還不熟悉具體的編程術語,更傾向于用自然語言描述自己的需求。同時,教師也可以利用模型快速找到類似的編程練習和解決方案,為課程設計提供支持。
開源項目維護者面臨著管理大量代碼貢獻和問題報告的挑戰,而這個模型能夠幫助自動化部分維護工作。當新的問題報告提交時,系統能夠自動查找相關的代碼片段和歷史問題,為維護者提供上下文信息。這種自動化支持讓維護者能夠更快地理解問題本質并提供解決方案。
企業級應用場景中,模型可以集成到代碼資產管理系統中,幫助組織更好地利用其積累的代碼資源。大型企業往往擁有龐大的代碼庫,其中包含了多年來積累的業務邏輯和技術解決方案。通過智能代碼檢索,開發團隊可以更容易地發現和重用現有的代碼模塊,避免重復開發,提高整體的開發效率。
API文檔和示例管理是另一個有潛力的應用領域。API提供者可以利用模型構建智能的文檔搜索系統,幫助開發者快速找到相關的使用示例和最佳實踐。當開發者描述他們想要實現的功能時,系統能夠推薦最合適的API組合和實現模式。
跨團隊協作中,模型能夠充當知識共享的橋梁。不同團隊開發的代碼可能采用不同的編碼風格和命名約定,但模型能夠識別功能上的相似性,促進團隊間的代碼共享和學習。這種能力對于大型組織中的技術知識傳播具有重要意義。
隨著人工智能輔助編程工具的普及,jina-code-embeddings模型為這些工具提供了關鍵的基礎能力。無論是代碼生成、代碼補全還是智能重構,都需要準確理解代碼語義和上下文關系。這個模型的高效性和準確性使其非常適合集成到各種AI編程助手中,為開發者提供更智能的編程體驗。
說到底,這項研究真正做到了"小身材,大能量"。研究團隊巧妙地利用了已有的代碼生成模型,通過創新的訓練方法和精心的任務設計,創造出了一個既高效又實用的代碼搜索工具。它不需要龐大的計算資源就能提供出色的性能,這讓更多的開發者和組織能夠享受到智能代碼搜索的便利。
更重要的是,這項工作為代碼嵌入技術的發展指出了一條新的道路。它證明了利用預訓練模型進行任務適配是一個可行且高效的策略,這種思路可能會啟發更多類似的創新。隨著軟件開發變得越來越復雜,像jina-code-embeddings這樣的智能工具將變得越來越重要,它們不僅能夠提高開發效率,還能夠幫助開發者更好地理解和管理復雜的代碼庫。
對于那些對技術細節感興趣的讀者,建議直接查閱原論文以獲得更深入的理解。這項研究不僅在技術上有所創新,在實際應用方面也展現出了巨大的潛力。可以預見,隨著這類技術的不斷完善和普及,軟件開發的方式將會發生深刻的變化,程序員將能夠以更自然、更直觀的方式與代碼進行交互。
Q&A
Q1:jina-code-embeddings模型有什么特別之處?為什么比其他模型更有優勢?
A:jina-code-embeddings的特別之處在于它采用了全新的構建思路——基于專門的代碼生成模型進行改造,而不是從零開始訓練。這種方法讓模型既理解編程語言又懂自然語言,能夠準確理解程序員用日常語言描述的需求并找到匹配的代碼。盡管體積相對較小(只有0.5B和1.5B參數),但性能卻超越了許多更大的競爭對手,提供了極佳的性能價比。
Q2:普通程序員如何使用jina-code-embeddings?它能解決什么實際問題?
A:程序員可以將jina-code-embeddings集成到開發環境中,實現智能代碼搜索功能。它能解決很多實際問題:當你想找"處理用戶登錄驗證的函數"時,不需要猜測具體的函數名,直接用自然語言描述即可;在代碼審查時能快速找到類似實現進行對比;重構代碼時能識別功能重復的代碼片段;甚至能幫助找到不同編程語言中實現相同功能的代碼。
Q3:jina-code-embeddings的訓練數據來源是什么?如何保證質量?
A:訓練數據采用多元化來源策略,包括MTEB代碼任務數據、CoSQA+數據集、多個適配的公開數據集,以及使用GPT-4o生成的合成數據。對于數據稀缺的領域(如深度學習框架間的代碼轉換),團隊專門生成了合成數據集。所有合成數據都經過人工抽樣檢查確保質量,避免了因低質量數據導致的性能下降問題。





京公網安備 11011402013531號