“让 AI 帮我整理笔记”听起来只是一个要求,真正落地时却包含多个步骤:查找文件、判断主题、提出分类、生成修改,最后确认结果有没有破坏原来的内容。
本文把能够根据任务状态选择工具、利用执行反馈继续工作的系统称为 Agent。这个词在不同产品中使用得很宽泛,讨论具体项目时,更有用的问题是:它能观察什么、能执行什么,以及什么时候必须停下来。
从固定流程开始观察问题
如果任务始终是“读取文章、提取摘要、写入草稿”,直接用固定工作流通常更容易检查。只有当下一步依赖运行时得到的信息时,再考虑把部分选择交给模型。
例如,整理笔记时发现重名文件,需要进一步检查内容,才能判断是同一份笔记的不同版本,还是两个不同主题。这里确实出现了依赖观察结果的分支。
ReAct 研究探索了推理与行动交替进行的方法:模型利用外部动作获得信息,再据此更新后续处理。它提供了一种研究思路,并不意味着给模型接上工具后,任务就会自然变得可靠。ReAct: Synergizing Reasoning and Acting in Language Models
工具接口尽量具体
给模型一个可以执行任意命令的入口,很难限制影响范围。对于笔记整理,可以先暴露少量明确的工具:搜索笔记、读取指定笔记、保存分类建议。
每个工具都应说明输入字段、允许的路径范围和返回结构。下面是一个设计示例,并非某个现成框架的 API:
{
"tool": "save_classification_draft",
"arguments": {
"note_id": "notes/rag-intro",
"category": "人工智能",
"reason": "正文主要讨论检索与生成流程。"
}
}
服务端要重新检查笔记是否存在、分类是否允许、调用者是否有权限。模型生成了符合 JSON 语法的参数,不代表这些参数就可以直接执行。
一次动作需要有明确结果
工具调用后,至少区分成功、可重试失败和需要额外输入的失败。返回的信息应当足够让系统决定下一步,而不是把所有错误都包成一句“操作异常”。
对于写入操作,还要考虑重复执行。比如工具已经保存了草稿,但返回时网络超时,直接重试可能产生第二份。可以通过任务编号和操作编号识别重复请求。
这类保证需要由应用实现。提示模型“不要重复”可以作为要求,却不能替代存储层或接口层的约束。
在循环开始前定义停止条件
可以为一个笔记整理任务设定:最多处理多少文件、允许多少次工具调用、单次任务最长运行多久,以及遇到哪些情况必须交给用户决定。
这些数值需要根据任务成本和可恢复性设定。下面的伪代码只表达控制关系:
读取任务与预算
循环:
预算耗尽 → 停止并报告已完成部分
任务完成 → 检查结果并返回
需要额外授权 → 保存当前状态并等待
请求工具 → 校验参数与权限 → 执行 → 记录结果
对于改名、删除和覆盖原文,第一版可以只生成变更建议,展示修改前后的差异,再由用户确认。确认应该绑定具体的变更内容;如果后续重新生成了修改,就需要重新判断原来的确认是否仍然适用。
用任务结果判断是否成功
Agent 输出“整理完成”,并不等于每份笔记都处理正确。应该检查实际产物:目标文件是否存在、分类是否有效、原文是否保留、失败项是否列出。
调试记录也应围绕可观察的信息:任务目标、工具参数、执行结果、状态变化和耗时。不要依赖一段模型自述的理由,来证明某次外部操作已经发生。
第一个 Agent 可以很小,只负责一个可检查、可恢复的任务。等它能清楚说明做了什么、哪里失败、下一步需要什么,再扩大它的执行范围。