Manus 內(nèi)部的 Context 工程經(jīng)驗(yàn)(精校、高亮要點(diǎn))

0 評(píng)論 1672 瀏覽 0 收藏 22 分鐘

構(gòu)建AI智能體時(shí),上下文工程是塑造其行為的核心。如何通過(guò)優(yōu)化KV緩存、動(dòng)態(tài)管理工具、利用文件系統(tǒng)拓展記憶等策略,讓智能體更高效、穩(wěn)定地運(yùn)轉(zhuǎn)?這些來(lái)自實(shí)踐的經(jīng)驗(yàn),或許能為智能體開(kāi)發(fā)提供關(guān)鍵指引。

Manus 團(tuán)隊(duì)剛分享了他們構(gòu)建 Agent 的 Context 工程經(jīng)驗(yàn)。

想來(lái)會(huì)對(duì)同樣做 Context 工程、Agent 開(kāi)發(fā)的朋友有所幫助。

剛好我在自己讀的過(guò)程中,對(duì)全文進(jìn)行了精校翻譯,并高亮要點(diǎn)與排版。來(lái)自一線的分享,總共 6 條經(jīng)驗(yàn),共 5K 字。

也提煉了一份思維導(dǎo)圖。不過(guò)還是建議直接閱讀,不要省流。

分享給你們,enjoy~

From:https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus

譯文:《 AI 智能體的上下文工程:構(gòu)建 Manus 的經(jīng)驗(yàn)》

2025 年 7 月 18 日,Peak @Manus

在 Manus 項(xiàng)目啟動(dòng)之初,我們面臨一個(gè)關(guān)鍵抉擇:

是應(yīng)該利用開(kāi)源基礎(chǔ)模型,訓(xùn)練一個(gè)端到端的智能體模型?還是基于前沿大模型已有的上下文學(xué)習(xí)(in-context learning)能力,構(gòu)建我們的智能體?

在我投身 NLP 領(lǐng)域的頭十年里,我們沒(méi)有這樣的選擇。

在遙遠(yuǎn)的 BERT 時(shí)代(沒(méi)錯(cuò),已經(jīng)過(guò)去七年了),模型必須經(jīng)過(guò)微調(diào)和評(píng)估,才能遷移到新任務(wù)上。即便那時(shí)的模型與今天的 LLM 相比小得可憐,但這個(gè)過(guò)程的每次迭代也常常需要數(shù)周時(shí)間。

我上一個(gè)創(chuàng)業(yè)項(xiàng)目給我留下了一個(gè)慘痛的教訓(xùn):對(duì)于快速迭代的應(yīng)用,尤其是還沒(méi)找到 PMF 之前,緩慢的反饋循環(huán)是致命的。

當(dāng)時(shí)我為開(kāi)放信息提?。∣pen information extraction)和語(yǔ)義搜索從零開(kāi)始訓(xùn)練模型。然而,GPT-3 和 Flan-T5 相繼問(wèn)世,我自研的模型一夜之間就過(guò)時(shí)了。頗具諷刺意味的是,也正是這些模型,開(kāi)啟了上下文學(xué)習(xí)的時(shí)代,并由此揭示了一條全新的路徑。

這個(gè)來(lái)之不易的教訓(xùn)讓我們的選擇變得清晰:Manus 決定押注在上下文工程上。

這讓我們能將改進(jìn)的發(fā)布周期從數(shù)周縮短到幾小時(shí),并使我們的產(chǎn)品與底層模型的發(fā)展保持“正交”關(guān)系:如果說(shuō)模型的進(jìn)步是水漲船高的浪潮,我們希望 Manus 成為潮頭上的船,而不是被固定在海底的石柱。

盡管如此,上下文工程的實(shí)踐遠(yuǎn)比想象的要復(fù)雜。

上下文工程是一門(mén)實(shí)驗(yàn)科學(xué)——我們已經(jīng)重構(gòu)了四次 Agent 的框架,每一次都是因?yàn)榘l(fā)現(xiàn)了塑造上下文的更優(yōu)方法。

我們親切地稱這個(gè)手動(dòng)進(jìn)行架構(gòu)搜索、調(diào)試提示詞和經(jīng)驗(yàn)猜測(cè)的過(guò)程為“隨機(jī)研究生下降法”(Stochastic Graduate Descent)。

雖然聽(tīng)起來(lái)不那么優(yōu)雅,但確實(shí)有效。

譯者注:“研究生”在學(xué)術(shù)界和科技界,常常與“做實(shí)驗(yàn)、調(diào)參數(shù)、熬夜、靠直覺(jué)和運(yùn)氣”等形象掛鉤,形容這個(gè)過(guò)程不是一個(gè)嚴(yán)謹(jǐn)、自動(dòng)化的數(shù)學(xué)優(yōu)化過(guò)程(如梯度下降),而是充滿了人工調(diào)試、反復(fù)試錯(cuò)和“體力活”的探索。

本文將分享我們通過(guò)自己的“SGD”找到的局部最優(yōu)解。如果你也在構(gòu)建自己的 AI Agent,希望這些原則能幫助你更快地收斂。

  • Manus:https://manus.im/
  • In-context learning:https://arxiv.org/abs/2301.00234
  • BERT:https://arxiv.org/abs/1810.04805
  • Open information extraction:https://en.wikipedia.org/wiki/Open_information_extraction
  • GPT-3:https://arxiv.org/abs/2005.14165
  • Flan-T5:https://arxiv.org/abs/2210.11416

1)圍繞 KV 緩存進(jìn)行設(shè)計(jì)

如果非要我只選一個(gè)指標(biāo),我會(huì)說(shuō) KV 緩存命中率 是生產(chǎn)環(huán)境中 AI 智能體最關(guān)鍵的單一指標(biāo)。它直接影響延遲和成本。

要理解其中緣由,我們先來(lái)看看典型 AI Agent (a typical agent)是如何運(yùn)作的:在收到用戶輸入后,智能體通過(guò)一系列的工具調(diào)用鏈來(lái)完成任務(wù)。在每次迭代中,模型根據(jù)當(dāng)前上下文,從預(yù)定義的動(dòng)作空間中選擇一個(gè)動(dòng)作。該動(dòng)作隨后在環(huán)境(例如 Manus 的虛擬機(jī)沙箱)中執(zhí)行,并產(chǎn)生一個(gè)觀測(cè)結(jié)果。這個(gè)動(dòng)作和觀測(cè)結(jié)果會(huì)被追加到上下文中,形成下一次迭代的輸入。這個(gè)循環(huán)持續(xù)進(jìn)行,直到任務(wù)完成。

你可以想象,上下文在每一步都會(huì)增長(zhǎng),而輸出通常是結(jié)構(gòu)化的 Function Call,相對(duì)較短。

與聊天機(jī)器人相比,這使得智能體中預(yù)填充(prefilling)和解碼(decoding)的比例嚴(yán)重傾斜。以 Manus 為例,其輸入與輸出的 token 數(shù)量比平均達(dá)到了 100:1。

幸運(yùn)的是,擁有相同前綴的上下文可以利用 KV 緩存(KV-cache)機(jī)制。

無(wú)論你是自部署模型還是調(diào)用推理 API,都能極大降低首個(gè) token 生成時(shí)間(TTFT)和推理成本。

這帶來(lái)的成本節(jié)約非同小可:以 Claude Sonnet 為例,命中緩存的輸入 token 成本為 0.30 美元/百萬(wàn) token,而未命中緩存的成本則為 3 美元/百萬(wàn) token——相差整整十倍。

從上下文工程的角度看,提升 KV 緩存命中率涉及幾個(gè)關(guān)鍵實(shí)踐:保持提示詞前綴的穩(wěn)定性。?由于大模型的自回歸(autoregressive)特性,哪怕只有一個(gè) token 的差異,也可能使緩存從該 token 之后開(kāi)始失效。一個(gè)容易犯的錯(cuò)誤是,在系統(tǒng)提示詞的開(kāi)頭包含時(shí)間戳(尤其是精確到秒的時(shí)間戳)。它確實(shí)能讓模型告訴你當(dāng)前時(shí)間,但也會(huì)直接破壞你的緩存命中率。只對(duì)上下文進(jìn)行追加(append-only)。?避免修改之前的動(dòng)作或觀測(cè)結(jié)果。確保你的序列化(serialization)過(guò)程是確定性的。許多編程語(yǔ)言和庫(kù)在序列化 JSON 對(duì)象時(shí),不保證鍵的順序是固定的,這會(huì)在不知不覺(jué)中破壞緩存。在需要時(shí)明確標(biāo)記緩存斷點(diǎn)。?一些模型提供商或推理框架不支持自動(dòng)的增量前綴緩存,而是需要手動(dòng)在上下文中插入緩存斷點(diǎn)。在分配斷點(diǎn)時(shí),要考慮到緩存可能的過(guò)期時(shí)間,并至少確保斷點(diǎn)包含在系統(tǒng)提示詞的末尾。

此外,如果你在使用 vLLM 等框架自部署模型,請(qǐng)確保啟用了 prefix / prompt caching ,并用 Session IDs 等技術(shù)保持分布式工作節(jié)點(diǎn)間的一致路由。

  • A typical agent:https://arxiv.org/abs/2210.03629
  • KV-cache:https://medium.com/@joaolages/kv-caching-explained-276520203249
  • Autoregressive:https://en.wikipedia.org/wiki/Autoregressive_model
  • vLLM:https://github.com/vllm-project/vllm
  • prefix / prompt caching:https://docs.vllm.ai/en/stable/design/v1/prefix_caching.html

2)遮蔽(Mask),而非移除

隨著智能體能力的增加,其動(dòng)作空間(action space)自然會(huì)變得愈發(fā)復(fù)雜。直白地說(shuō),就是工具的數(shù)量會(huì)爆炸式增長(zhǎng)。

最近 MCP 的流行更是火上澆油。如果你允許用戶配置工具,相信我:總會(huì)有人把你精心構(gòu)造的動(dòng)作空間里,塞進(jìn)上百個(gè)來(lái)歷不明的工具。其后果是,模型更容易選錯(cuò)行動(dòng)或采取低效路徑。

簡(jiǎn)而言之,你構(gòu)造出來(lái)的智能體反而會(huì)變笨。

一種自然的想法是設(shè)計(jì)一個(gè)動(dòng)態(tài)的動(dòng)作空間——比如類似 RAG 一樣,按需動(dòng)態(tài)加載工具。(我們?cè)?Manus 中也嘗試過(guò))

但我們的實(shí)驗(yàn)揭示了一條清晰的規(guī)則:除非絕對(duì)必要,否則避免在迭代中途動(dòng)態(tài)增刪工具。

主要原因有二:

1.?在大多數(shù)大模型中,工具定義在序列化后通常位于上下文的靠前位置,通常位于系統(tǒng)提示詞之前或之后。因此,任何更改都會(huì)導(dǎo)致后續(xù)所有動(dòng)作和觀測(cè)的 KV 緩存失效。

2.?當(dāng)此前的動(dòng)作和觀測(cè)仍然引用著當(dāng)前上下文中不再定義的工具時(shí),模型會(huì)感到困惑。如果沒(méi)有約束解碼(constrained decoding),這通常會(huì)導(dǎo)致模式違規(guī)或產(chǎn)生幻覺(jué)動(dòng)作。

為了解決這個(gè)問(wèn)題,同時(shí)又能優(yōu)化動(dòng)作選擇,Manus 使用一個(gè)上下文感知的狀態(tài)機(jī)(state machine)來(lái)管理工具的可用性。它并不移除工具,而是在解碼階段遮蔽掉 token logits,從而根據(jù)當(dāng)前上下文,阻止(或強(qiáng)制)模型選擇某些動(dòng)作。

在實(shí)踐中,大多數(shù)模型提供商和推理框架都支持某種形式的響應(yīng)預(yù)填充,這允許你在不修改工具定義的情況下約束動(dòng)作空間。

函數(shù)調(diào)用通常有三種模式(我們以 NousResearch 的 Hermes format 為例):自動(dòng)(Auto):模型可以選擇調(diào)用函數(shù),也可以不調(diào)用。通過(guò)僅預(yù)填充回復(fù)前綴實(shí)現(xiàn):<|im_start|>assistant必需(Required):模型必須調(diào)用一個(gè)函數(shù),但具體調(diào)用哪個(gè)不受限制。通過(guò)預(yù)填充至工具調(diào)用 token 實(shí)現(xiàn):<|im_start|>assistant<tool_call>指定(Specified):模型必須從一個(gè)特定的子集中調(diào)用函數(shù)。通過(guò)預(yù)填充至函數(shù)名的開(kāi)頭實(shí)現(xiàn):<|im_start|>assistant<tool_call>{“name”: “browser_

利用這一點(diǎn),我們通過(guò)直接遮蔽 token logits 來(lái)約束動(dòng)作選擇。

例如,當(dāng)用戶提供新輸入時(shí),Manus 必須立即回復(fù),而不是執(zhí)行動(dòng)作。

我們還有意地設(shè)計(jì)了具有一致性前綴的動(dòng)作名稱——例如,所有瀏覽器相關(guān)的工具都以 browser_ 開(kāi)頭,而命令行工具則以 shell_ 開(kāi)頭。這使得我們能夠在特定狀態(tài)下,輕松地強(qiáng)制智能體只能從某一類工具中進(jìn)行選擇,而無(wú)需使用有狀態(tài)的 logits 處理器。

這些設(shè)計(jì)有助于我們確保 Manus 的智能體 loop 在模型驅(qū)動(dòng)的架構(gòu)下,依然保持可靠穩(wěn)定。

  • MCP:https://modelcontextprotocol.io/introduction
  • RAG:https://en.wikipedia.org/wiki/Retrieval-augmented_generation
  • Constrained decoding:https://platform.openai.com/docs/guides/structured-outputs
  • State machine:https://en.wikipedia.org/wiki/Finite-state_machine
  • Hermes format:https://github.com/NousResearch/Hermes-Function-Calling

3)將文件系統(tǒng)作為上下文

現(xiàn)代前沿大模型如今已提供高達(dá) 128K 甚至更長(zhǎng)的上下文窗口。但在真實(shí)的智能體場(chǎng)景中,這往往還不夠,有時(shí)甚至是一種負(fù)擔(dān)。

這里有三個(gè)常見(jiàn)痛點(diǎn):

1.?觀測(cè)結(jié)果(Observations)可能極其龐大,尤其是當(dāng)智能體與網(wǎng)頁(yè)、PDF 等非結(jié)構(gòu)化數(shù)據(jù)交互時(shí),輕易就可能撐爆上下文長(zhǎng)度限制。

2.?即便窗口技術(shù)上支持,模型的性能在超過(guò)一定上下文長(zhǎng)度后往往會(huì)下降。

3.?長(zhǎng)輸入非常昂貴,即使有前綴緩存。你仍然需要為每個(gè) token 的傳輸和預(yù)填充付費(fèi)。

為應(yīng)對(duì)此問(wèn)題,許多智能體系統(tǒng)采用了上下文截?cái)嗷驂嚎s策略。

但過(guò)于激進(jìn)的壓縮不可避免地會(huì)導(dǎo)致信息丟失。這是一個(gè)根本性問(wèn)題:智能體的天性決定了它必須基于所有先前的狀態(tài)來(lái)預(yù)測(cè)下一個(gè)動(dòng)作,因?yàn)槟銦o(wú)法可靠地預(yù)測(cè)十步之后,之前的哪個(gè)觀測(cè)結(jié)果會(huì)變得至關(guān)重要。

從邏輯上講,任何不可逆的壓縮都伴隨著風(fēng)險(xiǎn)。

因此,我們將文件系統(tǒng)視為 Manus 的終極上下文:它容量無(wú)限,天然持久,并且智能體自身可直接操作。模型學(xué)習(xí)如何按需讀寫(xiě)文件——不僅是將文件系統(tǒng)用作存儲(chǔ),更是將文件系統(tǒng)當(dāng)作結(jié)構(gòu)化的外部記憶體。

我們的壓縮策略始終被設(shè)計(jì)為可恢復(fù)的。

例如,只要保留了網(wǎng)頁(yè)的 URL,其內(nèi)容就可以從上下文中丟棄;只要文檔在其沙箱中的路徑可用,其內(nèi)容也可以被省略。

這使得 Manus 可以在不永久丟失信息的前提下,縮減上下文長(zhǎng)度。

在開(kāi)發(fā)此功能時(shí),我常常思考,要讓一個(gè)狀態(tài)空間模型(SSM)在智能體場(chǎng)景中有效工作需要什么。與 Transformer 不同,SSM 缺乏全局注意力,難以處理長(zhǎng)程的回溯依賴。但如果它們能掌握基于文件的記憶——將長(zhǎng)期狀態(tài)外化,而不是保留在上下文中——那么它們的速度和效率或許能開(kāi)啟一類全新的智能體。具備智能體能力的 SSM,或許才是 Neural Turing Machines 真正的繼承者。

Neural Turing Machines:https://arxiv.org/abs/1410.5401

4)通過(guò)“復(fù)述”來(lái)操控注意力

如果你用過(guò) Manus,你可能已經(jīng)注意到一個(gè)有趣的現(xiàn)象:在處理復(fù)雜任務(wù)時(shí),它傾向于創(chuàng)建一個(gè)名為 todo.md 的文件,并隨著任務(wù)的進(jìn)展逐步更新它,勾掉已完成的項(xiàng)。

這并不僅僅是為了看起來(lái)“可愛(ài)”,而是一種精心設(shè)計(jì)的注意力操控機(jī)制。

在 Manus 中,一個(gè)典型任務(wù)平均需要約 50 次工具調(diào)用。

這是一個(gè)很長(zhǎng)的循環(huán)——由于 Manus 依賴大模型進(jìn)行決策,它很容易出現(xiàn)偏離主題或忘記早期目標(biāo)等問(wèn)題,尤其是在長(zhǎng)上下文或復(fù)雜任務(wù)中。

通過(guò)不斷重寫(xiě)待辦事項(xiàng)列表,Manus 實(shí)際上是在將任務(wù)目標(biāo)“復(fù)述”到上下文的末尾。

這會(huì)將全局計(jì)劃注入到模型的近期注意力范圍,從而避免“中間遺忘”(lost-in-the-middle)問(wèn)題,并減少目標(biāo)偏離。

實(shí)際上,它是在不依賴特殊架構(gòu)的情況下,用自然語(yǔ)言來(lái)引導(dǎo)自身的注意力,使其聚焦于任務(wù)目標(biāo)。

5)保留出錯(cuò)記錄

Agent 會(huì)犯錯(cuò)。這不是 bug,而是現(xiàn)實(shí)。

語(yǔ)言模型會(huì)產(chǎn)生幻覺(jué),環(huán)境會(huì)返回錯(cuò)誤,外部工具會(huì)出故障,各種意想不到的邊界情況層出不窮。

在多步任務(wù)中,失敗不是例外,而是循環(huán)的一部分。

然而,一種常見(jiàn)的沖動(dòng)是隱藏這些錯(cuò)誤:清理痕跡、重試動(dòng)作,或者重置模型狀態(tài),然后把它交給神奇的“溫度(Temperature)”。這似乎更安全、更可控。

但它是有代價(jià)的:消除失敗記錄,也就消除了過(guò)往的行動(dòng)證據(jù)。而沒(méi)有過(guò)往的行動(dòng)證據(jù),模型就無(wú)法適應(yīng)。

根據(jù)我們的經(jīng)驗(yàn),提升智能體行為最有效的方法之一簡(jiǎn)單得令人意外:將失敗的嘗試保留在上下文中。

當(dāng)模型看到一個(gè)失敗的動(dòng)作——以及由此產(chǎn)生的觀測(cè)結(jié)果或堆棧跟蹤(stack trace)——它會(huì)隱式地更新其內(nèi)部認(rèn)知,改變它對(duì)相似動(dòng)作的先驗(yàn)判斷,從而減少重復(fù)犯同樣錯(cuò)誤的可能性。

事實(shí)上,我們認(rèn)為錯(cuò)誤恢復(fù)能力是真正智能體行為最明確的標(biāo)志之一。

然而,在多數(shù)學(xué)術(shù)研究和公開(kāi)基準(zhǔn)測(cè)試中,這一點(diǎn)仍然沒(méi)有得到充分的體現(xiàn),它們往往只關(guān)注理想條件下的任務(wù)成功率。

Temperature:https://arxiv.org/abs/2405.00492

6)不要陷入 Few-Shot 陷阱

Few-shot Prompting 是一種改進(jìn)大模型輸出的常用技術(shù)。但在 Agent 系統(tǒng)中,它可能會(huì)以一些微妙的形式,適得其反。

語(yǔ)言模型是出色的模仿者,它們會(huì)模仿上下文中的行為模式。

如果你的上下文中充滿了相似的“動(dòng)作-觀測(cè)結(jié)果”對(duì),模型就會(huì)傾向于遵循這種模式,即便這種模式已不再是最佳選擇。

這在涉及重復(fù)性決策或動(dòng)作的任務(wù)中可能很危險(xiǎn)。

例如,在使用 Manus 協(xié)助審閱 20 份簡(jiǎn)歷時(shí),智能體常常會(huì)陷入一種慣性節(jié)奏——僅僅因?yàn)樗谏舷挛闹锌吹搅祟愃频男袨椋筒粩嘀貜?fù)相似的動(dòng)作。這會(huì)導(dǎo)致行為漂移、過(guò)度泛化,有時(shí)甚至產(chǎn)生幻覺(jué)。

解決方法是增加多樣性。

Manus 會(huì)在動(dòng)作和觀測(cè)結(jié)果中引入少量結(jié)構(gòu)化的變動(dòng)——使用不同的序列化模板、變換措辭、在順序或格式上引入微小的噪音。這種受控的隨機(jī)性有助于打破模式,調(diào)整模型的注意力。

換言之,不要讓自己陷入“少樣本”的思維定勢(shì)中。

上下文的模式越單一,智能體的行為就越脆弱。

Few-shot Prompting:https://www.promptingguide.ai/techniques/fewshot

結(jié)語(yǔ)

上下文工程仍是一門(mén)新興的學(xué)科,但對(duì)于 Agent 系統(tǒng)而言,它已至關(guān)重要。

模型也許會(huì)變得更強(qiáng)、更快、更便宜,但無(wú)論原始能力有多強(qiáng),都無(wú)法取代對(duì)記憶、環(huán)境和反饋的需求。

你如何塑造上下文,最終定義了智能體的行為方式:它的運(yùn)行速度、恢復(fù)能力以及擴(kuò)展的潛力。

在 Manus,我們通過(guò)反復(fù)的重構(gòu)、失敗的嘗試以及面向數(shù)百萬(wàn)用戶的真實(shí)世界測(cè)試,才學(xué)到了這些經(jīng)驗(yàn)。

我們?cè)诖朔窒淼囊磺胁⒎鞘欠胖暮6詼?zhǔn)的真理,但這些模式對(duì) Manus 行之有效。

如果它們能幫你哪怕只減少一次痛苦的迭代,這篇文章的目的就達(dá)到了。

智能體的未來(lái),將由一個(gè)個(gè)上下文構(gòu)建而成。

Engineer them well~

本文由人人都是產(chǎn)品經(jīng)理作者【一澤Eze】,微信公眾號(hào):【一澤Eze】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來(lái)自Unsplash,基于 CC0 協(xié)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!