这个问题其实是在问,你要怎么把一个纯语言模型变成一个能自主完成任务的系统。核心就是一个感知-规划-记忆-工具-行动的闭环。
先说感知模块。它负责接收外部输入,比如用户问的问题、图片、或者工具返回的结果。它的工作不只是接收,还要把这些原始数据转化成模型能理解的格式,比如把图片转成描述文本,或者把工具返回的 JSON 解析成自然语言。
再一个就是规划模块,这是 [[Agent]] 的脑子。它负责把复杂目标拆成可执行的子步骤,比如用户说“帮我订一张去北京的机票”,它要拆成查航班、比价格、下单、支付这些步骤。推理策略上,[[ReAct]] 和 [[Chain-of-Thought]] 是两种主流模式。CoT 适合纯推理任务,比如数学题,让模型一步步思考;ReAct 更适合需要跟外界交互的场景,比如搜索、查数据库,它让模型在思考和行动之间交替。实际落地时,我一般会混合使用,比如先用 CoT 做任务分解,再用 ReAct 执行每个子步骤。这里有个坑:如果任务需要频繁调用工具,ReAct 容易陷入循环,所以我会在规划时加一个最大步数限制,超时就直接报错。
然后是记忆系统。短期记忆就是当前对话的上下文,靠 sliding window 控制长度。长期记忆靠 [[Vector Database]] 存储历史经验和用户画像。举个例子,客服场景里,用户之前投诉过退款问题,下次来问其他订单时,Agent 能检索到那个历史记录,给出更个性化的回复。但长期记忆有个前提:向量检索的召回质量要够高,否则检索到不相关的内容反而会干扰模型。我见过一个失败案例,因为 [[Embedding]] 模型没做好领域适配,导致 Agent 总是引用错误的历史对话,越帮越忙。
工具和行动模块是 Agent 的手脚。它通过 [[Function Calling]] 把用户的自然语言请求转化成 API 调用。这里的关键是工具注册和参数解析。比如用户说“查一下这个订单的状态”,Agent 要能识别出“订单号”这个参数,并从上下文提取出来。工具执行后,返回结果还要解析,决定是继续规划还是直接输出。异常处理也很重要,比如工具超时或者返回错误,我会设计重试机制,重试三次还失败就降级,比如改用备选工具或者直接告诉用户“暂时查不到”。
最后是执行与反馈循环。整个流程是观察-思考-行动的闭环:感知输入,检索记忆,规划决策,调用工具,拿到结果后更新记忆,然后进入下一轮。真正上线时,我最关注的是失败场景。比如工具调用失败后,Agent 有没有能力重新规划,而不是卡死。另一个风险是 [[Hallucination]],如果 Agent 对工具返回的结果过度解读,可能会编造不存在的功能,所以我会在系统 Prompt 里强调“只基于工具返回的事实回答,不要猜测”。
说到这个,其实现在很多框架像 LangChain 已经封装好了这些组件,但我觉得它们有个共同问题:规划策略太死板。比如 ReAct 在复杂任务中容易产生冗余步骤。我更倾向自己实现一个轻量的规划器,用 [[Few-shot]] 示例来引导模型做更高效的分解。当然,这需要领域数据来构造示例,不是所有场景都适用。
所以我的理解是,Agent 不是一个固定的架构,而是根据场景做取舍。比如客服场景,记忆和工具是核心;而代码生成场景,规划和执行更重要。我会把 Agent 看成一套可插拔的组件,根据需求灵活组合。