Haystack 的 Pipeline vs Agent:声明式编排和自主决策,两种范式的适用场景

我最早以为,Agent 既然能让模型自己决定调用哪些工具,那它一定比 Pipeline 高级。直到我在一个生产项目里用 Agent 做客服问答,结果它在一半请求里调用错了数据库,还一脸笃定。后来我把流程改成 Pipeline,问题瞬间消失。这件事让我重新思考:这两种范式到底分别适合什么场景?

AI technology illustration

先看 Pipeline。用 Haystack 构建一个 RAG 应用,你大概会这样做:把文档切块、向量化,用户提问后先检索最相关的块,再把这些块塞给大模型生成回答。每一步做什么、顺序是什么,都是你在代码里写死的。这就是声明式编排——你声明流程,框架负责执行。

Agent 完全不同。你给它几个工具:搜索引擎、数据库、计算器。它自己决定先调用哪个、怎么调用、调用的结果怎么处理。模型在每一步都生成一个"思考",然后选一个动作,观察结果,再思考下一步。这就是自主决策,你只给目标,不给路径。

听起来 Agent 明显更聪明。但生产环境不是智力竞赛,而是可靠性竞赛。要理解为什么 Pipeline 在大多数场景下更稳,得先看两者底层的机制差异。

Pipeline:一条写死的流水线,每一步都看得见

Pipeline 的本质是一个有向图。每个节点是一个组件,比如检索器、重排序器、生成器。你用代码把节点连接起来,数据按固定的方向流动。Haystack 的 Pipeline 代码大概长这样:

pipe = Pipeline()
pipe.add_component("retriever", retriever)
pipe.add_component("llm", llm)
pipe.connect("retriever.documents", "llm.documents")

连接一旦建好,执行顺序就确定了。这意味着你可以在任何一步插入日志、调试、加缓存,甚至可以单独测试某个节点。Pipeline 的可预测性来自它放弃了灵活性——它不聪明,但它可靠。

这种设计很适合企业级应用。比如医疗问答,你必须保证每个问题都经过特定的审核节点,Pipeline 可以强制做到。如果换成 Agent,模型可能跳过审核直接输出答案,这是合规问题。

Agent:一个会思考的实习生,但你不清楚他下一步干嘛

Haystack 的 Agent 基于 ReAct 范式:模型重复 Thought → Action → Observation 的循环,直到得出最终答案。每一步,模型从你预设的工具列表里选一个,生成调用参数,然后框架执行工具,把结果反馈给模型,模型再决定下一步。

这个过程看起来很酷,但有个致命问题:你无法预知模型会调用哪条路径。你可能设置了 5 个工具,但模型偏要组合出第 6 种用法。有时候这是惊喜,有时候是灾难。

我踩过一个具体的坑:给 Agent 配了一个搜索工具和一个数据库工具,用户问"昨天销售额是多少",Agent 先去搜索了一遍,没找到,然后才去查数据库——浪费了 3 秒。还有一次,用户问"退货流程",Agent 居然调用了发邮件工具,试图给用户发一封退货指引邮件。虽然逻辑上没错,但这是生产环境,用户只是想知道流程,不是要收邮件。

一张表说清两者的本质区别

维度 Pipeline Agent
编排方式 声明式,流程在代码里写死 自主式,模型动态决定流程
决策者 开发者 模型
执行过程 固定路径,每个节点按序执行 循环探索,路径不固定
可预测性 高,相同输入得到相同路径 低,相同输入可能走不同路径
调试难度 低,可以单步追踪 高,需要看模型的思考日志
性能开销 低,无多余调用 高,多次模型推理
容错能力 弱,节点失败则流程中断 强,可以尝试其他工具
适用场景 流程明确的业务 任务开放的探索

这张表的核心是决策权在哪。Pipeline 把决策权交给开发者,Agent 把决策权交给模型。这决定了你在面对具体问题时该怎么选。

什么时候用 Pipeline?什么时候用 Agent?

我现在的判断标准很简单:如果业务流程在需求阶段就能画出来,用 Pipeline;如果画不出来,或者流程本身会随上下文变化,用 Agent。

具体来说,Pipeline 适合这些场景:

  • 固定业务逻辑:比如客服工单的分类、转交、回复模板,每个环节都有明确规则。
  • 合规与审计要求:每一步都必须有记录,不能跳过,比如金融风控。
  • 低延迟服务:Pipeline 每一步都精简,没有多余的模型调用。
  • 可解释性要求高:你能向客户解释"为什么推荐这个产品",因为你可以展示检索到的文档和排序分数。

Agent 适合这些场景:

  • 任务不明确:用户需求五花八门,比如"帮我研究一下这个行业",你需要模型自己拆解问题。
  • 工具组合多变:需要根据问题动态选择工具,比如有时查天气、有时查日历、有时发消息。
  • 探索性任务:没有固定答案,模型需要多步推理,比如复杂的逻辑问答。
  • 流程会自我修正:当第一步的结果影响后续步骤时,Agent 可以根据中间结果调整计划。

注意,这些场景并不是非黑即白。我在实际项目中见过很多混合用法:用 Pipeline 做主干流程,在某个节点嵌入一个 Agent 做子决策。比如客服系统,先通过 Pipeline 判断用户意图,如果是复杂问题,才调用 Agent 处理。这样既保证了大部分请求的可控性,又给少数复杂请求留了灵活性。

一个容易被忽略的维度:成本

Agent 的每一步思考都是一次大模型调用。一个简单的三步骤任务,Pipeline 可能只调一次模型,Agent 要调三次以上,还要加上工具执行时间。在 API 按 token 计费的今天,这意味着 Agent 的每次请求成本可能是 Pipeline 的 5 到 10 倍。我见过一个团队上线 Agent 后,月度 API 账单涨了 12 倍,后来不得不给 Agent 加超时限制和最大步数。

所以,不要因为 Agent 看起来"智能"就盲目选它。你的业务真的需要模型自己决定路径吗?如果流程是稳定的,Pipeline 是更经济、更可控的选择。

我的认知转变

两年前我刚开始接触 Haystack 时,看到 Agent 的 demo 非常兴奋:模型自己调用搜索引擎、自己算数、自己组织答案,太强了。那时候我写什么应用都想用 Agent。直到一次生产事故让我彻底改变:用户问了一个关于产品价格的问题,Agent 先调用了搜索工具,搜到一篇过时的博客,然后基于那篇博客回答了错误价格。用户投诉后,我们查日志才发现,Agent 根本没有调用价格数据库,因为它的思考过程是"搜索应该能获得最新信息"。这个错误在 Pipeline 里几乎不可能发生——你会在代码里明确把价格数据库作为唯一的数据源。

那之后我总结了一条经验:Agent 适合做"辅助决策",不适合做"核心流程"。核心流程必须由 Pipeline 保证确定性,Agent 可以用来处理边缘情况。

现在你怎么选?

回到开头的问题。如果你在构建一个生产级应用,我的建议是:先用 Pipeline 把主流程搭起来,把每一步都跑通、测好,然后只在真正需要灵活性的地方引入 Agent。比如,检索不到答案时,让 Agent 尝试其他检索策略;或者,让 Agent 帮你把用户的问题改写得更清晰,但最终的回答生成还是由 Pipeline 控制。

如果你在做一个实验项目,或者任务本身就没有标准答案,Agent 可能是更好的起点。但请记住,Agent 的不可预测性既是它的优势也是它的代价。你需要在产品里为用户留好"兜底",比如限制最大步数、设置超时、提供人工转接。

最后说一句:技术选型没有高下之分,只有匹配度之分。Pipeline 和 Agent 不是替代关系,而是互补关系。理解了它们的机制和适用边界,你才能在任何场景下做出不后悔的选择。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/282.html

(0)
上一篇 2026年8月25日
下一篇 2026年8月25日

相关推荐