prompts.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. """
  2. Agent 系统 Prompt 集中管理
  3. 本文件集中管理 Agent 系统中使用的所有 prompt 模板,
  4. 包括 runner.py、compaction.py、subagent.py、knowledge.py 等文件中的 prompt。
  5. ## 📑 目录索引
  6. ### 1. 系统级 Prompt (行 50+)
  7. - DEFAULT_SYSTEM_PREFIX # Agent 基础系统提示
  8. ### 2. 研究流程 Prompt (行 60+)
  9. - RESEARCH_STAGE_PROMPT_TEMPLATE # 调研阶段引导
  10. - PLANNING_STAGE_PROMPT # 计划阶段引导
  11. - RESEARCH_DECISION_GUIDE_TEMPLATE # 调研决策阶段引导
  12. ### 3. 压缩相关 Prompt (行 110+)
  13. - COMPRESSION_EVAL_PROMPT_TEMPLATE # Level 2 压缩与经验评估
  14. - REFLECT_PROMPT # 经验反思提取
  15. - SUMMARY_HEADER_TEMPLATE # 压缩后的摘要头部
  16. ### 4. 工具执行 Prompt (行 180+)
  17. - TRUNCATION_HINT # 响应截断提示
  18. - TOOL_INTERRUPTED_MESSAGE # 工具执行中断提示
  19. - AGENT_INTERRUPTED_SUMMARY # Agent 中断摘要
  20. - AGENT_CONTINUE_HINT_TEMPLATE # Agent 继续执行提示
  21. ### 5. 任务生成 Prompt (行 200+)
  22. - TASK_NAME_GENERATION_SYSTEM_PROMPT # 任务名称生成
  23. - TASK_NAME_FALLBACK # 默认任务名称
  24. ### 6. 经验管理 Prompt (行 210+)
  25. - EXPERIENCE_ENTRY_TEMPLATE # 经验条目格式
  26. - EXPERIENCE_SUMMARY_WITH_RESULTS # 有结果的经验摘要
  27. - EXPERIENCE_SUMMARY_NO_RESULTS # 无结果的经验摘要
  28. - EXPERIENCE_PARSE_WARNING # 经验解析警告
  29. ### 7. 辅助函数 - 基础 Prompt 构建 (行 240+)
  30. - build_research_stage_prompt() # 构建调研阶段 prompt
  31. - build_research_decision_guide() # 构建调研决策引导
  32. - build_compression_eval_prompt() # 构建压缩评估 prompt
  33. - build_summary_header() # 构建摘要头部
  34. - build_tool_interrupted_message() # 构建工具中断消息
  35. - build_agent_continue_hint() # 构建 Agent 继续提示
  36. - build_experience_entry() # 构建经验条目
  37. ### 8. 子 Agent 相关 Prompt (行 320+)
  38. - EVALUATE_PROMPT_TEMPLATE # 评估任务 prompt
  39. - DELEGATE_RESULT_HEADER # 委托任务结果头部
  40. - DELEGATE_SAVED_KNOWLEDGE_HEADER # 保存知识头部
  41. - DELEGATE_STATS_HEADER # 执行统计头部
  42. - EXPLORE_RESULT_HEADER # 探索结果头部
  43. - EXPLORE_BRANCH_TEMPLATE # 探索分支模板
  44. - EXPLORE_STATUS_SUCCESS # 成功状态
  45. - EXPLORE_STATUS_FAILED # 失败状态
  46. - EXPLORE_STATUS_ERROR # 错误状态
  47. - EXPLORE_SUMMARY_HEADER # 探索总结头部
  48. ### 9. 辅助函数 - 子 Agent Prompt 构建 (行 380+)
  49. - build_evaluate_prompt() # 构建评估 prompt
  50. ### 10. 知识管理相关 Prompt (行 400+)
  51. - KNOWLEDGE_SEMANTIC_ROUTE_PROMPT_TEMPLATE # 知识语义路由
  52. - KNOWLEDGE_EVOLVE_PROMPT_TEMPLATE # 知识进化重写
  53. - KNOWLEDGE_SLIM_PROMPT_TEMPLATE # 知识库瘦身
  54. ### 11. 辅助函数 - 知识管理 Prompt 构建 (行 450+)
  55. - build_knowledge_semantic_route_prompt() # 构建知识路由 prompt
  56. - build_knowledge_evolve_prompt() # 构建知识进化 prompt
  57. - build_knowledge_slim_prompt() # 构建知识瘦身 prompt
  58. ## 🔍 快速查找
  59. **按使用场景查找:**
  60. - 研究流程:第 2 节
  61. - 对话压缩:第 3 节
  62. - 工具调用:第 4 节
  63. - 经验管理:第 6 节
  64. - 子 Agent:第 8 节
  65. - 知识管理:第 10 节
  66. **按文件来源查找:**
  67. - runner.py → 第 1, 2, 4, 5 节
  68. - compaction.py → 第 3 节
  69. - subagent.py → 第 8 节
  70. - knowledge.py → 第 10 节
  71. ## ⚠️ 重要提示
  72. 1. **变量占位符**:所有 `{变量名}` 格式的占位符必须保留
  73. 2. **特殊标记**:`[[EVALUATION]]`、`[[SUMMARY]]` 等标记不可删除
  74. 3. **输出格式关键字**:代码解析依赖的关键字需要保持一致
  75. 4. **使用辅助函数**:优先使用 `build_*()` 函数而非直接 `.format()`
  76. """
  77. # ============================================================
  78. # 系统级 Prompt
  79. # ============================================================
  80. DEFAULT_SYSTEM_PREFIX = "你是最顶尖的AI助手,可以拆分并调用工具逐步解决复杂问题。"
  81. # ============================================================
  82. # 研究流程 Prompt - 调研阶段
  83. # ============================================================
  84. RESEARCH_STAGE_PROMPT_TEMPLATE = """## 📚 研究流程 - 执行调研
  85. 现有信息不足,需要进行调研。
  86. {research_skill_content}
  87. **重要提示**:
  88. - 调研完成后,请使用 `save_knowledge` 工具保存调研结果
  89. - 系统会自动检测到 save_knowledge 调用,并进入下一阶段(计划)
  90. """
  91. # ============================================================
  92. # 研究流程 Prompt - 计划阶段
  93. # ============================================================
  94. PLANNING_STAGE_PROMPT = """## 📋 研究流程 - 制定计划
  95. 调研已完成(或无需调研),现在请制定执行计划。
  96. **请立即执行以下操作**:
  97. 1. 使用 `goal` 工具创建目标树
  98. 2. 将任务分解为可执行的子目标
  99. 3. 为每个子目标设置合理的优先级
  100. 注意:这是强制步骤,必须创建 goal tree 才能进入执行阶段。
  101. """
  102. # ============================================================
  103. # 研究流程 Prompt - 调研决策阶段
  104. # ============================================================
  105. RESEARCH_DECISION_GUIDE_TEMPLATE = """---
  106. ## 🤔 调研决策
  107. {experience_summary}
  108. ### 决策指南
  109. **当前状态**:系统已自动检索知识库和经验库,相关内容已注入到上方的 GoalTree 中(查看 Current Goal 下的「📚 相关知识」部分)。
  110. **请根据已注入的知识和经验,选择下一步行动**:
  111. **选项 1: 知识充足,直接制定计划**
  112. - 如果上方显示的知识和经验已经足够完成任务
  113. - 直接使用 `goal` 工具制定执行计划
  114. **选项 2: 知识不足,需要调研** ⭐
  115. - 如果上方没有显示相关知识,或现有知识不足以完成任务
  116. - **立即调用 `agent` 工具启动调研子任务**:
  117. ```python
  118. agent(
  119. task=\"\"\"针对任务「{task_desc}」进行深入调研:
  120. 1. 使用 web_search 工具搜索相关技术文档、教程、最佳实践
  121. 2. 搜索关键词建议:
  122. - 核心技术名称 + "教程"
  123. - 核心技术名称 + "最佳实践"
  124. - 核心技术名称 + "示例代码"
  125. 3. 使用 read_file 工具查看项目中的相关文件
  126. 4. 对每条有价值的信息,使用 save_knowledge 工具保存,标签类型选择:
  127. - tool: 工具使用方法
  128. - definition: 概念定义
  129. - usercase: 使用案例
  130. - strategy: 策略经验
  131. 调研完成后,系统会自动进入计划阶段。
  132. \"\"\",
  133. skills=["research"] # 注入调研指南
  134. )
  135. ```
  136. **重要提示**:
  137. - 如果 GoalTree 中没有显示「📚 相关知识」,说明知识库为空,必须先调研
  138. - 调研应该简洁高效,最多设立两个 goal
  139. """
  140. # ============================================================
  141. # 压缩相关 Prompt - Level 2 压缩与经验评估
  142. # ============================================================
  143. COMPRESSION_EVAL_PROMPT_TEMPLATE = """请对以上对话历史进行压缩总结,并评价所引用的历史知识/经验。
  144. ### 任务 1:评价已用知识
  145. 本次任务参考了以下知识内容:{ex_reference_list}
  146. 请对比"知识建议"与"实际执行轨迹",给出三色打分:
  147. [[EVALUATION]]
  148. ID: knowledge-xxx 或 research-xxx | Result: helpful/harmful/mixed | Reason: [优点]... [局限/修正]...
  149. ### 任务 2:对话历史摘要
  150. 要求:
  151. 1. 保留关键决策、结论和产出(如创建的文件、修改的代码、得出的分析结论)
  152. 2. 保留重要的上下文(如用户的要求、约束条件、之前的讨论结果)
  153. 3. 省略中间探索过程、重复的工具调用细节
  154. 4. 使用结构化格式(标题 + 要点 + 相关资源引用,若有)
  155. 5. 控制在 2000 字以内
  156. 格式要求:
  157. [[SUMMARY]]
  158. (此处填写结构化的摘要内容)
  159. 当前 GoalTree 状态:
  160. {goal_tree_prompt}
  161. """
  162. # ============================================================
  163. # 压缩相关 Prompt - 经验反思
  164. # ============================================================
  165. REFLECT_PROMPT = """请回顾以上整个执行过程,提取有价值的经验教训。
  166. 你必须将经验与当前的任务意图(Intent)和环境状态(State)挂钩,以便未来精准检索。
  167. 关注以下方面:
  168. 1. 人工干预:用户中途的指令是否说明了原来的执行过程哪里有问题
  169. 2. 弯路:哪些尝试是不必要的,有没有更直接的方法
  170. 3. 好的决策:哪些判断和选择是正确的,值得记住
  171. 4. 工具使用:哪些工具用法是高效的,哪些可以改进
  172. 输出格式(严格遵守):
  173. - 在每条经验前加一个[]中添加自定义的标签,标签要求总结实际的内容为若干词语,包括:
  174. - intent: 当前的goal
  175. - state: 环境状态(如果与工具相关,可以在标签中加入工具的名称)
  176. - 经验标签可用自然语言描述
  177. - 每条经验单独成段,格式固定为:- 当 [条件] 时,应该 [动作](原因:[一句话说明])。具体案例:[案例]
  178. - 条目之间用一个空行分隔
  179. - 不输出任何标题、分类、编号、分隔线或其他结构
  180. - 不使用 markdown 加粗、表格、代码块等格式
  181. - 每条经验自包含,读者无需上下文即可理解
  182. - 只提取最有价值的 5-10 条,宁少勿滥
  183. 示例(仅供参考格式,不要复制内容):
  184. - [intent:示例生成 state:用户提醒,指定样本] 当用户说"给我示例"时,应该用真实数据而不是编造(原因:编造的示例无法验证质量)。具体案例:training_samples.json 中的示例全是 LLM 自己编造的,用户明确要求"基于我指定的样本"。
  185. """
  186. # ============================================================
  187. # 压缩相关 Prompt - 压缩后的摘要头部
  188. # ============================================================
  189. SUMMARY_HEADER_TEMPLATE = """## 对话历史摘要(自动压缩)
  190. {summary_text}
  191. ---
  192. 请基于以上摘要和当前 GoalTree 继续执行任务。"""
  193. # ============================================================
  194. # 工具执行 Prompt - 响应截断提示
  195. # ============================================================
  196. TRUNCATION_HINT = """你的响应因为 max_tokens 限制被截断,tool call 参数不完整,未执行。请将大内容拆分为多次小的工具调用(例如用 write_file 的 append 模式分批写入)。"""
  197. # ============================================================
  198. # 工具执行 Prompt - 工具执行中断提示
  199. # ============================================================
  200. TOOL_INTERRUPTED_MESSAGE = """⚠️ 工具 {tool_name} 执行被中断(进程异常退出),未获得执行结果。请根据需要重新调用。"""
  201. AGENT_INTERRUPTED_SUMMARY = "⚠️ 子Agent执行被中断(进程异常退出)"
  202. AGENT_CONTINUE_HINT_TEMPLATE = '使用 continue_from="{sub_trace_id}" 可继续执行,保留已有进度'
  203. # ============================================================
  204. # 任务生成 Prompt
  205. # ============================================================
  206. TASK_NAME_GENERATION_SYSTEM_PROMPT = "用中文为以下任务生成一个简短标题(10-30字),只输出标题本身:"
  207. TASK_NAME_FALLBACK = "未命名任务"
  208. # ============================================================
  209. # 经验保存 Prompt - 经验条目格式
  210. # ============================================================
  211. EXPERIENCE_ENTRY_TEMPLATE = """---
  212. id: {ex_id}
  213. trace_id: {trace_id}
  214. tags: {{intent: {intents}, state: {states}}}
  215. metrics: {{helpful: 1, harmful: 0}}
  216. created_at: {created_at}
  217. ---
  218. {content}
  219. """
  220. # ============================================================
  221. # 经验检索 Prompt - 经验摘要格式
  222. # ============================================================
  223. EXPERIENCE_SUMMARY_WITH_RESULTS = "✅ 已自动检索到 {count} 条相关经验(见上方 GoalTree 中的「📚 相关知识」)\n"
  224. EXPERIENCE_SUMMARY_NO_RESULTS = "❌ 未找到相关经验\n"
  225. # ============================================================
  226. # 经验评估 Prompt - 格式解析警告
  227. # ============================================================
  228. EXPERIENCE_PARSE_WARNING = "未能解析出符合格式的经验条目,请检查 REFLECT_PROMPT。"
  229. # ============================================================
  230. # 辅助函数:构建特定场景的 Prompt
  231. # ============================================================
  232. def build_research_stage_prompt(research_skill_content: str) -> str:
  233. """构建调研阶段的引导 prompt"""
  234. return RESEARCH_STAGE_PROMPT_TEMPLATE.format(
  235. research_skill_content=research_skill_content
  236. )
  237. def build_research_decision_guide(
  238. experience_results: list,
  239. task_desc: str
  240. ) -> str:
  241. """构建调研决策阶段的引导消息"""
  242. if experience_results:
  243. experience_summary = EXPERIENCE_SUMMARY_WITH_RESULTS.format(
  244. count=len(experience_results)
  245. )
  246. else:
  247. experience_summary = EXPERIENCE_SUMMARY_NO_RESULTS
  248. # 截取任务描述前100字符
  249. task_desc_short = task_desc[:100] if len(task_desc) > 100 else task_desc
  250. return RESEARCH_DECISION_GUIDE_TEMPLATE.format(
  251. experience_summary=experience_summary,
  252. task_desc=task_desc_short
  253. )
  254. def build_compression_eval_prompt(
  255. goal_tree_prompt: str,
  256. ex_reference_list: str
  257. ) -> str:
  258. """构建 Level 2 压缩 prompt(含经验评估)"""
  259. return COMPRESSION_EVAL_PROMPT_TEMPLATE.format(
  260. goal_tree_prompt=goal_tree_prompt,
  261. ex_reference_list=ex_reference_list
  262. )
  263. def build_summary_header(summary_text: str) -> str:
  264. """构建压缩后的摘要头部"""
  265. return SUMMARY_HEADER_TEMPLATE.format(summary_text=summary_text)
  266. def build_tool_interrupted_message(tool_name: str) -> str:
  267. """构建工具中断消息"""
  268. return TOOL_INTERRUPTED_MESSAGE.format(tool_name=tool_name)
  269. def build_agent_continue_hint(sub_trace_id: str) -> str:
  270. """构建 Agent 继续执行提示"""
  271. return AGENT_CONTINUE_HINT_TEMPLATE.format(sub_trace_id=sub_trace_id)
  272. def build_experience_entry(
  273. ex_id: str,
  274. trace_id: str,
  275. intents: list,
  276. states: list,
  277. created_at: str,
  278. content: str
  279. ) -> str:
  280. """构建经验条目"""
  281. return EXPERIENCE_ENTRY_TEMPLATE.format(
  282. ex_id=ex_id,
  283. trace_id=trace_id,
  284. intents=intents,
  285. states=states,
  286. created_at=created_at,
  287. content=content
  288. )
  289. # ============================================================
  290. # 子 Agent 相关 Prompt - 评估任务
  291. # ============================================================
  292. EVALUATE_PROMPT_TEMPLATE = """# 评估任务
  293. 请评估以下任务的执行结果是否满足要求。
  294. ## 目标描述
  295. {goal_description}
  296. ## 执行结果
  297. {result_text}
  298. ## 输出格式
  299. ## 评估结论
  300. [通过/不通过]
  301. ## 评估理由
  302. [详细说明通过或不通过原因]
  303. ## 修改建议(如果不通过)
  304. 1. [建议1]
  305. 2. [建议2]
  306. """
  307. # ============================================================
  308. # 子 Agent 相关 Prompt - 结果格式化
  309. # ============================================================
  310. DELEGATE_RESULT_HEADER = "## 委托任务完成\n"
  311. DELEGATE_SAVED_KNOWLEDGE_HEADER = "**保存的知识** ({count} 条):"
  312. DELEGATE_STATS_HEADER = "**执行统计**:"
  313. EXPLORE_RESULT_HEADER = "## 探索结果\n"
  314. EXPLORE_BRANCH_TEMPLATE = "### 方案 {branch_name}: {task}"
  315. EXPLORE_STATUS_SUCCESS = "**状态**: ✓ 完成"
  316. EXPLORE_STATUS_FAILED = "**状态**: ✗ 失败"
  317. EXPLORE_STATUS_ERROR = "**状态**: ✗ 异常"
  318. EXPLORE_SUMMARY_HEADER = "## 总结"
  319. # ============================================================
  320. # 辅助函数:构建子 Agent 相关 Prompt
  321. # ============================================================
  322. def build_evaluate_prompt(goal_description: str, result_text: str) -> str:
  323. """构建评估 prompt"""
  324. return EVALUATE_PROMPT_TEMPLATE.format(
  325. goal_description=goal_description,
  326. result_text=result_text or "(无执行结果)"
  327. )
  328. # ============================================================
  329. # 知识管理相关 Prompt - 语义路由
  330. # ============================================================
  331. KNOWLEDGE_SEMANTIC_ROUTE_PROMPT_TEMPLATE = """你是一个知识检索专家。根据用户的当前任务需求,从下列原子知识元数据中挑选出最相关的最多 {routing_k} 个知识 ID。
  332. 任务需求:"{query_text}"
  333. 可选知识列表:
  334. {routing_data}
  335. 请直接输出 ID 列表,用逗号分隔(例如: knowledge-20260302-001, research-20260302-002)。若无相关项请输出 "None"。
  336. """
  337. # ============================================================
  338. # 知识管理相关 Prompt - 知识进化重写
  339. # ============================================================
  340. KNOWLEDGE_EVOLVE_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。请根据反馈建议,对现有的知识内容进行重写进化。
  341. 【原知识内容】:
  342. {old_content}
  343. 【实战反馈建议】:
  344. {feedback}
  345. 【重写要求】:
  346. 1. 融合知识:将反馈中的避坑指南、新参数或修正后的选择逻辑融入原知识,使其更具通用性和准确性。
  347. 2. 保持结构:如果原内容有特定格式(如 Markdown、代码示例等),请保持该格式。
  348. 3. 语言:简洁直接,使用中文。
  349. 4. 禁止:严禁输出任何开场白、解释语或额外的 Markdown 标题,直接返回重写后的正文。
  350. """
  351. # ============================================================
  352. # 知识管理相关 Prompt - 知识库瘦身
  353. # ============================================================
  354. KNOWLEDGE_SLIM_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。以下是当前知识库的全部条目,请执行瘦身操作:
  355. 【任务】:
  356. 1. 识别语义高度相似或重复的知识,将它们合并为一条更精炼、更通用的知识。
  357. 2. 合并时保留 helpful 最高的那条的 ID 和 metrics(metrics 中 helpful/harmful 取各条之和)。
  358. 3. 对于独立的、无重复的知识,保持原样不动。
  359. 4. 保持原有的知识结构和格式。
  360. 【当前知识库】:
  361. {entries_text}
  362. 【输出格式要求】:
  363. 严格按以下格式输出每条知识,条目之间用 === 分隔:
  364. ID: <保留的id>
  365. TAGS: <yaml格式的tags>
  366. METRICS: <yaml格式的metrics>
  367. SCORE: <评分>
  368. SCENARIO: <场景描述>
  369. CONTENT: <知识内容>
  370. ===
  371. """
  372. # ============================================================
  373. # 辅助函数:构建知识管理相关 Prompt
  374. # ============================================================
  375. def build_knowledge_semantic_route_prompt(
  376. query_text: str,
  377. routing_data: str,
  378. routing_k: int
  379. ) -> str:
  380. """构建知识语义路由 prompt"""
  381. return KNOWLEDGE_SEMANTIC_ROUTE_PROMPT_TEMPLATE.format(
  382. query_text=query_text,
  383. routing_data=routing_data,
  384. routing_k=routing_k
  385. )
  386. def build_knowledge_evolve_prompt(old_content: str, feedback: str) -> str:
  387. """构建知识进化重写 prompt"""
  388. return KNOWLEDGE_EVOLVE_PROMPT_TEMPLATE.format(
  389. old_content=old_content,
  390. feedback=feedback
  391. )
  392. def build_knowledge_slim_prompt(entries_text: str) -> str:
  393. """构建知识库瘦身 prompt"""
  394. return KNOWLEDGE_SLIM_PROMPT_TEMPLATE.format(
  395. entries_text=entries_text
  396. )