少即是多:我最出活的 agent 配置,反而是最简陋的那套
玩了两年 agent,试遍各种 harness、插件、记忆系统之后,我现在跑的是接近裸奔的配置——基础 CLI 加上几条朴素原则。这篇把这套"少即是多"的心法摊开讲:为什么 context 就是一切、怎么把研究和实现切开、怎么反过来利用模型的谄媚、怎么让 agent 知道任务到底什么时候算完,以及为什么 CLAUDE.md 应该只是一本 IF-ELSE 的目录。
你是个写代码的。每天用着 Claude Code 和 Codex,心里反复打鼓:我到底有没有把它榨干?偶尔看它干出一件蠢到离谱的事,你想不通——凭什么有人拿同样的工具在造火箭,我连两块石头都垒不稳?
于是你开始怀疑是 harness 不对、插件不对、终端不对。你上了一堆记忆系统、编排框架、向量库,CLAUDE.md 写到两万六千行。可不管怎么折腾,你离天堂还是差着一截,只能眼睁睁看别人跟天使跳舞。
我先把结论拍这儿:你不需要最新的 harness,不需要装一百个包,更不需要追着读那些”必读”。你那股子热情,多半在帮倒忙。
我不是来打卡的游客。从 agent 还几乎不会写代码那会儿我就在用,各种包、各种 harness、各种范式我都趟过——拿它搭过真在生产里跑的信号、基建和数据管线,不是 demo 级的玩具。趟完这一圈,我现在的配置简陋到接近裸奔:就是 Claude Code 和 Codex 两个裸 CLI,外加对几条基本原理的理解。而我这辈子做过最硬的活,恰恰是用这套出的。
先认清一件事:世界在飞速往前跑
基础模型公司正在跑一段代际级别的长征,而且短期内不会减速。每提升一代”agent 智能”,你跟它打交道的方式就得跟着变——因为这些模型被一代代调得越来越愿意听话。
举个例子。几代以前,你在 CLAUDE.md 里写”做任何事之前先去读 READ_THIS_FIRST.md”,它有差不多一半的概率直接当没看见,爱干嘛干嘛。现在呢?复杂的嵌套指令它都乖乖跟:”先读 A,再读 B,如果命中 C 就去读 D”——大部分情况下它会老老实实照走。
这件事的含义是:每一代新模型都会逼你重新定义”什么才是最优”。所以少即是多。
你一旦把自己绑死在某个库、某个 harness 上,等于在给一个未来可能根本不存在的问题买保险。而且——你猜 agent 用得最猛、最热情的是谁?是前沿公司自己的员工,无限 token 预算,手里是真·最新的模型。想想这意味着什么。
如果某个痛点真实存在、又真有个好解法,那这帮人才是这个解法最大的用户。然后他们会干嘛?把它内化进自家产品里。换你你也这么干——凭什么让一个外部产品去解决你自家的真痛点,平白给自己造个外部依赖?
skills、记忆、subagents、planning,全是这么来的:先是社区里有人当成”解法”battle 出来,证明真有用,然后官方把它收进基础产品。所以反过来推:真正扩展了 agent 能力边界的东西,迟早会被基础模型公司内化。 你不必焦虑要不要上”那个新东西”,也不必逼自己”时刻保持同步”。
我给的第一个建议特别朴素:偶尔更新一下你的 CLI,读读它新加了什么功能。就这,足够了。
Context 就是一切
真的,context 就是一切。这也是堆一堆插件和外部依赖的真正代价——你会得上下文膨胀,说人话就是:你的 agent 被一堆没用的信息淹了。
帮我写个 Python 小脚本?小事。等等,26 个会话之前那条关于”内存管理”的笔记是啥?哦,71 个会话之前我们 spawn 了太多子进程把用户屏幕卡死过。规则说每次都要写笔记?好的没问题……可这跟写个小脚本有半毛钱关系?
你懂我意思了。你要给 agent 的,是完成当前任务恰好够用的信息,多一个字都不要。你对这件事的掌控越精细,agent 表现越好。一旦你塞进各种花里胡哨的记忆系统、插件、命名混乱又乱触发的 skill,你就是在它只想写首红杉林小诗的时候,顺手塞给它一份炸弹制作指南外加一张蛋糕配方。
所以我先念这句咒:把依赖都扒掉。 然后——
做那些真正管用的事
把研究和实现切开
记得吗,context 就是一切,你要注入的是恰好够用、不多不少的信息。
保证这一点的第一招,是把研究和实现分成两件事,并且对你要 agent 干的活极度精确。
不精确会发生什么。你说:”去搭一套鉴权系统。”于是它得先自己研究:鉴权系统是啥?有哪些方案?各自优劣?它跑去满世界扒它其实根本用不上的信息,把一大堆可能性的实现细节糊进 context。等真到了写代码那一刻,它更容易犯迷糊、更容易在选定方案上幻觉出无关或多余的细节。
反过来,你直接说:”用我们网关的 OpenAI 兼容接口走鉴权,token 7 天过期带刷新轮转,密码 bcrypt cost=12,refresh token 存 Redis。”它就不用去研究别的方案了——它知道你要的是啥,于是能把 context 全填成这条路线的实现细节。
当然你不会永远握着实现细节。很多时候你自己也拿不准什么才对,甚至你压根就想把”选实现”这件事下放给 agent。那怎么办?简单——开一个专门的研究任务去铺各种实现可能,要么你自己拍板、要么让一个 agent 拍板,定完之后再开一个全新 context 的 agent 去实现。
顺着这个思路想下去,你会开始在自己的工作流里揪出那些”agent 被无关 context 污染”的地方。然后你就能在 agentic 流程里砌墙,把跟当前任务无关的信息挡在外面,只放进那一小撮真正需要的上下文。记住,你手里是个又聪明又能干的队友,它知道宇宙里所有种类的球——可你不告诉它”我要你设计一个让人跳舞、玩得开心的空间”,它就会一直跟你念叨球形物体有多少好处。
谄媚的设计局限
没人会想用一个天天怼你、说你错、无视你指令的产品。所以这些模型天生就在努力顺着你、努力把你交代的事办了。
你让它”每三个词加一个’开心’“,它会尽力照办——这点大家都懂。它这股”愿意听话”的劲儿,正是它好玩的地方。但这事有个很有意思的副作用:你要是说”去代码库里给我找个 bug”,它一定给你找出来——哪怕得现编一个。为啥?因为它太想听你的话了。
很多人张口就骂 LLM 幻觉、骂它编造不存在的东西,却没意识到问题出在自己身上。你要什么,它就给你交付什么——哪怕得把事实稍微抻一抻。
我的对策有两个。
第一,用中性 prompt,别把 agent 往某个结论上带。 我不说”找数据库里的 bug”,我说”把每个组件的逻辑顺着走一遍,把你看到的都报上来”。这种不预设的 prompt,有时候确实捞出 bug,有时候就只是平铺直叙地告诉你代码怎么跑——但它不会被诱导成”这里一定有 bug”。
第二,反过来把谄媚当工具用。 既然我知道它一心想取悦、想照指令办,那我就能往两个方向掰它。这套我在 workflow 里反复用,三个 agent:
- bug-finder:我给它设计分。低危 +1,中危 +5,高危 +10。它会嗨到不行,把所有疑似 bug 全翻出来(包括一堆其实不是 bug 的),回来报个总分一百零几。我把这当成所有可能 bug 的全集。
- 对抗 agent:我告诉它,每证伪一个 bug 就拿到那个 bug 的分,但要是证错了,倒扣两倍。于是它会激进地去推翻尽可能多的 bug(连真 bug 也想推),但因为有惩罚又带着点谨慎。我把这当成真实 bug 的子集。
- 裁判 agent:把前两个的输入都丢给它打分。我撒个谎,说我手里有标准答案,判对 +1、判错 -1。它就老老实实去给前两个在每个 bug 上评分。
裁判说啥就是啥,我再人工抽检,确认它没瞎说。多数时候保真度高到吓人,偶尔还是会错那么一两个,但整体已经接近无懈可击。也许对你来说光一个 bug-finder 就够了——但这套对我管用,因为它把每个 agent 被硬编进去的那点天性(想取悦你)压榨得干干净净。
怎么判断什么东西真有用
这条听着像得天天泡在 AI 前沿才答得上来,其实特简单:如果 OpenAI 和 Claude 都把它实现了、或者直接收购了实现它的团队——那它八成有用。
看见 skills 现在到处都是、两边官方文档都收了吗?看见 planning 当年被一帮人发现”先规划再实现真香”、然后变成核心功能了吗?还记得 agent 死活不肯干长活那阵子,各种 stop-hook 续命特别灵——然后某代模型一出,这玩意儿一夜之间没人提了吗?
对,你需要知道的就这些。真正重要、真正有用的东西,Claude 和 Codex 会替你实现。你不用为了”那个新东西”过分焦虑,甚至不用刻意”保持同步”。帮我个忙:偶尔更新下你顺手的那个 CLI,读读新功能。这就绰绰有余了。
压缩、上下文,和那要命的”填空”
一个让你迟早会撞上的大坑:agent 有时候像全地球最聪明的生物,有时候你简直不敢信自己被它忽悠了这么久。
聪明?这玩意儿是个智障吧!
分水岭几乎只有一个:它有没有被迫去做假设、去”填空”。 直到今天,它们在”连点成线”“脑补缺口”“做合理假设”上还是烂得一塌糊涂。一旦它开始干这事,水平立刻肉眼可见地往下掉。
所以 CLAUDE.md 里最重要的一条规则,是关于怎么抓取上下文的规则,并且你要让 agent 读到 CLAUDE.md 之后第一件事就是去读这条(每次压缩之后它必然重读 CLAUDE.md)。这条”抓取上下文”的规则里,塞几条朴素指令就能走很远:重读你的任务计划、重读跟当前任务相关的文件,然后才继续。
让 agent 知道任务到底什么时候算完
我们对”一件事干完了”有挺强的直觉。但对 agent 来说,当前这代智能最大的毛病是:它知道怎么起头,不知道怎么收尾。
结果就是各种让人血压升高的场面——它写着写着塞个 stub,然后宣布收工。
测试是极好的里程碑,因为它确定、可验证,能立一个极清晰的预期:这 X 个测试不全绿,任务就没完;并且你不准改测试。然后你只要把测试本身审一遍,剩下的就交给”全绿”两个字,心里踏实。这事能自动化,但重点是:记住”任务结束”对人类很自然,对 agent 一点都不自然。
还有个最近变得可行的终点:截图 + 验证。你可以让 agent 一路实现到所有测试通过,然后让它截图,再去核对截图上的”设计或行为”对不对。这样你就能让它朝着你想要的设计反复迭代,而不用担心它第一版一交就撒手。
把这一切收拢,自然的延伸就是:跟 agent 立一份”契约”,写进规则里。比如这份 {任务}_CONTRACT.md 规定了——在你被允许结束会话之前,必须做完哪些事。契约里写清你的测试、截图、以及其它要过的验证;这些全做完,任务才算可以收。(我全局 CLAUDE.md 里那套”真实验证准则”和”八荣八耻”,本质就是把这份契约前置成了默认规矩。)
那些”永远在跑”的 agent
经常有人问我:那些跑 24 小时还不漂移的 agent 是怎么做到的?
有个特简单的办法:写一个 stop-hook,在 {任务}_CONTRACT.md 没全部完成之前,不准 agent 结束会话。如果你有一百份写得足够精确、把”要建什么”说得明明白白的契约,那 stop-hook 就会拦着所有 agent,直到这一百份契约连同里面所有该跑的测试和验证全部兑现。
不过说句实话:我没发现 24 小时长会话在”把事干好”上有多优。原因恰恰在于——它天然制造上下文膨胀,会把一堆不相干契约的 context 灌进同一个会话里。所以这种我不推荐。
更好的姿势是这样的 agent 自动化:一个契约配一个新会话。 需要做什么的时候就生成一份契约。再加一个编排层,每当”有事需要做”就负责生成契约、并开一个新会话去干这份契约。
这一下会彻底改变你的 agent 体验。
迭代,迭代,再迭代
你请个行政助理,会指望他第一天就摸清你的日程?知道你咖啡怎么喝?知道你晚饭是六点吃不是八点?当然不会。偏好是随时间一点点喂出来的。
agent 也一样。从裸奔开始,别碰那些复杂结构和 harness,先给基础 CLI 一个机会。然后再往上叠你的偏好。怎么叠?
Rules
不想让 agent 干的事,写成一条规则,然后在 CLAUDE.md 里告诉它有这条规则。类似:”写代码前,先读 coding-rules.md。”规则可以嵌套,也可以带条件:写代码读 coding-rules.md,写测试读 coding-test-rules.md,测试挂了读 coding-test-failing-rules.md。你可以搭出任意分支的规则逻辑,Claude(和 Codex)会乖乖照走,前提是你在 CLAUDE.md 里写清楚了。
看见它干了件你不爽的事?加一条规则,告诉它下次干”那件事”之前先读这条——它基本就再也不会犯了。
Skills
skill 跟 rule 很像,区别是:rule 编码的是偏好,skill 更适合编码配方。你有一套”这事就得这么干”的做法,就把它沉淀成 skill。
很多人抱怨:我不知道 agent 会怎么解某个问题,这让人发慌。想让它确定下来,办法是:让 agent 先去研究”这个问题它会怎么解”,然后把方案写成 skill。你就能在它真正遇到这问题之前,先看到它的思路、提前纠正或改进。
怎么让 agent 知道这个 skill 存在?对,还是 CLAUDE.md:当你遇到某场景、需要处理某事时,去读这个 skill.md。
怎么对待 rules 和 skills
你肯定会不停往里加 rule 和 skill,这正是你给它喂”人格”和”对你偏好的记忆”的方式。除此之外的大多数东西,都是过度设计。
一旦你这么干起来,agent 会开始像魔法一样——它会”按你想要的方式”做事。这时候你才算真正”grok”了 agentic engineering。
然后……你会发现性能又开始下滑。
咋回事?!
简单。rule 和 skill 加多了,它们开始互相打架,或者 agent 又上下文膨胀了。你要它写代码前先读 14 个 markdown,那它跟被塞了一堆废信息是一个德行。
那怎么办?清理。 让你的 agent 去”放个假、做个 spa”,把 rule 和 skill 合并、消除矛盾,顺便回头问你最新的偏好是什么。(这件清理本身就可以是一个 skill——我自己就常态化地跑这一步去对齐文档和记忆。)
弄完,它又像魔法了。
就这。这真的就是全部秘密:保持简单,用 rules、skills 和 CLAUDE.md 当目录,对它们的 context 和设计局限保持近乎偏执的敬畏。 我前面说的第一条可落地建议,核心也在这:把 CLAUDE.md 当成一本”什么场景去哪找 context”的、逻辑化、可嵌套的 IF-ELSE 目录。 它本身要尽可能裸,只放那套”去哪取上下文”的分支,别的什么都别塞。
自己对结果负责
今天没有完美的 agent。设计和实现你可以大量下放给它,但结果得你自己扛。
所以小心点——然后,玩得开心。
能拿未来的玩具干正经事,本来就是件挺爽的事。