動態脈絡探索
程式開發 Agent 正在快速改變軟體的開發方式。它們之所以能迅速進步,來自更強大的代理型模型,以及更好的脈絡工程來引導其行為。
Cursor 的 Agent harness——也就是我們提供給模型的一組指令與工具——會針對我們支援的每一個新的前沿模型單獨最佳化。不過,仍有一些適用於所有在我們 harness 中運行的模型的脈絡工程改進空間,例如我們如何收集脈絡,以及如何在長程互動軌跡中最佳化 token 使用。
隨著模型在扮演 Agent 角色方面變得更強,我們發現預先提供較少細節更容易達成良好效果,能讓 Agent 更輕鬆地主動擷取相關脈絡。我們將這種模式稱為 動態脈絡探索(dynamic context discovery),用以對比總是一開始就被納入的 靜態脈絡(static context)。
用於動態上下文探索的檔案
動態上下文探索在 token 使用上效率高得多,因為只會將必要的資料載入到上下文視窗中。它也能透過減少可能令人困惑或互相矛盾的資訊,來提升 Agent 的回應品質。
以下是我們在 Cursor 中使用動態上下文探索的方式:
- 將過長的工具回應轉為檔案
- 在摘要時參照聊天紀錄
- 支援 Agent Skills 開放標準
- 僅高效載入實際需要的 MCP 工具
- 將所有已整合的終端機工作階段視為檔案
1. 將冗長的工具回應轉成檔案
工具呼叫可能會因為回傳龐大的 JSON 回應而大幅增加 context window。
對於 Cursor 裡的第一方工具,例如編輯檔案和搜尋程式碼庫,我們可以透過聰明的工具定義與精簡的回應格式來避免 context 膨脹,但第三方工具(例如 shell 指令或 MCP 呼叫)在預設情況下並不會自動獲得同樣的處理。
多數程式碼代理程式的常見做法是截斷過長的 shell 指令或 MCP 結果。這可能導致資料遺失,其中可能包含你希望保留在 context 中的重要資訊。在 Cursor 中,我們改為將輸出寫入檔案,並讓代理程式可以讀取它。代理程式會呼叫 tail 來檢查結尾,若有需要再讀取更多內容。
這使得在接近 context 上限時,不必要的摘要次數明顯減少。
2. 在摘要過程中引用對話紀錄
當模型的 context window 被填滿時,Cursor 會觸發一個摘要步驟,讓 Agent 在全新的 context window 中取得截至目前為止工作的摘要。
但由於摘要本質上是對 context 的有損壓縮,Agent 的知識在摘要之後可能會變得不完整,甚至遺忘任務中的關鍵細節。在 Cursor 中,我們將對話紀錄視為檔案來使用,以提升摘要的品質。


在達到 context window 的上限之後,或是使用者選擇手動進行摘要時,我們會為 Agent 提供一個指向歷史檔案的引用。如果 Agent 發現自己需要更多在摘要中遺漏的細節,它可以在歷史紀錄中搜尋並取回這些資訊。
3. 支援 Agent Skills 開放標準
Cursor 支援 Agent Skills,這是一個用來擴充程式開發代理、讓其具備專門能力的開放標準。與其他型別的 Rules 類似,Skills 是由檔案定義的,這些檔案會告訴代理如何執行特定領域的任務。
Skills 也包含名稱與描述,這些可以作為「靜態上下文」放入 system prompt 中。之後代理可以進行動態上下文探索,透過像 grep 和 Cursor 的 semantic search 等工具載入相關的 Skills。
Skills 也可以打包與任務相關的可執行檔或腳本。由於它們只是檔案,代理可以很容易找到與某個特定 Skill 相關的內容。
4. 僅載入真正需要的 MCP 工具以提升效率
MCP 能協助透過 OAuth 存取受保護的資源,例如正式環境日誌、外部設計檔案,或企業內部的情境資訊與文件。
有些 MCP 伺服器會包含許多工具,而且往往附有很長的說明,這會大幅膨脹 context window。即使這些工具大多不會被使用,它們仍然會一直被包含在 prompt 中。如果你同時使用多個 MCP 伺服器,這個問題會更加嚴重。
要期待每個 MCP 伺服器都自行為此最佳化並不切實際。我們認為,降低 context 使用量應該是編碼 Agent 的責任。在 Cursor 中,我們透過將工具說明同步到資料夾的方式,支援 MCP 的動態 context 探索。1
Agent 現在只會接收一小部分靜態 context,其中包含工具名稱,並在任務需要時再去查找對應工具。在一個 A/B 測試中,我們發現,在有呼叫 MCP 工具的執行中,這個策略將 Agent 的 token 總使用量減少了 46.9%(統計上顯著,但會隨已安裝 MCP 數量有高度變異)。


這種以檔案為基礎的做法也帶來了能夠向 Agent 傳達 MCP 工具狀態的好處。比如,以前如果某個 MCP 伺服器需要重新驗證,Agent 會完全「忘記」那些工具,讓使用者一頭霧水。現在,它就能主動提醒使用者重新驗證。
5. 將所有整合終端機工作階段視為檔案
與其需要將終端機工作階段的輸出複製貼上到 Agent 的輸入中,Cursor 現在會將整合終端機的輸出同步到本機檔案系統。
這讓你可以輕鬆地詢問「為什麼我的指令會失敗?」並讓 Agent 理解你在指的是什麼。由於終端機歷史紀錄可能很長,Agent 可以只對相關輸出使用 grep 搜尋,這對於像伺服器這種長時間執行程序產生的日誌特別有用。
這與以 CLI 為基礎的程式碼代理所看到的情境相同:它們會將先前的 shell 輸出納入情境中考量,但這些輸出是動態發現的,而不是靜態注入的。
簡單抽象
目前還不清楚檔案是否會成為以 LLM 為基礎工具的最終介面。
但隨著程式編寫代理快速進步,檔案一直是簡單且強大的基本原語(primitive),而且比起再發明一個無法完全因應未來的抽象層,檔案是更安全的選擇。敬請期待我們在這個領域將分享的更多令人興奮的新進展。
這些改進將在未來幾週內向所有使用者全面開放。這篇部落格文章中描述的技術是許多 Cursor 團隊成員共同努力的成果,包括 Lukas Moller、Yash Gaitonde、Wilson Lin、Jason Ma、Devang Jhabakh,以及 Jediah Katz。如果你有興趣使用 AI(人工智慧)來解決最困難、最具野心的程式設計任務,非常歡迎和我們聯繫。請寄信到 hiring@cursor.com 與我們聯絡。
- 我們曾考慮採用「工具搜尋」的做法,但那會把工具分散在一個扁平的索引中。相反地,我們為每個伺服器建立一個資料夾,讓每個伺服器的工具在邏輯上維持成組。當模型列出某個資料夾時,它會同時看到該伺服器的所有工具,並能將它們理解為一個具整體性的單位。檔案也能帶來更強大的搜尋能力。代理可以使用完整的
rg參數,甚至利用jq來篩選工具描述。 ↩