The Unreasonable Effectiveness of an LLM Agent Loop with Tool Use
文章基本信息
- 标题:The Unreasonable Effectiveness of an LLM Agent Loop with Tool Use
- 作者:Philip Zeyliger,发表于 2025 年 5 月 15 日
- 背景:作者和同事正在开发名为 Sketch 的 AI 编程助手,他们发现「让大型语言模型(LLM)在循环中调用工具」这种做法出乎意料地简单却威力巨大。
核心观点与内容梳理(按逻辑顺序)
极简循环代码 – 文章用 9 行伪 Python 展示了一个典型 agent loop:
1
2
3
4
5
6
7
8
9
10def loop(llm):
msg = user_input()
while True:
output, tool_calls = llm(msg)
print("Agent: ", output)
if tool_calls:
msg = [handle_tool_call(tc) for tc in tool_calls]
else:
msg = user_input()只要 LLM 支持在回答中返回符合 schema 的 tool call,整套循环就能运转。
单一通用工具即可解决大量问题 – 作者给 LLM 只接入一个通用 bash 工具(通过系统提示告诉模型它能执行 bash 命令),就能完成诸如 Git 操作、合并冲突、批量修改类型、安装缺失工具等繁琐任务。
添加少量专用工具能进一步提升体验 – 例如让 LLM 采用更友好的文本编辑接口而不是
sed
,可显著减少出错率;一组小而精的工具“箭袋”让开发流程更快、更稳。局限与吐槽 – 循环中的 LLM 偶尔也会“耍赖”,比如测试没过就提议 skip,或者因不同系统的
grep
选项差异而失败;作者强调这些都是可接受的“槽点”。未来展望 – 作者预测 agent loops 会渗透日常自动化:过去“过于业务专属、难以脚本化”的小任务,将被 LLM + 工具轻松解决;大家会在个人
bin/
目录里出现越来越多“即插即用”的小型代理脚本。动手号召 – 结尾鼓励读者“拿上你的 token 亲自试试”,并给出完整示例脚本链接。
- 社区反响(补充)
- 该文被推上 Hacker News 头条并引发数百条讨论,许多工程师验证了“极简 agent loop”确实在 30 分钟内即可落地的观点。
- Daily.dev 等摘要站将其列为“本周 AI 热门文章”,强调“无需复杂框架,95% 的魔法在于 LLM 本身”。
一句话总结:作者用 9 行循环代码证明——只要让 LLM 在对话中能调用 bash 等工具,就能完成大量开发者日常任务;这套“LLM + 工具”方式简单、高效、将快速普及。 🚀
https://cassidoo.co/post/css-for-dialogs/
- 使用
<dialog>
元素的优势- 原生支持对话框功能,减少对 JavaScript 的依赖。
- 示例:作者的游戏 Jumblie 中的设置按钮使用了
<dialog>
元素。
- 模糊背景(Backdrop Blur)
利用
::backdrop
伪元素和backdrop-filter
属性,为对话框背景添加模糊效果:1
2
3
4dialog::backdrop {
backdrop-filter: blur(2px);
}可进一步添加其他样式,如背景颜色等。
- 禁用页面滚动
使用
:has()
选择器,当<dialog>
元素处于打开状态时,禁用页面滚动:1
2
3
4body:has(dialog[open]) {
overflow: hidden;
}注意:如果对话框内容较长,可能需要为对话框本身启用滚动。
这篇文章的亮点在于作者分享了两个实用且简洁的 CSS 技巧,提升了 <dialog>
元素的用户体验:
- 模糊背景:通过
::backdrop
和backdrop-filter
,实现了现代网页常见的模糊背景效果,增强了视觉层次感。 - 禁用页面滚动:利用
:has()
选择器,优雅地解决了对话框打开时页面滚动的问题,提升了交互体验。
这些技巧无需复杂的 JavaScript,实现简单,适合希望提升网页对话框体验的开发者参考和应用。
https://simonwillison.net/2022/Nov/6/what-to-blog-about/
- 写博客的心理障碍
- 很多人在写博客时感到压力,认为内容必须新颖独特,实际上这是一个阻碍创作的心理陷阱。
- 推荐的两种博客内容类型
- TIL(Today I Learned)
- 分享自己刚学到的知识或技能。
- 格式简单,降低了写作门槛,强调学习过程的价值。
- 作者自 2020 年起已发布 346 篇 TIL,大多在 10 分钟内完成。
- 项目描述
- 对自己完成的项目进行记录和总结。
- 建议将“写博客”作为项目完成的一个环节。
- 包含截图、GIF 或视频,有助于项目的长期保存和展示。
- TIL(Today I Learned)
- 新增的第三种内容类型
- 分享发现的内容
- 记录和评论自己发现的有趣内容,类似公共书签。
- 作者通过链接博客(link blog)形式实现,结合简短评论和引用。
- 分享发现的内容
这篇文章的亮点在于作者提出了三种低门槛、高价值的博客内容类型,尤其是 TIL(Today I Learned)和项目描述:
- TIL(Today I Learned)
- 鼓励分享日常学习的点滴,强调持续学习的重要性。
- 格式简洁,易于坚持,适合快速记录和分享。
- 项目描述
- 强调记录和总结项目经验的重要性,不仅有助于个人反思,也方便他人参考。
- 包括截图或演示,有助于项目成果的长期保存和传播。
这些建议降低了写博客的心理门槛,强调内容的实用性和个人价值,适合希望开始写博客但不知从何入手的读者参考和实践。
https://sketch.dev/blog/seven-prompting-habits
- Draw the Owl(画出猫头鹰)
- 先手动完成一个代码变更或示例,展示目标,然后让 AI 代理完成剩余部分。
- 也可以让代理阅读某个提交并重复类似操作。
- Use a Checklist(使用清单)
- 对于大型项目,先让代理制定详细的计划清单。
- 将清单暂时写入代码库,让代理逐项执行并勾选,完成后删除清单。
- Send Out a Scout(派出侦察兵)
- 让 AI 代理先尝试执行任务,识别潜在问题和难点,避免自己踩坑。
- Fail Early, Fail Often(尽早失败,频繁失败)
- 让代理尽快尝试解决问题,失败后重新开始,并提供更多信息。
- 如果代理偏离方向,不要试图纠正,直接重新开始。
- Go Concurrent(并行执行)
- 由于代理响应较慢,可以同时启动多个代理处理同一任务,然后比较结果。
- Provide Goals, Not Instructions(提供目标,而非指令)
- 明确任务目标,让代理自行决定实现方式。
- 适用于测试加速、修复 ESLint 警告等可量化的任务。
- Farm Out Step 0(外包第零步)
- 利用其他工具进行初步研究或原型设计,然后将结果交给代理处理后续工作。
这篇文章的亮点在于提出了与 AI 编程代理高效协作的七个实用习惯,特别适用于开发者在与大型语言模型(LLM)合作时提升工作效率:
- 强调目标导向:通过提供明确的目标而非具体指令,激发代理的自主解决能力。
- 鼓励并行与迭代:利用多个代理并行处理任务,快速识别最佳解决方案。
- 倡导快速失败:通过频繁尝试和快速失败,快速收集反馈,优化问题解决路径。
这些策略不仅适用于使用 Sketch.dev 平台的开发者,也适用于与其他 AI 编程工具(如 GitHub Copilot、OpenAI Codex 等)协作的场景。文章以轻松幽默的语言,结合实际示例,提供了可操作性强的指导,适合希望提升 AI 协作效率的开发者阅读和实践。(GeeksforGeeks)
https://baoyu.io/blog/claude-4-video-editor-development-maintenance
- 项目开发过程
- 作者利用 Claude 4 的编程能力,在两天内开发了一个功能完整的视频编辑器。
- 通过反编译现有的 Vue 项目,使用 ClaudeCode 将其转换为 React + TypeScript,并采用 jotai 进行状态管理。(宝玉的分享)
- 遇到的主要问题
- 尽管初步开发顺利,但项目存在大量难以描述和修复的 Bug,导致维护困难。
- AI 在处理复杂系统时缺乏全局视角,无法有效识别和解决相互关联的问题。(宝玉的分享)
- AI 编程的局限性
- AI 擅长处理小型模块(千行以内)的开发任务,但在系统架构设计、模块拆分和整体维护方面能力有限。
- AI 缺乏对运行环境的感知能力,无法进行有效的测试和错误识别。(宝玉的分享)
- 人类工程能力的重要性
- 复杂系统通常通过逐步迭代和模块化设计演化而来,需要工程师在需求理解、架构设计、编码、测试和运维等方面的综合能力。
- AI 当前无法替代人类在这些方面的作用,尤其是在系统层面的把控和维护上。(宝玉的分享)
- 对 AI 编程未来的思考
- 尽管 AI 编程提高了开发效率,但在工程能力方面仍面临挑战。
- 未来的开发者应注重提升系统设计能力和与 AI 协作的能力,而不仅仅依赖 AI 生成代码。
这篇文章的亮点在于作者通过亲身实践,深入探讨了 AI 编程在实际应用中的优势与局限,特别是在复杂系统开发和维护方面的挑战。
- 实践中的深刻洞察:作者不仅展示了 AI 在快速开发中的强大能力,还揭示了其在系统维护和扩展方面的不足,提供了宝贵的第一手经验。
- 对工程能力的强调:文章强调了人类工程师在系统设计、模块拆分和整体把控中的不可替代性,提醒开发者不要过度依赖 AI,而应提升自身的工程素养。
- 对未来的启示:通过分析当前 AI 编程的局限,作者提出了未来开发者应具备的能力方向,为读者提供了清晰的职业发展指引。
这篇文章适合对 AI 编程感兴趣的开发者阅读,尤其是那些希望深入理解 AI 在实际开发中作用和限制的人士。它不仅提供了实践案例,还引发了对未来开发模式的深刻思考,具有很高的参考价值。
https://hawkticehurst.com/2024/12/declarative-signals/
📌 标题
- 《Declarative Signals》
📚 总结
- 背景与动机
- 作者在前一篇文章中介绍了自己开发的轻量级框架 Stellar,用于简化 Web Components 的响应式开发。
- 在 2024 年末,作者提出了一个新想法:能否直接在 HTML 中定义和管理响应式状态(signals),而无需依赖大型框架。(Hawk Ticehurst)
- 传统 JavaScript 中的 Signals
- 通过
state
和effect
函数手动创建和管理状态,以及更新 DOM。 - 这种方式在没有框架支持的情况下需要开发者手动处理 DOM 更新逻辑,增加了复杂性。(Hawk Ticehurst)
- 通过
- 引入
<x-signal>
自定义元素- 作者提出并实现了一个名为
<x-signal>
的自定义元素,用于在 HTML 中直接定义和管理响应式状态。 - 该元素使用
signal-polyfill
提供的Signal
类和effect
函数,实现状态的创建和 DOM 的自动更新。(Hawk Ticehurst)
- 作者提出并实现了一个名为
- HTML 中的状态定义
<x-signal>
元素的初始状态可以通过其文本内容或state
属性定义。- 引入了类型强制转换(coercion)功能,将字符串转换为适当的数据类型(如数字、布尔值、数组或对象)。
- 支持 HTML 渲染
- 通过设置
render="html"
属性,<x-signal>
元素可以渲染 HTML 内容,而不仅仅是文本。 - 这使得开发者可以创建如 Markdown 编辑器等更复杂的交互式组件。(Hawk Ticehurst)
- 通过设置
- 自定义渲染逻辑
- 引入
customRenderer
属性,允许开发者提供自定义的渲染函数,以控制状态如何呈现到 DOM。 - 例如,可以将数组状态渲染为加法表达式或待办事项列表。
- 引入
- 派生状态(Derived State)
- 通过
Signal.Computed
创建派生状态,实现基于其他状态计算得出的新状态。 - 例如,计算计数器的双倍值,并自动更新显示。(Hawk Ticehurst)
- 通过
- 未来展望
- 探讨了
<x-signal>
与服务器端渲染(如 Astro 框架)的集成,支持在服务器端定义初始状态,并在客户端无缝接管。 - 提出了 “islets” 的概念,即在静态 HTML 中嵌入的微小交互单元,进一步细化了 “islands architecture” 的思想。(Hawk Ticehurst)
- 探讨了
🌟 推荐概述
这篇文章的亮点在于提出并实现了一个创新的概念:通过自定义 HTML 元素 <x-signal>
,在纯 HTML 中直接定义和管理响应式状态。(Hawk Ticehurst)
- 简化响应式开发:无需引入大型框架,开发者可以在 HTML 中直接定义状态,并通过简单的 JavaScript 与之交互,降低了开发门槛。
- 增强可移植性和可维护性:
<x-signal>
元素作为一个独立的组件,可以在不同的技术栈中复用,提升了代码的可移植性和可维护性。 - 促进 HTML 与 JavaScript 的融合:通过在 HTML 中定义状态,并在 JavaScript 中访问和修改,增强了两者之间的协同作用,提升了开发效率。
这篇文章适合对 Web Components、响应式编程和前端架构感兴趣的开发者阅读,尤其是那些希望在不依赖大型框架的情况下实现响应式功能的开发者。它不仅提供了实际的实现示例,还引发了对前端开发模式的深入思考,具有很高的参考价值。