解密prompt系列56.Agent context Engineering - 單智能體代碼剖析
近期關(guān)于智能體設(shè)計(jì)有諸多觀點(diǎn),一個(gè)關(guān)鍵點(diǎn)讓我豁然開朗——無論智能體是1個(gè)還是多個(gè),是編排驅(qū)動(dòng)還是自主決策,是靜態(tài)預(yù)定義還是動(dòng)態(tài)生成,Context上下文的管理機(jī)制始終是設(shè)計(jì)的核心命脈。它決定了:每個(gè)節(jié)點(diǎn)使用哪些信息?分別更新或修改哪些信息?多步驟間如何傳遞?智能體間是否共享、如何共享?后續(xù)篇章我們將剖析多個(gè)熱門開源項(xiàng)目,一探它們?nèi)绾务{馭Context。本章聚焦單智能體設(shè)計(jì),選取兩個(gè)代表性框架:模仿OpenAI深度研究范式的Gemini-fullstack(編排式)與模仿Manus的OpenManus(自主式)。
框架對(duì)比
先來整體對(duì)比下兩個(gè)框架,這樣懶得看細(xì)節(jié)的盆友們就可以只看下表了~
| 特性 | Gemini Deep Search (編排式) | OpenManus Flow Mode (規(guī)劃式自主) | OpenManus Manus Mode (純自主) |
|---|---|---|---|
| 智能體類型 | 單智能體,編排驅(qū)動(dòng) | 單智能體,全局規(guī)劃 + 分步ReAct循環(huán) | 單智能體,ReAct循環(huán) |
| 任務(wù)分解 | 固定流程節(jié)點(diǎn) | 全局Plan | 動(dòng)態(tài)思考下一步(Think) |
| Context 范圍 | 節(jié)點(diǎn)級(jí)隔離 (每節(jié)點(diǎn)用特定輸入) | Step級(jí)隔離 (每Step用Plan狀態(tài)+當(dāng)前任務(wù)) | 線性增長(zhǎng)+窗口截?cái)?/strong> (全歷史) |
| Context 傳遞 | 傳遞任務(wù)結(jié)果 (Query列表, 摘要文本) | 外層:傳遞Plan狀態(tài) + Step結(jié)果字符串;內(nèi)層全部歷史 | 傳遞完整ReAct歷史 (截?cái)嗪? |
| 狀態(tài)管理 | 無顯式狀態(tài),依賴數(shù)據(jù)流 | 顯式Plan & Step狀態(tài)管理 | 隱含在消息歷史中 |
| 優(yōu)勢(shì) | 流程清晰可控,模塊化,引用處理優(yōu)雅 | 步驟Context輕量,潛在減少迭代次數(shù) | 靈活性高 |
| 挑戰(zhàn) | 靈活性較低,節(jié)點(diǎn)間“思考”不共享 | Plan質(zhì)量依賴(或需要?jiǎng)討B(tài)調(diào)整),Step間Context隔離可能導(dǎo)致信息斷層/沖突 | Context膨脹,長(zhǎng)程依賴易丟失,多輪消息會(huì)引入噪音 |
Gemini Deep Search- 編排智能體
Gemini Deep Search 是一個(gè)典型的編排式智能體。其執(zhí)行流程預(yù)先定義,核心在于引入了反思節(jié)點(diǎn),用于動(dòng)態(tài)判斷信息收集是否充分。流程清晰簡(jiǎn)潔:

圖釋:Gemini Deep Search的核心編排流程,包含查詢生成、并行搜索、反思評(píng)估、路由決策和最終答案生成五個(gè)關(guān)鍵節(jié)點(diǎn),通過反思節(jié)點(diǎn)實(shí)現(xiàn)循環(huán)控制。
1. 查詢生成(Generate Query)

- 核心亮點(diǎn):將“思考過程”工具化/結(jié)構(gòu)化輸出。
- 使用Pydantic模型強(qiáng)制輸出包含查詢列表(query)和推理依據(jù)(rationale)
class SearchQueryList(BaseModel):
query: List[str] = Field(
description="A list of search queries to be used for web research."
)
rationale: str = Field(
description="A brief explanation of why these queries are relevant to the research topic."
)
實(shí)際應(yīng)用中會(huì)發(fā)現(xiàn)把 思考工具化(結(jié)構(gòu)化) 有很多優(yōu)點(diǎn):
- 模型無關(guān)性: 不依賴模型的“思考”原生能力,任何支持結(jié)構(gòu)化輸出的模型皆可。
- 簡(jiǎn)潔可控: 結(jié)構(gòu)化輸出比模型自由生成的思考通常更簡(jiǎn)短、更聚焦,避免冗余和發(fā)散。。
2. 并行搜索+摘要(Web_research)

然后就是基于多個(gè)query的并行搜索模塊這里直接使用了Langgraph自帶的Send多線程并發(fā)模式,然后直接讓大模型基于檢索上文進(jìn)行總結(jié)。這里可參考不多,因?yàn)橐蒙傻冗壿嬙贕emini的API中,用開源模型的盆友需要重新適配。
不過有意思的是現(xiàn)在如何給模型推理插入引用,原來多數(shù)都是在指令中加入要求,讓模型一邊推理一邊生成引用序號(hào)[i]([citation:i]),不過在新的模型能力下有了很多天馬星空的方案。像Claude給出過先直接進(jìn)行無引用推理,然后再讓模型重新基于推理結(jié)果,在不修改原文的基礎(chǔ)上,插入引用的markdown鏈接。
這里Google是直接推理API中集成了類似能力,哈哈我也沒用過Gemini的API,不過看代碼,應(yīng)該是類似以下的結(jié)構(gòu), 會(huì)通過結(jié)構(gòu)化推理(哈哈Google很愛用結(jié)構(gòu)化推理,其實(shí)個(gè)人也覺得不論是工具還是Function Calling或者是Thinking,最底層的對(duì)接方案還是結(jié)構(gòu)化推理),返回引用序號(hào)列表對(duì)應(yīng)的文字段落的起止位置。
# Gemini API響應(yīng)結(jié)構(gòu)
response.candidates[0].grounding_metadata = {
"grounding_supports": [
{
"segment": {"start_index": 0, "end_index": 50},
"grounding_chunk_indices": [0, 1, 2]
}
],
"grounding_chunks": [
{
"web": {
"uri": "https://example.com/page1",
"title": "Example Page 1"
}
}
]
}
考慮到這里涉及兩次模型推理,第一次就是每個(gè)query的搜索總結(jié),第二次是最終基于所有總結(jié)段落的二次匯總推理。因此這里項(xiàng)目在本次推理(第一次)中把citation以markdown超鏈接的格式插回到了原文中,這樣二次推理可以直接生成引用鏈接。(URL進(jìn)行了縮寫,降低推理token和copy出錯(cuò)的可能性)
3. 反思評(píng)估(Reflection)

- 評(píng)估當(dāng)前收集的摘要信息是否足以回答用戶問題。
- 同樣采用結(jié)構(gòu)化輸出,個(gè)人實(shí)踐的優(yōu)化點(diǎn): 可擴(kuò)展Reflection模型,加入reasoning字段,讓模型先分析“回答用戶需要什么信息?”、“當(dāng)前已有哪些信息?”,再做出判斷和提出補(bǔ)充查詢,使決策更透明、依據(jù)更充分。
class Reflection(BaseModel):
is_sufficient: bool = Field(
description="Whether the provided summaries are sufficient to answer the user's question."
)
knowledge_gap: str = Field(
description="A description of what information is missing or needs clarification."
)
follow_up_queries: List[str] = Field(
description="A list of follow-up queries to address the knowledge gap."
)
4. 決策路由(Router)

- 根據(jù)Reflection節(jié)點(diǎn)的輸出 (is_sufficient) 和預(yù)設(shè)的最大循環(huán)次數(shù),決定流程走向(繼續(xù)搜索Generate Query或進(jìn)入Finalize Answer)。
- Context管理:此節(jié)點(diǎn)本身不修改Context,僅基于Reflection的Context進(jìn)行流程控制。
5. 生成最終答案(Finalize Answer)

- 匯總所有步驟收集到的摘要信息(已包含Markdown引用鏈接)
- 進(jìn)行最終推理,生成回答,并保留摘要中已嵌入的引用信息。
Context管理
Gemini的Context管理
- 模塊化隔離: 每個(gè)節(jié)點(diǎn)聚焦特定任務(wù),使用特定的Context輸入(如Generate Query只用原始Query,Web Research用特定Query列表,Reflection用所有摘要)。
- 無狀態(tài)傳遞: 節(jié)點(diǎn)間不共享“推理狀態(tài)”上下文(如之前的思考過程),主要傳遞任務(wù)結(jié)果(Query列表、摘要文本)。
OpenManus - 自主智能體
OpenManus 提供了兩種模式:Manus Mode(基礎(chǔ)ReAct)和Flow Mode(規(guī)劃驅(qū)動(dòng))。雖然項(xiàng)目將Flow稱為“多智能體”,但從Context管理角度看,更像是單智能體的兩種任務(wù)分解策略:Manus是局部規(guī)劃+即時(shí)執(zhí)行,F(xiàn)low是全局規(guī)劃(Plan)+分步執(zhí)行(Manus)。
Manus 模式:經(jīng)典ReAct循環(huán)

Manus模式本質(zhì)是ReAct循環(huán):思考(Think)->行動(dòng)(Act)->觀察(Observe),循環(huán)執(zhí)行直至任務(wù)完成。核心流程:
- Think: 基于當(dāng)前Context(用戶問題+歷史消息+可用工具描述),模型決定下一步動(dòng)作(調(diào)用哪個(gè)工具及其參數(shù))。
- Act: 執(zhí)行所選工具(如browser-use進(jìn)行復(fù)雜網(wǎng)頁交互操作、文本編輯器)。
- Observe: 將工具執(zhí)行結(jié)果作為ToolMessage加入Context。
- 循環(huán)上述步驟,直到Think選擇終止工具。
Manus的Context管理
線性增長(zhǎng): 整個(gè)任務(wù)由一個(gè)智能體完成,Context隨執(zhí)行步驟線性增長(zhǎng),每一步都使用前置的所有message信息。
Flow 模式

Flow的核心思想是引入全局Plan規(guī)劃器。在當(dāng)前模型能力下,先規(guī)劃再執(zhí)行有助于:
- 簡(jiǎn)化步驟Context: 每個(gè)Manus步驟只需關(guān)注當(dāng)前Step和Plan狀態(tài),上下文更輕量。
- 減少迭代次數(shù): 全局視野可能降低智能體陷入局部循環(huán)的概率。
- 潛在挑戰(zhàn): 步驟間Context隔離可能導(dǎo)致信息重復(fù)/沖突;全局規(guī)劃器傳遞任務(wù)時(shí)可能丟失細(xì)節(jié)(Context Gap)。
Plan工具設(shè)計(jì) (核心): Plan本身通過結(jié)構(gòu)化工具實(shí)現(xiàn)管理:
- 兩層結(jié)構(gòu): Plan -> Steps。
- 操作完備: 創(chuàng)建(Create)、更新(Update)、列表(List)、獲取(Get)、激活(Set Active)、標(biāo)記步驟狀態(tài)(Mark Step)、刪除(Delete)
- 狀態(tài)跟蹤: Step狀態(tài)包括未開始(not_started)、進(jìn)行中(in_progress)、完成(completed)、阻塞(blocked)。
- 核心參數(shù)示例如下
class PlanningTool(BaseTool):
"""
A planning tool that allows the agent to create and manage plans for solving complex tasks.
The tool provides functionality for creating plans, updating plan steps, and tracking progress.
"""
name: str = "planning"
description: str = _PLANNING_TOOL_DESCRIPTION
parameters: dict = {
"type": "object",
"properties": {
"command": {
"description": "The command to execute. Available commands: create, update, list, get, set_active, mark_step, delete.",
"enum": [
"create",
"update",
"list",
"get",
"set_active",
"mark_step",
"delete",
],
"type": "string",
},
"plan_id": {
"description": "Unique identifier for the plan. Required for create, update, set_active, and delete commands. Optional for get and mark_step (uses active plan if not specified).",
"type": "string",
},
"title": {
"description": "Title for the plan. Required for create command, optional for update command.",
"type": "string",
},
"steps": {
"description": "List of plan steps. Required for create command, optional for update command.",
"type": "array",
"items": {"type": "string"},
},
"step_index": {
"description": "Index of the step to update (0-based). Required for mark_step command.",
"type": "integer",
},
"step_status": {
"description": "Status to set for a step. Used with mark_step command.",
"enum": ["not_started", "in_progress", "completed", "blocked"],
"type": "string",
},
"step_notes": {
"description": "Additional notes for a step. Optional for mark_step command.",
"type": "string",
},
},
"required": ["command"],
"additionalProperties": False,
}
下面我們來看下Plan創(chuàng)建、遍歷、更新的整個(gè)流程
- 創(chuàng)建初始Plan (create_initial_plan):
- 基于用戶Query生成Plan (Steps)。
- Prompt設(shè)計(jì)的幾個(gè)亮點(diǎn)關(guān)鍵詞: 簡(jiǎn)潔有力,強(qiáng)調(diào)關(guān)鍵里程碑(Key Milestones)、可行動(dòng)性(Actionable)、清晰度(Clarity)、效率(Efficiency)。
system_message = Message.system_message(
"You are a planning assistant. Create a concise, actionable plan with clear steps. "
"Focus on key milestones rather than detailed sub-steps. "
"Optimize for clarity and efficiency."
)
# Create a user message with the request
user_message = Message.user_message(
f"Create a reasonable plan with clear steps to accomplish the task: {request}"
)
- 效果評(píng)估: 生成的Plan結(jié)構(gòu)(Plan-Step兩層)清晰,但內(nèi)容質(zhì)量(步驟邏輯、并行性)較基礎(chǔ),有優(yōu)化空間。

- 執(zhí)行Plan (execute):
- 按順序遍歷Plan中的每個(gè)Step。
- 將當(dāng)前Step標(biāo)記為in_progress。
- 調(diào)用execute_step執(zhí)行當(dāng)前Step。
- 執(zhí)行單個(gè)Step (execute_step):
- 為當(dāng)前Step實(shí)例化一個(gè)Manus智能體。
- 關(guān)鍵Context注入:這里同時(shí)提供全部plan status能解決(一部分)有些步驟模型會(huì)發(fā)散把多個(gè)步驟一起做了導(dǎo)致重復(fù)或者沖突的問題。
- 當(dāng)前任務(wù): "You are now working on step {index}: '{step_text}'"
- 全局狀態(tài): "CURRENT PLAN STATUS: {plan_status}" (包含所有Steps的狀態(tài))
step_prompt = f"""
CURRENT PLAN STATUS:
{plan_status}
YOUR CURRENT TASK:
You are now working on step {self.current_step_index}: "{step_text}"
Please execute this step using the appropriate tools. When you're done, provide a summary of what you accomplished.
"""
- 所有Plan執(zhí)行完成進(jìn)入?yún)R總階段:會(huì)基于原始生成的所有Plan的執(zhí)行狀態(tài),讓模型給出一份匯總
Flow的Context管理
- 分層Context: 全局Plan狀態(tài) vs. 單個(gè)Step執(zhí)行Context。
- 智能體隔離: 每個(gè)Step由獨(dú)立的Manus智能體執(zhí)行,其Context主要包含:Plan全局狀態(tài) + 當(dāng)前Step描述 + 當(dāng)前Step執(zhí)行歷史 (ReAct循環(huán))。
- 狀態(tài)共享: Plan Status(所有Step狀態(tài))作為只讀Context傳遞給每個(gè)執(zhí)行Step的Manus智能體,有助于緩解步驟間沖突。
- 信息傳遞: Step間不直接共享詳細(xì)推理/操作Context,僅通過Plan Status的宏觀狀態(tài)(完成/阻塞)和最終結(jié)果字符串進(jìn)行間接傳遞。
Reference
- how we build our multi-agent system: Claude給出的多智能體構(gòu)建智能
- Don't build multi-agents:Devin創(chuàng)始人指出的多智能構(gòu)建中的一些坑
想看更全的大模型論文·微調(diào)預(yù)訓(xùn)練數(shù)據(jù)·開源框架·AIGC應(yīng)用 >> DecryPrompt

無論智能體是1個(gè)還是多個(gè),是編排驅(qū)動(dòng)還是自主決策,是靜態(tài)預(yù)定義還是動(dòng)態(tài)生成,Context上下文的管理機(jī)制始終是設(shè)計(jì)的核心命脈。它決定了:每個(gè)節(jié)點(diǎn)使用哪些信息?分別更新或修改哪些信息?多步驟間如何傳遞?智能體間是否共享、如何共享?后續(xù)篇章我們將剖析多個(gè)熱門開源項(xiàng)目,一探它們?nèi)绾务{馭Context。
浙公網(wǎng)安備 33010602011771號(hào)