☰
AI应用架构设计实战:从分层设计到Agent编排与高并发落地
2026/10/4 18:23:45 网站建设 项目流程

前前后后画了三十多张架构图,又推倒重来了好几次,我才算摸到AI应用架构设计的门道。

市面上聊AI应用的文章很多,聊架构的更多。但真要把一张架构图落到能跑、能扛并发、能迭代的生产系统里,过程中藏着一大堆文档里读不到的坑。这篇就把我做AI应用架构设计的完整思路、踩坑经历、以及最终沉淀下来的套路,全部摊开讲。

先说明一下,这篇聊的架构设计,不是指训练大模型,而是指基于现成的大模型能力(API或私有化部署)去构建上层应用,覆盖从请求接入、智能编排、模型调度,到数据召回、记忆管理、以及并发托底的完整链路。

开局先给一张总览图(文字版)。这张图也是我目前做AI应用架构的标准骨架:

用户端(Web/App/IM/硬件) ↓ 接入层(API Gateway、鉴权、限流、协议转换) ↓ 编排层(Agent Orchestrator / 工作流引擎 / 记忆管理器) ↓ 模型网关层(多模型路由、上下文组装、Prompt管理、流式转发) ↓ 数据层(向量库、缓存、业务DB、搜索服务、外部工具)

不要把这张图理解成传统的分层架构。AI应用最大的不同在于:每一层之间不只是数据流动,还有"智能决策"在流动。是的,用户请求不会简单地从A层透传到Z层,编排层会在中间反复和模型层、数据层对话,一个请求可能在大模型内部来回循环几十次才算完。这是AI应用架构与传统Web架构最本质的区别。

接下来,把每一层拆开讲。

1. 为什么AI应用架构设计不是"调个API"那么简单

先说个真实经历。我见过很多团队从传统后端转来做AI应用,最开始的架构通常长这样:

客户端 → 后端服务 → 大模型API → 返回结果 → 客户端

这个架构在Demo阶段毫无问题,短小精悍,人人都能跑通。但一旦面对真实业务场景,问题就接踵而至:

  • 用户的连续追问需要上下文记忆,谁来存、存哪里、怎么裁减?
  • 模型需要查实时数据或者企业内部文档,调用谁、什么时候调、结果怎么拼进Prompt?
  • 多个模型各有优劣,做总结用A模型、做推理用B模型,路由规则放哪一层?
  • 并发一上来,大模型API响应动不动几秒钟,连接池怎么设计?超时重试怎么做?流式输出怎么转发?
  • 用户问的内容需要引用原始文档,检索和编排的链路怎么闭环?

这些都是架构问题。传统后端架构在"查数据库返回结果"的模型下工作得很好,但AI应用的核心循环是思考-行动-观察(Reasoning-Acting-Observing),本质是一个多轮交互的智能循环,不是单次请求。

好,既然不是调API那么简单,那好的AI应用架构应该怎么设计?

1.1 传统三层架构与AI应用的本质差异

传统架构中,请求处理路径基本是:

  1. 客户端发起请求
  2. 后端验证参数、查数据库、做业务逻辑
  3. 返回固定结构的响应

关键在于,传统应用的业务逻辑是确定的、硬编码的,程序执行什么步骤完全由代码决定。架构设计的核心是管理好数据流和状态。

AI应用则不同。比如一个Agent应用,它的核心是让大模型自己决定下一步做什么——是要调用搜索工具,还是查数据库,还是直接回答。也就是说,业务流程本身存在"不确定性",架构必须为这种不确定性留出控制空间。

这意味着架构里必须具备这些组件:

组件作用传统应用是否需要
上下文管理器维护多轮对话状态和Token预算否
Prompt模板与版本管理控制模型行为和输出格式否
工具调用框架让模型可以触发外部动作否
记忆存储短期记忆(会话内)+ 长期记忆(跨会话)部分需要
模型网关多模型调度、降级、容错否
流式管道逐字返回输出的响应通道否

如果你的系统已经在跑AI应用,建议对照这张表自查一遍:缺了哪一块,哪一块就是隐患。

1.2 一条请求背后的全链路结构

举一个最简单的例子,一个"智能客服助手",用户问:"我们公司今年Q3的销售数据怎么样?"这句话看似简单,背后链路是:

  1. 接入层做用户鉴权、频率限制
  2. 编排层判断意图——用户要查数据
  3. 模型网关把问题送上大模型,模型发现需要查销售数据库
  4. 工具调用模块触发SQL查询(可能是Text-to-SQL)
  5. 查询结果返回后,编排层把结果追加到上下文中,再次交给模型
  6. 模型结合查询结果生成最终回答
  7. 流式管道把回答逐字推给用户

这个链路里,编排层(步骤2-5)是最核心的,它决定了系统智能程度的上限。如果这一步只是简单的大模型API封装,那你的应用本质上和"套壳"没区别。这就是为什么现在的热点是Agent和编排,而不是单纯的模型调用。

一个适合新手的架构原则:开始做AI应用架构时,不要一上来就设计复杂的组件,先把这条完整链路走通,然后再逐步引入编排、记忆、模型网关、多Agent协作等模块。架构是演进出来的,不是一次设计出来的。

2. 分层架构:从接入层到模型层的职责划分

现在开始正经分解各部分设计。每个团队技术栈不同,但AI应用架构的职责边界具有高度共性,按以下五层设计基本不会错。

2.1 接入层:这层比想象中更重要

接入层处理的是用户请求入口,看起来和传统API网关差不多,但在AI应用场景下有特殊的考虑:

  • 鉴权与授权:很多AI应用是面向C端用户的,大模型调用成本不低,接入层必须做用户粒度的配额控制。不做频率限制,很快会被薅羊毛,一个用户狂刷几百次,账单直接爆表。

  • 流式协议:AI应用的主流交互方式是流式返回。接入层需要支持SSE(Server-Sent Events)或WebSocket,把模型生成的增量内容实时推给用户。如果设计成"等模型全部生成完再返回",用户会面对好几秒的白屏等待,体验很差。

  • 多端协议适配:同一个AI能力,Web端走WebSocket,小程序走WebSocket、甚至有些IoT端走MQTT协议。接入层需要承担协议转换的职责,把不同端的请求归一化后转给编排层。

架构建议:接入层尽量薄。不要在这一层做业务逻辑,保持高并发吞吐能力。AI应用的CPU密集型操作都在下游的模型调用和向量检索中,接入层如果也做重逻辑,很容易成为性能瓶颈。

# 一个典型的SSE接入层实现思路(FastAPI风格) @app.websocket("/ai/chat") async def websocket_chat(websocket: WebSocket): await websocket.accept() user_input = await websocket.receive_text() # 校验用户配额 quota_ok = check_quota(user_id) if not quota_ok: await websocket.send_json({"error": "quota exhausted"}) return # 转给编排层,异步读取流式结果 async for chunk in agent_stream(user_id, user_input): await websocket.send_text(chunk)

2.2 编排层:Agent的"大脑中枢"

编排层是AI应用架构中最关键也最容易过度设计的一层。它承担三类核心职责:

职责一:意图路由

用户请求进来,先判断走哪个处理路径。比如"查询天气"的请求和"写一首诗"的请求,走两条完全不同的链路。常见实现有两种:

  • 基于分类模型(小模型或大模型分类接口),现在更常见的做法是让LLM本身做意图分类并输出JSON格式的意图结构
  • 基于语义相似度匹配,用向量检索在预定义的意图库中匹配最接近的意图

职责二:任务拆解与工具调度

这是Agent架构的核心。一个复杂请求往往需要拆成多个子任务,每个子任务对应一次模型调用或工具调用。比如"帮我总结一下昨天和客户的会议记录,并整理出待办事项发到团队群里"这个请求,拆解出来就是:

  1. 从会议记录存储中检索昨天的会议记录(工具调用)
  2. 大模型总结要点(模型调用)
  3. 从总结中提取待办事项(模型调用)
  4. 调用群机器人API发送消息(工具调用)

编排层必须有机制让模型能"选择工具"并"传递参数"。现有实现思路包括:

  • 基于LangChain的Tool Calling机制
  • 基于ReAct模式的"思考-行动-观察"循环
  • 基于自研的状态机(当你需要更精细控制时)

职责三:上下文与记忆管理

很多人做AI应用时最头疼的问题就是上下文越长,模型响应越慢、越贵、越容易"迷失"。编排层需要设计一套上下文管理的策略:

  • 滑动窗口:只保留最近N轮对话
  • 摘要压缩:把早期对话交给模型生成摘要,存摘要而不是全文
  • 关键信息抽取:从对话中不断抽取用户偏好、关键事实存成结构化的记忆
  • 混合策略:短期记忆用窗口,长期记忆用向量库,临时信息用缓存
def build_messages(session_id, new_user_msg): # 1. 取最近对话(滑动窗口) recent = session_repo.get_recent(session_id, limit=6) # 2. 取会话摘要 summary = memory_repo.get_summary(session_id) # 3. 取与当前意图相关的长期记忆 facts = vector_memory.search(new_user_msg, top_k=3) # 4. 组装成最终Prompt system_prompt = f"历史摘要:{summary}\n相关记忆:{facts}" return [{"role": "system", "content": system_prompt}] + recent.messages + [{"role": "user", "content": new_user_msg}]

这段代码看起来朴素,但已经是很多生产级AI应用的实际做法了。

2.3 模型网关层:隔离模型供应商的"防洪堤"

模型网关是很多人容易忽略、但生产环境离不开的一层。它的核心作用有三个。

多模型路由

不同模型在响应速度、输出质量、价格、支持语言上有很大差异。生产级应用几乎不会只用一个模型。我见过一个典型的AI客服系统:

场景模型选择原因
闲聊、寒暄便宜的小模型质量要求低,量大
复杂业务咨询旗舰大模型需要深度推理
总结摘要中等模型质量与成本平衡
内容审核专用分类模型响应要求快、必须合规

模型网关需要实现路由策略,按场景、按用户等级、按当前模型负载动态选择模型。这跟传统微服务中的服务路由是类似思路,但多了一个"语义"维度——路由规则的决策依据往往是意图分类结果,而不只是请求路径。

上下文组装与Token管理

网关层还要做让开发者抓狂的一件事:上下文越长,API调用越贵。两个解决办法:

  • Token预算控制:每轮请求前计算当前上下文token数,超过预算就截断或压缩
  • Prompt缓存:对于系统Prompt不变的部分,使用模型提供方的缓存能力,显著降本

以GPT系列API为例,同前缀的Prompt缓存能省约一半的输入成本。这个细节很多架构师在设计时根本没考虑到,直到账单出来才后悔。

统一错误处理与降级

大模型API的可用性永远不是100%。调用超时、5xx错误、限流(429)都是常态。模型网关层必须做统一的重试、熔断、降级策略。我做过的一个项目里,模型网关会实时统计每个模型供应商的失败率,当失败率超过阈值时自动把流量切换到备用的同能力模型上。用户无感知。

2.4 数据服务层:向量库、缓存和业务数据的协同

数据服务层是我在架构设计初期最容易低估、后期投入精力最多的一层。AI应用的数据需求比传统应用复杂很多。

向量库选型

为什么需要向量库?因为AI应用的核心场景之一是RAG——把你的业务文档变成模型可以"查询"的知识。这就需要把文本切块、向量化、存储、检索。

选型时,有三个维度需要权衡:

向量库适合场景优点缺点
Milvus数据量大、需要分布式功能全、性能猛部署运维成本高
Chroma本地开发、轻量试用极简、快速启动不适合大规模生产
云厂商服务(如向量检索服务)不想自运维的中大规模免运维、弹性价格和管控绑死
关系库+插件数据量小、已有的PG基础设施复用现有设施性能上限低

纯技术角度,如果数据量在几百万级以上、QPS预期高,直接选Milvus这类专业向量库,别用关系库的向量插件硬扛;如果数据量在百万以下且已有PG,用PG的向量插件反而省事,少一个组件少一类故障。

缓存层:不止是Redis

AI应用里,缓存的含义比传统应用更广。至少有三类缓存值得注意:

  1. 语义缓存:用户问过的问题,模型已经回答过,如果新问题的语义和旧问题高度相似,直接返回旧答案,省一次模型调用。实现方式是用向量相似度匹配旧问题。
  2. KV缓存:用户画像、配额、会话状态,用Redis这类常规缓存
  3. 文档块缓存:RAG场景下,文档解析、清洗、切块、向量化的成本不低,需要做增量更新和缓存,避免每次重新全量处理

业务数据库

别以为有了向量库就不需要业务库。用户信息、订阅关系、对话记录的元数据、工具调用的审计日志,这些结构化数据仍然放在关系数据库里。典型设计是:业务元数据在关系库,向量数据在向量库,两边的ID互相关联。

这是AI应用架构的一个隐藏复杂度:传统数据与新数据的双重存储。数据一致性维护比传统应用更繁琐,必须考虑"对话里如果引用了旧知识,但知识库已经更新了,怎么处理?"这类问题。成熟的做法是给知识版本打时间戳,在上下文里带上版本号,让模型知道数据的时效性。这个问题我们后面专门展开。

3. Agent架构:单Agent与多Agent协作的取舍

聊到Agent,先泼一盆冷水。不要被"AI Agent"这个词吓到,也不要被媒体吹得天花乱坠。在我看来,Agent本质就是**"模型 + 工具 + 编排循环"的组合**,并不神秘,但落地时坑很多。

3.1 单Agent的边界

所谓单Agent,就是一个大模型驱动的智能体,它自己决定怎么使用工具、怎么回答。对大部分业务场景,单Agent已经足够了。单Agent的架构是这样的:

用户问题 ↓ LLM(决策循环:需要工具吗?需要查资料吗?) ↓ 是 工具调用(搜索/查询/API) ↓(工具结果返回) LLM(继续推理) ↓ 否 最终回答

实现时的关键点在于工具调用的格式。现在主流模型基本都支持Function Calling,你只需要把工具的定义(函数名、参数说明、用途描述)以JSON Schema的方式传给模型,模型就能在需要时返回一个结构化调用指令。

这个设计里有几个很深的门道:

  • 工具描述写不好,模型就乱调工具。工具描述就是给模型的"说明书",写清楚这个工具什么时候该用、什么时候不该用、参数格式是什么。很多人上来写个"获取天气信息"就完了,结果模型该调用时不调用、不该调用时乱调用。
  • 工具太多,模型选择困难。如果工具列表超过20个,模型的选择准确率会下降。架构上需要做一级工具分类,先选工具组,再选具体工具。
  • 工具调用失败要有恢复机制。工具可能失败(网络错误、返回空数据、权限不足),架构必须让模型知道失败了,并重新决策。最常见的坑是:工具调用失败后,模型像没事人一样继续编答案。架构上要在工具返回的内容里显式带上错误标记,并提示模型"这次查询没有成功,你不应该编造数据"。

3.2 多Agent协作模式:串行、并行与分层

当业务足够复杂时,单Agent会力不从心。比如一个智能助手既要回答客服问题,又要管理订单,还要做数据报表。所有能力塞进一个Agent,Prompt会越来越长,工具列表越来越长,模型决策质量急剧下降。

这时候就需要多Agent架构。市面上常见四种协作模式:

串行模式(Pipeline)

Agent A处理完,把中间结果传给Agent B继续处理。适合有固定流程的场景,比如先审阅后总结再归档。这种模式最稳定、最好调试,架构上就是一个工作流。

并行模式(Fan-out/Fan-in)

一个请求分发到多个Agent并行处理,最后汇总结果。适合"多角度分析同一问题"的场景。比如做一个行业研究报告,竞品分析Agent、市场规模Agent、趋势预测Agent同时开工,最后汇总成一份报告。

分层模式(Supervisor)

一个"主管Agent"负责拆解任务、分发给多个"专员Agent"执行,并收集结果。这种模式最接近真实组织运作,也是多Agent协作中最推荐的。主管Agent的Prompt要写得极其清晰,它本身通常使用最强的模型,专员Agent可以用低成本模型。

协商模式(Debate)

多个Agent对同一问题给出不同观点,互相辩论,最后仲裁者定稿。这个模式最有想象力但也最容易失控,适合头脑风暴、观点审查类场景,不太适合对确定性要求高的业务系统。

架构建议:追求稳定性优先,先用串行模式;业务复杂度真上来了,再升级到分层模式。一上来就搞协商模式,大概率要翻车,调试成本极高。

3.3 多Agent架构的工程复杂度来源

多Agent协作听起来很美,实际投入生产后你会发现,工程复杂度是指数级上升的:

  • 上下文隔离:每个Agent的上下文是否共享?如果共享,中间的中间产物和海量思考过程会迅速淹没上下文;如果隔离,每个Agent另起炉灶,信息不连续怎么解决?常见的解法是:主记忆在Session级别共享、各Agent只保留与自身任务相关的局部上下文。
  • 状态一致性:多个Agent有没有可能修改同一份数据?操作同一个订单?如何避免并行Agent之间互相覆盖数据?必须有锁或版本号机制。
  • 可观测性:多Agent协作的链路比单Agent长得多,任何一个环节出错,排查都如同大海捞针。每个Agent的输入输出、工具调用、决策理由都要有日志记录。这是多Agent系统能生产落地的先决条件。

工程上还有一类代价很多人不算:多Agent协作会显著增加模型调用次数和耗时。一次复杂任务可能调用20次甚至更多次模型,延迟从单Agent的5秒变成30秒甚至更多。架构设计必须考虑到用户的耐心边界,必要时用流式进度反馈缓解等待感。

4. RAG架构设计的四条关键链路

RAG(检索增强生成)是当前AI应用落地最广的技术架构之一。但很多人对RAG的理解停留在"向量检索+拼接到Prompt"的层面,这个理解太粗浅了。

我强烈推荐把RAG当成一个独立架构来设计,而不是一个功能。RAG架构包含四条关键链路:索引链路、检索链路、重排链路、验证链路。任何一条链路的缺失或薄弱,都会让整个系统效果崩塌。

4.1 索引链路:文档从入库到可检索的全过程

索引链路是最不起眼、但对最终效果影响最大的环节。流程如下:

  1. 文档解析:PDF、Word、HTML、Markdown……不同格式处理方式完全不同。PDF尤其麻烦,有扫描件、有表格、有多栏排版,需要OCR、版面分析才能把内容有效提取。
  2. 文本清洗:去掉页眉页脚、水印、乱码字符、无关广告。质量差的源文档清洗不干净,检索到的内容就是垃圾,模型生成质量直接受影响。
  3. 分块策略:把长文切成小块才能精确检索。块太小语义不完整,块太大噪声太多。实践中的经验值是:通用文本200-500 token;代码或结构化内容按逻辑块切;Markdown按标题层级切。但最好根据具体内容调整——这一块非常依赖经验。
  4. 向量化:选择合适的Embedding模型。中文场景可以选择主流的国产中文向量模型,英文场景可以用通用的向量模型。向量化后做归一化储存,为后面的相似度计算打基础。
  5. 增量更新:文档库不是静态的,每天有新增、有修改、有删除。索引链路必须支持增量更新,否则每来一个新文档就全量重建索引,系统很快就扛不住。

4.2 检索链路:为什么混合检索是标配

检索不只是向量相似度那么简单。向量检索擅长语义匹配,比如"电脑开不了机"和"笔记本电脑无法启动"能匹配上,但它在精确匹配、数字范围、同义专有名词等场景下会失灵。

举例:用户问"找一下编号为INV-2024-0089的订单",如果用纯向量检索,模型会按语义去找,结果可能完全不匹配。这种场景下,精确匹配(倒排索引或数据库查询)是必须的。

所谓混合检索,就是向量检索+关键词检索+结构化检索的结合,最后用加权或重排方式融合结果。哪些场景选哪种策略的参考逻辑如下:

场景主检索方式原因
开放域问答、概念查询向量检索语义匹配能力强
精确ID、编号、工号查询结构化/精确检索容不得模糊
专有名词、缩写匹配关键词检索向量可能混淆缩写
多条件过滤+语义查询向量+结构化过滤先过滤后语义

4.3 重排链路:从Top-10到Top-3的关键一步

向量检索拿回来的Top-10结果,是不能直接全部塞进Prompt的。原始的向量相似度排名在前十名层面的排序质量比较粗糙,直接使用会在中间混入语义低相关但向量距离较近的噪声。业界标准做法是加重排环节。

重排的实现方式有两种:

  • 用重排模型(如bge-reranker)对检索结果评分排序。这个模型的输入是query和文档对,输出相关性分数。准确率高,但速度慢,所以只对Top-10重排,不做全量重排。
  • 用大模型重排。让模型判断哪些候选文档相关并排序。效果可能更好,但token成本高。适合候选集小、质量要求极高的场景。

架构上,重排层是选配,但生产级RAG系统我推荐直接上重排模型。原因很简单:向量检索的目的是召回率优先,重排的目的是精确率优先,两者互补,缺一个就会在效果上出问题。

4.4 验证链路:引用溯源与幻觉控制

最后这条链路最容易被新手忽略。很多RAG系统做完了前三步就上线,结果模型一本正经地编造引用内容——用户提出质疑,你才发现回答里根本没绑定原始出处。

验证链路做的事包括:

  1. 引用溯源:当模型生成回答时,必须明确这条信息的来源是哪份文档、哪个段落。实现方式是在Prompt里要求模型以特定格式输出引用标识,并在生成后通过后处理脚本做映射。
  2. 相关性校验:模型回答的核心论断,在检索到的原文里找不找得到?可以做一个自动化的断言验证——把模型生成的句子与原文句子做语义相似度比对,低于阈值就标记为"疑似幻觉"。
  3. 无依据拒答:架构上要允许模型在检索到的资料不足以回答问题时,明确说"根据现有信息我无法回答这个问题",而不是硬编。这需要在Prompt里反复强调,并配以后处理兜底。

这四条链路合成一句话:RAG的效果不是由模型决定的,而是由索引、检索、重排、验证四个环节共同决定的。这句话值得贴在公司白板上,因为绝大多数RAG效果不理想的项目,问题都出在这四环的某一环,而不是模型本身。

5. 高并发下AI Agent架构的扛压设计

话题落到热搜词里频繁出现的"AI Agent怎么扛并发"。这个问题确实该聊。很多人做一个AI应用原型很容易,等到用户量一上来就发现,大模型调用的延迟和成本会成为系统的"短板"。

5.1 AI应用的并发瓶颈到底在哪

传统的Web服务,并发瓶颈通常在数据库、在磁盘IO。AI应用变了,瓶颈转移到了三个新地方:

  • 大模型API的响应时延:一次调用可能1-10秒,是传统API的百倍以上。线程池/协程占用时间极长,服务很容易被慢调用拖垮。
  • 上游API的并发配额:模型供应商对API有严格的并发限制(RPM,每分钟请求数;TPM,每分钟Token数)。你自己的服务能扛十万并发也没用,上游只给你200RPM,多出来的请求全部429。
  • 向量检索的吞吐:虽然比大模型调用快得多,但向量检索也需要毫秒级计算,高并发下索引的加载、计算、返回都需要扩容。

理解了瓶颈位置,才能对症下药。

5.2 连接池、超时与重试的正确姿势

先给几个具体的参数实践值,这些是从生产环境中总结出来的,可供参考:

参数建议值理由
单路请求超时读超时60-120秒大模型生成长文本可能真的需要这么久
连接超时3-5秒如果TCP握手都这么慢,说明网络有问题
连接池最大连接数视上游配额而定连接数不要超过上游限流阈值,否则毫无意义
重试次数2次(幂等场景)第一次重试间隔500ms,第二次1s;非幂等请求不能重试
熔断阈值连续失败率>50%且请求量>阈值触发后快速失败,进入半开状态探测恢复

重试这里必须强调一个经典坑:大模型API是非幂等的。如果请求已经发出去,模型已经在生成结果,你因为超时重试了一次,用户可能收到两个答案(如果业务处理了两个响应),而且两次请求都消耗token费用。所以重试策略应该只针对"连接失败"和"明确返回5xx(非处理中错误)"的场景,对"超时但不确定服务端是否已处理"的请求,应该走状态查询而不是盲目重发。

5.3 异步化与流式响应的架构影响

AI应用天然适合异步化。用户发一条消息,模型要想好几秒,让用户的HTTP连接一直挂着等结果,是很差的体验,也大量占用连接资源。

架构上推荐的做法是基于消息队列的异步处理:

API接入层(立即返回 request_id) ↓ MQ(消息队列) Agent Worker(消费消息,执行智能循环) ↓(执行完成) WebSocket / SSE(推送结果给客户端)

这样做的优势:削峰填谷能力极强,哪怕上游模型API偶尔变慢,消息在队列里排队等待,服务不会崩溃;处理进度可以随时查询,用户体验也更可控。

流式响应带来的架构变化值得单独说。传统API要等整个响应体生成完才返回,AI应用场景下流式逐步返回生成结果已经是标配。但流式也带来了额外问题:编排层的中间状态怎么在流式协议中透出?我的方案是用事件类型区分:token事件推增量文本、tool_call事件推工具调用状态、status事件推当前处理阶段。前端拿到这些事件可以渲染出"正在查资料...""正在生成中..."的动态效果,体验比干等好太多。

# 流式事件示例(伪代码) async for event in agent_execute(msg): match event["type"]: case "token": await ws.send({"type": "token", "delta": event["delta"]}) case "tool_call": await ws.send({"type": "status", "text": f"正在调用{event['tool']}..."}) case "done": await ws.send({"type": "done", "request_id": event["id"]})

5.4 降级与熔断的实操方案

不管你怎么优化,大模型API该挂还是挂。生产级架构必须做好降级预案。我在实际项目中用过的降级策略,按优先级排列:

  1. 模型降级:从旗舰模型降级到普通模型。回答质量差一些,但服务还在。
  2. 简化编排:Agent的多步推理链路降级为单轮问答。不做工具调用、不做复杂的思考过程,直接生成答案。
  3. 局部降级:如果重排服务挂了,跳到"不重排只取Top-1"的简化链路。
  4. 兜底话术:AI能力完全不可用时,返回预制语句:"小助手当前繁忙,请稍后再试",并引导用户转人工。

降级方案设计要在上线之前完成,而不是宕机之后再补救。上线前把每个降级路径都演练一遍,确定能真正跑通。

# 降级配置示例(YAML) routes: - id: chat-main model: flagship fallbacks: - model: fast-model trigger: [timeout, 5xx] - mode: echo-fallback trigger: [quota-exhausted, circuit-open]

在压测实践中还有一个经验:并发压力下,先挂的往往不是大模型API本身,而是你的昂向量库或数据库。模型API挂了会快速退回非200状态,数据库挂了则是连接池耗尽,所有请求排队等待,整个服务完全卡死。所以做高并发架构时,务必同时关注下游每一个依赖组件的连接池配置和超时设置。甚至有人会特意给数据库、向量库设置比模型API更短的超时时间,优先保护业务链路。

6. AI Native研发范式的工程落地

这是最后一个大议题,也是行业内正在热烈讨论的方向。热搜词里出现了"AI Native研发范式实践手册"、"AI测试开发"、"AI编程提示词"这些词,非常贴合时代脉搏。

所谓AI Native,不是说"用了AI辅助编程"就算,而是指软件开发流程本身被AI重塑——从需求分析、架构设计、编码实现到测试运维,每个环节都被AI深度介入或自动完成。

6.1 从提需求到写Prompt:需求表达的范式变化

传统研发的需求链是:产品经理写PRD → 开发读PRD写代码 → 测试按PRD写用例。AI Native的研发范式里,需求链变成了:产品经理定义问题域和验收标准 → AI辅助生成PRD和用户故事 → AI辅助生成架构图和代码骨架 → 开发者审核、修正、集成。

在这个范式下,架构师和开发者的核心能力不再是"从零写程序",而是:

  • 写高质量Prompt的能力:给AI描述清楚系统要做什么、边界在哪、如何处理异常。一个精准的Prompt,胜过十轮无效对话。
  • 审阅AI产物的能力:AI生成的代码,你能看出问题在哪、哪里需要改。这部分能力依赖传统功底。
  • 结构化拆解能力:把大系统拆成一个个AI能独立完成的模块,定义好模块间接口。这是架构设计的新形态。

这不是"程序员要失业"那套话术,而是程序员的产出形态从"代码"变成"代码+Prompt+审批决策"。

6.2 可观测性:Trace、LLM监控与评测

做AI应用架构,最趁手的调试工具,不是断点,而是可观测性工具链。

传统微服务的监控指标是QPS、延迟、错误率。AI应用多出几个核心指标:

指标含义为什么重要
Token消耗每个请求消耗的输入/输出Token数直接关联成本
Tool调用成功率工具调用成功/失败的占比反映Agent决策质量
上下文长度每次请求的上下文Token数过长需压缩,影响成本
幻觉率(抽样评测)回答中无依据内容的比例决定用户体验和可信度
重排命中率重排后Top-1与最终答案一致的比例反映检索链路质量

AI应用的排障逻辑也与传统应用不同。试想这个场景:用户反馈"回答质量变差了",你的第一步排查动作是什么?传统思维:看报错日志。AI应用里更可能的根因:Prompt被改动过?知识库更新了但向量索引没重跑?模型供应商悄悄换了版本?数据库里混入了脏数据?这些都可能让质量变化,且没有任何报错。

架构上建议针对一次完整的Agent请求做TTV(Trace-Token-Verify)记录:

  • Trace:记录完整调用链,每个工具的输入输出、每个节点的耗时
  • Token:记录Token消耗明细和上下文组装过程
  • Verify:记录评测结果,支持事后复盘

有了这三样,在用户反馈质量问题时才能快速定位"是哪一环变了"。

6.3 灰度发布与回归防线

AI应用发布新版本,比传统应用风险高很多。最大的风险在于:模型行为是概率性的,同样的Prompt,这周和上周输出的质量可能有肉眼可见的差异。你可能改了一个Prompt里的标点符号,用户的体验就明显下降。这不是玄学,是真实发生过无数次的翻车案例。

传统的代码灰度发布机制能用到AI应用上,但需要补充AI特有环节:

  1. Prompt灰度:新Prompt只对10%的流量生效,离线对比新旧版本的回答质量得分,确认无回归再放量。目前已有相应的Prompt评测框架可以支持这类工作。
  2. 模型灰度:切换底层模型时,先在影子模式下用真实流量做对比评测(不返回新模型结果给用户,只记录和打分),观察几天再切换。
  3. 回归测试集:必须有一个人工标注或半人工的问答评测集,覆盖核心业务场景和常见的刁钻问题。每次Prompt变更、模型切换、检索逻辑修改后,跑一遍回归集,分数下降就阻断发布。

在实践的反复打磨中,我发现最实用的是黄金评测集机制——把线上用户的高频问题、曾经翻过车的问题、边界刁钻问题沉淀成评测集。每次发布前跑一遍,虽然不完美,但能挡住大部分低级回归。

以上,就是从分层架构到Agent设计、RAG链路、高并发承载、AI Native工程范式的完整架构设计体系。

最后分享一句我这几年做AI应用得到的最深刻的体会。架构设计这件事,想的比写的值钱,试错的比规划的可靠。AI应用架构没有放之四海而皆准的正确答案,只有针对你业务场景的最优解。先把基础链路跑通,再一层层往上加复杂度,过程中不断用线上数据修正设计方向——这才是AI应用架构设计的正道。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询