【Agent】OpenManus-Prompt组件详细分析

news2025/3/20 17:26:56

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_PROMPT
    next_step_prompt: str = NEXT_STEP_PROMPT
  1. 提示词常量从相应模块导入
  2. 在智能体类定义中设置为类属性
  3. 可以在子类中覆盖或扩展

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_prompt
        else None,
        tools=self.available_tools.to_params(),
        tool_choice=self.tool_choices,
    )
  1. 如果存在下一步提示词,创建用户消息并添加到消息历史
  2. 调用 LLM 时,将系统提示词作为系统消息传递
  3. 同时传递工具参数和工具选择模式

3.3 动态提示词处理

# SWEAgent.think 方法中的动态提示词处理
async def think(self) -> bool:
    # Update working directory
    self.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()
  1. 获取当前工作目录
  2. 使用 format 方法填充提示词模板中的占位符
  3. 调用父类的 think 方法继续处理

3.4 规划流程中的提示词使用

# PlanningFlow._create_initial_plan 方法中的提示词使用
async def _create_initial_plan(self, request: str) -> None:
    # Create a system message for plan creation
    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}"
    )
    
    # Call LLM with PlanningTool
    response = await self.llm.ask_tool(
        messages=[user_message],
        system_msgs=[system_message],
        tools=[self.planning_tool.to_param()],
        tool_choice=ToolChoice.REQUIRED,
    )
  1. 创建特定于任务的系统消息
  2. 创建包含用户请求的用户消息
  3. 调用 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 messages
    if system_msgs:
        system_msgs = self.format_messages(system_msgs)
        messages = system_msgs + self.format_messages(messages)
    else:
        messages = self.format_messages(messages)
  1. 接收消息和系统消息作为参数
  2. 使用 format_messages 方法将消息转换为标准格式
  3. 将系统消息添加到消息列表的开头

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)
  1. 与 ask 方法类似的消息处理
  2. 额外传递工具参数和工具选择模式
  3. 支持超时和温度等参数

OpenManus 的提示词组件设计了一个灵活、模块化的提示词。通过将提示词与代码分离,同时保持紧密集成,它实现了提示词的可维护性和可扩展性。系统提示词和下一步提示词的组合,加上动态模板能力,使智能体能够适应各种任务和环境,同时保持一致的行为模式和交互风格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

swagger ui 界面清除登录信息的办法

我们在开发过程中,用swagger ui 测试接口的时候,可能会要修改当前登录的用户。 但是如果我们在谷歌中对调试的本地swagger ui 登录地址存储过账户密码,每次启动项目调试之后,都会自动登录swagger ui ,登录界面一闪就…

TensorFlow 的基本概念和使用场景

TensorFlow 是一个由 Google 开发的开源机器学习框架,主要用于构建和训练深度学习模型。下面是一些 TensorFlow 的基本概念和使用场景: 基本概念: 张量(Tensor):在 TensorFlow 中,数据以张量的…

基于x11vnc的ubuntu远程桌面

1、安装VNC服务 sudo apt install x11vnc -y2、创建连接密码 sudo x11vnc -storepasswd3、安装lightdm服务 x11vnc 在 默认的 GDM3 中不起作用,因此需要使用 lightdm 桌面管理环境 sudo apt install lightdm -y切换至lightdm,上一步已经切换则跳过该…

Cursor解锁Claude Max,助力AI编程新突破!

Cursor 最新推出的 Claude Max 模型,以其卓越的性能和创新的能力,正在重新定义我们对 AI 辅助编程的认知。这款搭载 Claude3.7 大脑的超级模型,不仅具备超强智能,还凭借一系列技术突破,向传统 AI 编程工具发起了挑战。…

ESP8266 与 ARM7 接口-LPC2148 创建 Web 服务器以控制 LED

ESP8266 与 ARM7 接口-LPC2148 创建 Web 服务器以控制 LED ESP8266 Wi-Fi 收发器提供了一种将微控制器连接到网络的方法。它被广泛用于物联网项目,因为它便宜、体积小且易于使用。 在本教程中,我们将 ESP8266 Wi-Fi 模块与 ARM7-LPC2148 微控制器连接,并创建一个 Web 服务…

通过C#脚本更改材质球的参数

// 设置贴图Texture mTexture Resources.Load("myTexture", typeof(Texture )) as Texture;material.SetTexture("_MainTex", mTexture );// 设置整数material.SetInt("_Int", 1);// 设置浮点material.SetFloat("_Float", 0.1f);// 设…

FPGA管脚约束

目录 前言 一、IO约束 二、延迟约束 前言 IO约束包括管脚约束和延迟约束。 一、IO约束 对管脚进行约束,对应的约束语句: set_property -dict {PACKAGE_PIN AJ16 IOSTANDARD LVCMOS18} [get_ports "led[0]" ] 上面是单端的管脚&…

实现前端.ttf字体包的压缩

前言 平常字体包都有1M的大小,所以网络请求耗时会比较长,所以对字体包的压缩也是前端优化的一个点。但是前端如果想要特点字符打包成字体包,网上查阅资料后,都是把前端代码里面的字符获取,但是对于动态的内容&#xf…

uni-app集成保利威直播、点播SDK经验FQ(二)|小程序直播/APP直播开发适用

通过uniapp集成保利威直播、点播SDK来开发小程序/APP的视频直播能力,在实际开发中可能会遇到的疑问和解决方案,下篇。更多疑问请咨询19924784795。 1.ios不能后台挂起uniapp插件 ios端使用后台音频播放和画中画功能,没有在 manifest.json 进…

Sensodrive机器人力控关节模组SensoJoint在海洋垃圾清理机器人中的拓展应用

海洋污染已成为全球性的环境挑战,其中海底垃圾的清理尤为困难。据研究,海洋中约有2600万至6600万吨垃圾,超过90%沉积在海底。传统上,潜水员收集海底垃圾不仅成本高昂,而且充满风险。为解决这一问题,欧盟资助…

Git的基本指令

一、回滚 1.git init 在项目文件夹中打开bash生成一个.git的子目录,产生一个仓库 2.git status 查看当前目录下的所有文件的状态 3.git add . 将该目录下的所有文件提交到暂存区 4.git add 文件名 将该目录下的指定文件提交到暂存区 5.git commit -m 备注信…

Vitis 2024.1 无法正常编译custom ip的bug(因为Makefile里的wildcard)

现象:如果在vivado中,添加了自己的custom IP,比如AXI4 IP,那么在Vitis(2024.1)编译导出的原本的.xsa的时候,会构建build失败。报错代码是: "Compiling blank_test_ip..."…

Elasticsearch 在航空行业:数据管理的游戏规则改变者

作者:来自 Elastic Adam La Roche 数字化客户体验不再是奢侈品,而是欧洲航空公司必不可少的需求。它推动了客户满意度,提升了运营效率,并创造了可持续的竞争优势。随着行业的不断发展,优先投资前沿数字技术和平台的航空…

DeepSeek 模型的成本效益深度解析:低成本、高性能的AI新选择

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

利用knn算法实现手写数字分类

利用knn算法实现手写数字分类 1.作者介绍2.KNN算法2.1KNN(K-Nearest Neighbors)算法核心思想2.2KNN算法的工作流程2.3优缺点2.4 KNN算法图示介绍 3.实验过程3.1安装所需库3.2 MNIST数据集3.3 导入手写数字图像进行分类3.4 完整代码3.5 实验结果 1.作者介…

基于springboot+vue的调查问卷平台

一、系统架构 前端:vue | element-ui | echarts 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. web端-问卷中心 04. web端-文章中心 05. 管理端-…

美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!

今年以来,DeepSeek凭借其强大的深度推理分析能力,在AI领域掀起新的热潮。美摄科技快速响应市场需求,迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型,为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…

网络编程之客户端聊天(服务器加客户端共三种方式)

最终效果&#xff1a; serve.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 只允许两个客户端 #define BUF_SIZE 1024i…

图莫斯TOOMOSS上位机TCANLINPro使用CAN UDS功能时 编写、加载27服务dll解锁算法文件

【本文发布于https://blog.csdn.net/Stack_/article/details/146303690&#xff0c;未经许可不得转载&#xff0c;转载须注明出处】 软件安装目录下找到如下压缩包&#xff0c;此为dll文件示例工程 使用VisualStudio打开工程GenerateKeyExImpl.vcxproj&#xff0c;可能会提示版…

vue+echarts实现饼图组件(实现左右联动并且数据量大时可滚动)

pieChart.vue(直接cv即可) <template><div class"rBox1"><div id"rBox1"></div></div> </template><script> export default {name: "pieChart",dicts: [],props: {subtext: {type: String,default…