跳到主要内容

复合 AI 系统:当你的流水线比任何单一模型都更智能

· 阅读需 11 分钟
Tian Pan
Software Engineer

在 AI 工程领域,一直存在一种固有的假设:获得更好输出的路径是更好的模型。更大的上下文窗口、更新的训练数据、更高的基准测试分数。在实践中,交付最强大 AI 产品的团队通常在做一些不同的事情:他们正在构建流水线(pipelines),由多个专门的组件——检索器(retriever)、重排序器(reranker)、分类器(classifier)、代码解释器(code interpreter)以及一个或多个语言模型——协同工作,处理任何单一模型都无法独立可靠完成的任务。

这种架构模式有一个名字——复合 AI 系统(compound AI systems)——它现在是生产级 AI 的主导范式。了解如何正确构建这些系统,以及在构建不当时它们会在哪里失效,是当今应用 AI 工程中最重要的技能之一。

为什么单一模型总会让你触及天花板

复合系统背后的直觉并不复杂。语言模型是一个单一的通用组件。它具有固定的上下文窗口、固定的训练数据、固定的每 token 成本以及固定的延迟特性。对于狭窄且定义明确的任务,通常只需要一次模型调用。但大多数生产任务并非如此狭窄。

考虑一个财务文档问答系统。用户询问有关季度报告的问题。即使拥有大上下文窗口,单次 LLM 调用也会面临一个现实约束:你无法将语料库中的所有文档都塞进一个 prompt 中。因此,你需要检索。但原始嵌入相似度是有噪声的——语义相似的句子并不总是最相关的。因此,你需要重排序。检索到的上下文可能包含结构化表格,LLM 在没有预处理的情况下可能会读错。因此,你需要规范化。最终的答案可能需要追溯到特定的段落以便审计。因此,你需要引用。

在每一步中,你都添加了一个专门的组件,它比处理所有事情的通用模型做得更好。复合系统不仅更快、更便宜,而且在准确性上也优于单体方法。FactSet 报告称,在转向复合检索架构后,公式生成的准确率从 55% 跃升至 85%。微软的 Medprompt 组合了动态少样本检索、自生成思维链以及多轮投票机制,在 MultiMedQA 上达到了 90.6% 的准确率,表现超过了专门针对医学数据进行微调的模型。

这里更深层次的原理是,当任务具有天然的可分解点时,组件专业化优于参数规模。AlphaGeometry 2 通过将语言模型与符号推理引擎相结合,解决了 84% 的国际数学奥林匹克几何题,超过了人类金牌得主的平均表现。没有任何一个基于更多数据训练的单一模型能够弥补这一差距。收益来自于架构组合,而非规模扩张。

接缝处是系统崩溃的地方

当你从单一模型转向复合系统时,你引入了“接缝”:即组件之间的交接点,一个组件的输出成为下一个组件的输入。每个接缝都是一个潜在的故障点,而且接缝处的故障具有一种特性,使它们在生产环境中特别危险:它们通常是无声的。

最常见的接缝故障是格式不匹配。一个组件输出 YAML,下一个组件却期望 JSON。一个组件返回段落列表,下一个组件却假设是单一字符串。这些故障并不总是产生异常——它们会产生微妙的错误输入,并流经流水线的其余部分,生成看起来合理但实际上错误的输出。当退化现象浮出水面时,它已经被每个下游组件放大了。

上下文窗口溢出是另一种相关的故障,它随着流水线复杂度的增加而扩展。检索器返回 50 个段落,重排序器保留前 10 个。每个段落都很长。等到组装 LLM prompt 时,对于一个限制为 100,000 token 的模型,你已经达到了 90,000 token,关键段落被截断了。一个构建材料科学工作流的团队发现,一个简单的流水线在单次工作流运行中消耗了 2,000 万个 token 且失败了。同样的工作流,通过重构为传递内存指针而非完整文档内容,仅使用了 1,234 个 token 并成功运行。组件级逻辑完全相同,但接缝设计不同。

错误传播在深层流水线中的累积方式,在结构上类似于神经网络中的梯度消失。TextGrad(一个用于基于文本的自动微分框架)记录了长链条中信号的指数级退化——流水线后期阶段的反馈在到达早期阶段时已经变得语无伦次。直接借鉴自 ResNets 的修复方法是显式的残差连接(residual connections),它可以在多个跳转中保留信号。

幻觉共识是多智能体复合系统中最隐蔽的故障模式。多个智能体独立处理查询,并收敛到一个虚构的数据点上。因为每个智能体都“同意”,系统会报告高置信度。只有在人类审计输出时才会发现错误——而这通常永远不会发生。这比明显的崩溃更糟糕。崩溃会告诉你出了问题,而幻觉共识会告诉你一切正常。

设计缝隙,而不仅仅是组件

区分成功构建复合系统的团队与挣扎求存的团队的工程准则,在于显式的缝隙设计(Seam Design)。随着更优模型的出现,组件相对容易替换。而一旦缝隙是隐式的,积累的技术债将难以偿还。

在每一次衔接处定义接口契约。 输出的 Schema 是什么?当上游组件返回空结果、低置信度结果或错误时会发生什么?这些契约应该在代码中显式定义,而不是靠假设。分类器应返回结构化元数据,而非自由格式文本。检索器应在返回段落的同时返回相关性得分。重排序器(Reranker)应在候选集中没有任何内容超过最低阈值时发出信号。

添加与不确定性匹配的路由逻辑。 级联路由(Cascade routing)—— 将查询依次路由到成本逐渐升高的组件,并在置信度足够时停止 —— 是生产环境 AI 中最常被低估的模式之一。FrugalGPT 通过将低复杂度查询路由到更便宜模型的级联方式,在某些工作负载上实现了 98% 的成本降低。同样的原则也适用于流水线内部:如果一个快速分类器可以在查询到达昂贵的 LLM 之前拦截并拒绝 60% 的请求,你就应该利用这一点。

为终止而构建,而非仅仅为了执行。 缺乏显式终止条件的多步流水线最终会陷入循环。一个代理(Agent)如果因为每一步迭代的输出无法满足模糊的成功标准而无限运行,那就是一个成本黑洞。对迭代次数、Token 数量和实际运行时间设置硬性上限并不是过早的悲观,而是工程纪律。正确的抽象是显式的终止状态:SUCCESS(成功)、FAILED(失败)和 UNCERTAIN(不确定),且每种状态都有定义的下游行为。

监测每一个缝隙,而不仅仅是组件。 组件级的指标 —— 检索器的延迟、重排序器的准确率 —— 只能告诉你每个部分独立运行的情况。它们无法告诉你流水线是否在端到端地提供正确答案。对于生产质量而言,使用具有代表性的真实查询样本和地面真值标签(Ground Truth Labels)进行端到端评估,是唯一有意义的衡量标准。

端到端延迟是唯一重要的延迟

在不进行全流水线性能分析(Profiling)的情况下优化单个组件,是浪费工程时间最可靠的方式之一。阿姆达尔定律(Amdahl's Law)在这里直接适用:如果你的检索器占流水线总延迟的 10%,而你将其速度提高了 10 倍,那么你只将整体延迟降低了约 9%。如果你的 LLM 生成过程占延迟的 80%,而你将其速度提高 2 倍,你就削减了近一半的总延迟。

其推论是,局部优化可能会转移瓶颈,而非消除瓶颈。将较慢但更准确的重排序器替换为较快但噪声较大的重排序器,虽然减少了重排序器对延迟的占比,但由于更多不相关的段落通过,可能会增加传递给 LLM 的 Token 数量,从而增加生成时间。净效应取决于具体的工作负载,如果不进行端到端性能分析,你无法衡量它。

另一个延迟陷阱是过早并行化。在多个索引上并行检索是一种真正的优化,但如果你受限于 LLM 的解码阶段 —— 在小批量(Small Batch)情况下,这通常受内存带宽限制(Memory-bandwidth-bound)—— 那么再多的检索优化也无法改变延迟上限。像 NVIDIA Nsight Systems 和 PyTorch Profiler 这样的工具可以告诉你时间究竟花在了哪里。Roofline 模型通过对比已实现的计算量与硬件限制,会告诉你你是受计算能力限制还是受内存限制。这些不是高级技巧,而是任何从事严肃 AI 系统工作的工程师的基本门槛。

框架之问

复合 AI 系统编排框架(如 DSPy、LangGraph、LlamaIndex、Semantic Kernel)的激增,反映了真实的工程需求。从零开始构建健壮的流水线需要解决大多数团队不应重复解决的问题:提示词管理、重试逻辑、状态序列化、组件版本控制、评估体系。

DSPy 采取了与大多数框架不同的概念方法。它不将提示词(Prompts)视为手动调整的字符串模板,而是将系统视为具有类型签名(Typed Signatures)的程序,并利用带标签的示例算法化地优化提示词。对于拥有评估数据的团队,这会带来可衡量的改进;OPTIMAS 框架通过优化组件组合而非单个组件,在五个基准测试中展示了 11.9% 的相对提升。

重要的警示是,框架减少了常规情况下的阻力,却增加了特殊情况下的阻力。一个让两阶段 RAG 变得简单的框架,可能会让你很难实现特定领域所需的自定义验证逻辑。在标准化确实有帮助的缝隙中选择框架 —— 如状态管理、工具调用、评估 —— 而在你的领域有特殊要求的缝隙中选择自建。

系统优先的思维模型

复合 AI 系统所需的认知转变,是从“我该用哪个模型?”转向“这个流水线的每个阶段需要产出什么,以及在每个交接点可能会出现什么问题?”

从任务分解开始。有哪些天然的子任务,以及哪些组件最适合处理每一项?先检索,再生成。先验证,再返回。基于置信度进行路由,而不仅仅是根据查询类别。

在优化任何内容之前,先为每一个接缝处添加监控。你无法改进你没有衡量的东西,而且组件级的衡量会误导你对系统级行为的认知。

将故障模式视为设计输入,而不是事后补救。静默失败——如幻觉共识、循环诱发的上下文爆炸、静默降级的格式不匹配——这些都不是边缘用例。它们是未经深思熟虑设计的接缝处的默认结果。

实际的意义在于,最有价值的 AI 工程技能不是提示词编写或模型选择。而是构建流水线的系统设计纪律:使每个组件都理解自己的角色,每个接缝都有明确的契约,并让整体的表现比任何单个部分都更加可靠。

References:Let's stay in touch and Follow me for more thoughts and updates