Skip to content

Discussion: 系统提示词和工具列表的裁剪优化 #99

@dengmik-commits

Description

@dengmik-commits

背景

通过 debug 日志分析发现,每次发给 LLM 的请求中,系统消息约占 ~20KB(15KB system prompt + 5KB default skills),加上 70 个工具定义(6 内置 + 64 MCP),无论用户问的是"解释这段代码"还是"实现一个功能模块",LLM 都要处理同等量级的上下文。

问题 1:系统提示词缺乏按需裁剪

当前 getSystemPrompt() 返回的一整块 system message 包含 7 个工具的完整文档(每个约 1000-3000 字)。即使用户只需要一次简单的 read 查询,bash/write/edit/WebSearch/UpdatePlan 的详细用法也会全部塞进去。

此外,getDefaultSkillPrompt() 每次都注入 agent-drift-guardplan-and-execute。对于"帮我解释这段代码"这种不可能漂移且无需执行计划的简单任务,约 5KB 的 skill 文档纯属浪费。

影响

  • 每次请求首轮默认吃掉 ~8K tokens 的系统开销
  • 尤其是 agent-drift-guard 的自检循环指令("每步前确认目标、每步后自问偏离")本身就会消耗 token 和思考轮次

潜在方向

  • 按任务类型(读代码 / 写代码 / 纯问答)动态裁剪 system prompt 和 skills
  • 或由 LLM 首轮快速判断后,在第二轮削减不必要的上下文

问题 2:工具列表过长

当前 getTools() 固定返回 6 个内置工具 + 所有已连接的 MCP 工具(如 playwright 的 23 个、fetch 的 6 个、memory 的 12 个、github 的 25 个)。每个工具带完整的 JSON Schema,所有工具的 Schema 加起来约 15KB

对于一个简单问答("这个函数是干什么的"),LLM 仍需要遍历 70 个工具定义。agent-drift-guard 的指令会让 LLM 在每个步骤都思考"要不要调哪个工具"。

影响

  • 工具 Schema 在 system message 和 API tools 参数中各出现一次(重复)
  • 简单问答场景额外消耗约 8K+ tokens

潜在方向

  • 工具定义只放在 API tools 参数中,system message 中移除重复的 Schema
  • 根据任务复杂度动态裁减工具列表(如简单问答只保留 read/AskUserQuestion,复杂编码任务才挂全套)

讨论点

  1. 是否有必要让 system message 每次都带完整 tool docs,还是可以缩减为"看到 tools 参数即可"?
  2. 按任务类型动态裁剪 system prompt 是否可行?有没有风险评估(误判任务类型导致工具不可用)?
  3. 默认 skills 是否应该改为"按需注入"而非"每次都注入"?
  4. 有没有其他 CLI AI 工具(aider、codex 等)在这一块做得更好的参考?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions