ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI应用架构设计:从Demo到生产的六层模型与落地实战

AI应用架构设计:从Demo到生产的六层模型与落地实战

这两年经常有人拿着各种漂亮的架构图来问我:“我这个AI应用,接下来该怎么落地?”结果细看下来,大部分图里只有三个框:用户请求、一个无所不能的模型、一个数据库,然后用几根箭头串起来。说实话,这种图拿去汇报没问题,拿去开发就是灾难现场。

真正做过AI应用的人都懂,从Demo到生产环境,隔着的不是模型的聪明程度,而是架构设计里那些看不见的工程细节:模型输出不稳定怎么办?上下文越长成本越不可控怎么办?用户量翻倍时延迟和费用一起飙升怎么办?Agent调用工具时偶发卡死怎么办?这些问题的答案,全部藏在架构设计里。这篇文章我就用自己的实际经验,把AI应用架构从头到尾拆一遍,讲清楚每一层为什么存在、该怎么取舍、实际踩过哪些坑。无论你是刚入行的AI应用开发者、从传统后端转过来的工程师,还是要给团队做技术方案的技术管理者,这篇都能给你一套可以直接拿去做评审的思考框架。

1. AI应用架构不是三层,而是六层——先搞懂它在解决什么问题

1.1 传统三层架构在AI应用里为什么失灵

很多从传统后端转过来的同学,第一反应是沿用经典的三层架构:接入层、业务逻辑层、数据层。这个框架在业务规则确定的系统里很好用,因为所有流程都是可预期、可测试、可回归的——订单超时一定会触发取消逻辑,库存扣减失败一定会回滚。但AI应用的核心组件是一个概率系统,模型的输出天生带有随机性、延迟波动和不可预估的成本消耗。

拿我做过的一个智能客服项目说:同样一个问题“我要退款”,模型可能回答“我帮您查询一下订单”,也可能直接建议“您可以在订单页点击售后申请”,两种回答对后续流程的影响完全不同。如果架构里只有“请求进来、模型回答、返回结果”这三个环节,那业务逻辑根本无法稳定挂在模型输出之上。这就是三层架构失灵的根本原因——它假定系统行为是确定的,而AI应用的行为天然带概率。

1.2 AI应用架构真正要管理的三类不确定性

架构设计本质上是在做风险管理。AI应用的架构至少需要面对三类传统架构几乎不用考虑的不确定性。

第一是输出的不确定性。模型说什么不完全由你的代码决定,Prompt写得再好也有漂移的可能,版本升级后行为还会变化。这意味着架构里必须有“评测”和“兜底”这两个环节,评测保证你知道模型现在是什么水平,兜底保证模型答错时系统不会崩。

第二是成本的不确定性。API调用按Token计费,一个用户连续追问五轮,上下文不断加长,单次请求成本可能从几分钱涨到几块钱。如果架构里没有Token计数、成本预算和模型路由,业务跑起来后费用会像漏水的水管一样,你根本不知道钱花在哪了。

第三是延迟的不确定性。模型推理时间从几百毫秒到几十秒都可能,流式输出慢慢吞吞,用户等得不耐烦就刷新页面,结果重复请求打到上游。架构里如果不处理超时、重试和流式协议,用户体验和系统稳定性都会被拖垮。

1.3 从三层到六层:AI应用架构的分层逻辑

我在多个项目里反复调整后,最终稳定在六层结构上面,每一层都对应上面某一种不确定性。

从上到下分别是:交互层(负责用户对话、流式展示、多端适配)、编排层(负责业务状态机、任务拆解、Agent决策)、上下文层(负责Prompt组装、记忆管理、检索增强)、模型网关层(负责模型路由、限流、重试、成本核算)、模型层(实际的大模型实例,包括本地部署和API调用)、数据与基础设施层(向量库、Redis、对象存储、可观测系统等)。

这套分层不是凭空想出来的理论,而是被一堆线上事故逼出来的。早期我做AI应用就是把Prompt和业务逻辑混在一个Service里,结果模型换版本后Prompt全要改,业务代码也跟着遭殃。后来才意识到:模型是易变的、业务是相对稳定的、Prompt是介于两者之间的胶水,必须让它们各自待在独立的层里,才能独立升级、独立测试、独立回滚。

2. 图解核心分层细节:每一层到底该放什么、不该放什么

2.1 交互层:流式响应改变了架构的底层约束

交互层是离用户最近的地方,但大多数人只把它当成一个API入口,忽略了AI应用对交互层的特殊要求。传统的HTTP接口是一次请求一次完整响应,而大模型动辄生成几百上千字,不搞流式输出的话,用户看到一句话要等十几秒,体验非常差。但流式响应意味着连接是长时间挂着的,网关的超时时间、负载均衡的配置、CDN的缓存策略全部要跟着改。

我在生产环境里遇到过最典型的问题:用了流式接口后,前端频繁断连,后端却还在继续生成内容,不仅浪费Token,还会把下游的日志系统打爆。后来在交互层和服务之间加了一层事件通道的解耦,前端断连时后端能收到取消信号,及时中断模型调用。这种细节就是架构设计的价值——不是画几根线,而是把每个环节的异常路径都走一遍。

交互层还应该负责会话ID管理和消息持久化的入口。你在这层把用户的每次请求都按会话维度记录下来,后面做评测、做用户行为分析、排查问题才能有据可依。我在很多项目里发现,大家总是急着去调模型参数,却忘了把日志留全,出了线上问题连复现都做不到。

2.2 编排层与上下文层:最容易混淆、也最容易被写烂的地方

编排层负责的是“这个AI应用到底怎么做决策”——是简单的一问一答,还是需要拆解任务、调用工具、多轮迭代?上下文层负责的是“模型能看到什么信息”——Prompt怎么组、历史对话怎么压缩、外部知识怎么灌进去。

好多人把这两层混在一个大Service里,代码里全是拼字符串的逻辑加if-else分支,三个月后基本没人敢改。我的经验是,编排层要当成业务状态机来设计:明确每一步的状态、可用的动作、状态转移的条件。比如客服机器人查询订单,状态就是“待提取订单号”“待确认订单信息”“待查询物流”“待回复结果”,每一步模型可以做什么、不能做什么,由你的编排代码控制,而不是让模型自由发挥。

上下文层有几个事必须认真做:

第一是历史消息的压缩和截断策略。很多人直接把整个对话历史全塞进Prompt,随着轮数增加Token成本疯涨,而且模型注意力会被早期无关信息干扰。实践中我们会把超过一定轮数的历史消息做摘要——小模型负责压缩,压缩结果再参与下一次生成。

第二是Prompt的版本管理。Prompt不是写在代码里的字符串,它是需要像代码一样管理的资产。我在项目里把Prompt模板放在独立的配置中心,每次修改都有版本记录,A/B测试时可以同时加载两个版本的Prompt对比效果。这个习惯帮我们避免了很多次因为手滑改了Prompt导致线上效果突变的惨剧。

第三是检索增强(RAG)的接入位置。检索应该在编排层里被调用,但检索出的文档要放在上下文层里做筛选和重排。千万不要把检索结果一股脑全塞给模型,文档一多、信息一杂,模型反而找不到重点。我们做过实验,同样的知识库,加一道“相关度截断+去重”的过滤,回答准确率能提升十几个百分点。

2.3 模型网关层:被80%的团队忽略的隐形基础设施

模型网关层可能是整个架构里最不像“AI”但最值钱的一层。它的核心职责是:把模型供应商的差异封装起来,让你在上层代码里不需要关心今天用的是GPT、通义还是某家开源模型的API。

网关层至少要做四件事:模型路由(根据任务复杂度、Token价格、延迟要求选择模型)、限流与配额管理(防止某个调用方把额度打爆)、自动重试与降级(模型接口超时或返回异常时切到备用模型)、成本核算(按业务线、按功能点统计Token消耗)。

我参与过一个知识库问答系统,早期所有请求都走最强的模型,每个月API账单高得吓人。后来做了模型路由:简单问题先交给小模型,小模型判断自己能力不足时才“让贤”给大模型。光这一项,账单直接降了六成,回答质量还没明显变化。这就是网关的杠杆效应——它决定着你每调用一次模型要掏出多少成本,而很多人写代码的时候根本没想过这个问题。

3. 从Demo到产业级落地:一次完整的数据流设计

3.1 一个典型的RAG客服机器人,数据是怎么走的

纸上谈兵没有意义,我拿一个具体场景——企业知识库客服机器人——来串一遍完整的数据流。假设你的业务是让用户通过自然语言查询公司的报销制度、请假流程等内部文档。

第一步,用户消息到达交互层,交互层把消息写入消息队列,同时给前端返回一个“已收到”的即时响应。这里用消息队列而不是同步调用,是为了让后续链路不阻塞用户感知,这也给前端提供了做“正在思考”动画的机会。

第二步,编排层从消息队列里取到消息,根据会话状态判断当前应该走哪条分支。比如上一个状态是“待补充部门信息”,那这次进来的用户内容就会被当成关键信息,而不是新问题。

第三步,编排层调用上下文层的检索服务:先把用户的问题向量化(用Embedding模型),在向量库里做相似度检索,拿到TopK个相关文档片段;然后用重新排序模型对结果做精排;最后把选定的文档内容、历史对话摘要、当前问题组装成一个完整的Prompt,发给模型网关。

第四步,模型网关做模型路由选择。这里可以设置一个可配置的规则:问题命中成本预算高的类别时走大模型,否则走小模型。网关把Prompt发送给模型后,将模型的流式输出原样转发给交互层,同时把Token用量写入计费模块。

第五步,编排层拿到模型的完整回复后,还要做一道“输出校验”——检查模型回答里是否包含必须的要素(比如退款链接、表单编号),如果不完整,触发一次修复重试。这步是很多人漏掉的,却是AI应用能不能稳定服务的关键。

3.2 状态、缓存、Token用量:三个必须从Demo期就考虑的数据维度

我在带团队做AI项目时,规定必须从第一天起就建立三个数据集:会话状态、响应缓存、Token用量表。

会话状态不用多解释,AI应用绝大多数都是多轮交互,没有状态就无法支撑编排层做决策。响应缓存则分两层:语义缓存和结果缓存。语义缓存解决“用户换了个说法问同样的问题”,我们把用户查询Embedding后做相似度匹配,命中就直接返回之前的结果。结果缓存解决“同一个问题在短时间内被反复问了十遍”,比如热点事件期间的客服咨询,直接命中结果缓存,不仅省Token,还让响应时间从秒级降到毫秒级。

Token用量表是一个按小时粒度的统计表,记录每个会话、每个用户、每个功能模块消耗的Token,按模型类型分开计。这张表上线之后,你做的所有优化——换Prompt、加缓存、改路由——都能量化评估效果。没有这张表,你的成本优化就是拍脑袋。

3.3 最小可行架构的部署清单

如果你是从零起步,我建议不要一上来就追求六层全部到位,但下面这三个组件必须从第一天就有:一个能做模型路由的网关(哪怕只是配置文件里的一个分发逻辑)、一个带版本管理的Prompt仓库(哪怕只是Git里的一个目录)、一个Token与延迟的可观测面板(哪怕只是每日日志里多打几行JSON)。

这三个组件覆盖了AI应用最核心的三个风险:成本失控、效果退化和故障难查。等业务跑顺了,再逐步补充缓存层、Agent编排框架、自动化评测这些高阶能力。架构是长出来的,不是设计出来的,但关键骨架必须在第一天就长对。

4. 设计AI Agent时的架构考量:自主与可控的取舍

4.1 Agent不是让你放弃控制,而是换一种方式控制

现在Agent的话题很热,很多人觉得Agent就是给模型一个工具列表,让它自己去调。这个想法很危险。我见过不少项目,Agent上线后莫名其妙地去调用删除接口、在循环里卡住退出不了、或者被用户的提示词诱导去做不该做的事。

Agent的架构设计核心不是“让模型自由”,而是在让模型有行动能力的同时保留人在回路上。业内管这个叫Human-in-the-loop。我的做法是:Agent的每一步动作都要经过一个校验层,校验规则由业务方配置,包括允许调用的工具白名单、关键操作的二次确认、每轮自循环的最大次数。模型可以有自己的判断,但这个判断必须在你的业务边界内。

4.2 单Agent与多Agent协作的架构差异

多Agent协作是目前的另一个风口,多个模型各司其职,一个负责拆解任务,一个负责检索资料,一个负责写代码,一个负责审查代码。这种架构确实能完成单Agent很难搞定的复杂任务,但代价是架构复杂度指数级上升。

我实践下来的建议是:能单Agent解决的,不要硬上多Agent。多Agent之间的通信、状态同步、结果校验,每一个都是独立的问题,两三个Agent协作时的故障率已经比单Agent高一个数量级。如果确实要上,至少要做到三点:每个Agent的职责边界清晰且文档化;Agent之间的消息走统一的消息总线,可审计可回放;全局有一个调度者,监控每个Agent的状态,允许对异常Agent进行熔断隔离。

4.3 制定兜底预案:Agent故障时的熔断降级设计

无论用单Agent还是多Agent,都一定要设计兜底预案。模型调用会失败、Agent循环会卡死、工具调用会超时。架构里必须明确:Agent失败后是进入人工接管队列,还是自动切换到更简单的固定问答流程?降级后用户在界面上看到什么?这种预案不是可有可无的,它是生产系统和DEMO系统的真正分界线。

5. AI应用架构的未来演进:从调用模型到治理模型

5.1 评测体系:AI应用架构的“质量红线”

AI应用与传统软件最大的区别在于:没有自动化测试,你就不知道这次改动到底是变好了还是变坏了。传统软件有单元测试、集成测试,AI应用的“测试”是评测集加评测指标。

评测体系在架构里的位置,是连接到模型网关和Prompt仓库之上的一个独立模块。每次改动Prompt、换模型版本、调检索参数,都要先在一组固定评测集上跑一遍,对比关键指标(准确率、召回率、幻觉率、无回答率),通过之后才能灰度上线。没有这套机制,你的架构迟早会被一次看似无害的Prompt调整带崩。

5.2 混合推理与成本优化:多模型协作的架构思路

最后说说多模型协作的架构思路。AI应用未来一定不是只用一个模型,而是让不同模型各展所长:小模型做意图识别和摘要,中等模型做常规问答,大模型处理复杂推理和生成。这就像公司里不会所有人都是CEO,也不会所有人都是实习生——你得有个组织架构把人放到合适的位置上。

具体的做法是:定义任务等级或者任务类型,在模型网关里配置路由策略。我习惯用一个“复杂度评估器”额外做一次判断,让这个评估器决定请求应该去哪个模型。虽然评估器本身也消耗一点Token,但换来的是整体成本的下降和质量稳定性的提升,这笔账算下来永远划算。

6. 写在最后:架构设计的本质是管理不确定性

做了这么多AI项目,我越来越觉得,AI应用架构设计的本质不是“把模型接进来”,而是“在一个充满不确定性的系统里,搭建确定性的边界”。交互层让用户感知可控,编排层让决策可控,上下文层让信息可控,模型网关层让成本和故障可控,数据层让效果可度量。边界越多,系统越稳。

我最后再分享一个实战中养成的习惯:每次评审AI应用架构,先不看功能实现,先问三个问题——模型挂了你怎么降级?Token成本你怎么统计?效果退步你凭什么发现?这三个问题答不上来的架构,无论画得多漂亮,都是空中楼阁。把这个顺序反过来做设计,你会少踩很多坑。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进