发布时间:2026/6/16 11:58:21
Agent Scope Java 2.x 系列【19】Harness:系统提示词
文章目录1. 前言2. 总体流程3. 基础提示词3.1 设置方式3.2 存储位置4. Transformer 链实现4.1 源码入口4.2 反射检测4.3 串行执行4.4 系统提示词中间件4.4.1 WorkspaceContextMiddleware4.4.2 TaskReminderMiddleware4.4.3 PlanModeMiddleware4.4.4 HarnessSkillMiddleware4.4.5 SubagentsMiddleware通过 onReasoning4.5 最终 System Prompt 结构5. 生命周期要点分析AgentScope Harness中System Prompt的组装、注入和生命周期管理机制。1. 前言系统提示词System Prompt是给大模型底层预设的固定指令优先级高于用户每一轮提问相当于提前给AI定好身份、规则、能力边界、输出规范全程生效。在构建HarnessAgent时指定了一个简单的系统提示词HarnessAgentagentHarnessAgent.builder().name(harness-demo).description(HarnessAgent Demo).sysPrompt(你是一个中文 AI 助手).model(model).workspace(workspacePath).maxIters(5).build();在进行对话时可以看到当前AI回复的内容包含了更强大的能力说明AgentScope框架内部对系统提示词进行了增强处理2. 总体流程System Prompt通过Transformer 链逐层组装最终注入到LLM推理的SYSTEM消息中。HarnessAgent.builder().sysPrompt(你是 AI 助手) │ ▼ ReActAgent.sysPrompt ← 存储基础提示词 │ ▼ seedSystemMsg() 被调用每次推理前 │ ▼ applySystemPromptMiddlewares(base, ctx) ← Transformer 链逐层变换 │ ├─→ custom MW1.onSystemPrompt() ├─→ custom MW2.onSystemPrompt() ├─→ WorkspaceContextMiddleware ← Session / Workspace / AGENTS / MEMORY / knowledge ├─→ TaskReminderMiddleware ← todo_write 使用说明 ├─→ PlanModeMiddleware ← Plan Mode 横幅 └─→ HarnessSkillMiddleware ← 技能列表 (available_skills) │ ▼ SystemMessage → 注入 reasoning 的消息列表首位关键设计seedSystemMsg()在每轮推理前被调用所以修改AGENTS.md或MEMORY.md立即生效Transformer链通过反射检测——只有真正重写了onSystemPrompt的中间件才参与变换避免不必要的block()调用3. 基础提示词3.1 设置方式HarnessAgent.builder().sysPrompt(你是一个有用的 AI 助手可以用中文回答问题。).build();3.2 存储位置sysPrompt存储在ReActAgent实例中// ReActAgent.javaprivatefinalStringsysPrompt;// BuilderpublicBuildersysPrompt(StringsysPrompt){this.sysPromptsysPrompt;returnthis;}4. Transformer 链实现4.1 源码入口在Agent每轮调用前都会通知所有钩子函数智能体即将启动其中会调用seedSystemMsg方法/** * 获取初始系统消息用于在钩子执行前填充至{link PreCallEvent}。 * * p默认实现返回{code null}。子类例如{code ReActAgent}会重写该方法 * 根据自身配置的{code sysPrompt}构建系统消息。 * * param callScope 调用入口捕获的单次调用作用域可为{code null} * 子类可通过该参数获取本次调用的{link RuntimeContext}用于系统提示词中间件 * 无需读取共享实例字段 * return 初始填充用系统消息无则返回{code null} */OverrideprotectedMsgseedSystemMsg(ObjectcallExectution){RuntimeContextrccallExectutioninstanceofCallExecutionce?ce.rc:getRuntimeContext();StringbasesysPrompt!null?sysPrompt.trim():;StringpromptapplySystemPromptMiddlewares(base,rc);if(promptnull||prompt.isEmpty()){returnnull;}returnSystemMessage.builder().name(system).content(TextBlock.builder().text(prompt).build()).build();}seedSystemMsg方法中会调用私有的applySystemPromptMiddlewares方法按顺序执行所有系统提示词中间件对原始系统提示词sysPrompt做拦截、修改、增强若无自定义中间件逻辑直接返回原提示词避免不必要的异步阻塞。// ReActAgent.java:536-569privateStringapplySystemPromptMiddlewares(Stringprompt,RuntimeContextctx){if(middlewares.isEmpty()){returnprompt;}// 通过反射检测哪些 middleware 真正重写了 onSystemPromptbooleanhasOverridefalse;for(MiddlewareBasemw:middlewares){if(mw.getClass().getMethod(onSystemPrompt,Agent.class,RuntimeContext.class,String.class).getDeclaringClass()!MiddlewareBase.class){hasOverridetrue;break;}}if(!hasOverride){returnprompt;// 短路没有任何 middleware 重写直接返回}// 从左到右串行接力MonoStringresultMono.just(prompt);for(MiddlewareBasemw:middlewares){resultresult.flatMap(p-mw.onSystemPrompt(this,ctx,p));}returnresult.block();}applySystemPromptMiddlewares方法的入参是【基础提示词】、【运行时上下文】4.2 反射检测通过反射检测哪些middleware真正重写了onSystemPrompt方法没有任何middleware重写直接返回// 注释翻译仅当至少一个中间件重写了onSystemPrompt方法时才构建响应式异步链路// 基类默认实现是直接入参原样返回该判断是为了避免无意义的block()阻塞调用// block()在非阻塞调度器如Reactor并行调度器中会抛出异常booleanhasOverridefalse;// 遍历全部中间件for(MiddlewareBasemw:middlewares){try{// 反射获取 onSystemPrompt(Agent, RuntimeContext, String) 方法// getDeclaringClass()获取该方法实际定义的类// 如果 ! MiddlewareBase说明子类重写了该方法存在自定义处理逻辑if(mw.getClass().getMethod(onSystemPrompt,Agent.class,RuntimeContext.class,String.class).getDeclaringClass()!MiddlewareBase.class){hasOverridetrue;break;}}catch(NoSuchMethodExceptionignored){// 极端异常找不到该方法视为存在自定义逻辑hasOverridetrue;break;}}关键设计MiddlewareBase是中间件基类自带默认onSystemPrompt逻辑为直接返回入参prompt无任何修改用反射判断中间件子类是否重写了该方法如果所有中间件都用基类默认实现 →hasOverridefalse直接返回原始prompt不走异步流程目的规避block()阻塞Reactor异步环境下随意调用block()会报错、破坏非阻塞性能。默认配置下自动装载了以下中间件4.3 串行执行当存在重写了onSystemPrompt方法的中间件时会构建异步处理链路串行执行中间件// 封装原始prompt为响应式Mono流MonoStringresultMono.just(prompt);// 循环串联所有中间件的onSystemPrompt串行执行// flatMap异步链式调用上一个中间件输出作为下一个输入for(MiddlewareBasemw:middlewares){resultresult.flatMap(p-mw.onSystemPrompt(this,ctx,p));}// 阻塞等待全部中间件异步处理完成拿到最终字符串返回returnresult.block();}Middleware列表按注册顺序排列onSystemPrompt从左到右串行接力原始 prompt → mw[0].onSystemPrompt → mw[1].onSystemPrompt → ... → 最终 prompt自定义 Middleware 跑在最前面因为HarnessAgent先注册用户Middleware再注册内置Middleware。4.4 系统提示词中间件所有中间件中有5个重写了onSystemPrompt方法WorkspaceContextMiddlewareDynamicSkillMiddlewareHarnessSkillMiddlewarePlanModeMiddlewareTaskReminderMiddleware在自动默认装载的8个只有2个按照执行顺序排列WorkspaceContextMiddlewareHarnessSkillMiddleware4.4.1 WorkspaceContextMiddleware核心作用自动向原始系统提示词尾部拼接工作区上下文片段工作空间路径、Agent配置、记忆、知识库、会话信息等同时做Token截断控长避免超出模型上下文窗口。重写onSystemPrompt钩子方法OverridepublicMonoStringonSystemPrompt(Agentagent,RuntimeContextctx,StringcurrentPrompt){// 兜底空上下文传入ctx为空则使用空白运行时上下文RuntimeContextrcctx!null?ctx:RuntimeContext.empty();// 组装工作区完整上下文段落StringsectionbuildWorkspaceSection(rc);// 无上下文内容直接返回原始提示词不做修改if(section.isEmpty()){returnMono.just(currentPrompt);}// 原始提示词兜底为空串StringbasecurrentPrompt!null?currentPrompt:;// 换行分隔符原始文本末尾已有换行则不加否则补换行排版整洁Stringseparatorbase.isEmpty()||base.endsWith(\n)?:\n;// 原始提示词 分隔换行 工作区上下文段落返回异步MonoreturnMono.just(baseseparatorsection);}核心上下文构建逻辑读取各类静态资源文件内容Token预算计算 记忆内容截断关键控长逻辑拼装所有模块生成完整附加段落privateStringbuildWorkspaceSection(RuntimeContextrc){// 读取工作区 agents.md、memory.md、knowledge.md 内容并去除首尾空白StringagentsContentworkspaceManager.readAgentsMd(rc).strip();StringmemoryContentworkspaceManager.readMemoryMd(rc).strip();StringknowledgeContentworkspaceManager.readKnowledgeMd(rc).strip();// 获取当前工作空间根路径PathworkspaceworkspaceManager.getWorkspace();// 构建会话专属上下文片段StringsessionContextbuildSessionContextSection(workspace,rc);// 封装知识库块文本StringknowledgeBlockbuildKnowledgeBlock(rc,knowledgeContent,workspace);// 扩展附加上下文自定义全局变量、权限、用户信息等StringadditionalBlockbuildAdditionalContextBlock(rc);// 计算固定占用Token会话信息、Agent配置、知识库、附加上下文intfixedTokensestimateTokens(sessionContext)estimateTokens(agentsContent)estimateTokens(knowledgeBlock)estimateTokens(additionalBlock);// 记忆文件单独Token消耗intmemoryTokensestimateTokens(memoryContent);// 剩余可用Token额度 最大上下文Token上限 - 固定内容占用量intavailablemaxContextTokens-fixedTokens;// 剩余额度充足但记忆文本超量 → 截断记忆内容至可用Token上限if(available0memoryTokensavailable){memoryContenttruncateToTokenBudget(memoryContent,available);// 工作空间描述段落路径、文件系统信息StringworkspaceParagraphbuildWorkspaceParagraph(workspace,workspaceManager.getFilesystem());// 整合四大块加载资源Agent配置、裁剪后记忆、知识库、附加上下文StringloadedContextbuildLoadedContextSection(agentsContent,memoryContent,knowledgeBlock,additionalBlock,rc);// 最终拼接会话上下文 固定引导模板 工作空间说明 所有加载资源returnassembleSection(sessionContext,GUIDANCE_TEMPLATE,workspaceParagraph,loadedContext);}组装结构## AgentStateStore Context This is the HarnessAgent. Todays date is 日期. My operating system is: OS The workspace directory is: 路径 The projects temporary directory is: 临时目录 ## Domain Knowledge / Memory Recall / Memory Persistence 引导段 内置模板教模型如何使用记忆系统和知识库 ## Workspace 按 filesystem 模式分支本机 / 沙箱 / 远端 ## Workspace Files (Injected) The following files were loaded from your workspace: loaded_context agents_context AGENTS.md 全文 /agents_context memory_context MEMORY.md超出 maxContextTokens 则截断 /memory_context domain_knowledge_context KNOWLEDGE.md 全文 knowledge/ 下所有文件路径清单 /domain_knowledge_context soul_mdadditionalContextFile 注入的额外文件/soul_md /loaded_context关键参数maxContextTokens默认8000控制MEMORY.md的注入预算。4.4.2 TaskReminderMiddleware仅在Builder未禁用Task功能时注册。onSystemPrompt注入todo_write工具的静态使用说明## Task List You have a todo_write tool that maintains a structured task list for this session. Use it for multi-step work: capture the plan as todos, keep exactly one task in_progress, and update the whole list as you make progress...onReasoning每轮推理前注入当前Todo列表的system-reminder块。4.4.3 PlanModeMiddlewarePLAN 模式注入只读设计阶段的提示横幅system-reminder PLAN MODE is active (read-only). Plan file: plans/PLAN.md Investigate the problem and draft a plan, but do NOT modify files... /system-reminderBUILD 模式刚从PLAN切出注入执行提示system-reminderYou have switched from PLAN to BUILD mode; the read-only restriction is lifted. An approved plan exists at plans/PLAN.md... /system-reminder4.4.4 HarnessSkillMiddleware注入当前可见技能列表渲染为available_skills块available_skills - code-reviewer: 代码评审专家 - pdf-extractor: Extract text from PDF documents /available_skills只列namedescriptionAgent判断相关后通过load_skill_through_path拉取完整指令。技能来源低优先级 → 高优先级重名覆盖projectGlobalSkillsDir(Path)— 项目全局skillRepository(...)— 市场后端Git/Nacos/MySQL/classpathworkspace/skills/— 工作区共用userId/skills/— 用户隔离4.4.5 SubagentsMiddleware通过 onReasoning不走onSystemPromptTransformer链而是通过onReasoning直接修改SYSTEM消息内容——将子Agent使用指南prepend到消息列表首条SYSTEM消息中## Subagents You have access to subagent tools for spawning and coordinating isolated subagents. ### Agent Tools - agent_spawn / agent_send / agent_list ### Available agent ids - reviewer: 代码评审专家 - researcher: 技术调研助手 ### When to use subagents / When NOT to use...4.5 最终 System Prompt 结构经过所有Transformer链处理后一次典型推理的最终SYSTEM消息结构如下[HarnessAgent.builder().sysPrompt(...)] ← 基础提示词 [自定义 Middleware 注入] ← 如果有 ## AgentStateStore Context ← WorkspaceContextMiddleware Todays date is ... My operating system is ... ## Domain Knowledge ← WorkspaceContextMiddleware ## Memory Recall ## Memory Persistence ## Workspace ← WorkspaceContextMiddleware Project: ... Workspace: ... ## Workspace Files (Injected) ← WorkspaceContextMiddleware loaded_context agents_contextAGENTS.md 全文/agents_context memory_contextMEMORY.md 全文受预算截断/memory_context domain_knowledge_contextKNOWLEDGE.md 路径清单/domain_knowledge_context /loaded_context ## Task List ← TaskReminderMiddleware todo_write 使用说明 system-reminderPLAN MODE is active.../system-reminder ← PlanModeMiddleware如开启 available_skills ← HarnessSkillMiddleware - skill-a: ... - skill-b: ... /available_skills5. 生命周期要点每轮推理前重新组装修改AGENTS.md、MEMORY.md、技能仓库后下一次call()立即生效不需要重启Agent。Transformer 链是同步阻塞的applySystemPromptMiddlewares()最后调用result.block()这意味着所有onSystemPrompt中的异步操作必须在返回前完成。实际内置Middleware的onSystemPrompt都是同步返回Mono.just()。自定义 Middleware 跑在最前面HarnessAgent先注册用户.middleware()的实例再注册内置Middleware。用户的onSystemPrompt可以看到最原始的sysPrompt。SubagentsMiddleware 的特殊性它不走onSystemPromptTransformer链而是通过onReasoning直接操作消息列表中的SYSTEM消息。这是因为子Agent信息需要在每轮推理前动态刷新文件系统可能随时新增子Agent声明而onSystemPrompt链只在seedSystemMsg时执行一次。

相关新闻

【Kafk源码解读和使用指南】第87篇:电商订单系统的Kafka实战——从下单到通知的完整消息链路设计
2026/6/16 11:58:21

【Kafk源码解读和使用指南】第87篇:电商订单系统的Kafka实战——从下单到通知的完整消息链路设计

上一篇【第86篇】Kafka Tool工具链深度解析——这些官方工具你都用对了吗 下一篇【第88篇】日志收集平台的Kafka实战——百亿日志的接入、传输与清洗 摘要 电商系统的订单处理是一个典型的异步消息驱动场景——用户下了一个单,背后涉及库存扣减、支付处理、物流配送…

阅读更多
Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程
2026/6/16 10:58:21

Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程

Windows驱动存储清理终极指南:DriverStoreExplorer完全使用教程 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾经发现Windows系统盘空间越来越小,却不知…

阅读更多
python对文件夹里所有压缩文件zip解压(转载)
2026/6/16 10:58:21

python对文件夹里所有压缩文件zip解压(转载)

python对文件夹里所有压缩文件zip解压_zip ctf python 多层解压-CSDN博客

阅读更多
nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具
2026/6/16 12:58:21

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70AI工具 【免费下载链接】flake A Nix flake for many AI projects 项目地址: https://gitcode.com/gh_mirrors/fl/flake nixified.ai 是一个革命性的开源项目,它通过 Nix 打包技术为 AI 开发者…

阅读更多
多维动态聚合:金融场景下可解释的实时指标构建
2026/6/16 12:58:21

多维动态聚合:金融场景下可解释的实时指标构建

1. 项目概述:为什么多维聚合不是“加个groupby”那么简单我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到后来在Spark上跑PB级交易流水,再到如今带团队设计实时风险指标引擎——所有这些活儿,…

阅读更多
大模型MoE稀疏激活原理与工程实践全解析
2026/6/16 12:58:21

大模型MoE稀疏激活原理与工程实践全解析

1. 项目概述:大模型参数规模与“稀疏激活”真相的实操拆解你可能在各种技术社区、AI资讯平台甚至朋友圈里反复看到这句话:“GPT-4有1.8万亿参数,但每次只用其中2%”。它像一句科技圈的都市传说,简洁有力,自带传播力——…

阅读更多
一个被忽略的行草范本:傅山这轴六言诗,藏着“行气不断”的密码,新手也能用
2026/6/16 12:58:21

一个被忽略的行草范本:傅山这轴六言诗,藏着“行气不断”的密码,新手也能用

练行草大半年,我最崩溃的不是笔画写不像——是整行字跟断了气似的,一个一个字往外蹦。明明原帖是“缠”在一起的,我写出来就成了排队领盒饭。后来老师看了一眼我的练习纸,说了句话:“你这叫‘抄字’,不叫‘临帖’。你看傅山,人家字和字之间是搂着腰写的。”哎,一句话让…

阅读更多
JD_AutoComment:让电商评价告别机械重复,体验智能自动化新境界
2026/6/16 12:58:21

JD_AutoComment:让电商评价告别机械重复,体验智能自动化新境界

JD_AutoComment:让电商评价告别机械重复,体验智能自动化新境界 【免费下载链接】jd_AutoComment 自动评价,仅供交流学习之用 项目地址: https://gitcode.com/gh_mirrors/jd/jd_AutoComment 在电商购物体验中,商品评价扮演着至关重要的…

阅读更多
终极指南:如何用Legacy-iOS-Kit让你的旧iPhone重获新生
2026/6/16 11:58:21

终极指南:如何用Legacy-iOS-Kit让你的旧iPhone重获新生

终极指南:如何用Legacy-iOS-Kit让你的旧iPhone重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/16 0:39:53

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)
2026/6/16 0:57:58

2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)

(先给结论,节省时间) 只想最快把简历“拉到及格线更贴JD”:优先从 鹅来面 开始——先做简历评分与岗位匹配度,再按建议改一版可投递稿。投递量很大、需要职位管理:偏向 Teal(职位追踪 多份简历…

阅读更多
Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)
2026/6/16 0:57:58

Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法
2026/6/16 0:57:58

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memre…

阅读更多
GIT修改用户名
2026/6/16 5:55:51

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/15 2:21:34

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/15 21:13:35

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多