1. 从一张架构图说起:AI应用到底由哪些层组成
很多人第一次接触AI应用开发,脑子里冒出来的第一个问题不是“怎么写代码”,而是“这东西到底长什么样”。你打开一个对话窗口,输入一句话,几秒钟后得到一段回答——中间发生了什么?如果只是调用一个模型接口,那确实简单,几行代码就能跑通。但当你真正要把AI能力做成一个能上线、能维护、能扩展的产品时,事情就完全不一样了。
我见过太多团队在Demo阶段跑得飞快,一到生产环境就各种问题:模型响应不稳定、上下文丢失、工具调用失败、成本失控、安全边界模糊。根本原因往往不是模型不够强,而是架构设计没有跟上。AI应用不是“前端+后端+数据库”的传统三层结构,它多了一个非常特殊的层——模型层,以及围绕模型层衍生出来的编排层、工具层、记忆层、安全层。这些层怎么划分、怎么交互、数据怎么流转,就是AI应用架构设计要解决的核心问题。
这篇文章面向的是正在或准备做AI应用开发的工程师、架构师和产品技术负责人。不管你是用Java、Python还是Rust,不管你接的是哪家的大模型,架构层面的思考是相通的。我会从整体分层讲起,然后逐层拆解每一层的职责、常见方案和踩坑经验,最后给出几种典型场景的架构选型建议。读完之后,你应该能画出一张属于自己的AI应用架构图,并且知道每个方框里该放什么、为什么这么放。
注意:本文讨论的是工程架构层面的设计思路,不涉及任何特定地区的政策或敏感话题,所有案例均来自公开的技术实践。
2. 模型层:LLM不是数据库,别把它当数据库用
2.1 LLM在架构中的真实角色定位
很多刚入门的开发者会下意识地把LLM当成一个“智能数据库”——输入问题,输出答案,好像它什么都知道。这个认知偏差会导致一系列架构决策失误。LLM的本质是一个概率性的文本生成引擎,它没有事实核查能力,没有持久化存储,没有事务保证,每次调用都是独立的无状态请求。
这意味着什么?意味着你不能把业务的关键数据只存在模型的上下文里。我见过一个项目,把用户的订单信息全部塞进对话历史,靠模型“记住”来维持多轮交互。结果对话一长,模型开始编造订单号,用户投诉不断。正确的做法是:LLM只负责理解和生成,状态管理交给外部存储。模型层在架构中的定位应该是“推理引擎”,而不是“数据中心”。
从架构图的角度看,模型层通常包含以下几个关键组件:模型接入网关、模型路由、Prompt模板管理、输出解析器。模型接入网关负责统一不同厂商的API差异,比如有的用OpenAI格式,有的用自有协议,网关做一层适配。模型路由根据任务类型、成本预算、延迟要求选择不同的模型——简单分类任务用小模型,复杂推理用大模型。Prompt模板管理把提示词从代码里抽出来,做成可配置、可版本化的资源。输出解析器负责把模型的自由文本转成结构化数据,比如JSON、XML或者特定的DSL。
2.2 模型选型:不是越大越好,而是越合适越好
在实际项目中,模型选型是一个需要反复权衡的决策。我通常从四个维度来评估:能力、成本、延迟、可控性。能力包括理解能力、推理能力、代码能力、多语言能力等;成本包括API调用费用和自托管时的GPU资源消耗;延迟直接影响用户体验;可控性涉及是否支持微调、是否支持私有化部署、是否有内容安全过滤机制。
举个例子,如果你做的是一个客服自动回复系统,大部分问题都是常见FAQ,那么用一个小参数量的模型加上良好的Prompt工程就能达到很好的效果,成本可能只有大模型的十分之一。但如果你做的是代码生成或者复杂逻辑推理,那就必须上大模型,小模型会频繁出错,反而增加人工复核的成本。
还有一个容易被忽略的点:模型的版本管理。大模型厂商会不定期更新模型版本,新版本可能能力更强,但也可能在某些特定任务上表现不如旧版本。如果你的应用直接绑定了某个模型版本,升级时可能会遇到意想不到的回归问题。所以在架构上,模型路由层应该支持版本切换和灰度发布,方便你对比不同版本的效果。
2.3 多模型协同的架构模式
在实际生产环境中,单一模型往往无法满足所有需求。常见的多模型协同模式有三种:级联模式、投票模式、分工模式。
级联模式是指先用小模型处理,如果置信度不够再升级到大模型。比如用户输入一句话,先用小模型做意图分类,如果分类置信度低于阈值,再调用大模型做深度理解。这种模式能显著降低成本,因为大部分请求都在小模型层被处理掉了。
投票模式是让多个模型对同一个问题给出答案,然后通过某种策略选择最佳答案。这种模式适合对准确性要求极高的场景,但成本也是成倍增加。
分工模式是根据任务类型路由到不同的专用模型。比如文本理解用一个模型,图像识别用另一个模型,代码生成再用一个。这种模式在多模态应用中特别常见。架构上需要有一个统一的路由层来根据输入类型和任务类型做分发。
实操心得:多模型协同的架构复杂度远高于单模型,除非确实有必要,否则建议先从单模型做起,等业务量上来、成本压力显现之后再考虑引入多模型路由。
3. 编排层:Agent不是万能药,但没有它万万不能
3.1 从Chain到Agent:编排思想的演进
早期的LLM应用编排比较简单,基本就是“Prompt进,文本出”的线性流程,业界常称为Chain。你定义一个Prompt模板,把用户输入填进去,调用模型,拿到结果,结束。这种模式适合简单的问答和生成任务,但一旦涉及多步骤推理、工具调用、条件分支,Chain就力不从心了。
Agent的出现解决了这个问题。Agent的核心思想是让模型自己决定下一步做什么——它可以根据当前状态选择调用哪个工具、是否继续推理、何时给出最终答案。从架构上看,Agent就是一个循环控制器:感知当前状态,决策下一步动作,执行动作,更新状态,再循环,直到任务完成或达到终止条件。
但Agent也带来了新的架构挑战。首先是不确定性:模型的决策是概率性的,同样的输入可能走出完全不同的路径。其次是调试困难:一个任务经过多轮循环和工具调用,出错了很难定位是哪一步的问题。第三是成本不可控:Agent可能陷入死循环,反复调用工具和模型,导致费用飙升。
3.2 Agent架构的核心组件拆解
一个完整的Agent架构通常包含以下组件:规划器、执行器、工具注册表、状态管理器、终止条件判断器。
规划器负责把复杂任务拆解成子任务,决定执行顺序。有的实现用模型来做规划,有的用规则引擎,有的两者结合。执行器负责实际调用工具或模型。工具注册表管理所有可用的工具,包括工具的描述、参数schema、调用方式。状态管理器维护Agent的当前状态,包括对话历史、中间结果、已执行的动作等。终止条件判断器决定Agent何时停止,可以是达到最大步数、任务完成、或者模型主动声明结束。
这里特别说一下工具注册表的设计。工具是Agent与外部世界交互的桥梁,工具的设计质量直接影响Agent的表现。一个好的工具应该具备:清晰的名称和描述、明确的参数定义、稳定的返回格式、合理的错误处理。我见过很多项目工具定义写得含糊不清,模型根本不知道怎么调用,或者调用后返回一堆非结构化文本,模型无法解析。这些都是架构设计阶段就应该考虑的问题。
3.3 MCP协议:工具集成的标准化尝试
MCP(Model Context Protocol)是近年来出现的一个工具集成标准,它的目标是让不同的AI应用能够以统一的方式接入外部工具和数据源。你可以把它理解成“AI应用的USB接口”——只要工具实现了MCP协议,任何支持MCP的AI应用都能直接使用它。
从架构角度看,MCP解决了一个很实际的问题:工具复用。在没有MCP之前,每个AI应用都要自己实现一套工具接入逻辑,工具提供方也要为每个应用单独适配。MCP把这个矩阵式的适配工作简化成了星型结构——工具只需要实现一次MCP接口,所有支持MCP的应用都能用。
在实际项目中,MCP的典型应用场景包括:接入数据库查询工具、接入代码执行环境、接入第三方API、接入文件系统等。比如你可以把Playwright封装成一个MCP工具,让Agent能够自动化操作浏览器;或者把IDEA的代码分析能力封装成MCP工具,让Agent能够理解和修改代码。
注意:MCP目前还在快速演进中,不同实现之间可能存在兼容性差异。在生产环境使用前,建议先做充分的兼容性测试。
4. 记忆与上下文层:让AI记住该记住的,忘掉该忘掉的
4.1 上下文窗口的物理限制与应对策略
大模型的上下文窗口是有限的,虽然现在主流模型已经支持到128K甚至更长的上下文,但这并不意味着你可以把所有东西都塞进去。原因有三:第一,成本随上下文长度线性增长,每次调用都带上全部历史,费用会迅速累积;第二,长上下文会导致注意力稀释,模型对关键信息的捕捉能力下降;第三,延迟随上下文长度增加,用户体验会变差。
所以架构上必须有一套上下文管理策略。常见的做法包括:滑动窗口、摘要压缩、关键信息提取、分层记忆。滑动窗口就是只保留最近N轮对话,简单但会丢失早期信息。摘要压缩是定期把历史对话总结成一段简短的摘要,保留核心信息。关键信息提取是从对话中抽取实体、意图、约束条件等结构化信息,单独存储。分层记忆是把记忆分成短期记忆和长期记忆,短期记忆放在上下文里,长期记忆存在外部数据库,需要时再检索。
4.2 向量数据库与RAG的架构位置
RAG(检索增强生成)是目前最主流的记忆扩展方案。它的核心思想是:把知识存在外部向量数据库中,当用户提问时,先检索相关文档,再把检索结果作为上下文的一部分送给模型。这样模型就能“知道”它训练数据中没有的信息。
从架构上看,RAG涉及几个关键组件:文档处理器、嵌入模型、向量数据库、检索器、重排器。文档处理器负责把各种格式的文档(PDF、HTML、Markdown等)切分成适合检索的片段。嵌入模型把文本片段转成向量。向量数据库存储向量并支持相似度检索。检索器根据用户查询找到最相关的片段。重排器对检索结果做二次排序,提升相关性。
这里有一个常见的架构误区:把RAG当成万能药。实际上,RAG的效果高度依赖于文档切分质量、嵌入模型的选择、检索策略的设计。我见过很多项目RAG效果不好,排查下来发现是文档切分太粗,一个片段包含多个主题,检索时引入大量噪声。正确的做法是根据文档结构做语义切分,保持片段的主题一致性。
4.3 记忆层的读写策略与一致性
记忆层不仅要考虑“怎么存”,还要考虑“怎么读”和“怎么写”。读策略决定了什么时候触发检索、检索多少条、如何融合到上下文。写策略决定了什么时候更新记忆、更新哪些内容、如何处理冲突。
一个实用的经验是:读要激进,写要保守。读的时候宁可多检索一些,让重排器去筛选;写的时候要谨慎,只写入高置信度的信息,避免噪声污染记忆库。另外,记忆的更新应该是增量的,而不是全量覆盖,这样可以保留历史版本,方便回溯和审计。
在一致性方面,如果多个Agent共享同一个记忆库,需要考虑并发写入的冲突问题。简单的做法是加锁,但会影响性能。更好的做法是用版本号或者时间戳来做乐观并发控制,冲突时由上层逻辑决定如何合并。
5. 工具与执行层:Agent的手和脚
5.1 工具设计的粒度与边界
工具是Agent与外部系统交互的接口,工具设计的质量直接决定了Agent能做什么、做得多好。工具设计的第一个问题是粒度:粒度太粗,一个工具做太多事情,模型难以正确调用;粒度太细,工具数量爆炸,模型选择困难。
我的经验是:一个工具只做一件事,但要把这件事做完整。比如“查询订单”是一个工具,“取消订单”是另一个工具,不要把两者合并成“订单管理”。同时,每个工具的参数要尽量少而精,必填参数不超过三个,可选参数用默认值处理。
第二个问题是边界:工具应该处理哪些错误,哪些错误应该抛给Agent。一般来说,工具内部的业务逻辑错误(比如订单不存在)应该以结构化的方式返回给Agent,让Agent决定下一步怎么做。而系统级错误(比如网络超时)应该由工具自己重试,重试失败后再上报。
5.2 工具调用的安全沙箱
当Agent能够调用工具执行代码、访问文件系统、操作数据库时,安全就成为一个必须严肃对待的问题。Agent安全的核心原则是最小权限:Agent只能访问它完成任务所必需的资源,不能多也不能少。
具体来说,代码执行工具应该运行在沙箱环境中,限制CPU、内存、网络访问和文件系统权限。数据库查询工具应该使用只读账号,并且限制可查询的表和字段。文件操作工具应该限制在特定的目录范围内。网络请求工具应该配置白名单,只允许访问特定的域名。
还有一个容易被忽略的点:工具调用的审计日志。每一次工具调用都应该记录谁调的、调了什么、参数是什么、结果是什么、耗时多少。这不仅是为了安全审计,也是为了调试和优化。当Agent行为异常时,审计日志是排查问题的第一手资料。
5.3 工具编排中的错误处理与重试
Agent在执行任务时,工具调用失败是常态而不是异常。网络抖动、服务限流、参数错误、权限不足,各种问题都可能出现。架构上必须有一套完善的错误处理和重试机制。
我的建议是分三层处理:工具层做基础重试,对于瞬时错误(如网络超时)自动重试2-3次;Agent层做决策重试,如果工具返回业务错误,Agent可以根据错误信息调整参数后重新调用;应用层做兜底处理,如果Agent多次尝试后仍然失败,降级到人工处理或者返回友好的错误提示。
重试策略也需要注意:指数退避是基本要求,避免密集重试打垮下游服务;重试上限必须设置,防止无限循环;幂等性要保证,对于非幂等操作(如创建订单),重试前要检查是否已经执行成功。
6. 安全与可观测层:上线前的最后一道防线
6.1 Prompt注入与输出过滤的架构方案
Prompt注入是AI应用面临的一类特有安全威胁。攻击者通过在输入中嵌入恶意指令,试图让模型执行非预期的操作,比如泄露系统提示词、越权访问数据、执行恶意工具调用。从架构层面防范Prompt注入,需要多层防御。
第一层是输入净化,对用户输入做预处理,识别并过滤明显的注入模式。第二层是指令隔离,把系统指令和用户输入放在不同的消息角色中,利用模型对角色优先级的理解来降低注入风险。第三层是输出校验,对模型的输出做结构化校验,确保不包含敏感信息或非预期的工具调用。第四层是权限控制,即使模型被诱导执行了某些操作,权限系统也能阻止越权行为。
输出过滤同样重要。模型可能会生成不当内容、泄露训练数据中的隐私信息、或者产生幻觉性的错误信息。架构上应该在模型输出和最终用户之间加一层过滤,包括敏感词过滤、事实性校验、格式校验等。
6.2 可观测性:日志、指标、追踪一个都不能少
AI应用的可观测性比传统应用更复杂,因为多了模型调用这一层。你需要知道:每次请求消耗了多少Token、调用了哪个模型、延迟是多少、是否命中了缓存、Agent走了哪些步骤、调用了哪些工具、每一步的耗时和结果是什么。
日志要记录完整的请求链路,包括输入、输出、中间状态、工具调用详情。指标要覆盖QPS、延迟分布、错误率、Token消耗、成本等关键维度。追踪要把一次请求涉及的所有组件串联起来,方便定位性能瓶颈。
我特别建议在Agent架构中引入步骤级追踪。因为Agent的执行路径是不确定的,传统的请求级追踪不够用。你需要记录Agent每一步的决策依据、执行动作、观察结果,这样才能在出问题时复现整个推理过程。
6.3 成本控制与限流策略
AI应用的成本结构与传统应用完全不同。传统应用的成本主要是服务器和带宽,相对固定;AI应用的成本主要是模型调用费用,随使用量线性增长,而且不同模型的单价差异巨大。如果不做成本控制,很容易出现“用户越多亏得越多”的情况。
架构上的成本控制手段包括:缓存,对于相同或相似的请求,直接返回缓存结果;模型降级,在高峰期自动切换到更便宜的模型;Token预算,为每个请求或每个用户设置Token上限;限流,限制单位时间内的请求数量;异步处理,对于非实时任务,用队列削峰填谷。
实操心得:成本控制策略一定要在架构设计阶段就考虑进去,不要等到账单爆炸了才想起来加。我见过一个项目上线第一周就烧掉了几万块,原因就是没有做任何缓存和限流,所有请求都直接打到大模型上。
7. 典型场景的架构选型建议
7.1 知识问答类应用的架构组合
知识问答是最常见的AI应用类型,典型场景包括智能客服、文档助手、企业知识库等。这类应用的核心需求是准确、可溯源、低成本。
推荐的架构组合是:RAG + 小模型 + 缓存。用RAG来保证知识的准确性和可更新性,用小模型来降低成本,用缓存来应对高频重复问题。具体来说,文档经过切分和嵌入后存入向量数据库;用户提问时先查缓存,未命中则走RAG检索;检索结果和问题一起送给小模型生成答案;答案中附带引用来源,方便用户核实。
如果问题复杂度较高,可以在RAG前面加一个意图分类器,简单问题走小模型,复杂问题走大模型。这样能在成本和效果之间取得较好的平衡。
7.2 自动化任务类应用的架构组合
自动化任务类应用,比如自动填表、自动巡检、自动报告生成,核心需求是可靠、可审计、可干预。这类应用通常需要Agent架构,因为任务步骤不固定,需要根据实际情况动态决策。
推荐的架构组合是:Agent + 工具集 + 人工审核节点。Agent负责规划和执行,工具集提供各种操作能力,人工审核节点在关键步骤插入人工确认。比如自动生成报告的场景,Agent可以自动收集数据、分析、撰写初稿,但在最终发送前需要人工审核。
这类应用特别需要注意幂等性和回滚机制。因为Agent可能会重试或者走错路径,如果操作不是幂等的,可能会产生重复数据或者错误状态。回滚机制则是在任务失败时能够恢复到执行前的状态。
7.3 多模态应用的架构特殊考量
多模态应用涉及文本、图像、音频、视频等多种输入输出形式,架构上比纯文本应用复杂得多。核心挑战在于模态对齐和统一表示。
推荐的架构组合是:多模态编码器 + 统一向量空间 + 模态路由。不同模态的输入先经过各自的编码器转成向量,映射到统一的向量空间,然后由模型统一处理。输出时根据目标模态选择对应的解码器。
在实际项目中,多模态应用的延迟和成本通常远高于纯文本应用,所以缓存和降级策略更加重要。另外,多模态数据的存储和传输也需要特别设计,比如图像和视频的压缩、分片、CDN分发等。
8. 架构演进:从能用到好用再到耐用
8.1 从单体到分层的演进路径
AI应用的架构不是一开始就要设计得很复杂。我的建议是从单体开始,按需拆分。初期把所有逻辑放在一个服务里,快速验证产品方向。当某个模块成为瓶颈或者需要独立扩展时,再把它拆出来。
典型的演进路径是:单体应用 → 模型调用独立 → 工具调用独立 → Agent编排独立 → 记忆层独立。每一步拆分都要有明确的理由,比如性能瓶颈、团队分工、部署独立性等。不要为了架构而架构,过度设计带来的复杂度往往比它解决的问题更多。
8.2 性能优化的关键杠杆点
AI应用的性能优化有几个关键杠杆点:模型选择、缓存策略、并发控制、流式输出。模型选择直接影响延迟和成本,前面已经讨论过。缓存策略能大幅降低重复请求的开销。并发控制决定了系统能同时处理多少请求。流式输出能显著提升用户体验,让用户感觉响应更快。
流式输出特别值得说一下。传统的请求-响应模式需要等模型生成完整答案后才返回,用户可能要等好几秒。流式输出则是模型生成一个Token就返回一个Token,用户几乎立刻能看到内容开始出现。从架构上看,流式输出需要支持SSE或者WebSocket,并且要处理好中断、重连、错误传播等问题。
8.3 团队协作与架构治理
AI应用的架构治理和传统应用有很大不同。传统应用的接口相对稳定,而AI应用的Prompt、模型版本、工具定义都在快速变化。如果没有良好的治理机制,很容易出现“每个人都在改Prompt,没人知道线上跑的是哪个版本”的情况。
我的建议是:Prompt版本化、模型配置化、工具注册中心化。Prompt要像代码一样做版本管理,每次变更都要有记录、有评审、有回滚方案。模型配置要集中管理,不同环境用不同的配置。工具要统一注册和发现,避免重复实现和版本混乱。
另外,AI应用的测试也和传统应用不同。除了常规的单元测试和集成测试,还需要效果测试——用一批标注数据来评估模型输出的质量。效果测试应该自动化,每次Prompt变更或模型升级后都跑一遍,确保效果没有退化。
说到底,AI应用架构设计的核心不是追求技术上的先进,而是找到能力、成本、延迟、可靠性之间的最佳平衡点。不同的业务场景有不同的平衡点,没有放之四海而皆准的方案。我在实际项目中最大的体会是:先把最简单的方案跑通,然后在真实流量中发现问题、迭代优化,比一开始就设计一个完美架构要靠谱得多。架构是演进出来的,不是设计出来的。