sketch.dev blog Log in Sign up

LLM Agent Loop 结合工具使用的惊人有效性

2025-05-15 by Philip Zeyliger 过去几个月,我和我的同事一直在开发一个名为 Sketch 的 AI 编程助手。最让我惊讶的是,将 LLM 与工具结合使用的主循环竟然如此简单:

def 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()

为了使上述代码正常运行,需要一些技巧([这是完整的脚本](https://sketch.dev/blog/<agent_loop.py>)),但核心思想就是上面这 9 行代码。在这里,llm() 是一个函数,它将系统提示、到目前为止的对话以及下一条消息发送到 LLM API。

“工具使用”是指“LLM 返回一些与 schema 对应的输出”的术语。在完整的脚本中,我们在系统提示和工具描述提示中告诉 LLM,它可以访问 bash

仅仅使用这一个非常通用的工具,当前的模型(我们广泛使用 Claude 3.7 Sonnet)就能解决许多问题,其中一些问题可以“一次成功”。以前我需要查找一个深奥的 git 操作,然后剪切并粘贴,现在我只需让 Sketch 来完成。以前我需要手动处理 git 合并,现在我让 Sketch 进行第一次尝试。以前我需要更改类型,然后逐一处理由此产生的类型检查器错误(或者,说实话,使用 perl -pie 的荒谬方法),现在我让 Sketch 试一试。如果提示得当,agentic loop 可以是持久的。如果你没有安装某些工具,它会安装它。如果你的 grep 有不同的命令行选项,它会适应。(它也可能令人恼火!“哦,这个测试没有通过...我们跳过它吧”,它有时会令人恼火地说。)

对于许多工作流程,agentic 工具可以进行专门化。Sketch 的工具箱不仅仅是 bash,因为我们发现一些额外的工具可以提高质量、加快迭代速度并促进更好的开发者工作流程。让 LLM 正确编辑文本的工具出人意料地棘手。看到 LLM 在 sed 单行程序中挣扎,再次证明了可视化(而非基于行)编辑器是多么了不起。

我毫不怀疑 agent loops 将被纳入更多日常自动化工作中,这些工作在历史上对于通用工具来说过于具体,对于传统的自动化来说又过于深奥和不稳定。我一直在想,我花了多少时间将堆栈跟踪与 git 提交相关联,以及 LLM 在这方面做的第一次尝试有多好。我们将在我们的 bin/ 目录中看到更多自定义的、临时的、一次性的 LLM agent loops。拿起你最喜欢的 bearer token,试一试吧。

Also published atphilz.dev/blog/agent-loop/. sketch.dev · merde.ai · pi.dev