ARTICLE DETAIL

资讯详情

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

图解AI应用架构设计:从模型网关到RAG与Agent的落地实践

图解AI应用架构设计:从模型网关到RAG与Agent的落地实践 1. 内容整体设计与思路拆解1.1 AI应用不是调个API那么简单很多朋友第一次接触AI应用开发以为就是把大模型的接口封装一下前面套个Web页面就完事了。真正上手之后才发现Prompt写不好模型就乱答并发一高就超时用户多聊几轮上下文就爆掉更别提什么Agent、RAG、多模型切换这些进阶需求了。我做AI应用架构设计这几年最深的体会是AI应用本质上是一个概率系统的外壳工程。传统软件的逻辑是确定的——输入A输出B中间每一步都可预测、可调试。但AI应用不一样模型输出有随机性同一个Prompt可能每次答案都不同这就要求架构在设计时就得把不确定性当作第一公民来对待。整体架构里至少要考虑模型接入、上下文管理、检索增强、Agent编排、缓存降级、可观测性这六个维度缺哪个后面都会还债。所谓图解AI应用架构设计其实就是把上面这些复杂关系用分层、模块化的方式梳理清楚。我一直觉得架构不是画一张漂亮的图给别人看而是让团队里每个人都能指着图上任何一个节点说清楚它负责什么、依赖谁、挂了会怎样。这篇文章就把我这几年沉淀下来的一套通用AI应用架构串起来讲透。1.2 先画一张总图AI应用的四层结构我习惯把AI应用架构拆成四层来看这个分层方式已经帮很多团队快速对齐过认知层级职责典型组件接入层面向用户与外部系统负责交互与API暴露Web端、移动端、微信/企微/钉钉等渠道、API Gateway应用服务层承载业务逻辑、会话管理、Agent编排、工具调用业务后端、Agent Runtime、工作流引擎、消息队列模型服务层统一接入大模型做路由、重试、降级、缓存模型网关、多模型适配器、推理服务vLLM等基础设施层提供数据检索、向量存储、监控、可观测性能力向量数据库、对象存储、日志系统、指标监控接入层解决用户从哪里进来的问题应用服务层解决业务怎么编排的问题模型服务层解决模型怎么选、怎么调、怎么兜底的问题基础设施层解决数据与观测怎么支撑的问题。这里我想特别强调模型服务层。很多团队一开始图省事直接把所有模型调用散落在业务代码里结果模型供应商一升级、一调整全链路跟着遭殃。我建议不管项目多小都要在模型前面加一层网关哪怕只是一个几十行的封装模块。它带来的收益不是少写几行代码那么简单而是给了你一个统一的开关限流、熔断、重试、模型切换全在这层做业务代码完全不用动。1.3 为什么说图解是AI架构设计的关键能力不少同学对架构图有误解觉得就是把组件框框连几条线。AI应用架构图的难点在于它画的不只是数据怎么流更是责任怎么分。比如用户发来一句话它可能同时触发主对话流程、知识库检索流程、工具调用流程三者并行又有依赖关系。这种编排关系如果没有一张清晰的图靠脑子和口头沟通一定会在某个环节漏掉。画架构图我有个原则一张图只表达一个主题。系统全貌用一张分层图Agent编排单独画一张时序图数据流单独画一张流程图。不要试图把所有的东西塞进一张图里那样看起来很高大上实际压根没法用来指导开发。我常用Excalidraw画草图、用draw.io画正式图图不重要图里表达的逻辑才重要。2. 核心细节解析与实操要点2.1 模型接入层API调用、私有化部署与混合路由模型选型是架构设计避不开的第一个决策点。当前主流形式无非三种调用云端API如各厂商的开放平台接口优势是省心、迭代快、成本可控尤其有小模型做兜底时劣势是数据出域合规压力大、长链路下延迟不可控。私有化部署开源模型像Qwen系列、Llama系列、DeepSeek系列等用vLLM或SGLang做推理服务。优势是数据私有、可深度优化劣势是GPU成本高、运维复杂。混合路由核心业务走私有化长尾场景走API或者在API和本地之间做故障转移。我实测下来混合路由是当前性价比最高的方案。举个例子一个客服助手90%的常见问答用7B14B的小参数模型就够推理速度快、成本低遇到复杂推理、长文本写作用户才把请求路由到更大模型。只要网关层做好了路由规则用户根本感知不到背后换了模型。路由规则里我常用的字段包括用户会话的复杂度评分消息长度、是否包含附件、是否触发了工具调用、业务线标识、当前模型的响应时间与错误率。一个能跑的简化路由逻辑大致长这样def route_to_model(request): # 1. 业务线优先不同业务绑定不同默认模型 if request.biz_line chat: primary_model qwen-14b-local elif request.biz_line writing: primary_model deepseek-api-high # 2. 根据会话复杂度升级模型 if len(request.messages) 10 or request.need_tool_call: primary_model qwen-72b-local # 3. 故障转移主模型不可用时自动降级 if is_model_healthy(primary_model) is False: primary_model get_fallback_model(primary_model) return primary_model这个代码看着简单但解决的是真实痛点模型服务不稳定时自动降级到备用模型和直接报错的用户体验差别是巨大的。我曾经把一个备用模型从API切换到本地部署切换过程用户完全无感知这就是网关层的价值。2.2 上下文管理从塞满窗口到结构化组织上下文是AI应用架构里最容易被低估的一环。很多新手做一个聊天应用直接把历史消息全部拼进Prompt窗口爆了就开始报错。实际上上下文管理的核心不是装得下而是用得好。我先说一个最常用的上下文组织策略分三层系统提示词层放角色设定、能力边界、回答风格、安全规则。这一层基本不变只在会话开始时注入。业务数据层放当前对话相关的业务信息比如用户的订单记录、商品详情、检索回来的知识片段。这一层每次请求动态组装。历史对话层放之前的对话摘要和最近几轮的原始消息。这里有个关键点——能摘要就不要放原文能放近3轮就不要放近10轮。我自己项目里的处理方式是每两轮对话结束调用一次小模型把之前的对话压缩成结构化摘要存进会话记录里。下次请求时把摘要 最近两轮原始消息放进上下文。这样做的好处不仅是省Token更是让模型聚焦在最近的关键信息上避免被又长又杂的历史带偏。还要特别提一下Token计算。很多团队对Token没概念动不动就报上下文超限。记住一个大致换算1个汉字约等于1.52个Token中文场景下一个14B模型常见的8K上下文窗口实际能装下的有效中文内容大约是40005000字。如果你的业务需要处理长文档选模型时直接往32K或128K窗口看别在8K窗口上死磕。2.3 RAG检索增强让模型先查再答RAG检索增强生成现在几乎是企业级AI应用的标配了因为大模型的幻觉问题靠Prompt是治不了的必须靠外部知识库约束。RAG链路里效果好坏的关键不在模型而在数据进库之前。我用过很多开箱即用的RAG框架最后基本都回到自己控制Embedding和切分逻辑。切分文档是我强调最多的地方别用固定字数切要按语义边界切。最笨也最有效的方法是根据Markdown标题、段落、句子层级去切确保每个片段是一个相对完整的语义单元。固定500字硬切经常把一句话拆两半检索召回的质量会肉眼可见地下降。Embedding模型选择上中文场景我推荐优先考虑开源的BGE系列或商用的中文优化向量模型维度对齐到768以上。构建向量索引时一定要记得带上metadata来源文档、页码、更新时间、权限标识不然后续做权限过滤、结果溯源、增量更新全都寸步难行。RAG的架构里还要设计检索后处理环节。原始检索回来的top-K片段直接塞给模型是远远不够的我一般会做一个rerank重排把召回的候选片段按照和问题的相关度重新排序取前35个送进模型。别小看这个rerank步骤实测对答案准确率的提升在10%20%之间成本却只增加一次小模型的调用。2.4 Agent与工具调用架构上的复杂度分水岭一旦涉及Agent智能体和工具调用架构复杂度会指数级上升。Agent的本质是让模型来决定下一步做什么——查数据库、调接口、发通知这些动作不再是写死的代码流程而是模型在运行时动态选择的。Agent架构设计里我吃过最大的亏是没有做任务沙箱。早期做Agent让模型直接调用生产环境的接口结果模型误解了用户意图调了一个不该调的接口虽然没出大事故但那次之后我所有的工具调用都加了一层审批/确认机制。凡是涉及写操作、发消息、扣费的工具一律先返回一个待确认的action给前端用户点了确认再真正执行。这个设计看起来多了一步交互但在真实场景里能帮你挡掉90%的模型自作主张事故。多Agent协作是另一个热点很多团队一上来就想做复杂的多智能体编排。我真心建议初期不要做多Agent把单Agent的工具调用、规划能力做扎实已经足够解决大部分业务。如果确实需要多Agent也先在架构上分成主控Agent 专用子Agent两层主控负责任务拆解和结果汇总子Agent只处理特定领域任务。跨Agent通信用结构化消息JSON而不是自然语言文本否则你会在Agent之间的对话里迷失根本没法调试。3. 实操过程从零搭建一套可落地的AI应用架构3.1 第一步需求拆解与架构规划我在动手写代码之前一定会先做一件事把业务需求翻译成架构需求。这个过程可以套用下面的检查清单用户问题属于开放问答还是限定知识范围问答决定要不要RAG。是否需要调用外部系统查库存、下订单、发邮件决定要不要Agent。核心体验是快秒回还是准慢工出细活决定模型选型和缓存策略。数据是否涉密、能否出域决定API还是私有化部署。预期并发是多少决定网关、队列、实例数怎么设计。一个典型的中小型AI应用我给出的起步架构是前端接入层 一个业务后端负责会话和编排 一个模型网关封装所有模型调用 一个向量库支撑RAG再加一套Redis缓存会话状态和检索结果。这套组合用一台8核16G的服务器加一台带GPU的推理机就能跑起来成本可控、迭代灵活。3.2 第二步搭建模型网关模型网关是整个架构的心脏我先说它的最小可用版本需要哪些能力统一接口不管背后是OpenAI格式的接口、开源模型的接口还是自建推理服务的接口对外全部统一成一个格式。我推荐以OpenAI的Chat Completion格式为基准因为目前开源社区的工具链对它的兼容性最好。网关内部做协议转换业务方永远不用关心背后接的是哪家模型。超时与重试模型调用是最不稳定的环节。没有网关时业务代码里到处是超时配置改一处漏十处。我把超时分为连接超时默认5秒和读取超时默认60秒针对长输出重试策略用指数退避第一次失败等1秒第二次等2秒第三次等4秒最多重试3次。要特别注意重试只适用于幂等请求比如纯问答场景涉及写操作的Agent调用绝不能自动重试否则可能重复下单、重复扣费。限流与熔断给每个业务线、每个模型分配不同的QPS上限。当某一模型供应商的接口错误率连续30秒超过20%网关自动熔断后续请求直接走备用模型。这个阈值是我踩出来的经验值——低于20%容易误熔断高于30%错误已经影响用户体验了。3.3 第三步设计会话状态与记忆管理会话状态是AI应用区别于普通接口的一个核心挑战。传统接口是无状态的每次请求独立AI应用则必须记住用户刚才说了什么、做到哪一步了、上下文摘要是什么。我最常用的会话存储方案是Redis以conversation_id为key存储以下内容{ user_id: u_12345, session_start_time: 2024-06-01T10:00:00Z, summary: 用户想了解如何配置API网关已完成基础概念介绍正在等待用户提供具体场景, recent_messages: [ {role: user, content: 我遇到了超时问题, time: 2024-06-01T10:05:00Z}, {role: assistant, content: 可以描述一下你的超时设置吗, time: 2024-06-01T10:05:10Z} ], state: { current_step: awaiting_timeout_detail, collected_params: {biz_line: pay} } }Redis存储的过期时间我一般设置为30分钟到24小时视业务而定。超出过期时间的会话用户重新发起时就开一个新会话。这个会话过期策略一定要和产品经理提前对齐因为很多用户会觉得我中午聊的下午回来怎么不记得了本质上是过期策略太激进。另外提一个容易被忽略的点会话状态里要存状态机字段。比如一个多轮表单收集场景模型需要知道当前收集到第几项了。如果不存state单纯靠历史消息推断模型经常会失忆。我在架构里会为有明确流程的业务单独维护一张流程状态表比让模型自己从历史里猜靠谱得多。3.4 第四步落地RAG检索链路我在2.3节讲了RAG的原理这里给出一个具体的检索链路实现。整个链路分两段文档入库阶段和在线检索阶段。入库阶段流程文档上传 - 格式解析PDF/Word/MD- 清洗去页眉页脚、去敏感信息- 语义切分 - 生成向量 - 写入向量库同时把原始文本和metadata存到对象存储或数据库。这个阶段是离线的可以用异步任务慢慢跑但切分和Embedding的参数一定要经过小批量测试验证后再全量执行否则返工成本很高。在线检索阶段流程用户提问 - 生成问题向量 - 向量库召回top-20候选 - rerank重排取top-4 - 拼装上下文 - 送入模型。整个检索链路的目标延迟控制在500ms以内其中向量检索本身通常只要几十毫秒大头在rerank和网络传输上。关于向量数据库选型我按规模给自己分了三个档位百万级向量以下用开源的轻量方案如Chroma、LanceDB足够部署在应用侧省心千万级向量用Milvus或Qdrant支持分布式适合正式开始投入运维成本如果真的到了上亿级的海量搜索场景再考虑专门的商业化向量检索服务。多数AI应用的起步阶段都在第一档别一上来就上重型集群先跑通业务再说。3.5 第五步并发处理与性能优化AI应用最让人头疼的并发问题是模型推理带来的长耗时。一个普通接口请求要几十毫秒而一次模型调用短则1秒、长则几十秒。这决定了AI应用架构必须拥抱异步。我用得最多的方式是同步接口 SSE流式返回用户提问后的第一次响应要快不用等模型全部生成完而是通过SSEServer-Sent Events把模型输出的token逐段推给前端用户看到打字机效果体感延迟能降低一个量级。异步任务处理像文档解析、批量生成、Agent长链任务等一律进消息队列如Celery Redis或RabbitMQ后台Worker处理完后通过Webhook或轮询通知前端。缓存命中缓存比调任何模型都快。同一问题是否命中缓存我用的是一级语义缓存把用户输入向量化在缓存里找相似度大于0.95的旧结果直接返回。实测常见客服场景的缓存命中率能到20%30%这部分请求的响应时间直接从2秒降到100毫秒以内。模型侧的性能优化还有一个参数值得重点关注max_tokens。很多开发新手不理解输出长度对响应时间的影响实际上模型生成是逐token的max_tokens设得越大最坏情况下的响应时间就越长。如果是短问答场景果断把max_tokens压到512甚至256只有写文章、写代码这种长输出场景才放开到2048以上。每个业务线配不同的max_tokens这算是我总结的最简单、最有效的性能优化手段之一。4. 常见问题与排查技巧实录4.1 模型回答变慢了应该从哪里查起AI应用变慢80%的情况不是模型变慢了而是链路里某处悄悄出了问题。我的排查顺序是固定的先看网关日志模型的响应时间分布有没有异常有没有超时重试如果网关返回时间正常问题就不在模型侧。再看网络尤其API调用场景DNS解析和TLS握手时间经常被忽略。我遇到过一次诡异的问题某地区的用户访问特别慢最后定位是机房出口链路拥塞。模型服务加了一个就近接入点后解决。查上下文体积用户聊着聊着变慢大概率是历史消息越积越多每次请求要处理的Token数越来越大。这个看请求日志里的prompt_tokens字段就能确认。解决方案就是我在2.2节说的摘要压缩策略。最后才怀疑模型本身模型服务端偶发变慢一般表现为响应时间的P99突然升高。此时看模型供应商的状态页或者自己推理服务的队列长度。队列积压说明推理实例不够了扩容或者将部分流量切到备用模型。这一套排查逻辑我写成了一张流程图贴在团队文档里新同学遇到慢了的问题不会慌照着顺序查基本都能定位。4.2 上下文窗口不够怎么破上下文爆掉的场景很典型用户上传了一份几十页的文档要模型基于全文回答问题。8K窗口根本装不下。这时候我建议按下面三个层级去处理第一层检索替代全量。不是用户传了文档就必须全文进Prompt。先做切分和向量化每次只检索相关片段进Prompt。这本质上就是RAG也是最推荐的方案。第二层滑动窗口 摘要。非要全文进Prompt的场景比如让模型做全文总结用滑窗把文档分块多次送入模型每次生成局部摘要最后把摘要汇总再生成总摘要。注意这里不能用RAG因为全文总结的相关片段其实是全文本身。第三层选择长窗口模型。现在128K甚至200K窗口的模型已经不难获取特别适合需要处理完整长文档的场景。但长窗口不等于能充分利用实测模型对长上下文中间位置的注意力会衰减业界叫lost in the middle现象所以关键信息尽量放在Prompt的开头或结尾。我在项目里专门封装了一个prompt_template库针对不同任务类型配置不同的上下文组装策略。比如摘要类任务就把全文尽量放后面问答类任务就把检索片段放前面。这些细节对最终效果的影响往往比换个大模型还明显。4.3 检索质量差、AI满嘴跑火车怎么治幻觉问题排查我先看检索链路。很多幻觉案例的根因不是模型爱编而是检索回来的内容压根和问题无关模型被错误知识误导还一本正经地编圆。这时检查三件事查询改写用户问它多少钱系统知道它指什么吗我增加了一步查询改写——先让一个小模型把用户的问题结合历史对话改写成一个完整的、语义明确的独立查询再去做向量检索。这一小步对检索准确率提升很明显。召回阈值向量检索给每个结果都带相似度分数。如果top结果的分值普遍低于0.7具体阈值跟Embedding模型有关需要实测校准说明知识库里可能根本没有答案这时候宁可让模型直接说我不清楚也不要硬答。Rerank逻辑我见过不止一个团队跳过了rerank环节。这一步在知识库场景的效果立竿见影建议加上。还有一个容易被忽视的问题知识库的时效性。用户问最近有什么优惠活动文档库里的内容还是三个月前的检索结果再准也是过时的。RAG架构一定要做数据更新链路定期检测文档变更并重新切分、重新向量化同时把更新时间写入metadata。用户问时效性问题时系统要能识别知识库信息可能不是最新的主动提示而不是假装什么都知道。4.4 多Agent场景下任务悬空和循环空转做Agent架构时我踩过最深的坑就是Agent进入死循环模型反复生成工具调用工具返回结果模型再生成调用……A调用B、B又调A互相等谁也不产出最终答案。这类问题排查起来特别痛苦因为每次调用都是正常的但整体就是不结束。我在架构里做了三层防护实测有效最大步数限制单条Agent链路的工具调用次数上限设为58次超过直接终止并提示用户这个问题我暂时处理不了已经转人工。别觉得这个限制粗暴真实场景里正常任务34次工具调用基本完事走到6次以上大概率是模型在兜圈子。步骤间超时每一步Agent推理单独计时超过阈值就终止整个链路。这个计时不是给模型调用用的而是给模型在思考但没有任何输出和动作的情况用的。全局状态监控把Agent每一步的意图 工具 结果结构化记录到日志。出问题时不是看模型生成了什么文本而是看它的决策轨迹——哪一步开始偏离的、哪一步开始重复的一眼就能看出来。另外多Agent协作中任务悬空也很常见主控Agent把一个任务分配给子Agent子Agent做完返回结果后主控Agent因为上下文管理不当忘记了之前分配任务的初衷做出错误的汇总。解决方案是主控Agent维护一张任务清单JSON结构每个子任务的状态待执行/执行中/已完成/结果摘要都写在这张清单里每次汇总时以清单为准而不是依赖模型去历史消息里回忆。这就像带了一个记事本比让模型靠脑记靠谱得多。4.5 可观测性黑盒必须有仪表盘最后专门聊一下AI应用的可观测性。传统应用只要记录报错日志就差不多了AI应用不行因为它的输出没有唯一的正确值你必须知道模型为什么这么答否则出了问题根本没法复盘。我的AI应用日志方案包含四类信息请求级指标每次请求的耗时、Token消耗、模型名、是否命中缓存、是否触发重试、是否走备用模型。质量评估指标引用率回答里是否引用了检索片段、拒绝率模型说不知道的比例、用户反馈按钮的点击数据。这些指标直接反馈业务健康度。成本指标按业务线、按模型维度的Token消耗和金额统计。AI应用的成本不是小数目上个月最夸张的一天光Token费就烧掉两千多没有成本看板根本发现不了是哪个业务线在吃钱。Trace从用户请求进来到最终返回完整链路追踪。选择开源方案时我建议优先考虑兼容OpenTelemetry的它是目前生态最通用的可观测性标准后面接监控、告警、链路分析都方便。刚开始做可观测性时也别贪多我会先保证每个请求有trace、每笔成本有统计、每个回答不满意有上下文回放这三件事覆盖了AI应用最核心的调试和优化诉求。然后再逐步加上更精细的告警比如某业务线错误率突增、Token成本日环比超过20%、模型调用超时率超过5%统统自动告警别等用户来投诉才发现出事了。5. 一点个人的架构心得与扩展方向前面几节把架构的各个模块拆开讲了一遍最后想聊聊我在不同项目里总结的几条心得就当是给准备上手的同学打个预防针。第一句话先跑通再优化最后才谈规模。我带过的团队里最容易犯的错是一开始就追求完美架构——分布式、微服务、多Agent编排全上结果连最基础的用户问答都还没稳定跑通。AI应用的技术栈已经很复杂了架构应该跟着业务成长而不是业务还没起来架构先撑爆了团队。第二句话模型能力会持续升级架构要为换模型留好接口。我三年前用的模型和现在的主流模型完全不是一个量级但当时的架构设计只要把模型网关层的适配做好升级模型就是一个配置项的事。反观那些把模型调用散落到业务代码里的项目每次模型升级都是一次重构。把模型当成一个可替换的组件来设计这个思想比任何具体技术都值钱。第三句话AI应用架构的价值一半在脑子里一半在图纸上。我见过很多团队架构能力不差但整个系统的设计只存在于技术负责人的脑子里其他人全靠问。后来我要求每个项目必须有一份一页纸架构图组件职责说明新同学入职第一天先看这个沟通效率提升非常多。最后说一个我最近在探索的方向把AI应用的架构进一步配置化。现在很多通用的能力——模型路由、上下文管理、RAG链路、Agent基础框架——已经可以沉淀成一套可复用的配置模板。新项目进来不需要再从头搭一套架构而是根据业务特点选择模块、填写配置、调整Prompt模板。这个方向如果做成AI应用开发的门槛会进一步降低团队可以把精力集中在业务价值本身而不是反复造架构的轮子。如果你也在做AI应用架构欢迎从这篇文章里挑一两个模块先落地试试跑出问题随时回来对照排查。
返回列表