1. 分水岭到底分的是什么:Agent 开发与 Agent 算法的本质差异
先把结论摆在最前面:Agent 开发和 Agent 算法,是两条完全不同的职业路径,混在一起学,大概率两头都抓不住。我见过太多人一上来就问“Agent 怎么学”,然后同时打开 LangChain 文档、ReAct 论文、某框架的快速上手教程,三线并行,两周之后原地打转。问题不在于不够努力,而在于没搞清楚这两件事各自解决什么问题。
打个比方。Agent 算法像是研究“怎么让一个厨师更聪明”——怎么拆解菜谱、怎么根据现有食材临时换方案、怎么在多个灶台之间调度。Agent 开发则像是“把厨房搭起来,让厨师能真正干活”——灶台怎么接燃气、传菜窗口开在哪、冰箱和操作台的距离合不合理、高峰期三个厨师会不会撞在一起。前者关心决策质量,后者关心系统能不能跑起来、跑得稳、跑得久。
这个分水岭之所以在 2025 到 2026 年变得特别明显,是因为行业需求发生了结构性变化。2023 年大家还在惊叹“大模型能调用工具了”,2024 年开始卷框架和编排,到了 2025 年下半年,企业侧的需求已经非常具体:不是要一个能演示的 Demo,而是要一个能扛住真实业务流量、能审计、能回滚、能控制成本的 Agent 系统。这就把“算法能力”和“工程能力”硬生生撕开了。
Agent 算法的核心问题域包括:任务如何分解、推理链路如何设计(ReAct、Plan-and-Execute、Reflexion 等范式)、记忆如何组织与检索、多 Agent 之间如何协商、工具选择策略如何优化、失败后如何自我修正。这些问题的产出物通常是论文、算法模块、评测基准上的指标提升。
Agent 开发的核心问题域则是:框架选型、状态管理、并发控制、超时与重试、可观测性、权限与安全边界、成本核算、部署形态、与现有业务系统的对接。产出物是一个能上线的服务。
我个人的判断是:如果你是想做产品、做平台、做企业级落地,Agent 开发是主线,算法是你要能读懂但不一定自己造的东西;如果你是想做研究、发论文、优化核心指标,算法是主线,开发能力是让你能验证想法的工具。最怕的是定位不清,用算法的心态做开发(追求炫技,忽略稳定性),或者用开发的心态做算法(只会调 API,不理解为什么这样设计)。
下面这张表可以先帮你快速定位自己该往哪边靠:
| 维度 | Agent 算法 | Agent 开发 |
|---|---|---|
| 核心目标 | 提升决策质量与任务成功率 | 构建稳定可用的 Agent 系统 |
| 主要产出 | 算法模块、评测结果、论文 | 可部署服务、平台、工具链 |
| 关键技能 | 推理范式、记忆机制、多 Agent 协作 | 框架、并发、状态管理、可观测性 |
| 典型问题 | “为什么这个任务分解策略更好” | “为什么高峰期请求超时率飙升” |
| 评测方式 | 基准数据集、成功率、步数 | 吞吐、延迟、成本、故障恢复 |
| 学习入口 | 论文 + 小规模复现 | 框架文档 + 真实项目拆解 |
这张表不是绝对的,但它能帮你判断:你现在花时间学的东西,到底在解决哪一类问题。如果你连自己在哪一边都说不清,那大概率是在无效学习。
2. Agent 开发的核心能力栈:从框架选型到并发扛压
2.1 框架选型不是选最火的,而是选最匹配业务形态的
目前主流 Agent 框架大致可以分成几类,我按实际项目中的使用感受来说,不按官网宣传来排。
第一类是通用编排型,代表是 LangChain / LangGraph 这一系。LangChain 的优势是生态全、集成多,几乎你能想到的模型、向量库、工具都有现成封装。但它的历史包袱也重,抽象层多,调试的时候经常要往下翻好几层才能找到真正出问题的地方。LangGraph 是后来补上的状态图编排方案,把 Agent 的执行流程显式建模成图,节点是步骤,边是转移条件,这个设计对复杂流程控制非常友好。我现在的习惯是:简单链式任务用 LangChain,有循环、有分支、有中断恢复需求的用 LangGraph。
第二类是代码优先型,比如 OpenAI 的 Agents SDK、Anthropic 的 tool use 原生方案。这类方案的特点是“少抽象”,你直接写 Python 函数,框架帮你处理工具调用和消息循环。好处是透明、可控、调试简单;坏处是复杂编排要自己写,状态管理要自己管。适合对可控性要求高、团队工程能力强的场景。
第三类是企业平台型,比如扣子(Coze)、Dify 这类低代码平台。优势是上手快、可视化编排、内置知识库和插件市场。适合业务人员快速验证想法,或者做内部工具。但如果你要做深度定制、要接私有系统、要做复杂权限控制,平台的天花板会比较明显。
第四类是研究导向型,比如 AutoGen、CrewAI 这类多 Agent 协作框架。它们的设计初衷是探索多 Agent 交互范式,Demo 很惊艳,但直接上生产要补的工程课很多,比如消息传递的可靠性、Agent 之间的死循环检测、成本失控的防护。
选型的时候我一般问自己四个问题:流程是线性的还是图状的?需不需要人工介入中断?要不要持久化状态?团队能不能接受自己写状态管理?这四个问题的答案基本能锁定框架范围。
2.2 状态管理:Agent 开发里最容易被低估的硬骨头
很多人做 Agent Demo 的时候不觉得状态管理是个问题,因为一次会话就几轮,内存里存个 list 就够了。但一旦上生产,问题立刻暴露:用户会话可能持续几十分钟,中间可能断线重连,可能同时有多个任务并行,可能需要在某个步骤暂停等人工审批。这时候“状态”就不是一个 list 能解决的了。
我的经验是,Agent 的状态至少要分三层来管:会话状态(conversation state)、任务状态(task state)、执行状态(execution state)。会话状态是用户可见的对话历史;任务状态是当前任务分解到了哪一步、哪些子任务完成了;执行状态是当前正在跑的那个工具调用的中间结果、超时计时、重试次数。这三层混在一起,调试的时候就是灾难。
持久化方案上,轻量场景用 Redis 存会话和任务状态就够了,执行状态可以放内存加定期快照。重量场景建议上数据库,PostgreSQL 加 JSONB 字段能兼顾结构化和灵活性。如果框架自带 checkpointer(比如 LangGraph 的 checkpointer 机制),优先用框架的,但一定要搞清楚它存了什么、什么时候写、失败了怎么恢复。
注意:状态恢复不是“读回来就行”。你要考虑幂等性——如果某个工具调用已经执行了但状态没来得及写,恢复后会不会重复执行?涉及写操作的工具(发邮件、下单、改数据库)必须做幂等设计,否则恢复机制反而会制造脏数据。
2.3 并发扛压:AI Agent 怎么应对真实流量
“AI Agent 怎么扛并发”是热搜里的高频问题,说明这是真痛点。Agent 的并发和普通 Web 服务不一样,因为每个请求的耗时波动极大——简单问答可能 2 秒,复杂任务可能 2 分钟,中间还涉及多次模型调用和工具调用。这意味着你不能用传统的“线程池 + 固定超时”思路来扛。
我的实践方案是分层限流 + 异步编排 + 超时分级。
分层限流是指:入口层限制总并发请求数,模型调用层单独限制并发(因为模型 API 通常有 RPM/TPM 限制),工具调用层再单独限制(因为外部系统可能更脆弱)。这三层限流要独立配置,不能用一个全局值糊弄。
异步编排是指:Agent 的执行主循环用异步 IO,模型调用和工具调用都走 async。Python 里 asyncio + httpx 是标配,如果框架不支持异步,那在高并发场景下基本没戏。我实测过一个同步框架在 50 并发下的表现,延迟直接飙到不可用,换成异步版本后同样硬件能扛 300 并发。
超时分级是指:不同环节设不同超时。模型调用可以给 30 到 60 秒,简单工具调用给 5 到 10 秒,复杂工具调用给 30 秒,整个任务给一个总超时比如 5 分钟。任何一层超时都要有明确的降级策略——是重试、是跳过、还是返回部分结果,不能就卡在那里。
| 并发层级 | 限制对象 | 典型配置 | 超时策略 |
|---|---|---|---|
| 入口层 | 总请求数 | 按实例数 × 50 | 排队超时 10s |
| 模型层 | 模型 API 调用 | 按 API 配额 80% | 30-60s,失败重试 2 次 |
| 工具层 | 外部系统调用 | 按外部系统承受力 | 5-30s,失败降级 |
| 任务层 | 单任务总时长 | 按业务容忍度 | 5min,超时返回部分结果 |
这套东西听起来不复杂,但真正落地的时候,最难的是观测。你必须能实时看到每一层的并发数、排队长度、超时率、重试率,否则限流参数就是拍脑袋。Prometheus + Grafana 是标配,关键指标至少包括:当前活跃任务数、模型调用 P99 延迟、工具调用失败率、任务完成率、平均步数。
2.4 可观测性:没有 trace 的 Agent 就是黑盒
Agent 的可观测性比普通服务更重要,因为它的执行路径是不确定的。同一个输入,两次执行可能走不同的工具、不同的步数。出了问题,你光看日志根本还原不出来。
我的做法是全链路 trace + 步骤级 span。每次任务执行生成一个 trace ID,每个步骤(模型调用、工具调用、状态转移)生成一个 span,span 里记录输入、输出、耗时、token 消耗、是否命中缓存。这样出问题的时候,你能精确看到是哪一步、哪个工具、什么输入导致的。
工具选型上,OpenTelemetry 是通用方案,LangSmith、LangFuse 这类是 Agent 专用方案,后者对 Agent 场景的适配更好,能直接看到推理链路和工具调用树。如果预算有限,自己用 OpenTelemetry + ClickHouse 搭一套也不难,核心是把 trace 数据结构设计好。
实操心得:trace 里一定要记录 token 消耗和成本。Agent 的成本失控往往不是单次调用贵,而是步数多、重试多、上下文膨胀。我见过一个任务因为工具返回结果没做截断,上下文从 2K 涨到 50K,单次成本翻了 20 倍。没有成本 trace,你根本发现不了。
3. Agent 算法的关键范式:推理、记忆与多 Agent 协作
3.1 推理范式:ReAct 不是终点,而是起点
ReAct(Reasoning + Acting)是 Agent 算法里最经典的范式,核心思想是让模型交替进行“思考”和“行动”,思考决定下一步做什么,行动调用工具获取信息,然后基于新信息继续思考。这个范式之所以重要,是因为它把“推理”和“工具使用”耦合在了一起,让模型能根据中间结果动态调整策略。
但 ReAct 有明显局限。第一,它是贪心式的,每一步只看当前最优,容易陷入局部最优或者死循环。第二,它没有全局规划,复杂任务容易跑偏。第三,它步数不可控,简单任务可能绕远路,复杂任务可能步数爆炸。
所以后续出现了几个重要变体。Plan-and-Execute是先让模型制定完整计划,再逐步执行,适合步骤明确的任务,但计划一旦制定就缺乏灵活性。Reflexion是在失败后让模型反思原因并调整策略,适合有明确成功/失败信号的任务。Tree of Thoughts是让模型探索多条推理路径再选最优,适合需要搜索的问题,但成本高。
我的实际经验是:没有万能范式,要看任务类型选。信息检索类任务用 ReAct 就够;多步骤业务流程用 Plan-and-Execute 加动态重规划;需要试错的任务加 Reflexion;需要精确推理的任务考虑 ToT 但要做好成本控制。很多生产系统其实是混合的——外层用 Plan-and-Execute 做骨架,内层用 ReAct 做灵活执行。
3.2 记忆机制:Agent 的“记性”决定了它的上限
Agent 的记忆分短期和长期。短期记忆就是当前会话的上下文,受限于模型的上下文窗口。长期记忆是跨会话的知识,需要外部存储和检索。
短期记忆的核心问题是上下文管理。上下文窗口再大也是有限的,而且越长越贵、越慢、越容易“迷失中间”。我的做法是分层压缩:最近的几轮对话保留原文,稍早的做摘要,更早的只保留关键实体和结论。摘要不是简单截断,而是让模型提取“对当前任务有用的信息”。这个压缩策略要跟任务类型匹配——客服场景要保留用户情绪和诉求,代码场景要保留变量名和函数签名。
长期记忆的核心问题是检索质量。向量检索是标配,但纯向量检索在 Agent 场景下经常不够用,因为 Agent 需要的是“和当前任务相关的经验”,而不是“语义相似的文本”。我的做法是向量检索 + 结构化过滤 + 重排序。结构化过滤用元数据(时间、类型、来源)缩小范围,重排序用交叉编码器提升精度。如果任务有明确的实体关系,知识图谱也是值得考虑的方案。
注意:记忆不是越多越好。我踩过的坑是给 Agent 塞了太多历史记忆,结果它在不相关的信息里绕圈子,反而降低了任务成功率。记忆的关键是精准召回,不是大量存储。宁可少召回,不可乱召回。
3.3 多 Agent 协作:什么时候该用,什么时候是过度设计
多 Agent 协作是这两年的热点,但我要泼一盆冷水:大部分场景不需要多 Agent。单 Agent 加好的工具集和清晰的提示词,能解决 80% 的问题。多 Agent 带来的复杂度是指数级的——通信开销、状态同步、死锁检测、成本控制,每一项都是坑。
多 Agent 真正有价值的场景是:任务可以明确分解成不同角色(比如一个负责检索、一个负责分析、一个负责审核),且角色之间的交互有明确的协议。或者任务需要并行探索多个方向再汇总。或者需要“对抗式”验证(一个生成、一个挑错)。
如果决定用多 Agent,我的建议是先定义通信协议,再定义 Agent 角色。通信协议包括:消息格式、消息路由规则、终止条件、冲突解决机制。没有协议的多 Agent 系统,跑起来就是一群 Agent 在互相刷屏。框架上,AutoGen 的对话式协作适合探索性任务,CrewAI 的角色分工适合流程化任务,LangGraph 的图编排适合需要精确控制的场景。
| 场景特征 | 推荐方案 | 理由 |
|---|---|---|
| 单一任务、工具多 | 单 Agent + 工具集 | 复杂度低,调试容易 |
| 明确角色分工 | CrewAI 类角色框架 | 角色边界清晰 |
| 需要并行探索 | 多 Agent + 汇总 | 提升覆盖率 |
| 需要对抗验证 | 生成 + 审核双 Agent | 提升质量 |
| 复杂流程控制 | LangGraph 图编排 | 精确可控 |
4. 从零搭建一个 Agent 的完整实操路径
4.1 需求拆解:先想清楚“谁在什么场景下用它干什么”
我见过太多项目一上来就选框架、搭环境,结果做到一半发现需求根本没想清楚。Agent 开发的第一步不是技术选型,是需求拆解。
具体要回答几个问题:用户是谁?在什么场景下用?输入是什么形态?期望输出是什么?成功标准是什么?失败容忍度多高?有没有人工兜底?这些问题不回答清楚,后面所有技术决策都是空中楼阁。
举个例子。如果是一个内部知识库问答 Agent,用户是员工,场景是查制度、查流程,输入是自然语言问题,输出是带出处的答案,成功标准是答案准确且可追溯,失败容忍度低(不能瞎编),那技术方案就很明确:RAG + 引用溯源 + 拒答机制。如果是一个自动化运维 Agent,用户是运维工程师,场景是故障排查,输入是告警信息,输出是排查步骤和建议,成功标准是缩短排查时间,失败容忍度高(人可以接管),那方案就是:工具调用 + 推理链 + 人工确认节点。
需求拆解的输出应该是一份任务规格说明,包括:任务边界、输入输出规范、成功/失败定义、人工介入点、性能要求、成本预算。这份文档是后面所有工作的基准。
4.2 环境搭建与最小可运行版本
需求清楚之后,先搭一个最小可运行版本(MVP),不要一上来就追求完整功能。MVP 的目标是跑通“输入 → 推理 → 工具调用 → 输出”这个主循环,验证技术可行性。
以 Python 为例,最小依赖通常是:一个模型 SDK(OpenAI、Anthropic 或国内模型)、一个 Agent 框架(LangChain 或直接手写)、一个向量库(如果涉及 RAG)、一个 Web 框架(FastAPI)。环境用 venv 或 conda 隔离,依赖用 requirements.txt 或 pyproject.toml 管理。
# 最小 Agent 主循环示意(伪代码风格,突出结构) async def run_agent(task_input, tools, max_steps=10): messages = [{"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": task_input}] for step in range(max_steps): response = await call_model(messages) if response.has_tool_call: tool_result = await execute_tool(response.tool_call, tools) messages.append(response.message) messages.append({"role": "tool", "content": tool_result}) else: return response.content return "达到最大步数限制"这个循环看起来简单,但每个环节都有讲究。max_steps是防止死循环的硬保险,call_model要处理超时和重试,execute_tool要处理异常和幂等,messages的增长要控制上下文长度。MVP 阶段可以简化,但要知道哪些地方是后面必须补的。
4.3 工具接入:让 Agent 真正能“动手”
工具是 Agent 和外部世界交互的接口。工具设计的好坏,直接决定 Agent 的能力上限。我的经验是:工具要原子化、语义清晰、错误可读。
原子化是指一个工具只做一件事。不要设计一个“处理订单”的超级工具,而是拆成“查询订单”“修改订单状态”“取消订单”三个工具。这样 Agent 更容易选择,也更容易组合。
语义清晰是指工具名和参数名要自解释。search_knowledge_base(query, top_k)比skb(q, n)好得多,因为模型是根据语义来选工具的。
错误可读是指工具返回的错误信息要能让模型理解并调整。返回{"error": "timeout"}不如返回{"error": "查询超时,建议缩小查询范围或稍后重试"},后者能让模型做出更合理的下一步决策。
工具接入的常见坑:参数类型不匹配(模型传字符串,工具要整数)、工具描述太模糊(模型不知道什么时候用)、工具返回太长(撑爆上下文)、工具没有超时(卡死整个流程)。这些都要在接入时处理好。
4.4 提示词工程:Agent 的“操作系统”
Agent 的提示词和普通对话的提示词不一样,它更像是一个操作系统的内核,要定义角色、能力边界、行为规范、输出格式、异常处理策略。
我的提示词结构一般是:角色定义 + 能力清单 + 行为规范 + 输出格式 + 异常处理 + 示例。角色定义说清楚“你是谁、你擅长什么”;能力清单列出可用工具和使用场景;行为规范定义优先级和禁忌;输出格式规定结构化输出;异常处理说明遇到问题怎么办;示例给几个典型场景的输入输出。
提示词不是一次写好的,是迭代出来的。我的做法是建一个测试集,覆盖典型场景、边界场景、异常场景,每次改提示词都跑一遍,看成功率变化。没有测试集的提示词优化就是盲调。
实操心得:提示词里一定要有“不知道就说不知道”的约束。Agent 最大的风险不是能力不足,是自信地胡说。加一句“如果信息不足,明确说明需要什么信息,不要猜测”,能显著降低幻觉率。
5. 常见问题与排查技巧实录
5.1 Agent 死循环、跑偏、超时的排查思路
死循环是最常见的问题。表现是 Agent 反复调用同一个工具,或者在不同工具之间来回跳。排查思路:先看 trace,确认循环的模式;然后检查工具返回是否让模型“误以为”任务没完成;最后检查提示词里有没有明确的终止条件。
常见原因和对策:工具返回格式不清晰,模型无法判断成功与否——统一返回格式,明确 success/fail 字段;提示词没有步数意识——加入“如果连续两次得到相同结果,尝试不同策略或终止”;任务本身无解——加入“如果确认无法完成,明确说明原因并终止”。
跑偏是指 Agent 执行方向偏离了用户意图。排查思路:看第一步的推理是否正确,如果第一步就偏了,是提示词或任务理解的问题;如果中间偏了,是工具返回或记忆干扰的问题。
超时的排查要分层看:是模型调用慢,还是工具调用慢,还是步数太多。模型慢通常是上下文太长或模型本身负载高;工具慢通常是外部系统问题;步数多通常是任务分解不合理或提示词没有效率意识。
| 问题现象 | 可能原因 | 排查动作 | 解决方向 |
|---|---|---|---|
| 反复调用同一工具 | 工具返回不明确 | 看 trace 中工具返回 | 统一返回格式 |
| 工具间来回跳 | 提示词无终止条件 | 检查提示词 | 加入终止规则 |
| 第一步就跑偏 | 任务理解错误 | 看首步推理 | 优化提示词 |
| 中间跑偏 | 记忆干扰 | 看上下文内容 | 精简记忆 |
| 模型调用慢 | 上下文过长 | 看 token 数 | 压缩上下文 |
| 步数过多 | 任务分解差 | 看步数分布 | 优化分解策略 |
5.2 成本失控的预防与止损
Agent 成本失控通常有三个来源:步数多、上下文膨胀、重试多。预防措施是设硬上限:最大步数、最大 token 数、最大重试次数、单任务成本上限。止损措施是实时监控成本,超过阈值自动降级或终止。
我自己的做法是给每个任务设一个成本预算,比如 0.1 元。执行过程中累计 token 消耗,接近预算时触发警告,超过预算时强制终止并返回部分结果。这个机制救过我好几次,尤其是在测试阶段。
5.3 工具调用失败的降级策略
工具调用失败是常态,不是异常。降级策略要提前设计:重试、跳过、替代、终止。重试适合瞬时故障(网络抖动),跳过适合非关键工具,替代适合有备选方案的工具,终止适合关键工具失败且无替代。
关键是让 Agent 知道当前处于降级状态,并调整后续策略。比如检索工具失败了,Agent 应该知道“现在没有外部知识,只能基于已有信息回答”,而不是继续假装检索成功。
6. 学习路线与岗位能力对照
6.1 不同起点的学习路线
零基础转 Agent 开发:先补 Python 和 Web 基础,然后学一个框架(推荐 LangChain 或 LangGraph),做一个完整项目(比如知识库问答),再补并发、可观测性、部署。周期大概 3 到 6 个月。
有后端经验转 Agent 开发:直接学框架和 Agent 特有概念(状态管理、工具调用、提示词工程),重点补的是“不确定性系统”的设计思维。周期 1 到 3 个月。
有算法经验转 Agent 算法:读 ReAct、Reflexion、ToT 等核心论文,复现小规模实验,建立评测基准。重点是理解工程约束,避免设计出无法落地的算法。
想做 Agent 算法但没算法背景:先从应用层入手,理解 Agent 的实际问题,再回头研究算法。纯理论入手容易脱离实际。
6.2 岗位要求对照
Agent 开发岗通常要求:熟悉至少一个 Agent 框架、有 LLM 应用开发经验、懂并发和状态管理、有可观测性实践、能独立完成从需求到上线的全流程。加分项是:有高并发经验、有成本优化经验、有安全合规意识。
Agent 算法岗通常要求:有 NLP 或 RL 背景、熟悉推理范式、有论文复现能力、能设计评测方案。加分项是:有顶会论文、有开源贡献、有实际业务落地经验。
两个岗位的共同要求是:对大模型能力边界有清晰认知,知道什么能做、什么不能做、什么现在不能做但未来可能能做。这个判断力比任何具体技术都重要。
7. 我个人的一些实操体会
做 Agent 这几年,最大的体会是:技术选型的重要性被高估了,需求理解和工程细节的重要性被低估了。我见过用最朴素的方案做出稳定产品的团队,也见过用最时髦框架做出无法上线的 Demo 的团队。差别不在技术,在对问题的理解深度。
另一个体会是:Agent 的“智能”上限,往往不是模型决定的,是工具和数据决定的。你给 Agent 的工具越原子、越可靠、语义越清晰,它的表现就越好。你给它的数据越干净、越结构化,它的推理就越准。模型能力的提升是渐进的,但工具和数据的优化是立竿见影的。
最后一个建议:先做窄,再做宽。不要一上来就做通用 Agent,选一个具体场景,做到 90% 成功率,再扩展。窄场景能让你快速积累经验、建立评测、发现真问题。宽场景看起来机会大,但容易陷入“什么都能做一点,什么都做不好”的困境。
如果你现在正站在分水岭上犹豫往哪边走,我的建议是:先做开发,再补算法。开发能让你快速接触到真实问题,理解 Agent 的能力边界和工程约束。有了这些体感之后,再去看算法论文,你会知道哪些是真问题,哪些是纸面优化。反过来,先钻算法容易陷入“指标很好看,但不知道怎么用”的尴尬。