智能体工程:囤积你会的代码
我很多高效使用编程智能体的技巧,其实是我职业生涯中没用 AI 时也管用的建议的延伸。这里有个绝佳例子:囤积你会的代码。
构建软件的一大技能是知道什么可行、什么不可行,至少对如何实现有个大致概念。
这类问题可大可小,有的还很冷门。比如:网页能单用 JavaScript 跑 OCR 吗?iPhone 应用不运行时还能连蓝牙设备吗?能用 Python 处理 100GB 的 JSON 文件而不全加载到内存吗?
你掌握的这类答案越多,就越可能发现用技术解决问题的机会,方式可能是别人没想到的。
知道理论上可行,和亲眼见过实现是两回事。作为软件从业者,关键资产是积累大量这类问题的答案,最好有运行代码佐证。
我用多种方式囤积这类解决方案。我的博客和TIL 博客塞满了笔记,记录我搞明白怎么做的事。我有上千个 GitHub 仓库,收集为不同项目写的代码,很多是小型的概念验证,演示关键想法。
最近我还用大语言模型来扩充我的代码解决方案库。
tools.simonwillison.net 是我最大的大语言模型辅助工具和原型集合。我用它来收集所谓的HTML 工具——单个 HTML 页面,嵌入 JavaScript 和 CSS,解决特定问题。
我的 simonw/research 仓库有更大型、更复杂的例子,我让编程智能体研究问题,带回工作代码和详细报告。
重组囤积的代码
为什么要收集这些东西?除了帮你构建和扩展自身能力,过程中生成的资产会成为编程智能体极其强大的输入。
我最喜欢的提示模式之一,是告诉智能体通过组合两个或多个现有工作示例来构建新东西。
帮我理清这方法多有效的一个项目,是我工具集里加的第一个——浏览器端的OCR 工具,这里有更详细介绍。
我想要个简单、浏览器端的工具,来对 PDF 文件页面做 OCR——特别是那些完全由扫描图像组成、没提供文本版本的 PDF。
我之前试过在浏览器里跑 Tesseract.js OCR 库,发现它能力很强。这个库提供了成熟 Tesseract OCR 引擎的 WebAssembly 构建,让你能用 JavaScript 调用它从图像提取文本。
但我不想处理图像,我想处理 PDF。然后我记起我也用过 Mozilla 的 PDF.js 库,它能把 PDF 的单个页面转成渲染图像。
我笔记里有这两个库的 JavaScript 代码片段。
这是我喂给模型(当时是 Claude 3 Opus)的完整提示,结合了我的两个例子,描述了我想要的解决方案:
I want to build a web page that can perform OCR on PDF files directly in the browser. I have two existing examples:
1. Using PDF.js to render a PDF page as an image.
2. Using Tesseract.js to extract text from an image.
Combine these to create a tool where I can upload a PDF, select a page, and get the OCR text output.
效果完美!模型输出了一个概念验证页面,完全满足需求。
我迭代了几次才得到最终结果,但只花了几分钟就构建出一个真正有用的工具,我一直受益至今。
编程智能体让这更强大
那个 OCR 例子是我 2024 年 3 月建的,差不多在 Claude Code 首个版本发布前一年。编程智能体让囤积工作示例变得更有价值。
如果你的编程智能体能上网,你可以让它做类似这样的事:
Build me a tool that extracts all links from a web page and displays them in a table with their anchor text. Use this example as a starting point: https://tools.simonwillison.net/link-extractor
(我指定了 curl,因为 Claude Code 默认用 WebFetch 工具,它会总结页面内容而不是返回原始 HTML。)
编程智能体很擅长搜索,这意味着你可以在自己机器上运行它们,告诉它们去哪找你想要它们做的例子:
Write a Python script that uses the GitHub API to list all of my repositories. Look at my existing GitHub API scripts for examples of authentication.
通常这就够了——智能体会启动搜索子智能体去调查,只拉回完成任务所需的细节。
既然我的研究代码大多公开,我常告诉编程智能体克隆我的仓库到 /tmp 并用作输入:
Clone https://github.com/simonw/research to /tmp and look at the ocr-pdf example. Use that as a reference to build a similar tool for extracting text from scanned images in a ZIP file.
关键想法是,编程智能体意味着我们只需要一次搞明白有用的技巧。如果那个技巧在某个地方有文档和运行代码示例,我们的智能体就能参考那个例子,用它来解决未来任何类似形状的项目。
觉得有用?分享给更多人