ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI应用架构设计:从Agent编排到可观测性的五层实战指南

AI应用架构设计:从Agent编排到可观测性的五层实战指南 1. 为什么AI应用架构设计和传统后端根本不是一回事我见过太多团队做AI应用半年之后代码变成一坨浆糊。问题不在于模型选得差提示词写得不行而是压根没把“AI应用”当成一种新的架构形态来设计。大家默认拿Spring Boot那套思路往上一套结果接口越写越乱状态越传越散Agent一多直接互相打架。项目标题叫“图解AI应用架构设计”说白了就是在回答一个问题AI应用这栋楼到底该怎么盖每一层放什么承重墙在哪。先说一个很容易被忽视的事实AI应用和传统应用的差异不是“多调了一个接口”而是控制流彻底反转。传统应用是你写死逻辑用户点按钮触发代码按顺序执行每一步都是确定的。AI应用是你把目标交给模型模型来决定下一步调用哪个工具、查哪份资料、甚至生成一段代码再执行它。这个反转直接让架构设计的地基变了。传统架构里我们最关心的是模块划分、依赖注入、数据库事务、接口幂等。到了AI应用里这些依然存在但不再是主角。主角变成了这四样东西上下文怎么流转、工具怎么组织、Agent怎么协作、状态怎么恢复。我后面会把这四样一层层拆开配合架构图来讲清楚每条线该怎么画。此外AI应用的架构图不是画一次就完了。模型在升级工具在变多用户的行为模式也在变。我见过画得特别漂亮的分层架构图三个月后就对不上代码了。所以这篇文章里我讲的“图解”不只是给你一张结论性的架构图更多是告诉你每一层背后为什么要这么切数据往哪走故障会从哪里来。看懂这些你自然能画出属于自己项目的架构图而不是抄一张模板。先给一个最基本的定位这篇文章适合正在做AI应用但觉得架构混乱的工程师也适合准备从传统后端转过来做AI的团队技术负责人。如果你产品经理想了解AI应用的组成模块同样可以看后面我会尽量把行业黑话翻译成人话同时保留足够的实操细节。2. 一张AI应用全局架构图应该画出哪五层很多刚入行的同学在网上搜“AI应用架构设计”搜出来的图要么是四层要么是六层但每张图的画法都不一样。我自己的实践经验是画架构图最重要的不是层数而是每一条数据链路都能闭环。我这几年复盘下来最顺手的是把AI应用分成五层分别对应从用户到模型的完整路径。2.1 接入层对话、API还是事件接入层是你承接用户请求的“大门”。它不只是HTTP接口而是需要认真想清楚用户到底通过什么方式和你这个AI系统交互。最典型的是聊天窗口但AI应用远不只有对话形态。现在很多AI应用背后是Agent干活用户可能是在一个表单里填了需求系统自动拆解成任务去执行也可能是在阅读一篇长文时AI在后端做摘要和推荐。这些都需要接入层做统一封装。我在接入层通常会干三件事。第一做会话入口的统一抽象不管前端是Web、小程序还是IM机器人后端拿到的都是一个标准化的Request对象。第二做鉴权和租户隔离别让用户A的上下文跑到用户B的对话里这个问题在AI应用里比传统后端更严重因为提示词注入攻击的路径比传统接口多得多。第三做流量控制和降级AI接口的响应时间通常是几百毫秒到几秒比普通接口慢一两个数量级接入层如果不做缓冲和排队一个热点请求就能把模型服务打挂。我自己踩过一个大坑最开始做接入层时图省事直接让客户端调用大模型API没有中间层。结果用户随便传一段长文本就消耗了巨额token费用而且没法在服务端做任何日志审计。后来在接入层加了一个消息代理所有请求先落库再转发虽然多了一次IO但换来了可观测性和成本控制太值了。2.2 智能编排层Agent的“大脑中枢”这一层是整个架构图里最核心的部分也是大家常说的Agent Runtime。这里不只是一个简单的“调用模型”流程而是一个循环接收任务、拆解计划、调用工具、观察结果、决定下一步、再次调用模型直到任务完成。画这一层的时候我会画出三个子模块。第一个是计划模块负责把用户的复杂指令拆解成多个步骤。这里要注意牌面上很多框架自带Plan功能但实际业务里往往需要你根据领域知识做定制。比如说“帮我把这份合同看一下风险”和“帮我把这二十份合同的风险都列出来做成表格”前者是单轮任务后者是多轮Batch任务计划模块的处理逻辑完全不同。第二个是工具调用模块负责决定在哪个步骤调用哪个工具以及如何把模型的输出转成工具的参数格式。这一块看着简单但实际是出错率最高的地方。模型经常会把参数类型搞错或者生成一个完全超出接口定义的操作所以工具调用模块至少要做三层防护格式校验、权限校验、成本校验。第三个是记忆管理模块负责短期记忆和长期记忆的存取。短期记忆就是当前会话里的上下文窗口长期记忆则是跨会话的用户偏好和历史知识。很多团队把记忆简单地塞在Redis里但当token量涨到十万级别时上下文管理就变成一门学问了。关于这一层的架构选型我强烈建议刚开始不要自己造轮子。我见过一些团队非要自己写Agent框架写了三个月还没有稳定版本而使用LangChain、LlamaIndex这类成熟方案虽然也有坑但至少社区踩过一遍了。选型的核心标准是你的核心业务有没有独特逻辑需要定制如果没有就用现成的。2.3 能力层模型类型和工具服务的蓄水池再往下是能力层这一层回答的问题是“你的AI到底能干什么”。能力层的第一块是模型资源池。一个生产级AI应用通常不只用一个模型。主力对话可能用GPT-4o这种旗舰模型摘要抽取用快而便宜的中型模型简单的意图识别甚至可以跑一个开源的6B小模型。这就需要在架构图上画一个模型网关统一管理模型的接入、路由、限流和fallback。我在生产环境里遇到过旗舰模型服务不可用的情况如果没有网关自动切到备用模型整个业务就瘫了。能力层的第二块是工具集。现在大家都用MCP模型上下文协议来统一接入外部工具这个协议确实解决了大问题——以前每接一个工具就要写一套适配器现在工具方按MCP标准暴露服务模型侧按MCP格式调用剩下的就是配置和权限管理了。工具集要根据业务领域来设计比如做企业服务的AI应用至少要接CRM、日历、邮件、数据库查询这几类工具做内容生成的AI应用则要有联网搜索、图片生成、知识库检索这些能力。我画这一层时会特别标注每个工具的QPS上限和平均时延这是最容易忽略的信息。因为模型的调用频率极高一个慢工具可以直接拖垮整个Agent循环。2.4 数据与记忆层给AI喂饭的系统在哪里AI应用和传统应用最大的区别之一就是它需要不断“喂数据”。这个数据不只是训练数据更多的是运行时检索的数据。所以第四层我称为数据与记忆层它的核心组件是向量数据库传统数据库缓存的组合。向量数据库负责存放嵌入化的知识文档、历史对话的Embedding索引。RAG检索增强生成的架构图里一定要把向量检索这条路径画清楚当用户提一个问题系统先去向量库里检索相关段落然后拼接进提示词再送给模型生成答案。很多人以为RAG很简单实际上难点在于切分策略、Embedding模型选择、混合检索关键字向量的融合比例。我做过一个知识库问答项目单提高向量相似度检索正确率只有62%把BM25关键字检索的结果按比例融合之后正确率提到了79%。传统数据库里存的是业务结构化数据比如用户信息、订单状态、任务记录。这里有个架构设计的重要原则不要试图把业务数据也塞进向量库。结构化查询还是交给SQL语义检索才用向量。两者配合才能既快又准。最后缓存层负责承接高频重复查询。AI应用里很多计算是可以复用的比如同一份文档的摘要结果、同一组热点问题的检索结果缓存命中之后能省掉大量token调用。我在生产环境里加了一层Redis缓存把相似问题的重复调用降了大概40%这是性价比极高的优化。2.5 基础设施层GPU、模型网关、可观测性画布这层是“砖和瓦”支撑上面所有层的运转。普通后端应用的基础设施是CPU服务器、数据库和消息队列AI应用在此基础上增加了GPU集群或者外部模型的调用配额、模型网关处理流控、Prompt管理系统版本管理和AB测试。可观测性在这层必须单独划出来画一个模块。AI应用比传统应用更容易“黑盒化”因为你不知道模型为什么给出这个输出。所以在架构图里要明确标注每个关键节点都打了哪些日志模型输入输出、工具调用参数和结果、中间每一步耗时。我有一个专门的做法给每个会话分配一个唯一的trace ID从用户请求进来到每个工具调用结束全部串起来排查问题的时候效率翻倍。我就是依靠这个trace体系解决了生产环境里的一个幽灵故障用户经常反馈“AI答非所问”一开始怀疑是模型问题排查了半天发现是某个上游工具在特定条件下返回了空数组而Agent循环里没有做空结果判断带着空数据去生成答案自然就跑偏了。这件事之后我悟出一个道理架构图上每一根连线都要考虑“如果这里返回空/超时/报错会发生什么”。3. Agent运行时设计的核心任务状态、工具、上下文聊完五层全局视图我们把镜头拉近看看智能编排层里最关键的三个设计任务。这一节内容会比较硬核但搞懂这些你画出的架构图才能真正落地。3.1 循环决策引擎Agent到底怎么“想”和“做”Agent最核心的运行机制是一个循环观察-思考-行动-观察结果-再思考。我在架构图里会画成一个环并在环旁边标注几个关键入口。这个循环的实现通常有两种方式。一种是“逐步模式”即每次调用模型只生成一个动作执行完把结果追加进上下文再触发下一次调用。这种方式稳定、可控适合高风险操作比如自动执行代码、修改数据库记录。另一种是“批处理模式”让模型一次生成多个动作再逐个执行节省来回调用但风险也随之放大因为模型一旦在早期判断出错后面的动作就会跟着错。我试过的比较稳妥的策略是默认用逐步模式只在低风险场景启用批处理模式。比如让Agent去搜集资料、整理信息可以用批处理一旦涉及执行操作、调用付款接口这些必须走逐步模式每步都要人工确认或者严格的规则校验。除此之外循环引擎里还需要一个“终止条件”的判定模块。很多人看着模型反复调用工具来回折腾最后也没得到结果其实就是终止条件没写清楚。我的做法是设置两层判定硬性条件比如最大循环次数、总耗时上限、token预算上限和软性条件比如任务置信度评分当Agent认为“已获得足够信息”时自动收敛。3.2 会话状态管理最容易翻车的内存与持久化状态管理是AI应用和传统应用差异最大、也是最容易被低估的地方。传统后端里状态都在数据库里哪里读哪里写清清楚楚。AI应用里状态是一段不断增长的对话历史一堆中间工具调用的临时结果而且这些状态往往以token形态存在是有成本的。我踩过的坑是把一个Agent运行过程中的全部中间信息都塞进上下文窗口结果token消耗直接爆表一次任务花了好几十块钱。后来做了三层状态分层短期工作状态当前循环内的观察结果和下一步计划放在内存里任务结束就释放。会话状态用户和Agent的交互历史做摘要压缩后存入Redis设置TTL。持久状态跨会话的用户偏好、已完成任务的记录存入数据库。这三层状态在架构图里最好用三种不同颜色的线区分开避免混在一起。尤其要画清楚状态在哪一层被写入、在哪一层被读取一旦并发用户多了状态串线问题就像定时炸弹。3.3 工具注册与MCP协议接口爆炸的终结方案能力层我们提到了MCP这里展开讲讲工具接入的架构设计。当你只有三五个工具时写自定义适配器没问题。但当工具数量超过二十个、每种工具还有多个操作时统一的协议就变成了刚需。MCP协议本质上解决的是模型客户端和工具服务端之间的标准化通信。工具方实现MCP Server暴露统一的工具名、输入参数Schema、输出格式Agent端通过MCP Client动态发现工具列表并调用。好处是新增一个工具不再需要改Agent代码只需要在MCP配置文件里注册地址。实操中的几个细节值得留意。工具Schema要写得极其明确模型才不容易理解错。比如一个“发送邮件”的工具描述里写“收件人、主题、正文”太模糊了要标注“收件人格式为逗号分隔的邮箱地址列表”“主题最长为200字符”“正文支持Markdown”。我在项目里花了一个下午把二十多个工具的Schema全部重写模型调用错误率直接降了一半。还有一个安全注意点工具权限不能全放开。我见过有团队把数据库写操作也做成MCP工具Agent在循环里因为一个错误目标就把数据改坏了。正确做法是每个工具打上权限标签读类的工具放开写类和高风险类的要设置独立的审批路径。4. 多Agent协作架构单脑变群脑的演进路线现在的AI应用越来越复杂单Agent的模式经常撑不住于是大家开始关注多Agent协作。热搜词里的“多AI协作”“AI Agent搭建”也说明这是一个热门方向。但我要给大家泼点冷水多Agent不是银弹大部分业务场景单Agent加几个专项工具就够用了。4.1 什么时候真的需要多Agent判断的标准很简单任务是否需要并行处理不同类型的工作或者不同步骤是否需要完全不同的专业能力。举例一个“市场调研助手”如果只有一个Agent做全部流程它既要会搜索网页又要会分析财报还要会做图一个模型很难在每个环节都保持高质量。更合理的方案是拆成三个Agent调研Agent负责搜索和整理资料分析Agent负责读财报提炼关键指标报告Agent负责生成最终的图文报告。三个Agent可以并行启动一部分工作也可以按流水线方式串联。还有一个常见场景是“AI测试开发”我自己用多Agent写过一套代码检查工具流一个Agent负责理解代码变更一个Agent负责生成测试用例还有一个Agent负责执行产物分析和缺陷归类。这三个Agent之间传递的是结构化数据不是一大段对话文本效率比单Agent高很多。4.2 三种协作模式对比串联、并联、混合多Agent协作的架构图核心是画清楚Agent之间的连线和数据格式。串联模式下Agent A的输出是Agent B的输入。适合流水线式任务比如“解析需求-生成代码-运行测试-修复缺陷”。优点是最简单可控缺点是有瓶颈一个环节挂了整个流程就停了。并联模式下多个Agent同时处理不同子任务最后由一个聚合Agent汇总。适合“一大摞文档各自归纳再汇总”这类的任务。优点是快缺点是需要一个机制来处理各子任务结果的一致性问题。混合模式是我在实际项目中最常用的。先由一个“规划Agent”把任务拆成DAG有向无环图然后并行执行可并行的小任务串行的环节保持依赖关系。架构图画出来有点复杂但跑起来效果最好。关键是要有一个缩略图Graph状态管理器实时记录每个Agent节点的状态是Pending、Running、Done还是Failed。4.3 Agent之间的通信消息格式和共享黑板多Agent之间的通信我不建议直接用自然语言文本互传。文本太自由下游Agent解析起来极容易出错。更工程化的做法是定义结构化消息格式比如JSON Schema每个Agent按规定的Schema输出。另一个很有用的模式是“共享黑板”Blackboard。所有Agent都读写在同一个共享状态空间里但各自负责更新自己的区域。比如做长篇小说创作的多Agent系统故事设定区、角色区、情节区就是三块独立区域由不同Agent维护。好处是Agent之间不需要直接对话也就不会出现“两个Agent聊了十几轮结果话题跑偏”的尴尬局面。5. 可观测性、评估与成本工程生产环境的三座大山架构图画得再好看上线才是开始。AI应用生产运维最麻烦的是三个问题出了错不知道错在哪、结果好不好不知道怎么衡量、钱像流水一样烧完才好心疼。这三件事必须在架构设计阶段就预留解决方案。5.1 三层可观测性日志、链路、评估三位一体传统可观测性讲Log、Metric、TraceAI应用在此基础上多了一个维度结果评估。我的实践是至少做三层日志。第一层是接口层日志记录每次用户请求的参数和返回结果。第二层是模型调用日志记录模型版本、Prompt模板版本、输入输出token数、时延、模型返回的原始内容。第三层是工具调用日志记录调用哪个工具、参数、返回值、耗时、报错信息。三层日志用同一个request ID关联排查问题时直接一条命令拉全链路。链路追踪用的是OpenTelemetry自带的webhook集成大模型调用的Span就能直接看到某个环节消耗了多少token、耗时多长。除了链路还要有评估层。AI应用的测试和传统测试完全是两回事传统测试有确定性的断言AI应用的结果是概率性的。所以我会在架构图里单独画一个评估模块定期用测试集跑一遍业务场景通过LLM-as-a-Judge另一个模型打分或者RAGAS这类框架计算答案准确率、忠实度、上下文相关度分数。分数低于阈值就触发告警而不是等用户抱怨才去查。5.2 成本工程token花在哪、怎么省AI应用最大的成本不是服务器是token。我在做成本优化时先用账单API拉出每天的费用然后按功能模块分组很快就能看出哪部分烧钱烧得厉害。省钱姿势我总结了几条直接可以用上下文瘦身。把历史对话做摘要化处理对话超过N轮就用一个小模型把之前的内容榨干成要点大幅降低每轮请求的token量。模型分级。简单任务用便宜的小模型复杂任务才上旗舰模型。我项目里大约70%的请求走的是一个开源小模型效果满意度并不比旗舰模型差多少成本却降了60%以上。缓存复用。相似问题直接返回缓存结果相关的检索结果也在缓存里放一份能够显著减少重复计算。控制工具调用的输出长度。有些工具的返回值很大比如搜索API返回几十条链接实际上只有前几条有用。在工具调用层做“结果截断”让进入上下文的工具返回只保留最相关的部分token能省不少。成本工程在架构图里不需要画得很细但至少要在模型网关模块上标注每个模型的单价、每个功能的token预算上限、超限自动熔断。我见过有团队因为写了一个死循环让Agent疯狂检索同一个问题一夜之间烧掉了上万块钱。预算熔断是必须的。5.3 性能优化把延迟从三秒压到八百毫秒用户对AI应用的耐心其实很短响应超过三秒很多人就觉得“卡”。但模型的推理速度不是我们能控制的所以优化思路要放在“减少不必要的串行等待”上。我常用的性能优化手段有三个。第一个是预填充Prefetch用户在输入的时候就开始做意图识别和初步检索等用户点发送时结果已经备好了体验上快得不是一点半点。第二个是流式输出用SSEServer-Sent Events把模型输出的token实时推送用户看到的是逐字输出而不是长时间的白屏主观体验改善很多。第三个是并行化把Agent的多个独立工具调用并发执行而不是顺序等待。比如既要查天气又要查日历并行调用总耗时等于最慢的那个而不是两个之和。6. 常见问题与排查思路速查表AI应用出问题的表现和传统后端完全不一样要么是“答非所问”要么是“一直绕圈不动”要么是“结果时好时坏”。我把近几年见过的典型问题整理成一张速查表你们可以直接拿去参考。现象可能原因排查方向响应特别慢超过5秒上下文太长导致模型处理慢、上游工具无超时、多个工具串行调用检查token消耗量看链路追踪里哪个环节耗时最高对工具调用设置超时和并发策略答非所问或胡言乱语Prompt质量差、上下文被污染比如工具返回了错误文本、模型版本被切换对比模型输入输出日志检查Prompt模板版本和上下文是否包含异常注入内容用评估集跑回归测试Agent反复执行同一动作不推进终止条件没生效、工具返回结果没有进入状态更新逻辑检查循环引擎终止条件的代码分支验证工具调用结果是否被正确写入短期状态多Agent互相冲突/上下文串线Agent间共享状态没有隔离、消息格式不规范检查黑板模式的区域划分是否清晰消息是否用了结构化Schema费用异常飙升循环失控、缓存失效、模型误用昂贵模型处理简单任务看成本账单按功能维度拆分检查是否有死循环检索设置每会话token上限用户A看到用户B的数据上下文隔离没做、Redis Key设计不合理检查接入层鉴权逻辑Session ID是否在每个环节都透传除了表里的问题我再补充一个玄学级排查技巧当AI应用的行为变得很奇怪先看是不是模型服务端悄悄换了版本。很多模型服务商在API层面不强制通知模型下线的我们遇到过几次应用没有任何代码变更结果突然变傻。解决方案是在模型网关层固定模型版本并且在关键场景记录模型标识线上有问题先确认版本是否漂移。还有一个共性问题AI应用不是“一次开发完事”Prompt模板和工具Schema都是需要持续迭代的资产。我建议在架构图上把Prompt管理系统单独画出来每次修改Prompt都生成版本号并关联到评估集测试结果这样能知道每次改动到底是变好了还是变差了。没有这个系统你的AI应用就是在裸奔。写到这里我想起自己最开始画AI架构图时也是对着别人的图一脸懵觉得每个框都认识但不知道线怎么连。这几年画过十几个项目的架构图之后最大的体会是架构图的真正价值不在于好看而在于帮你提前暴露问题。当你画到某个模块的输入输出对不上时当你画到一条连线没有标注失败处理时问题就已经被发现了大半。最后一句话送给准备动手的读者先别追求炫酷的多Agent和复杂编排从一个简单的单Agent工具RAG开始把每一层的边界画清楚把每条链路的状态和日志打全再逐步演进。架构这东西改起来永远比推倒重来便宜。
返回列表