1. 提示詞架構概述
OpenManus 的提示詞組件采用了模塊化設計,為不同類型的智能體提供專門的提示詞模板。每個提示詞模塊通常包含兩種核心提示詞:系統提示詞(System Prompt)和下一步提示詞(Next Step Prompt)。這種設計使得提示詞可以獨立于智能體代碼進行管理和優化,同時保持了提示詞與智能體之間的緊密集成。
2. 提示詞類型與設計
2.1 系統提示詞 (System Prompt)
設計特點:
- 定義智能體的角色、能力和行為邊界
- 設置智能體的整體行為模式和交互風格
- 通常較為簡潔,專注于角色定義
- 在智能體初始化時設置,整個會話期間保持不變
使用場景:
- 在智能體初始化時設置基礎行為模式
- 在 LLM 調用時作為系統消息傳遞
2.2 下一步提示詞 (Next Step Prompt)
設計特點:
- 指導智能體在每個步驟中的決策和行動
- 提供可用工具的詳細說明和使用指南
- 通常較為詳細,包含具體指令和約束
- 在每個思考步驟中使用,可以動態更新
使用場景:
- 在每個
think
方法調用前添加到消息歷史 - 引導智能體選擇合適的工具和行動
- 提供上下文信息和決策指南
2.3 模板提示詞 (Template Prompt)
設計特點:
- 包含占位符,可以在運行時動態填充
- 支持格式化字符串語法
- 適用于需要動態內容的場景
使用場景:
- SWE 智能體中的工作目錄和文件信息
- 規劃流程中的步驟執行提示
3. 提示詞調用流程
3.1 智能體初始化
# 在智能體類定義中設置提示詞
class Manus(ToolCallAgent):system_prompt: str = SYSTEM_PROMPTnext_step_prompt: str = NEXT_STEP_PROMPT
- 提示詞常量從相應模塊導入
- 在智能體類定義中設置為類屬性
- 可以在子類中覆蓋或擴展
3.2 思考過程中的提示詞使用
# ToolCallAgent.think 方法中的提示詞使用
async def think(self) -> bool:if self.next_step_prompt:user_msg = Message.user_message(self.next_step_prompt)self.messages += [user_msg]response = await self.llm.ask_tool(messages=self.messages,system_msgs=[Message.system_message(self.system_prompt)]if self.system_promptelse None,tools=self.available_tools.to_params(),tool_choice=self.tool_choices,)
- 如果存在下一步提示詞,創建用戶消息并添加到消息歷史
- 調用 LLM 時,將系統提示詞作為系統消息傳遞
- 同時傳遞工具參數和工具選擇模式
3.3 動態提示詞處理
# SWEAgent.think 方法中的動態提示詞處理
async def think(self) -> bool:# Update working directoryself.working_dir = await self.bash.execute("pwd")self.next_step_prompt = self.next_step_prompt.format(current_dir=self.working_dir)return await super().think()
- 獲取當前工作目錄
- 使用 format 方法填充提示詞模板中的占位符
- 調用父類的 think 方法繼續處理
3.4 規劃流程中的提示詞使用
# PlanningFlow._create_initial_plan 方法中的提示詞使用
async def _create_initial_plan(self, request: str) -> None:# Create a system message for plan creationsystem_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 requestuser_message = Message.user_message(f"Create a reasonable plan with clear steps to accomplish the task: {request}")# Call LLM with PlanningToolresponse = await self.llm.ask_tool(messages=[user_message],system_msgs=[system_message],tools=[self.planning_tool.to_param()],tool_choice=ToolChoice.REQUIRED,)
- 創建特定于任務的系統消息
- 創建包含用戶請求的用戶消息
- 調用 LLM 時傳遞這些消息和工具參數
4. LLM 接口中的提示詞處理
4.1 消息格式化
# LLM.ask 方法中的消息處理
async def ask(self,messages: List[Union[dict, Message]],system_msgs: Optional[List[Union[dict, Message]]] = None,stream: bool = True,temperature: Optional[float] = None,
) -> str:# Format system and user messagesif system_msgs:system_msgs = self.format_messages(system_msgs)messages = system_msgs + self.format_messages(messages)else:messages = self.format_messages(messages)
- 接收消息和系統消息作為參數
- 使用 format_messages 方法將消息轉換為標準格式
- 將系統消息添加到消息列表的開頭
4.2 工具調用提示詞處理
# LLM.ask_tool 方法中的工具提示詞處理
async def ask_tool(self,messages: List[Union[dict, Message]],system_msgs: Optional[List[Union[dict, Message]]] = None,timeout: int = 300,tools: Optional[List[dict]] = None,tool_choice: TOOL_CHOICE_TYPE = ToolChoice.AUTO,temperature: Optional[float] = None,**kwargs,
):# 類似的消息處理邏輯# 加上工具參數和工具選擇模式if system_msgs:system_msgs = self.format_messages(system_msgs)messages = system_msgs + self.format_messages(messages)else:messages = self.format_messages(messages)
- 與 ask 方法類似的消息處理
- 額外傳遞工具參數和工具選擇模式
- 支持超時和溫度等參數
OpenManus 的提示詞組件設計了一個靈活、模塊化的提示詞。通過將提示詞與代碼分離,同時保持緊密集成,它實現了提示詞的可維護性和可擴展性。系統提示詞和下一步提示詞的組合,加上動態模板能力,使智能體能夠適應各種任務和環境,同時保持一致的行為模式和交互風格。