Tools、Workflow、Agent 三层架构详解
Tools、Workflow、Agent 三层架构详解:从最小能力单元到编排框架
1. 三者的核心误区
很多人把 Tools、Workflow、Agent 当成三个并列的竞争方案,认为做项目时需要在三者中选一个。这个理解是错的。
三者不是同一维度的东西,而是粒度不同、可以相互嵌套的三层结构。Tools 是最小的能力单元,Agent 是一个完整的决策系统,Workflow 是更上层的编排框架。在实际项目中,三者通常同时存在,扮演不同角色。
三者最核心的区别一句话:Tools 不做决策只执行,Agent 自己做决策,Workflow 是开发者替所有节点把决策提前写好。
2. 第一层:Tools——最小能力单元
2.1 核心定义
Tools 是整个体系里最底层的概念,就是一个封装好的函数,有明确的输入参数、明确的输出结果。
你给 LLM 配备的每一个能力,比如"查天气"“搜索网页”“执行 Python 代码”“往数据库写一条记录”,本质上都是一个函数。
Tools 和普通函数唯一的区别是:需要额外写一份"说明书"告诉 LLM 这个工具叫什么名字、能做什么事、需要传哪些参数,这样 LLM 才知道自己有哪些能力可以调用。
一个工具定义的结构示例:
{
"name": "search_web",
"description": "搜索互联网并返回结果",
"parameters": {
"type": "object",
"properties": {
"query": { "type": "string", "description": "搜索关键词" }
},
"required": ["query"]
}
}
2.2 技术特征
- 零决策能力:工具本身没有任何决策能力,它甚至不知道自己应该在什么时候被使用
- 被动等待调用:由外部(Agent 或 Workflow)触发,不会主动执行
- 高确定性:输入固定则输出固定,行为可预测
2.3 边界与局限
Tools 的使命就是把一个具体能力封装好、随时待命,至于什么时候该用它,那是别人的事。Tools 只负责执行,不负责判断"什么时候该用",需要组合才能完成复杂任务。
3. 第二层:Agent——拿着工具自己做决定
3.1 核心定义
Agent 是一个完整的决策系统,内部用 LLM 做大脑,自己判断什么时候调哪个工具、要不要继续、什么时候结束。
给 Agent 一个目标,比如"调研一下最近竞品的动态",它不会直接给一个答案,而是开始自己思考:第一步应该搜索什么关键词?搜索结果里有没有需要的信息?需不需要多搜几次?什么时候才算调研完了?
这一系列"要不要、用哪个、够不够、停不停"的判断,全部由 Agent 内部的 LLM 做决策。
3.2 运行机制:思考-行动-观察循环
Agent 的运行方式是一个反复循环的过程:
Thought(想清楚)→ Action(行动)→ Observation(看结果)→ 再 Thought → 再 Action → ...
直到 LLM 判断任务完成为止,这个循环才结束。
用 Go 代码表示这个循环:
func RunAgent(task string) string {
for {
thought := llm.Think(task, context) // 思考下一步做什么
if thought.IsDone { // 判断是否完成
return thought.FinalAnswer
}
result := callTool(thought.ToolName, thought.Args) // 执行工具调用
context.AddObservation(thought.ToolName, result) // 记录观察结果
}
}
关键点:这个 for 循环会跑几次,开发者完全不知道,也不需要知道。这正是 Agent 和普通代码最不一样的地方——普通代码的每一步都是开发者预先写好的,但 Agent 的执行路径是 LLM 实时决定的。
3.3 关键特征
- 主动决策:Agent 自己决定执行路径
- 灵活性高:能应对预料之外的复杂情况,完成事先无法预测路径的任务
- 行为不确定:同样的任务,今天跑和明天跑可能调了不同的工具、走了不同的路径。这是因为 LLM 本质上是概率模型,每次生成都带有随机性
灵活性和不确定性是一对孪生兄弟。有 Agent 的灵活,就必然伴随着一定程度的不可预测。
3.4 边界与局限
- 行为不可预测,线上排查困难
- 成本不可控:LLM 调用轮次可能超出预期
- 调试难度大:执行路径不确定,无法打断点逐步追踪
4. 第三层:Workflow——确定性编排框架
4.1 核心定义
Workflow 把整个执行流程的"骨架"写在代码里,LLM、Agent、Tools 都只是这个流程里的"节点",每个节点负责完成自己那一步。但整体走哪条路、下一步去哪里,全由开发者的代码决定,不是任何节点自己说了算。
4.2 技术特征
一个客服系统的 Workflow 示例:
def customer_service(user_input):
# 第一步:意图分类
intent = llm.classify(user_input)
# 第二步:根据意图走不同分支
if intent == "refund":
order_info = search_order(user_input)
result = generate_refund_response(order_info)
elif intent == "complaint":
complaint_info = analyze_complaint(user_input)
result = transfer_human_service(complaint_info)
else:
knowledge = search_knowledge_base(user_input)
result = llm.generate_answer(knowledge)
return result
关键点:LLM 在这里出现了两次,一次是做意图分类,一次是生成回答,但它只是流程里的两个工位。"接下来去哪"这件事完全由 if/elif 这些普通代码控制。
- 开发者预先写死执行路径:if/elif/else 控制流程
- 高确定性:代码看到什么就做什么,不会有"惊喜"
- 易调试:可以打断点逐步追踪,精确定位是哪个节点出了故障
4.3 与 Agent 的核心区别
谁在做"下一步去哪"的决策?
| 维度 | Agent | Workflow |
|---|---|---|
| 决策者 | LLM 实时决定 | 开发者代码写死 |
| 行为 | 不确定,路径动态变化 | 确定,完全可预测 |
| 调试 | 难,执行路径不确定 | 易,链路清晰可追踪 |
4.4 边界与局限
- 流程提前写死,难以动态调整
- 无法穷举所有情况,遇到预料之外输入容易失败或给出很差结果
5. 三者对比总结
| 维度 | Tools | Agent | Workflow |
|---|---|---|---|
| 决策能力 | 无(只执行,不决策) | 有(LLM 自主动态决策) | 无(开发者在代码里写死) |
| 执行方式 | 被动,等待被调用 | 主动,自主循环直到完成 | 按开发者定义的顺序执行 |
| 确定性 | 高(输入固定则输出固定) | 低(同输入可能走不同路径) | 高(行为完全可预测) |
| 灵活性 | 只做一件事 | 高(能应对预料之外的情况) | 低(流程提前写死) |
| 调试难度 | 容易(单一函数) | 难(执行路径不确定) | 容易(链路清晰,可逐步追踪) |
| 适用场景 | 封装单一具体能力 | 路径未知的复杂任务 | 流程相对固定的业务系统 |
6. Agentic Workflow:生产环境的主流组合模式
完全靠 Agent 自主决策的系统其实很少在生产环境出现,原因:行为太难控制,一旦出问题很难排查,成本也容易失控(LLM 调太多轮)。
完全靠 Workflow 写死的系统又太脆弱,没法把所有情况都穷举到代码里,遇到预料之外的输入就容易失败。
Agentic Workflow 的核心思想:用 Workflow 固定主流程的骨架,在需要灵活判断的节点嵌入 Agent,其余固定节点直接用 LLM 或 Tools。
Workflow 骨架(确定性)
├── 节点 1:固定逻辑(LLM 或 Tools)
├── 节点 2:Agent 子模块(自主决策,灵活应对)
│ ├── 子工具 A
│ ├── 子工具 B
│ └── 子工具 C
├── 节点 3:固定逻辑(LLM 或 Tools)
└── 节点 4:结果聚合
骨架是确定的,让你能控制整体行为、便于调试;关键节点是灵活的,让你能应对各种复杂情况。两个优点都有,两个缺点都被削弱了。
7. 总结
Tools、Workflow、Agent 不是三个并列的竞争方案,而是不同粒度的三层结构,在项目中通常同时存在、相互嵌套:
- Tools 是手,负责执行具体操作,不做决策
- Agent 是大脑,自主判断用哪个工具、什么时候结束
- Workflow 是骨架,由开发者预先编排好整体流程
生产环境推荐采用 Agentic Workflow 组合模式:用 Workflow 固定主流程,在需要灵活性的节点嵌入 Agent,实现可控与灵活的平衡。
更多推荐


所有评论(0)