作为一名经历过无数次Agent开发失败的AI工程师,我深刻理解那种从满怀希望到绝望的心情转变。第一天看完各种酷炫Demo后信心满满,第三天就发现自己的Agent变成了一个"智障"——死循环、幻觉、有工具却死活不用。这种挫败感往往源于我们这些习惯传统编程思维的程序员对Agent本质的误解。
我们这些习惯面向接口设计、喜欢二分断点调试的程序员,往往带着错误的预设进入Agent开发。最大的认知偏差在于:我们以为Agent就是一个更智能的API调用器。实际上,Agent更像是一个需要引导的"数字实习生",它有自己的认知方式和行为模式。
传统编程思维带来的三个典型误区:
早期我们团队犯的最大错误就是RAG(检索增强生成)的滥用。我们把项目背景、API文档、代码规范全部塞进上下文,结果导致:
转折点出现在我们尝试了"渐进式披露"(Progressive Disclosure)方法:
实测效果惊人:不仅信息获取更精准,Agent还能自动识别代码库中的隐含关联。这后来成为了我们Skills系统的设计基石。
设计Tool Set是构建Agent最微妙也最具创造性的环节。好的工具设计应该让Agent"本能"地想要使用,而不是"被迫"遵守格式要求。
以"向用户提问"功能为例,我们经历了三次迭代:
第一次尝试:改造现有ExitPlanTool
python复制class ExitPlanTool:
def run(self, plan: str, question: str = None):
# 既输出计划又附带问题
问题:意图混杂导致模型困惑,幻觉率飙升
第二次尝试:系统提示词约束
code复制当需要提问时,使用[?]标记问题
问题:符号漏用、自创语法现象严重
第三次成功方案:独立AskUserQuestion工具
python复制class AskUserQuestionTool:
def run(self, question: str):
# 前端弹窗阻塞直到用户回答
return user_response
关键突破:符合模型"遇到困难自然寻求帮助"的认知模式
随着基础模型能力提升,工具设计需要同步进化。典型案例是我们的Todo系统变迁:
Opus 3.0时代:
Opus 4.5时代问题显现:
进化解决方案:Tasks系统
bash复制CLAUDE_CODE_TASK_LIST_ID=project-name claude
核心创新:
LLM API中的Prompt Caching机制极其反直觉。传统Key-Value缓存是基于精确匹配,而LLM缓存是基于前缀匹配的——就像搭积木,底层变动会导致上层全部重新计算。
教训一:动态工具集的陷阱
直觉方案:按需加载工具节约token
实际问题:工具集变更导致缓存失效
我们的解决方案:
教训二:模型切换的代价
直觉方案:长对话后切Haiku省钱
实际问题:全量重新处理历史token
优化方案:Subagent交接
教训三:系统提示词的滥用
错误做法:在system prompt写"今天是周三"
正确做法:在下条消息用
教训四:对话压缩的实现
朴素方案:用不同system prompt调用API压缩
优化方案:Cache-Safe Forking
当接入7个以上MCP服务器时,工具描述可能占用70k tokens。我们的解决方案:
yaml复制defer_loading: true
python复制class ToolSearchTool:
def run(self, query: str):
# 返回匹配工具的完整定义
Skills是预设的工具调用模式和对齐偏好,它们像是Agent的"职业培训课程"。
关键参数示例:
yaml复制name: code-review
description: "在提交PR前自动激活,检查常见代码问题"
argument-hint: "[filename]"
disable-model-invocation: false
user-invocable: true
allowed-tools: [grep, ask_user]
paths: "*.py,*.js"
hooks:
pre-tool-use: "block_destructive_actions"
聚焦痛点而非流程:
动态资源管理:
实战案例:standup-post技能
| Skill | 功能 | 激活场景 |
|---|---|---|
| /careful | 拦截rm -rf等危险命令 | 生产环境操作时 |
| /freeze | 限制编辑范围 | 调试时防止意外修改 |
| /audit | 记录所有工具调用 | 合规性要求场景 |
| /fast | 切换至Haiku子agent | 需要快速响应非关键任务时 |
Playground允许Agent生成交互式HTML组件,特别适合:
实现原理:
python复制class PlaygroundTool:
def run(self, html: str):
# 渲染交互界面
# 将用户操作转为prompt返回
产品经理实用技巧:
构建高效Agent需要三大思维转变:
从控制到引导:
从静态到进化:
从孤立到协同:
最后给同行工程师的建议: