不可能的任务:真实世界中管理 AI Agent
Open in app
Sign up
Sign in
Write
Sign up
Sign in
Level Up Coding
·
Follow publication
Coding tutorials and news. The developer homepage gitconnected.com && skilled.dev && levelup.dev
Follow publication
Mission Impossible: Managing AI Agents in the Real World
David Bethune
Follow
35 min read
·
6 days ago
239
2
Listen
Share
我们正处于一个新时代,AI 工具渗透到各个行业,尤其是在软件开发领域。它们的变化速度比任何人都快,并且还要我们付费使用。控制这些机器人感觉就像一项不可能完成的任务。今天,我将分享一些经过实战检验的技术,你可以用它们来控制你的 AI Agent、聊天机器人和其他工具。
本文是我 AI Library 的一部分。如果你是 Agentic Coding 的新手,请从 License to Kill 开始。 要深入了解这些东西为什么以及如何以这种方式工作,请查看 Something from Nothing。
License to Kill: Coding with Cursor AI AgentsCursor, an AI code writing and editing tool, represents a significant advance in the practical use of artificial…levelup.gitconnected.com
Something From NothingA Painless Approach to Understanding AIlevelup.gitconnected.com
你的任务
在我使用 AI Agent 的诸多成功和失败之后,任务归结为仔细规划和限制 Agent 可以执行的操作的范围。
所有可能出错的事情,我都做错了。
如果你能设置正确的指导方针,Agent 就能交付更好的结果。所有可能出错的事情,我都做错了,并从中吸取了教训。Agent 以这种方式编写软件应该不足为奇。人类也是如此,而这正是 Agent 获得灵感的地方。
- 选择你的工具
- 选择要处理的任务
- 寻找路线
- 制定计划
- 修改计划
- 测试计划
- 寻找更大的问题
- 制定规则
- 绩效回报
- 选择模型
- 成本控制
- 模型上下文协议 (MCP)
**友情提示:**由于这些工具变化速度很快,所有屏幕截图和 UI 提及的内容在你阅读本文时可能已经过时。 如果你四处寻找,这些概念将出现在应用程序的不同部分。
Wheatfield with Crows 是我最喜欢的梵高画作。它在现实中令人惊叹,并且无法用任何媒介复制。油画颜料的厚涂以墨水在纸上或发射屏幕无法复制的方式将光子反射到你的眼睛中。 同样,现有代码和提示中的材料和技术决定了已完成应用程序的真正品质。
1. 工具不是材料,也不是技术
选择你的工具
我把这个问题放在这里,不是因为它最重要,而是因为人们_认为_它最重要。在艺术中,工具、材料和技术之间存在很大的差异。 完成工作后,只剩下材料,它们被你的工具和技术所转化。
当你使用 AI 工具时,材料是你的输入——你的代码、图表、数据和提示。 技术是你如何将这些材料编织在一起以及你呈现它们的顺序。 你会在本文中发现一个反复出现的主题:你提供的材料的质量将是你的 AI Agent 成功的唯一最重要的因素。
我的示例将来自 Cursor 但我想强调的是,_当下_的工具对你可以做什么影响很小,就像所有洗衣机都有相似的功能但不同的按钮一样。
AI 工具每天都在变化。 如果你今天还没有更新你的工具,它可能已经落后了。 诀窍是找到提供你喜欢的工作流程的工具——一种提供调查和行动平衡并促进你自己的工作流程的工具。
你可以将我将在 Cursor 中谈论的所有内容应用于 Windsurf、Copilot for VS Code 等工具, 甚至可以通过将东西粘贴到 ChatGPT 或 Google Gemini 中。 你也可以免费使用所有这些工具,但与生活中的所有事情一样,付费版本明显更好,因此不要根据免费结果来判断付费版本。
非开发人员能否使用这些工具创建高质量的输出? 绝对不能。
深入了解你的工具并及时了解其更新日志和文档也很重要。 我知道现在没人再读那些东西了,但具有讽刺意味的是,在“向 AI 提问任何问题”的时代,这种 AI 的用户最好直接阅读文档,因为其力量的真正秘密仅在那些神秘的书页中揭示。
认识你自己
在使用 AI 时,你必须对自己的能力和缺点保持现实态度,因为它们会渗透到 Agent 为你构建的所有内容中。 什么时候应该_调查_,什么时候应该采取_行动_? 你必须成为那个知道并控制这种流程的人。
使用 AI 工具,不同的技能会带来回报。 这是否意味着非开发人员(或非艺术家)将使用这些工具创建高质量的输出? 绝对不能。 这意味着恰恰相反。
除了你的一系列标准编码技能外,你还需要深入的架构洞察力以及用简单的英语交流它们的能力。 这并不是程序员中常见的技能。 当 LLM 的输出与你的输入一样糟糕时,不要对它感到不安。
Roland 的新型 V-Stage,图中与音乐传奇人物 Patrice Rushen of Forget Me Nots 一起展示,让我想起了钢琴的发展历程。 你知道我们今天的键盘一开始并没有标准化吗? 在采用平均律调音之前,在你之前的音乐家可能已经用与你完全不同的频率创作了他的作品。 真糟糕。
2. 糟糕的感觉
选择要处理的任务
你可能会注意到我在本文中选择的主题非常强调计划。 这是因为,对于 Agent 来说,你 90% 的工作将是计划。 流行的术语“vibe coding”表明你可以随便要求任何东西或说任何东西并获得结果。 令人震惊的是,这个想法是真实的。
除非你只想展示一个_人工制品_给别人看,否则 Vibe Coding 是完全错误的方法。
今天的模型已经发展到可以真正地编写任何东西的程度。 这现在成了一个问题,正如我在上一篇文章中广泛介绍的那样。 除非你只想展示一个_人工制品_给别人看,否则 Vibe Coding 是完全错误的方法。
如果你正在制作预期要交付的代码,你只能将 Vibe 输出视为原型。 它们看起来很棒,但像纸飞机一样,实际上并不能飞。 这并不意味着它们没有用处。 LLM 中的“M”表示模型。 它一直都是一个模型。 如果我们牢记这一点,我们就可以只在需要的地方使用该模型,同时我们控制构建最终产品。
我们需要为我们只计划做一次的事情制定一个可重用的计划。 这似乎很疯狂。
我建议的计划量似乎比你自己编写一些可交付的东西花费的时间更长。 这很可能就是事实。 区别在于我们从这个过程中获得了一个可重用的计划,这是我们不可能拥有的任何其他类型的自己编写的代码。
在这里,我同时引用了一个要处理的文件和一个先前编写的可重用计划(当然是由 Cursor 编写的!)。 请注意,与仅尝试从创建计划的原始提示中完成相同的操作相比,它能够更好地遵循这样的计划。
我们需要为我们只计划做一次的事情制定一个可重用的计划。 这似乎很疯狂。 如果我们只做一次,为什么它需要可重用? 有两个原因。 最明显的是,Agent 不太可能第一次就全部正确完成。 如果你的计划不是针对多次运行而编写的,你将浪费时间回溯和重新解释该计划,而不是简单地删除你的存储库并更改该计划,然后重新运行它。
如果你不确定该计划是否可行,Agent 也不会确定。
如果编写一个可重用、可运行的东西来输出数据和 UI 听起来很像编程,欢迎来到新时代。 这种(存在于你的存储库中的)可重用计划的第二个好处是,当你想要重构或扩展你的设计时,你或 Agent 可以再次阅读它。
考虑到这一点,仔细限制你的工作范围非常重要。 不要一开始就要求到达终点线。 尝试将你要求的工作分成可以成功完成的模块化部分。 如果你不确定它们是否可以成功完成,请将 Agent 送回调查阶段以改进该计划。
如果你不确定该计划是否可行,Agent 也不会确定。 对自己的计划缺乏信心的 Agent 往往会疯狂地偏离轨道,这是最近的《碟中谍》电影中反复出现的主题,现在我想起来了。 如果你的计划没有充分涵盖一种情况,AI Agent 会即时编造一个解决方案。 这是接受过各种代码训练的副作用。 Agent 认为,“我知道了! 我有一个解决方案!”
你的解决方案需要的步骤越多,Agent 就越不可能弥补缺失的步骤。 它会发明一个可能会破坏你的应用程序的其他区域或在原型中看起来可以工作但在实践中会崩溃的步骤。 你必须计划只进行小的、可交付的步骤。
出色的叙事游戏 Road 96 使用随机性为你(玩家角色)创建不同的互动,这些互动基于游戏中七个 NPC 的故事。 所有 NPC 都去同一个地方,但路线不同。 这些互动会产生你保留的新对象和技能。 同样,你必须选择适合每个 AI 模型的行动、问题和答案才能到达终点线——并将这些人工制品保留下来以供将来使用。
3. 人迹罕至的路
寻找路线
一旦你选择了 Agent 的目标,你还必须找到一条供它行驶的路线。 这似乎也很费力,并且总是会引起“但如果我必须这样做_,我最好自己编码!”的呼声。
有时这是真的。 如果更改非常小,你可以立即进行更改,那么你应该进行更改。 如果更改需要太多的解释,以至于你难以解释它,那么你的代码需要架构方面的帮助(稍后会详细介绍)。
无论我们尝试以多少种方式假装,Agent 都没有遵循任何“规则”。
你会发现,对于一个人来说似乎非常简单的过程,例如“从那里取出第三个项目并对其进行处理”,会对 LLM 造成严重的问题。 像复制文件或运行构建这样的简单控制台操作也存在问题。
要理解为什么,我们需要调整我们的期望。 无论我们尝试以多少种方式假装,Agent 都没有遵循任何“规则”。 它只是根据当前线程中的一系列提示预测要输出的下一个最有可能的文本片段。
观看 Agent 从无到有地编写一个功能,然后在几分钟后玩它,这真是令人兴奋。 它可以让我们产生一种虚假的安全感,在这种情况下,我们开始要求我们不应该要求的事情——我们应该自己做的事情。 我们看到了一个伟大的奇迹,然后在同一个代码库中要求一个小奇迹,却没有意识到我们正处于 Agent 的高潮中。
如果你不确定如何实现它,那没关系——只需询问 Agent 即可。 你引用自己的代码和数据越多,答案就会越好。
你可能应该至少尝试一次不重要的东西,以便导致崩溃。 如果你尝试 Vibe Coding 一些你计划保留的东西,请准备好花费宝贵的时间或几天来拯救你一起创造的漂亮宝贝,因为你爱上了你的“进步”。 你的救援将包括梳理 Agent 的代码和你你现有的代码,以找出它是如何以及为什么会变成这样的。
因此,我建议你从头开始,并确保你确切地知道如何实现你所要求的东西。 如果你不确定如何实现它,那没关系——只需询问 Agent 即可。 首先将其置于“计划”或“询问”模式,或者只是说“我想了解如何……”或“我正在尝试理解……的含义”。 你在问题中使用的程序员术语越多,引用你自己的代码和数据,答案就会越好。
当我在 1968 年出生时,《星际迷航》已经在重播了。 我母亲不允许我们观看它,因为它“太可怕了”。 该系列的 premise 是去前人未至的地方,这当然意味着风险,而柯克总是迅速制定计划并在任何人传送到新的星球或飞船之前进行沟通。 在这个新的 AI 空间中,你还必须快速制定和修改计划。
4. 前人未至的地方
制定计划
如果我们可以一步到位地制定计划,那就太好了。 这就像要求一步到位地学习弹钢琴一样。 随着时间的推移,你会变得更好,因为你会意识到 Agentic Coding 的问题主要源于你糟糕的计划和你糟糕的代码,而不是来自糟糕的模型或损坏的工具。
有些人将无法承认这一点。 众所周知,开发人员不擅长与其他人类沟通,但这恰恰是 Agentic Coding 所需的第二项技能(第一项仍然是常规编程)。
通常,程序员生活在一个“好吧,我在本地测试时它工作了”的世界中,我们不想承认我们自己的代码库中存在架构上的噩梦或实现问题,而我们通常不会向任何人展示。
在这个关于新计划的对话的早期部分中,该模型提出了一些建议,我讨厌所有这些建议,但是在我进行一些手动编码的架构更改后,在我要求 Agent “只是去做”之前,导致了一种非常不同且非常干净的技术,即用于元数据的纯可编辑 JSON 文件,以便它可以与任何单个游戏分离并在构建时注入。 Agent 的建议没有考虑到基于 JS 的解决方案不会出现在 Discord 或 Slack 等社交分享中,它们不会运行 JS,最终只会显示模板元数据。
因此,我们来到了新的编程语言,一种由英语和伪代码组成的混合体,充满了对你现有应用程序及其文件、函数和数据结构的神秘引用。
像 Cursor 这样允许你 @mention
代码的这些部分的工具在制定计划方面比仅使用打字或剪切/粘贴(甚至文件上传)界面的工具做得更好。
计划是一等公民
现在在我的存储库中,/plans
文件夹是一等公民。 我首先要求 Cursor 编写一个计划并将其放入 my-plan-for-this.md
(该文件夹中的一个 Markdown 文件)来启动每个新的复杂请求。
通过将这些与存储库提交一起保存,它们变成了我可以稍后通过 @mentioning
它们来运行的可用程序。 我甚至可以通过按名称提及一个计划,然后要求修改或要求在该计划中采取单个步骤,同时我保留对存储库的控制权(并且经常这样做)来启动一个新线程。 我会不断提交提交,并附上关于哪些计划已经编写或更改以及哪些步骤已经运行的清晰消息。
我们已经听过“代码即文档”这个术语,现在它正在实践中。
- 计划是可运行的程序。
- 以 Markdown 编写。
- 其中包含真实的代码和数据。
- 并保存在你的存储库中。
- 包含与计划相关的提交和消息。
唷! 开发、修改和保存你自己的计划的这个概念远比尝试下载别人的计划或规则文件重要,尽管数百个这样的文件一夜之间出现在网上。
你可以从 Home Depot 获得一本关于装修的书,但这本书没有你房子的计划。 这里也是如此。
查看计划内部,你会看到是什么实现了魔法。 它们远远超出一个人会写的东西。
通过让像 Cursor 这样的工具创建自己的计划,我们可以深入了解应用程序如何制作自己的提示——这些提示实际上被馈送到模型中。 我们知道它一路都是提示。 当你在聊天框中编写一个引用你所做的计划的提示时,该计划的内容会附加到该提示中。 这就是魔法的总和。
在这里,你可以看到我让 Cursor 编写的实际计划,以及在编写时出现的交互式聊天窗口。 请注意人类不会花时间添加的详细程度和 Markdown 格式。 当你想编辑或运行这些计划时,这非常有用。 另请注意,Cursor 想要更新(左下角),一如既往!
但是,查看其中一个文件内部,你会看到是什么实现了魔法。 它的计划远远超出一个人会写的东西。 它们具有完整的注释,用叙述性文本描述,充满了真实 JSON 或 TS 中的示例(在我的应用程序中——你的应用程序将使用你的语言),并使用大量的 Markdown 格式使其既可机读,又在你 IDE 预览窗格中查看时也很漂亮。
我们上次拥有这样的代码/文档是什么时候? 请记住,这些计划是可以运行的软件,你可以通过说“让我们继续执行 @world-domination-plan.md
中的步骤 2 来调用它。 当你更改计划时,请使用人类可读的注释提交你的存储库。 运行步骤时,请再次提交并注释说你“运行了步骤 2”或类似的内容。
当你以后想要回滚某些内容或查看你更改或删除的旧计划中的想法时,你需要这些_提交面包屑_。 通常,旧计划包含我们以后可能想要查看的有用信息——即使它描述的方式无法在你现在的代码中实现,AI 的创造力或巧妙的问题解决能力可能仍然有用的东西。
Chappell Roan 的 Pink Pony Club 足够吸引人,并且已经在大众市场中流行。 难怪妈妈看到它时尖叫起来。 AI Agent 会计划并做一些似乎脱离轨道的事情,这来自他们大量接触其他人的编程,与其他人的编程相比,你的代码或你的提示在训练集中占有更大的权重——除非你特别告诉它。
5. 粉红小马俱乐部
修改计划
一旦你的计划被写入 Markdown 文件,它就会出错。 这就是所需的所有时间!
这应该令人沮丧吗? 这取决于。 是的,在计划中看到它在这里偏离轨道,在我们甚至开始之前,这令人恼火。 这不是很令人欣慰,并且预示着实际上_执行_该计划的前景并不乐观。 当它想成为一个粉红小马女孩时,我们开始尖叫,“上帝,你做了什么!”
要使此方法起作用,你必须找出使用此过程完成的成品(具有正确的体系结构和设计)是否比使用纯手动编码(甚至只是自动完成)花费的时间更少。 修改计划之类的单个步骤似乎令人讨厌,因为我们以前不必这样做。 当然,我们以前不必这样做是因为以前没有计划。
向 LLM 讲授错误之处是无济于事的,因为你只是添加更多上下文到越添加上下文就越会崩溃的东西中。
我们都从脑海中编写代码。 如果我们编写文档,那主要是在我们编写代码之后。 如果我们尝试在代码之前编写文档,它也会立即出错,因为代码在实践中会偏离计划。
从我的一个计划的这个特写镜头中,你可以看到它们实际上包含真实的示例代码,例如 CSS、TS 和 JSON。 当执行重复步骤时,你可以使用此功能来避免说出要从哪里或从什么复制。 要求 Cursor 从你的示例(无论它在哪里,比如一个有效的示例)复制并将其包含在计划中。 这个长达数百行的综合计划经过了多次修改才得以正确。
当你看到新计划时,不要眼花缭乱。 它看起来如此完整,如此_专业_,怎么会出错呢? 相信我。 它是错误的。 你真的需要阅读所有内容。 如果有简单的错误,例如不应该存在的整个部分,只需自己删除它们即可。 不要对你的配偶大喊大叫,说他们应该把垃圾拿出去。 只是倾倒它。
向 LLM 讲授错误之处是无济于事的,因为你只是添加更多上下文到一个提示链中,而提示链添加的上下文越多就越会崩溃。 话虽如此,如果计划中存在_跨越_的更改,例如广泛的影响、数据格式、技术等,那么你不需要重写它们。 只需告诉模型更改计划以及原因,然后让它再次完成所有操作,进行所有必要的更新。 然后再次阅读它。
当你制定你的第一个看起来正确的计划时,你会印象深刻。 然后你会运行它…
当你第一次开始编写计划时,你可能需要两个以上的修改步骤才能运行它。 你正在学习一种新的编程风格。 当我将磁带加载到 ADAM 中并尝试编辑它们时,它们通常不会第一次工作。 当你制定你的第一个看起来正确的计划(直到最后一个字母)时,你会印象深刻。
然后你会运行它并发现它不是。
《侠盗猎车手在线》当然是一款必须制定计划并快速修改计划的游戏,并且正如你在我的档案照中看到的那样,它们会产生后果。 《侠盗猎车手》的一个运行主题是你必须兴高采烈地开车穿过路标、路障甚至人才能达到你的目标。 如果没有成人监督,你的 AI Agent 将采用其计划来做坏事,因为你说它必须达到目标。
6. 油门踩到底
测试计划
在看到你的计划写得比你自己写得更好之后,Agent 无疑会主动提出直接开枪杀死目标。 而且你绝对不要这样做。
我将在此处停下来说,即使你无意让 Agent 更改你的代码,让它以这些计划的形式为你或其他人生成文档也可能非常有用。 你可以要求它描述你现有代码的工作方式,将其放入 /docs
文件夹中的 .md
文件中,并增加该文档库。
这样做是明智的,即使其他人没有阅读你的代码,因为你可以 @mention
这些文档文件以将它们附加到提示中,从而制定“迷你规则”,我们稍后将了解如何将这些规则转换为其他类型的规则,包括自动规则。
通常,所有正确的步骤都在计划中,但由于各种原因,它们可能需要以与模型建议的顺序不同的顺序执行。 例如,你可能决定在本地执行文件或终端操作。 不要费心更改计划或告诉 Cursor 任何内容。 只需在你想要时告诉它执行步骤 3,即使它是第一个。 不要把学分的钱浪费在没用的地方,因为我们知道 LLM 不会通过更多的交谈来提高他们的理解能力。
测试你的计划与你的实际代码将揭示你(人类)编写的内容中的许多丑陋的真相。
通常,你需要在 Agent 启动计划之前进行一些其他的重构或清理,并且你应该尽一切可能“清除路径”。
这是我们在 AI 道路上失去人们的另一个地方。 “但是如果我只是自己编写代码,我就不必做任何这些。” 很难反驳这一点。 事实是,测试你的计划中编写的内容与你的代码库中实际存在的内容将揭示你(人类)编写的内容中的许多丑陋的真相。
很容易说,“我现在没有时间清理我的代码。 我需要交付这个。” 我的朋友们,这就是我们获得技术债务的方式。
Agent 的最佳用途之一是重构——但我们却听到人们说它不能完成! 我在这里宣称相反。 仔细地重构_AI 指出的_内容非常有用。 它正在照亮你没有看到的蛀牙。 钻孔,宝贝,钻孔!
只要你的重构遵循我在此处介绍的制定计划的计划,你最终将在整个代码库中减少技术债务。 你将拥有更容易为你和 Agent 工作的代码——不会被遗忘的代码,因为没有人理解它,也没有人真正能够再使用它。
无论你是否选择从你在计划中看到的内容进行重构,你都应该将其作为单独的线程进行处理,并制定自己的计划。 避免继续注射来自 Feelgood 博士的药物的诱惑。 无论你处于哪个计划中,只允许工具一次执行一个步骤,并在每个步骤之后提交和测试你自己。
如果你告诉 AI 你想要什么,你可能会在某一天被听到,而在另一天被忽略。
令人恼火的是,AI 不断错过“显而易见”的事情,但它们只是你从花费时间处理这个代码库和其他代码库以来才对你显而易见。 LLM 不会像人一样积累知识。 即使在他们的训练中有数百万行代码,也不会让他们对代码有任何理解,它只会让他们根据重复暴露于其他上下文中的代码来获得出色的预测能力。
大型训练基础实际上会降低它正确猜测适用于你的环境的自定义代码的可能性。 检索系统总是显示最可能的答案(在提示和当前随机种子的上下文中)。 这意味着最可能的答案不是与你的自定义架构完全匹配的解决方案。 它不会是训练集中的主要内容。
这就是为什么我们看到 LLM 不断尝试将你引导到他们“确定”会起作用的随机解决方案。 这是因为他们在你提出的问题的上下文中在他们的训练集中看到了这些解决方案。 这并不意味着在给出答案时会考虑你的代码的含义或用途。
如果我们告诉一个人,“听着,拉里,我们总是使用组合,并且不编写从彼此继承的东西”,你希望这是一次性提及,或者甚至是添加到代码样式手册中的东西。 如果你告诉 AI 这一点,你可能会在某一天被听到,而在另一天被忽略。 它没有从你那里