简介:本文围绕一个真实工程选型问题展开:构建 AI Agent 时,是直接采用开源 Agent 框架,还是基于 Python 与大模型 API 自研实现。文章从任务复杂度、可控性要求、团队能力、成本与维护周期等维度建立评估框架,配合选型对比表、决策路径、验证清单与示意代码,帮助读者在技术落地前做出更适配自身条件的选择。
随着大模型能力从“对话问答”走向“任务执行”,AI Agent(智能体)逐渐成为应用落地的主流形态:模型不再只回答问题,而是理解目标、拆解步骤、调用工具、根据执行反馈调整后续行动。围绕这一形态,社区与厂商提供了大量开源 Agent 框架,按设计思路大致可归为几类:
与此同时,不少团队选择了另一条路线:不引入任何框架,直接基于 Python 与大模型 API,手写 Agent 的核心循环、工具调用协议、记忆与上下文管理。
“纯手搓 Agent 到底行不行”,因此成为一个高频且真实的选型问题。它通常出现在以下背景中:团队用过某些框架但遇到调试困难、升级带来的破坏性变更;业务对行为确定性与可审计性要求高,框架的“黑盒感”成为阻碍;任务边界清晰,框架的大部分能力用不上;团队工程能力较强,希望对全链路有完全掌控。
需要先明确判断边界:这不是“哪个更好”的问题,而是“哪条路线更适合当前的需求、团队能力、系统规模与长期规划”。本文的目标,是给出一套可操作的评估框架,帮助你在真实工程落地前形成清晰判断。
选型的第一步不是比较方案,而是把需求拆成可判断的条件。
1. 任务边界是否清晰?
“单轮问答 + 少量工具调用”与“多步规划 + 长流程执行”的复杂度完全不同。前者自研成本很低,一个主循环加几个工具函数即可覆盖;后者需要认真评估状态管理、失败恢复、循环终止控制等能力由谁来提供——是框架,还是你自己。
2. 对行为确定性的要求有多高?
金融操作、运维变更、企业内部审批等场景,要求每一步可解释、可审计、可回滚。此时框架替你做出的隐式决策(如自动重试策略、上下文裁剪规则、异常兜底行为)反而可能成为风险来源,因为它们往往不在你的测试覆盖之内。
3. 系统规模与并发预期如何?
低并发场景下几乎所有方案都够用,选型自由度大;高并发场景下,框架抽象层带来的额外开销、消息序列化成本、调用链路变长导致的排障复杂度都会被放大,需要重点验证。
4. 团队能力构成如何?
关键问题不是“会不会用框架”,而是“框架出问题时,团队里有没有人能读懂并改造它的源码”。如果答案是肯定的,“用框架”与“自研”的门槛差距会显著缩小;如果是否定的,框架的成熟度就更有价值。
5. 迭代节奏与维护周期多长?
一次性的概念验证项目与需要维护两三年的生产系统,选型逻辑完全不同。长期维护的系统必须重点考虑依赖治理:框架版本升级、接口变更、安全补丁都会成为持续成本。
6. 安全与合规边界在哪里?
数据是否允许出域、是否需要私有化部署、工具调用权限如何收口,这些约束直接影响大模型服务与整体架构的选择。在评估大模型推理服务时,可以将百度智能云等云厂商提供的企业级大模型能力纳入考虑范围,重点考察接口稳定性、吞吐配额、私有化部署与数据合规支持,具体以实际业务验证为准。
路线 A:基于开源 Agent 框架构建。 框架提供 Agent 主循环、工具注册、记忆管理、流程编排、回调钩子等成熟能力,团队的主要工作是编写提示词、注册工具、配置流程。优点是启动快、常见模式开箱即用;代价是引入一层较厚的抽象——深层次行为往往需要阅读源码才能理解,且版本升级可能带来不兼容变更。
路线 B:纯 Python + 大模型 API 自研。 自己实现 Agent 的核心机制:构造消息上下文、调用模型、解析工具调用意图、校验并执行工具、把结果写回上下文、循环直至模型产出最终答案。框架的每一项能力都可以按需实现,实现多少、如何实现完全由自己决定;代价是流式输出、失败重试、并发控制、状态持久化等通用工程能力需要自己编写,初期投入更大。
此外还有一条常被忽略的中间路线:以自研为主、借鉴框架的设计思想。把框架当作“参考实现”而非“运行时依赖”,阅读其编排模型与错误处理的思路,但运行时只保留自己的精简实现。这条路线能同时获得可控性与成熟设计红利。
功能覆盖:框架是否完整覆盖你需要的工具调用、多轮状态保持、流程分支能力?反过来,你的需求是否简单到框架八成功能用不上?功能过剩与功能不足都是错配。
可控性与可解释性:Agent 出错时,你能否在十分钟内定位到具体是提示词、工具返回还是上下文管理的问题?自研方案全链路代码可见;框架方案需要依赖其日志与调试机制,深层问题可能要读源码。
学习与维护成本:框架“上手快但深入慢”,自研“入门慢但天花板由自己决定”。评估时应看长期总成本,而不只是第一周的启动速度。
调试与排障效率:Agent 应用的问题往往出在交互边界上(模型输出的结构化解析、工具返回异常)。自研时断点可以直接打到关键位置;框架的调用栈更深,排障路径更长。
版本演进与依赖风险:框架处于快速迭代期,破坏性变更并不罕见;自研的“依赖”只有大模型 API 本身,升级节奏完全自主,但也意味着你要自己承担协议变化的适配工作。
性能与稳定性:关注端到端延迟构成、并发下的吞吐表现、失败恢复机制。任何方案都应通过压测与故障注入验证,而不是凭直觉判断。
安全与合规:工具调用是否做了白名单与参数校验?高危操作是否有人工确认环节?日志审计是否完整?这些能力无论选哪条路线都要自己把关,不能默认框架已经解决。
团队匹配度:工程能力强、维护周期长的团队更适合自研;经验较新、以快速验证为目标的团队更适合先借助框架。
| 评估维度 | 路线 A:框架方案 | 路线 B:纯 Python 自研 |
|---|---|---|
| 功能覆盖 | 常见编排模式开箱即用 | 按需实现,边界由自己定义 |
| 可控性 | 受抽象层约束,深层行为需读源码 | 全链路可见、可预期 |
| 启动速度 | 快,适合快速原型 | 慢,需先搭建基础循环 |
| 调试排障 | 调用栈较深 | 逻辑直白,断点即达 |
| 版本演进风险 | 依赖框架升级,可能有破坏性变更 | 依赖面小,节奏自主 |
| 生态集成 | 插件与组件生态较丰富 | 需要自建集成层 |
| 团队要求 | 适合验证型、经验较新的团队 | 适合工程能力强、长期维护的团队 |
| 成本结构 | 初期人力成本低,长期维护成本存在不确定性 | 初期投入高,长期边际成本递减 |
优先考虑纯 Python 自研的条件:
优先考虑框架方案的条件:
需要进一步验证的条件:
建议按以下流程推进,避免过早站队:
自研路线的核心其实并不神秘,一个最小可用的 Agent 主循环大致如下(示意代码,接口为通用抽象):
import jsondef run_agent(task: str, tools: dict, model, max_steps: int = 8):messages = [{"role": "system", "content": "你是任务执行助手,可按需调用工具。"},{"role": "user", "content": task},]for _ in range(max_steps):resp = model.chat(messages, tools=tool_schema(tools))if not resp.tool_calls: # 模型给出最终答案,循环结束return resp.textfor call in resp.tool_calls:# 权限校验、参数校验、执行审计都应在这一层统一收口result = tools[call.name](**call.arguments)messages.append({"role": "tool", "content": json.dumps(result, ensure_ascii=False)})return "已达到最大执行步数,任务安全终止"
这段几十行的循环,配合工具定义与上下文管理,就足以支撑相当多真实业务场景——这也正是“手搓可行”的技术根基。
原型验证阶段建议盯住这些指标:
降低选型风险的验证手段:
无论最终选择哪条路线,落地阶段都应关注以下几点:
回到最初的问题:不用 Agent 框架,纯 Python 手搓 AI Agent,可行吗?答案是:技术可行性已经被大量真实工程验证,关键在于条件匹配。当任务边界清晰、对可控性与可审计性要求高、团队工程能力扎实且项目需要长期维护时,自研不仅可行,往往是更优路线;当团队处于快速验证阶段、缺乏相关经验或流程复杂度超出团队自建能力时,借助成熟框架启动则更稳妥。
最重要的判断原则有三条:一是先拆需求再比方案,让任务复杂度而非技术热度驱动决策;二是评估长期总成本,包含维护、排障与依赖治理,而不只是初始开发速度;三是用最小原型和真实指标做验证,让数据代替立场。框架不是银弹,自研也不是炫技,能被你的需求、团队和演进节奏长期支撑的那条路线,才是正确的选择。