ARTICLE DETAIL

资讯详情

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

图解AI应用架构设计:从不确定性到可控系统的工程实践

图解AI应用架构设计:从不确定性到可控系统的工程实践 由于输入内容中正文、关键词、摘要均为空我将围绕图解AI应用架构设计这一核心标题结合该领域的技术背景与工程实践采用图解实战拆解的方式写一篇面向中高级开发者的AI应用架构设计干货博文。内容聚焦于AI应用与传统软件架构的本质差异、分层设计、Agent编排、记忆与检索、可观测性、以及如何用图解方法表达架构设计。1. 为什么调接口和搭系统是两回事AI应用架构的本质问题先从一个很常见的现象说起。很多人第一次做AI应用觉得不过就是调一个API把用户的问题丢给大模型再把回答返回给前端。确实做一个Demo这样足够了但做一个真正能上生产环境的AI应用事情会突然变得复杂得多——回答不稳定、上下文一长就乱、工具调用失败、成本失控、用户问了一句模棱两可的话系统就崩了。这些问题归根结底都指向一个核心事实AI应用不是一个函数而是一个系统。传统软件开发中代码的执行路径是确定的输入输出是可预期的。但在AI应用里模型的行为是概率性的同样的输入可能得到完全不同的输出而且这个输出还会受到上下文、Prompt措辞、模型版本、温度参数等多种因素影响。这就是为什么我们需要架构设计。架构不是为了把代码组织得更美观而是为了在不确定性之上建立确定性。具体来说AI应用架构要解决四个核心问题控制边界模型负责生成内容但系统负责决定模型应该在什么约束下生成。没有控制边界的AI应用就像没有围栏的动物园随时可能跑偏。状态管理一次对话往往涉及多轮交互、多个工具调用、长上下文记忆。模型本身天然无状态状态必须由外部系统维持。故障容错模型会答错、工具会超时、外部API会限流。架构必须有降级、重试、人工兜底机制。成本与性能每次推理都在烧钱架构设计直接影响Token消耗、响应延迟和整体可用性。所以当我们谈AI应用架构设计时本质上是在设计一个以LLM为核心、以工程手段为护栏的混合系统。这是我个人的一个核心判断AI应用的架构价值不在于让模型更聪明而在于让整个系统更可控。从实际项目经验看一个能上线的AI应用通常由五个层次构成接入层面向用户和外部系统、编排层工作流和Agent逻辑、模型层LLM调用与路由、记忆层短长期上下文存储、工具层API、数据库、搜索等外部资源。后面我会逐层展开讲清楚每一层里那些文档里不会明说的设计细节。2. 分层设计把AI应用拆成五个能落地的模块2.1 接入层用户意图的翻译官接入层是用户和AI系统之间的第一道关卡。很多团队在这一层犯的错误是直接把用户原始输入丢给模型。正确的做法是在接入层完成三类预处理意图识别与任务分类判断用户是来闲聊、查资料、执行操作还是需要人工介入。这一步可以用一个小模型或规则引擎先做粗分类再路由到不同的处理流程避免所有请求都走一个重模型。输入清洗与脱敏去除有害内容、剥离个人敏感信息。尤其在企业场景里这一步不是可有可无的而是合规底线。比如用户往客服机器人里粘贴了一段带手机号的日志系统应该在进入模型前先做脱敏。多模态归一化文本、图片、语音等输入需要转换成统一的内部表示后续的Prompt构造和工具调用都要基于这个统一格式。接入层的设计原则是尽量薄。它不需要承担业务逻辑只需要做好分流和预处理。打个比方它就像公司前台的接待员——不负责具体业务但决定了访客应该去哪个部门。2.2 编排层AI应用的心脏编排层是AI应用架构中最核心、也最容易被低估的一层。它的职责是决定模型在每一步该做什么、调用什么工具、如何把多步结果拼装成最终答案。在早期的AI应用中编排层就是简单的用户问题 - 构造Prompt - 调用模型 - 返回。但到了Agent时代编排层需要处理循环模型决定调用工具 - 执行工具 - 把结果反馈给模型 - 模型再次决策。这个循环可能重复多轮因此编排层必须是一个完整的状态机而不是一段线性代码。我在实际项目中的体会是编排层最值得注意的有三件事第一不要把所有决策都交给模型。能用确定性代码实现的流程判断就不要让模型来做。比如用户是否已经登录这种状态判断代码几行就解决了但如果交给模型既慢又贵还可能判断错。AI应用架构的一个常见误区就是能AI就AI导致系统又慢又不可控。正确的姿态是确定性的交给代码不确定性的交给模型。第二可恢复性是编排的生命线。Agent在执行过程中可能遇到工具超时、模型输出格式错误、上下文超长等问题。如果编排层没有从故障中恢复的能力一次失败的调用可能让整个任务作废。我建议在编排层引入重试降级补偿三段式机制先重试瞬时故障超时、限流再降级换小模型、跳过非关键步骤最后补偿记录失败状态由后续流程或人工干预处理。第三显式记录每一步的状态和耗时。这在排查问题时至关重要。一个Agent任务跑了20秒到底卡在哪一步只有编排层每一步都有日志和轨迹记录才能回答这个问题。没有轨迹的Agent系统就是一个黑箱出了问题根本无从下手。2.3 模型层路由、缓冲与容灾模型层是所有AI能力的来源但架构上我们通常不会直接对着某一家模型写死。模型层要解决的核心问题有三个用哪个模型、怎么切换、怎么控制成本。关于模型选择我的建议是按任务分档而不是一个模型包打天下任务类型推荐模型档位原因简单分类、抽取、格式化小模型/轻量模型快、便宜准确率已足够中度推理、摘要、改写中档模型性价比平衡复杂推理、长文本、代码生成旗舰模型能力上限决定任务上限低延迟实时交互本地小模型避免网络开销模型路由层正是实现分档的关键组件。它根据任务的复杂度、用户的优先级、实时模型健康度来决定请求发往哪个模型。实测下来合理路由能节省30%-50%的推理成本。除此之外模型层还要做好三件事统一API抽象封装不同模型提供方的接口差异这样切换模型时只改配置不改业务代码。超时与熔断给每次模型调用设置合理的超时时间通常15-30秒当某个模型服务持续异常时自动熔断并切换到备用模型。缓存策略对重复性高的请求比如常见问题、固定模板转换在模型层前加一层语义缓存能显著降低成本和延迟。2.4 工具层AI的手脚如何设计接口工具层也叫函数调用层是AI从聊天走向做事的关键。工具的本质是把模型决策映射成真实世界的操作——查数据库、发邮件、调用支付接口、操作第三方系统。但给模型用的工具接口和给人用的API接口设计思路完全不同。给模型用的时候你要考虑到模型是通过自然语言理解工具描述的而自然语言是有歧义的。这就引出了工具设计的三个关键点一是工具描述必须极其精确。模型靠函数名和描述来决定是否调用这个工具。描述写得模糊模型就会乱调。比如get_user_info这种名字太泛应该写成根据用户ID获取用户的基本信息包括姓名、等级、最近一次消费时间。描述越具体模型判断越准确。二是入参严格校验不能省。模型生成的参数值偶尔会自创。比如用户说帮我订明天下午三点的会议室模型可能生成一个根本不存在的日期格式。工具层必须对入参加一层强校验不合格就让模型重新生成或者返回明确的错误信息给模型修正。这一步不做后面接的数据库和业务系统就要遭殃。三是工具职责单一组合交给编排层。一个工具只做一件事复杂的动作由编排层组合多个工具完成。这样设计的最大好处是可复用不同的Agent可以共享同一个工具集编排逻辑不同即可。2.5 层次之间的接口规范五个层次划分好之后层与层之间的接口是最容易被忽视的。我的建议是层间通信尽量采用结构化的消息而非裸字符串。比如编排层传给模型层的Prompt最好是一个结构体——包含任务类型、上下文、可用工具列表、输出格式约束。这样每一层都能对输入做校验出了问题也能准确定位。这个分层思路本质上跟传统软件工程中的关注点分离是一致的。AI应用虽然新颖但架构设计的基本功——模块化、接口清晰、可测试——完全通用而且因为这些原则在AI场景中更脆弱所以更值得严格贯彻。3. Agent编排与多智能体协作控制边界的艺术3.1 单Agent的自我循环随着AI Agent这个概念的火热很多人开始直接上多Agent架构——让几个AI角色互相聊天、协作完成任务。但根据我的一线观察绝大多数业务场景先用好单Agent就够了。单Agent的循环是接收任务 - 拆解思考 - 调用工具 - 观察结果 - 再次决策直到任务完成。这个循环看起来简单实际上有大量细节需要设计。其中最容易翻车的是循环终止条件。一个Agent可能因为反复得不到理想结果而陷入死循环疯狂调用工具Token成本一路飙升。所以在单Agent设计阶段必须强制设定三个终止条件任务完成Agent自己判断已产出最终答案。最大轮次设定硬性上限比如最多执行10轮工具调用达到上限强制停止并返回部分完成状态。风险触发某步操作结果异常如扣款失败、权限不足时立即停止并转人工。实测中最大轮次这个硬约束尤其重要。模型在开放性任务里有一种倾向——即使结果已经不错了它还想着再优化一下结果越跑越偏。硬轮次限制相当于给Agent安装了一个刹车非常管用。3.2 多Agent协作的分工与通信当任务足够复杂时单Agent会面临两个问题上下文窗口不够装下所有信息一个角色做所有事导致Prompt相互干扰。这时才需要考虑多Agent架构。多Agent架构有三种常见协作模式管道模式Agent A的输出直接作为Agent B的输入适合流水线式任务如生成大纲 - 写正文 - 配图 - 排版。编排者模式一个主Agent负责拆解任务、调度多个子Agent执行。适合主管专员型场景。自由对话模式多个Agent平级讨论、互相评审。这种模式最灵活但也最容易失控。我个人的建议是除非确实必要优先采用编排者模式。自由对话模式看起来很酷但经常出现几个Agent围绕一个细节来回争论浪费大量Token最终还需要人工介入来收场。编排者模式的控制权更集中每个子Agent的任务边界清晰主Agent只需要做好任务拆解与结果汇总。多Agent之间通信还有一个关键设计不要让Agent直接读对方的完整聊天记录。正确做法是上一个Agent的输出经过提炼可能由主Agent或一个专门的汇总Agent完成后只传递关键结论给下一个Agent。这样既能控制Token消耗也能减少噪声干扰。3.3 容错与自我修正怎样让Agent知道自己错了Agent系统的另一个核心问题是如何让错误不可怕。因为模型一定会犯错架构的前提假设应该是错误是常态而非异常。容错设计有几个层次输出格式校验模型应该输出JSON结果给了一段Markdown——让模型重新生成或者用解析器尝试修复。工具调用失败的反馈工具返回错误码之后要把错误信息返回给模型让它尝试调整参数重新调用或者换一种实现方式。不确定性感知当模型的回答置信度低、拿不准时应该允许它说我不确定需要人工确认而不是硬着头皮给一个可能错误的结果。其中一个比较容易被忽略的实践是自我修正提示语的设计。当工具返回异常时不要只把错误信息丢给模型而是同时给它修正建议。比如用户ID不存在可能是用户提供的信息有误请用友好的语气向用户澄清不要猜测或编造一个ID。这种带引导的反馈能显著提高模型在异常场景下的处理质量。4. 记忆与检索让AI从一问一答变成有上下文的工作流4.1 三种记忆的分层设计很多AI应用做出来给人感觉很傻原因往往不是模型不行而是没有记忆系统。用户的对话历史、偏好、项目上下文都散落在各处模型每次交互都像是在跟一个陌生人聊天。而要建立记忆系统第一步是把记忆拆成三种类型分别用不同的技术方案处理短期记忆当前会话的多轮对话历史。通常直接放在上下文中但要注意控制Token长度超出窗口要触发摘要压缩。长期记忆跨会话持久化保存的用户偏好、事实性信息如用户是HR、公司规模、常用工具。一般用向量数据库或传统数据库存储在需要时检索并注入上下文。工作记忆当前任务执行过程中的中间状态比如已经完成调研、正在生成报告初稿。这部分适合用结构化状态存储而不是塞进模型上下文。值得强调的一点是不是所有记忆都该往上下文里塞。很多团队一上来就把历史记录全量灌给模型结果上下文爆掉、Token成本暴涨、模型注意力被无关信息稀释。正确的做法是按需检索动态注入——只把当前任务真正需要的记忆片段注入上下文。4.2 检索增强生成搭好知识外挂RAG检索增强生成是目前解决模型知识陈旧和胡说八道的主流方案本质就是在模型生成之前先从外部知识库检索相关内容拼进Prompt里让模型基于材料作答。RAG的架构设计看似简单——文档切片、向量化、存向量库、检索、拼Prompt——但实际做好非常考验细节。几个关键点切片策略。切得太碎每条片段缺乏上下文检索结果语义不完整切得太粗向量化时语义被稀释且注入上下文时占用Token过多。没有万能标准但一个可参考的做法是优先按语义边界标题、段落、列表切分单段控制在200-500字并保留段落标题和元数据检索时优先匹配标题再匹配正文。检索的召回与重排两段式。先用向量检索快速召回Top 50候选再用一个重排模型Reranker对候选精排选Top 5注入上下文。只做向量检索直接取Top 5经常出现看着相似其实不对题的尴尬。重排这一步虽然多花几百毫秒但对回答质量的提升非常明显。引用溯源。回答里涉及知识库内容时应该让模型标注信息来源如[1] 参见产品文档3.2节。这不仅提升可信度也方便用户在UI上点击验证。这个需求要在Prompt里明确要求并在评测阶段作为一项质量指标来检查。4.3 上下文窗口管理的实操技巧上下文窗口是AI应用中最稀缺的资源比GPU还贵。管理上下文的核心策略是分层压缩、动态取舍。我自己常用的方法指令固定放前面系统提示词和任务指令永远放在上下文最开始的位置因为模型对开头的关注度最高。对话历史做滚动窗口最近的N轮对话保原文更早的用摘要压缩后放置。知识注入做问题驱动只有用户当前问题相关的知识片段才注入无关内容一律不进上下文。输出要求固定放最后把输出格式约束放在Prompt末尾如请以JSON格式输出模型对结尾部分同样有较高关注度。这套前指令、中历史、后约束的布局是我在多个项目里反复验证过的最稳定排布方式。初版可以照抄这个框架再根据具体模型微调。5. 可观测性与评估传统运维经验如何迁移到AI应用5.1 AI应用的可观测性不只是看日志传统应用的可观测性集中在日志、指标、链路追踪三件套。但AI应用多了一个传统应用没有的维度质量可观测性。这里的质量不是指系统稳定性而是指模型输出的质量——回答是否准确、是否有幻觉、是否符合业务规范。这意味着AI应用的可观测性必须把系统和模型输出两个视角结合起来。我的做法是在常规技术监控之外额外建立三个追踪维度Prompt追踪记录了每个请求最终拼装出来的完整Prompt。这是排查模型为什么这么回答的第一手证据。轨迹追踪Agent每一步决策、工具调用、中间结果全量记录。相当于给AI应用装了一个黑匣子。反馈追踪用户对回答的点赞/点踩、人工纠偏记录。这是质量评估最真实的数据来源。这三类数据如果能关联起来检索排错效率会大幅提升。比如用户点了踩之后你能回看当时模型看到了什么上下文、调用了什么工具、输出了什么内容就能快速定位是检索没召回、Prompt引导不足还是工具数据有误。5.2 离线评估集上线之前的考试评估AI应用质量和评估传统应用有个本质区别——没有一个固定正确答案可以断言对错。所以必须建立一套离线评估机制用一批标注好期望行为的用例在每次改动后跑一遍看看输出是否符合预期。我实践中推荐三级评估体系断言评估检查输出是否包含关键字段、是否符合JSON格式、是否触发敏感词。这类可以用代码自动断言。模型评分用更强的模型或专门的裁判模型对输出按维度打分准确性、完整性、友好度等。成本可控适合批量跑。人工抽检每周抽一部分线上样本由人来评分校准自动评估的偏差。我踩过的一个坑是离线评估做得很好但一上线就出问题。原因是测试集和线上真实用户的输入分布差异很大——测试集都是标准问题线上全是稀奇古怪的问题。规避方法是从上线第一天就开始积累真实用户输入持续扩充评估集。5.3 灰度发布与回归测试AI应用改动的高频触发点是Prompt调整、模型版本切换、知识库更新。这些改动有一个共同风险改完不知道哪里会变差。我的建议是AI应用的发布必须走影子模式灰度——新配置和旧配置同时跑但新配置的结果只记录不展示跑一段时间对比两者质量分确认不劣化再放量。这个流程在传统工程里叫流量回放测试在AI应用里同样适用而且我认为是标配。很多团队上线新Prompt后感觉好像变聪明了结果发现用户投诉反而变多——因为模型变聪明了但偏离了用户预期。影子模式能在用户发现之前先通过评估数据告诉你答案。6. 图解方法论一张好的AI架构图应该怎么画6.1 图解在AI架构设计中的独特价值回到这个标题的后半部分——图解。为什么AI应用架构尤其需要图解因为AI应用涉及大量异步、多路径、不确定分支的控制流纯用文字描述要么冗长难懂要么遗漏关键细节。一张好的架构图能把十段文字说不清楚的东西一眼讲明白。但我观察到一个普遍问题很多团队画的架构图其实是部署拓扑图哪个服务部署在哪台机器不是应用架构图数据和控制流如何运转。这两者是有本质区别的。AI应用架构图的核心表达对象应该是三个流请求流用户请求从进入到返回的完整路径走过了哪些组件。控制流编排层如何根据中间结果决定下一步走哪个分支。数据流上下文如何被检索、注入、更新和持久化。画图的时候明确的画出这三个流架构图的实用价值会远高于只画方框连线的示意图。6.2 五类必画的AI架构视图我建议AI应用项目至少维护五类视图服务于不同角色和场景视图类型主要读者表达重点系统上下文图产品、非技术干系人用户与系统的边界、外部依赖分层架构图开发团队五个层次及层间接口序列图开发团队一次完整请求的时序流转状态机图编排开发Agent循环的各个状态与迁移条件部署视图运维团队服务部署、模型端点、基础设施依赖这里面我最想强调序列图的重要性。AI应用的一次请求往往要经过模型-工具-模型-工具的多轮流转序列图能精确表达每一步发生的先后顺序、耗时和消息内容。排查线上问题的时候我几乎都是从序列图开始定位的因为只有它能把走了哪条路完整呈现出来。6.3 画好AI架构图的七个原则基于我在多个项目中的画图经验整理出七个实用原则以组件职能而非技术实现为分层依据。不要画用了LangChain、用了FastAPI要画编排层负责任务拆解。画出失败路径。好的架构图一定要画出异常分支——超时、重试、降级、转人工。只画正常路径的架构图在故障排查时基本没用。区分模型决策点和代码决策点。图上用不同符号标出某一步是模型判断还是规则判断这直接影响排查思路。标注关键接口协议。层与层之间传的是JSON还是消息队列给出明确标注。控制单图复杂度。一张图超过9个组件读者就很容易迷失。复杂的系统拆成多张图每张聚焦一个维度。用颜色区分稳定与易变模块。接模型的部分控制不了输出质量是高风险区规则代码是稳定区。图上做区分评审时注意力自然放到风险区。图必须跟随代码更新。架构图一旦过期比没有图更误导人。建议将关键视图放在CI检查里重大变更时强制要求同步更新。6.4 一个图解示例AI客服系统的架构拆解用我实际做过的一个AI客服项目来演示这套方法论。背景一个电商平台的售前售后AI客服需要支持产品咨询、订单查询、退换货引导三种主任务并能在遇到复杂投诉时转人工。系统上下文图先画出边界用户从IM渠道进入系统对外依赖三个东西——大模型API、订单系统、商品知识库。中间是AI客服系统本体。分层架构图把系统分成五层接入层负责渠道适配与预处理编排层是一个意图路由加两个子Agent售前Agent、售后Agent模型层配置了三个模型档位记忆层用了Redis短期会话 向量库商品知识工具层封装了订单查询、退换货申请、人工客服转接三个工具。序列图把一次复杂请求画清楚用户问我7号买的手机能退吗接入层清洗输入并归类为售后意图售后Agent启动先从短期记忆读取用户会话判断订单语义调用订单查询工具获取订单详情工具返回订单已签收8天命中7天无理由已过期的规则分支Agent再向用户询问是否属于质量问题用户回复屏幕有裂纹Agent调用质量问题判断分支触发退换货申请工具最终返回已提交人工审核。这张序列图最重要的价值在于它清楚标出了哪一步是模型自由发挥回答用户咨询哪一步是规则强制7天无理由判断哪一步是工具确定的订单查询结果。出了问题顺着图就能定位责任模块。7. 从架构图到落地设计评审与技术债的取舍架构图画完之后还有一个经常被忽略的环节架构评审。AI应用的架构评审和传统架构评审侧重点不同。传统评审关心性能、可用性、扩展性AI应用评审要把错误行为作为一等公民来讨论——模型会在什么场景下输出什么错误系统如何承接。建议评审时问五个问题如果模型输出JSON格式错误当前系统会怎样如果用户问了一个完全不在知识库里的话题系统会怎样如果工具调用超时用户的体验是什么如果旗舰模型服务不可用降级方案的用户感知是什么如果连续三次回答都让用户不满意系统如何升级到人工这五个问题中任何一个答不上来都说明架构设计还有缺口。补齐这些缺口往往比堆更多高级特性更有价值。关于技术债我的建议是AI应用迭代速度快不要在早期过度设计。很多架构组件比如复杂的状态机、多Agent协作框架在业务验证之前很可能用不上。我的原则是——先把最重要的直筒式路径跑通再逐步加扩展。什么时候该加当线上数据证明某类问题高频出现时针对性地加而不是架构图预先画得无比完备。过早抽象是AI应用项目里最常见的返工原因之一。最后分享一个多年来的体会AI应用架构设计的终极目标不是做一个酷炫的智能系统而是做一个稳定、可控、可维护的软件系统。模型能力本身会持续进化但架构的工程价值会长期存在。把不确定的部分约束在可控边界内把所有可确定的部分做得足够扎实——这才是AI应用架构设计的真功夫。
返回列表