我的第一个 LLM Agent:让模型真正执行任务
以前和大语言模型聊天时,我更在意它能不能给出一个好答案。后来开始做自己的项目,问题变成了:如果我交给它一件事,它能不能把这件事做完?
这也是我开始做 LLM Task Agent 的原因。我想把自然语言和日常内容管理连接起来,让模型参与理解需求、整理信息和生成内容,再由程序调用工具,把结果交到需要的位置。
我选择了 Notion 作为应用场景。自己的笔记和博客内容都和它有关,相比一个抽象的演示,我更想围绕实际会用到的事情来做。
这篇先记录项目的思路,以及我在整理这个项目时关心的问题。公开仓库目前以项目说明为主,源码和运行材料还需要补齐;持久化、中断恢复和评测等细节,也需要结合代码与记录逐项说明。
从一句需求开始
假设我提出这样一个任务:
找到 Notion 中关于 Agent 的笔记,整理成一篇中文草稿,保存到指定位置。
这是一个用于解释流程的例子,不是一段实际运行日志。
对人来说,这句话很容易理解。对程序来说,却有不少东西需要明确:到哪里找,哪些内容属于这个主题,文章面向谁,要多长,最后保存到哪个页面。
如果这些条件不清楚,模型即使写出一篇流畅的文章,也可能没有完成我想做的事情。例如,它直接凭已有知识写作,没有读取我的笔记;或者确实保存成功了,却写到了另一个位置。
因此,我把整个任务理解成几个相互连接的步骤:
提出需求 ↓ 明确范围和目标 ↓ 拆解步骤,选择工具 ↓ 读取资料,整理内容 ↓ 检查结果,确认写入 ↓ 返回完成情况
流程里的每一步都有自己的输入和结果。前一步得到的资料,需要能够传到后一步;某一步失败了,也需要知道失败发生在哪里。
模型和程序,分别负责什么
这个项目以 Python 为基础,围绕大语言模型 API、Notion API 和任务状态来组织流程。
我会让模型参与那些需要理解和表达的部分,例如分析需求、提出任务步骤、从资料中提炼重点。页面读取、参数检查、API 请求和结果记录,则由程序来完成。
以保存文章为例,模型可以生成正文,也可以提出要使用的工具和参数。但页面是否存在、请求是否成功、返回了什么 ID,都要依据工具的实际结果判断。
如果只看模型最后说了什么,很容易把“我已经保存好了”当成成功。可这句话本身不能证明页面真的写入了。
我希望最终的回复能够回答几件具体的事:处理了哪些资料,生成了什么内容,保存在哪里,还有什么没有完成。这样,我才知道这个任务能不能交差。
一份任务状态里应该留下什么
多步骤任务进行到一半时,程序不能只记住最后一句对话。
我认为值得保存的信息包括:原始需求、已经确定的目标、执行到哪一步、读到的资料、工具返回的结果,以及还没有处理的问题。后续步骤需要这些信息,排查失败时也需要它们。
例如,正文生成成功了,保存页面的请求却超时了。这时,重新生成一篇文章未必有必要。更需要确认的是,保存请求到底有没有生效。
这里有一个容易忽略的区别:保存任务进度,并不自动解决重复写入。
即使程序知道自己执行到了“保存页面”,也可能不知道外部系统是否已经完成了操作。恢复执行之前,需要查询已有结果,或通过操作标识和写入记录判断是否应当再次提交。
这是我后续完善可靠性时需要验证的情形。它也让我意识到,“支持恢复”需要有明确的失败场景和运行证据。
怎样判断它完成了任务
对于普通聊天,答案是否有帮助,往往可以直接阅读判断。对于 Agent,验收还涉及外部动作。
前面的示例至少需要检查:资料是否来自指定范围,草稿是否符合主题,正文是否完整,是否保存到了正确位置。
我倾向于把检查分成两部分。可以由程序确认的条件,例如页面 ID、返回状态和必填字段,交给程序。内容是否切题、有没有遗漏重要信息,再结合模型检查和人工阅读。
同样,重试也需要上限。一个任务持续调用模型、不断修改,却没有取得进展,应该能够停下来,说明已经完成的部分和卡住的原因。
执行次数、耗时和调用成本,都应该成为任务记录的一部分。没有固定任务与运行记录之前,我不会给这个项目写一个看起来漂亮的完成率。
为什么还需要人工确认
在博客场景里,我希望 Agent 先把资料和草稿准备好,让我阅读、修改,再决定是否发布。
写入草稿和发布文章有不同的含义。前者是编辑过程,后者代表我愿意对外表达这些内容。文章里可能有事实错误,也可能只是措辞和我的想法不一致。
所以,连接博客的下一步,我想打通的是“需求—资料—草稿—检查—确认”的流程。多语言翻译、任务恢复和自动化管理,也需要在这个流程里逐步验证。
我想继续把它做成什么
这个项目让我开始更具体地理解 Agent:一次任务需要把模型生成、程序执行和外部系统的结果连起来。
接下来,我更想把一个完整流程公开出来,让别人能够看见它读取了什么、调用了什么、为什么成功,以及失败时留下了什么。源码、运行配置和可复现的示例,是比功能清单更值得补齐的部分。
等这些材料准备好,再回头看这个项目,我应该也能更清楚地回答:哪些事情已经可以放心交给它,哪些事情还需要我陪着做。