我目前正在评估不同模型在生成 XML 和 JSON 时的表现。不出所料,XML 的表现相当不错——除了一个问题:这些模型经常返回无效的 XML。这使得很难正确评估内容本身的质量,无论模型的序列化数据质量如何。所以我需要一个粗糙的 XML 解析器。
我尝试过各种方法(比如 html5lib、html lxml 解析器等等)来修复我的 XML 解析问题,但都失败了,每次都引发各种有趣的问题。之后,我让 Claude 发挥我的想象力,从头开始为我编写一个合适的 XML 库。我给了它一些关于库应该是什么样子的基本说明,它一下子就搞定了。之后,我又提示它大约 20 次,让它做一些小的修复,作为对我(简要地)检查、使用以及创建全面测试套件的回应。
与此同时,我创建了一个徽标。之后,我快速用 Illustrator 将其转换为 SVG,并让 Claude 使其能够感知主题的暗色和亮色模式,结果完美地实现了。
除此之外,Claude 还完全设置了 CI,甚至远程控制我的浏览器来为我配置该包的可信 PyPI 发布者。
总而言之,AI 所做的如下:
- 它为解析器编写了约 1100 行代码
- 它编写了约 1000 行测试
- 它配置了整个 Python 包、CI、PyPI 发布
- 生成了 README 文件,起草了变更日志,设计了徽标,并使其具有主题感知能力
- 进行了多次重构,让我更加快乐
启动这一切的初始提示(包括拼写错误):
我希望你实现一个单文件库,用于对 XML 进行简单的解析。它应该实现两个功能:
- stream_parse为 XML 流生成事件流(使用命名元组)
- tree_parse接收 stream_parse 的输出并组装元素树。默认使用 xml.etree.ElementTree,也可以选择提供 lxml(或其他格式)
它应该很快,但使用预编译的正则表达式来解析流。这里的想法是,输出来自那些假装使用 XML 格式,但对不良输出缺乏足够保护的系统(例如:LLM)。
因此,例如 & 应该转换为 &,但如果使用了 &x(这是无效的),则它在输出中应该保留为 &x。此外,如果某个内容是无效的 CDATA 部分,我们会优雅地忽略它。如果标签在较大的标签内错误地关闭,我们会恢复其结构。例如,当 </foo> 出现时,<foo><p>a<p>b</foo> 会直接关闭内部结构。
使用超思维。将实施过程分解为
- 规划
- API 存根
- 执行
使用子任务和子代理来保存上下文
现在,如果你看一下这个库,你可能不会觉得它有多漂亮。它可能有点乱,可能还有一些我还没发现的bug。不过,它对我来说现在运行得很好,足以应付我正在做的事情,而且它确实帮我解决了一些问题。我总共花了大约30-45分钟来编写初始实现,当时我正在做其他事情。我不断提示它一段时间,以便在使用它时取得一些进展。
如果你想看看它是什么样子的:
需要明确的是:这并不是对在严肃的开源库中使用模型的认可。这只是一个实验,看看我能用最少的手动工作量取得多大的进展,并摆脱一个恼人的阻碍。结果对于我目前的用例来说已经足够好了,而且我觉得发布到 PyPI 上也不错,以防其他人遇到同样的问题。
把它当作一个有趣的副项目,它更多地说明了今天可能发生的事,而不是必然的建议。
附言:是的,我确实给它加了 Apache 2 许可证。在几乎没有人参与的情况下,这是否有效?这是一个有趣的问题,但我迫不及待地想自己弄清楚。然而,这肯定是我们迟早都要面对的问题。