ARTICLE DETAIL

资讯详情

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

AI应用架构设计图解:从模型接入到生产落地的完整指南

AI应用架构设计图解:从模型接入到生产落地的完整指南 这几年做AI应用落地我见过太多团队把大模型接进来却依然跑不起来的情况。模型调用通了问答听起来也没问题一旦面对真实用户延迟、成本、上下文混乱、工具调度失控、安全边界缺失全都浮出来。问题几乎都出在同一个地方整个系统没有架构可言只有一层直连大模型的胶水代码。所谓“AI应用架构设计”不是画一张漂亮的拓扑图而是把交互层、编排层、模型接入层、数据记忆层、可观测性这堆东西用清晰的边界和链路组织起来让每个环节都有扩展点每个失败都有兜底。这篇文章我准备用图解的方式把自己在多个AI项目中沉淀下来的拆解思路、参考架构、落地步骤和踩坑记录整个过一遍适合后端开发者、全栈工程师、以及正在把AI原型推向生产的架构师参考。1. 先把话说在前面AI应用架构到底在解什么题1.1 不是所有“接个大模型”都叫架构设计很多团队的第一步是申请一个模型API然后把用户的输入直接拼到系统提示词里调用接口把结果返给前端。这个流程在Demo阶段没有任何问题因为它要验证的是“模型能不能解决我的业务问题”。一旦上生产你会发现真正需要设计的不是模型本身而是模型旁边那一圈东西。举个例子。你做一个企业内部知识库问答助手输入端可能是Web聊天框也可能是IM机器人中间要处理权限普通员工只能检索公开文档管理层能看战略材料问答过程可能要调用内部HR系统查请假余额再调用日历系统帮你直接发起一个会议邀请最后还得把整个交互过程中用了哪些提示词模板、哪些检索片段、哪些工具调用记录全都留存下来供质量复盘用。这些需求没有哪一个是“调一次大模型”能完成的。所以架构设计要解的第一个题是把大模型从“全知全能的回答器”降级成“一个可被编排的推理组件”。它负责语言理解、逻辑推理、内容生成但业务状态、工具调用、数据权限、流程控制都应该由外部系统接管。这句话听起来简单实际影响很大它会决定你后续的扩展模型、替换模型、增加Agent能力时是改一个模块还是推翻重来。1.2 一张图先建立整体观我们常说的AI应用架构从纵向看大致可以分成五层。--------------------------- | 客户端与产品层 | | Web / 小程序 / App / IM | -------------------------- | -------------v------------- | 应用服务层 | | 业务逻辑 / 会话 / 权限 / 路由| -------------------------- | -------------v------------- | 编排与Agent层 | | 提示词 / 上下文 / 工具调用 | -------------------------- | -------------v------------- | 模型接入层 | | LLM API / 私有化模型 / 多模型| -------------------------- | -------------v------------- | 基础设施层 | | 向量库 / 缓存 / 对象存储 | | 网关 / 可观测性 / 安全 | ---------------------------横向看一条完整的业务请求链路会把这几层串起来用户消息先进应用服务层做权限校验、会话识别、敏感信息过滤然后到编排层由编排器决定这个问题是否需要检索、需要调用哪些工具、用哪份提示词模板接着再把组织好的上下文交给模型接入层模型返回结果后编排层可能还要执行后续动作比如解析结构化输出、调用外部系统、再让模型做一次总结最后才把响应返回到产品层。分层的好处在于每一层只干一件事并且可以被单独替换。模型接入层从GPT换成国产开源模型不影响上面三层的逻辑编排层从提示词拼接演进到复杂Agent循环也不需要动客户端协议基础设施层的缓存和向量库决定性能但它不应该跟业务代码耦合在一起。这个整体观是我每次开始新项目时即使代码还没写也会先在文档里搭起来的骨架。有了它后面每一步才知道自己动的是哪一层。2. 图解AI应用的核心模块拆解2.1 模型接入层API、私有化还是混合模型接入层是整个架构里最受关注、也最容易引发争论的一层。它要解决三个问题模型从哪来、如何统一接入、如何做多模型路由。在选择模型来源时我一般会让团队先盘一下自己的约束条件不搞拍脑袋。API方式优势是省心——免运维、延迟稳定、模型升级立即生效适合快速验证和大多数SaaS类业务但它引入两个隐形约束一是数据要出外网敏感业务必须先过脱敏和合规评审二是单次调用成本会随用量线性上涨。私有化部署适合高隐私、强合规场景以及希望把单位推理成本压下来的中大规模调用但GPU资源调度、模型量化、高并发推理排队都是需要团队持续投入的事。混合接入是目前比较务实的选择通用对话走外部API涉及核心数据或敏感行业的推理走内网私有化模型再在接入层做透明路由。不管选哪条路径我都建议在模型接入层定义一个统一接口而不是让业务代码直接依赖某个SDK。这个接口至少包含这些语义模型名或模型版本标识输入消息列表角色、内容系统提示词或指令前缀采样参数温度、top_p、最大输出长度等结构化输出要求JSON Schema或函数定义超时、重试、失败回调定义统一接口的核心价值是在后面接多模型时不用改业务代码。我在一个项目里做过替换对外用的模型A内部复盘和夜间批量任务用的是更便宜的开源模型B两套模型在接入层只通过一个配置项切换上面所有应用层完全无感。这个设计投入不大但后期带来的灵活度非常高。2.2 应用编排层Prompt、上下文和链路控制应用编排层是AI应用架构里最剧变的一层因为早期“拼Prompt”的思路已经越来越不够用。现在主流的设计思路可以分成三种模式。单次调用模式适合任务边界清晰的场景比如内容分类、情感分析、标题生成。这个模式下编排层只需要负责把系统提示词、用户输入、少量业务参数组装好然后调用一次模型拿到结果返回。简单可靠但无法处理需要多步推理的任务。链式调用模式把你的业务流程拆成一串子任务每个子任务调用一次模型前一个输出作为后一个输入。典型场景是智能写作助手先让模型根据用户意图生成大纲再按大纲分段扩写最后再让模型做整体润色。链式模式的优点是可观测、每步可控缺点是总延迟是每一步延迟的累加而且一旦某一步输出质量不好后面的步骤都会受影响。Agent循环模式是目前最热门的架构思路它让模型不是“回答一次就结束”而是进入一个循环理解用户意图 - 决定要不要调用工具 - 执行工具 - 把工具结果带回来 - 继续推理直到满足结束条件。这个模式的威力在于模型可以自己规划怎么完成任务而不是每一步都由研发人员写死。真实项目的复杂性在于多数场景不是单一模式。我的建议是把编排层拆成两个子组件一个是任务解析器负责判断当前输入适合单次调用、链式还是Agent循环另一个是执行引擎负责真正跑对应流程。任务解析器本身也可以是一个轻量模型调用用低温度参数保证分类稳定性这样既保留了Agent的灵活性又不会让所有请求都陷入不可控的自由发挥。上下文管理是编排层最容易崩的地方。很多人以为把历史消息全都塞给模型就完事了实际上一旦对话轮数变多上下文窗口被占满模型会开始“遗忘”关键指令输出质量快速恶化。实践中我会做三层上下文控制长期记忆用户的基本信息和业务偏好存数据库关键节点注入短期记忆最近N轮对话摘要可以用单独的模型把历史消息压缩成结构化摘要工作记忆当前任务正在使用的检索片段、工具返回结果、中间推理过程这是模型真正需要“看到”的内容这三层分开管理之后模型每次调用看到的信息总量会显著下降质量反而提升。上下文不是越多越好而是越精准越好。这个认知几乎是所有AI应用从Demo走向生产的分水岭。2.3 能力扩展层Function Calling、Agent与工具模型如果只能输出文本它能解决的业务问题很有限。现代AI应用架构里能力扩展层承担的是把模型跟真实世界连接起来让它可以查数据库、发消息、操作业务系统。Function Calling是目前最成熟的机制你在请求里声明一组函数定义描述函数名、参数、用途模型通过推理决定要调哪个函数并输出结构化的参数。你收到这个返回后可以不直接执行而是先校验参数合法性、做权限检查再实际调用业务系统。注意模型不具备真实执行能力它只是“建议”调用哪个函数真正的执行权必须掌握在应用层手里。这个原则能避免一堆安全问题比如模型在参数里填入越权范围如果你直接透传就出事了。Agent的兴起让能力扩展层面变得复杂。当模型进入自主循环它可能会连续调用多个工具检索文档、查询库存、对比价格、生成订单。这时候整个扩展层要具备工具注册、工具发现、工具执行状态管理、以及工具间依赖处理的能力。工具注册机制通常会维护一种“工具描述文件”里面包含工具名称、说明、OpenAPI风格的入参出参定义、调用地址、鉴权方式和重试策略。模型推理时其实读的是这些描述文本所以工具描述写得好不好直接决定模型能不能正确使用工具。我见过很多团队在这个环节翻车工具描述含糊只写“获取用户信息”模型根本不知道需要传什么参数改成“根据用户手机号查询用户基础信息手机号为11位数字必须存在且匹配当前登录用户”之后调用准确率立刻上了一个台阶。最近比较热的一个方向是行业里开始制定标准化工具协议比如OpenAPI直接转工具定义、MCP协议把外部能力统一挂进来。图里画的能力扩展层不再是一堆散落的函数而是一个统一的工具网关。这个网关做三类事情给每个工具分配唯一标识管理可见范围对入参做校验和脱敏对执行结果做格式化和限流。跟模型相关的逻辑只发生在描述文件和工具调用结果回填上其余都收敛到网关侧。2.4 数据与记忆层向量库、缓存与状态很多AI应用需要处理私有知识库、历史会话、业务状态这部分是我说的数据与记忆层。最常被误解的是向量数据库的定位。很多人以为只要接了一个向量库就解决了知识库问题。实际上RAG链路里数据侧要处理的事情远比“多存几个向量”复杂。第一文档入库前要做解析PDF、Word、扫描件格式不一表格和图片还要单独走OCR和多模态处理第二文档要切分切分策略直接影响检索质量太小则语义不完整太大则噪声多按标题层级和段落语义切分通常比按固定字符数切分好用第三每条切片要生成多个版本的向量以适应不同问法第四入库后还要做去重、权限标记和版本更新旧版本不能继续参与检索。我来用一个实际切分配置举例。一份企业制度文档我先按目录拆成章节再按段落和列表项拆分对于超过3000字的长章节允许单条切片上限800字符左右重叠100到200字符这样既能保住语义边界又能覆盖跨段落提问。嵌入模型选择上如果主要检索中文内容我会用中文效果好的嵌入模型向量维度视模型而定常见范围在768到1536之间。向量库只是数据层的一部分不是全部。业务状态和会话状态更适合放在传统SQL或Redis里因为它们是强一致、高可靠的事实型数据比如订单金额、参数表不该去走向量召回。RAG擅长的场景是语义检索而不是精确计算。你把订单号存进向量库再问“订单A1234金额多少”纯属绕远路正确设计应该是先让模型识别出意图是查订单通过Function Calling去订单系统精确查询再把查询结果拼进上下文中去生成回答。缓存是比较容易被忽略的架构组件。同一个问题如果答案不依赖当前用户上下文完全可以用语义缓存把用户输入做一次向量化如果和近几天的历史问题相似度超过阈值直接返回缓存答案。这样既能大幅降低模型调用成本也能显著优化响应延迟。我在一个高频客服系统里这么做过缓存命中率一度到30%以上线上成本大概省了四分之一。2.5 可观测性与安全生产环境的地基AI应用有个和传统应用很不一样的地方模型输出是不确定的同一个提示词在不同时间可能给出不同答案用户会拿错误结果来质问。如果你没有完整的调用记录排查起来会非常痛苦。可观测性在AI架构里至少要覆盖四个维度。第一请求链路追踪一条用户消息经历了哪些步骤、调了几次模型、调了什么工具每一步耗时多少第二Token消耗统计按用户、按会话、按功能模块汇总这是成本分析的原始数据第三输入输出留存尤其是生产环境里用户到底问了什么、模型答了什么这个数据是后续做评测集和提示词调优的基础第四质量监控自动或半自动去评估模型输出是否合规、是否偏离主题。安全方面输入侧要做两层过滤第一层是规则过滤拦截明显异常内容第二层可以用一个轻量分类模型把输入按安全等级打标高风险内容直接不走主链路或者走人工审核通道。输出侧同样要过滤防止模型被诱导生成违规内容。此外系统提示词和工具描述要避免被用户输入覆盖常见的做法是用系统级指令约束并且在上下文组装时把用户输入和系统指令分区做严格的角色隔离。最后是权限鉴权模型调用的工具必须继承当前登录用户的权限不能因为模型有工具描述就把它当成超级管理员对待。3. 一张可落地的参考架构图以及关键链路说明前面讲的是模块这里我把它们拼成一张完整参考架构图。这张图不是摆设我会在后面说明一条真实请求是怎么跑通它的。----------------------------- ------------------------- | 客户端 / 产品层 | | 管理侧 | | Web / App / IM / 小程序 | | 运营监控 / 评测标注 | ---------------------------- ------------------------ | | -------------v-------------------------------------------- | 入口网关(统一鉴权/限流/安全过滤) | ----------------------------------------------------------- | -------------v-------------------------------------------- | 应用服务层 | | 会话管理 | 用户权限 | 意图分流 | 业务API | ----------------------------------------------------------- | -------------v-------------------------------------------- | 编排与Agent层 | | 任务解析 | 上下文管理 | 工具调度 | 反馈与重试 | ----------------------------------------------------------- | | | v v v ------------- ----------------- ---------------- | Prompt管理 | | 工具网关 | | RAG检索服务 | | 模板/版本化 | | Function/API/ | | 向量检索/重排 | ------------- | MCP能力接入 | ---------------- ----------------- | | | v v v ----------------------------------------------------------- | 模型接入层 | | 统一模型网关( API / 私有化 / 多模型路由 / 降级) | ----------------------------------------------------------- | -------------v-------------------------------------------- | 基础设施层 | | 向量数据库 | 关系数据库 | 缓存(Cache) | 对象存储 | | 可观测性 | 日志检索 | 调用链追踪 | 成本分析 | -----------------------------------------------------------这条图里最上层的客户端只是外壳真正的决策链路大多从应用服务层开始。拉一条具体请求来看。用户在Web端问“帮我查一下张三这个月还剩几天年假。”请求先进入口网关完成登录鉴权、基础限流、敏感输入过滤。应用服务层拿到请求后会先判断当前用户在组织架构里的身份发现他只能查自己的年假于是给编排层注入一个约束只允许查询当前用户自己的数据。编排层的任务解析器判断这个问题需要两步完成先调用休假系统的查询函数再让模型基于返回结果组织回答。于是执行引擎开始循环第一轮调用模型模型输出一个Function Calling请求参数是当前用户ID和月份范围工具网关收到请求后先按工具入参Schema校验再执行真正的查询把返回结果回填给编排层第二轮编排层把“张三本月剩余年假5天”拼进上下文再次调用模型模型输出最终回答。回答经过输出过滤由应用服务层组装成客户端需要的格式最后展示给用户。整个过程还有一个并行动作是记录可观测性数据两轮模型调用的Token数、工具执行耗时、完整输入输出、命中缓存还是走了模型统一写入日志系统。如果用户觉得回答不准你要复现时直接按会话ID拉出这条链路的所有记录。这张架构图相比“直接调API”的写法多出来的这些层不是复杂度而是控制点。每一步都有关卡每一步都可观测每一步都有回退方案。这就是架构设计的本质。4. 从图到落地最小可用架构的实操拆解4.1 先定义边界再画图拿到一个AI项目需求时我不会立刻去选型大模型而是先跟业务方一起把边界定清楚。一般我会问四个问题用户是谁输入是什么形式文本、语音、图片输出是什么形式这个场景是一次性问答还是多轮对话要不要调用外部系统要调用哪些能不能接受最多多长的响应时间成本有没有硬上限以“企业智能客服”为例输入是文本或语音转写输出是文本大部分场景多轮对话要调用订单系统、退款系统响应时间要求首字不超过2秒单次回答成本上限几分钱。这几个问题回答完整个架构的轮廓基本就定出来了。接下来才是画架构图。画图的时候不要一上来就考虑微服务、K8s先用前面那张参考架构图当底稿一层一层问自己这一层在当前场景里要不要单独存在多数时候早期项目可以把编排层和应用服务层合并成一坨代码把模型接入层做成一个函数基础设施只保留一个向量库和日志表。架构的分层思维要保留物理部署可以先用单体。4.2 技术栈选择和关键参数技术栈这块我给出的是目前行业实践里比较稳的组合你可以根据团队情况调整。模型选择上如果一个团队没有专门的推理优化团队我建议优先走成熟API不要自己部署大模型。API的好处是开箱即用RLHF对齐做得好输出稳定性高。开源模型适合数据敏感或成本敏感的团队但要能接受性能调优和运维的投入。不要只看榜单分数落地时要测你场景里的真实数据反复测200条以上再做决定。编排框架方面团队熟悉Python就考虑LangChain生态但我们自己内部现在会刻意把框架承担的责任控制在“标准化调用”这个层面框架负责工具调用、上下文包装、重试机制复杂的业务状态流转自己写。最近行业里也很流行Graph方式的工作流编排这个适合任务链路复杂、并行分支多的场景。小团队或产品型团队也可以直接上一个开源的应用平台来缩短开发周期但对底层细节的掌控会弱一些。性能相关的关键参数我的默认值是温度分类和抽取任务用0到0.2生成和创意类用0.7左右top_p一般跟温度配合不单独调保持0.9到1max_tokens按任务类型控制生成类给足分类类给短上下文上限设一个低于模型硬上限的软上限比如模型支持32K我会控制在线请求不超过16K留一半空间给工具结果和检索片段超时与重试单次模型调用超时设置30秒重试2次重试间隔递增这些参数不是拍脑袋定的而是经过真实压测后调出来的。注意一点温度调高不意味着“更聪明”它只表示采样时更多样化、更随机。想让它遵守你的输出格式温度越低越稳。4.3 从零到一的最小闭环示例这里用“企业知识库问答助手”做一个最小闭环。第一步建一个FastAPI应用暴露一个/chat接口这个接口做三件事接收用户消息、调用后端的问答函数、返回回答。这个阶段不用考虑权限不用考虑多租户只要链路通。第二步用向量库存知识库。做一个文档导入脚本把公司的操作手册、FAQ、产品文档解析后切分逐块生成向量并写入向量数据库。切分和嵌入的具体参数按前面说的方法设。第三步写RAG查询函数。用户问问题时先用同款嵌入模型把问题向量化到向量库检索TopK个相关片段TopK默认设8检索回来之后过滤掉相关度太低的片段剩下的拼进上下文。第四步组装Prompt。系统提示词里写清楚你是企业助手、只能基于给定的资料回答、不知道就说不确定。然后把检索片段放在用户问题之前用明确的标记区分“资料区”和“用户问题区”。第五步加输出约束。让模型输出JSON里面包含回答内容、引用资料编号、置信度。这一步可以用结构化输出的方法也可以让模型在回答末尾附上结论依据。第六步接入工具调用。当用户问“我之前提交的工单处理到哪一步了”时让模型识别出意图调用工单查询函数函数返回结果后再生成回答。工具函数本身先写死返回测试数据后面再接入真实系统。第七步加日志。把每一次用户输入、检索到的片段、拼出来的Prompt、模型输出、耗时、Token用量全量记录下来。没有日志之前你很难知道Prompt哪一步写错了有了日志你就能对着实际数据做优化。当这个最小闭环跑通之后你再去补生产化的能力缓存、降级、权限、自动化评测。这样做的顺序保证你每一步的复杂度都是因为真实需求而引入的不是为了架构而架构。4.4 生产环境专属注意事项从小闭环到生产环境有几个容易忽略的细节最值得记住。第一模型调用不能当同步阻塞接口写死。你要在生产代码里加熔断和降级模型服务返回超时或错误时可以先返回友好兜底话术而不是让用户看到一片空白的异常页。某些场景里次级模型降级比如主模型失败后用更小的模型先顶上也比完全不可用强。第二Token成本必须按“业务路径”来做预算。有的场景一次回答可能要调用3次以上模型每次都是几千Token叠加检索、工具返回单次成本会是纯问答的好几倍。前期要画一个成本表格按用户量、平均调用轮数、平均Token数去估算月度成本。第三缓存不是简单加一层Redis就行。缓存键要考虑用户权限否则A用户通过缓存拿到了B用户专属的知识库回答。语义缓存命中时要重新检查权限标记因为底层数据可能已经变更。第四向量库的检索结果版本问题。知识库文档更新后旧切片的向量可能还在库里检索时如果排到了最前面回答就会过时。生产环境里要维护一个文档版本表和切片状态字段增量更新时把旧切片标记为失效。5. 常见问题与排查技巧实录AI应用架构的坑不同项目踩出来有共性。我把在项目里遇见频率最高的问题整理成一个速查表附带排查套路和解决方案。这一节每个问题背后都有真实的排障过程不是纸面结论。常见现象真正原因排查套路解决方案多轮对话后回答质量骤降甚至“忘掉”系统指令上下文窗口被历史消息占满关键指令被挤出注意力范围在日志里查看每次请求实际填入的Prompt长度对比上下文软上限启用历史摘要压缩设置明确的上下文保留策略把工具返回和检索片段放在消息中部而非尾部Agent经常循环空转不停调用同一个工具工具返回结果没有被正确回填模型看不到执行后的状态检查工具网关日志看返回结果格式和长度格式过长时模型注意力被稀释工具结果做截断和结构化摘要超过800字符先压缩给工具执行结果增加完成标志检索不到相关内容回答“不知道”文档切分不合理或嵌入模型对领域词汇理解弱也可能TopK设置过低单独抽一条问题做检索测试直接看向量库返回TopK片段的得分和内容优化切分策略增加领域同义词扩展引入重排模型调高TopK后再过滤回答很慢首字延迟超过预期模型输入Token过长或链路里串行步骤太多用链路追踪看每步耗时定位是检索慢、模型慢还是工具慢输入提示词前做压缩检索和工具调用做并行化增加流式输出Token成本远超预算每轮请求把大量历史消息和完整工具文档重复传给模型按会话统计每次调用Token数找最大消耗点共用Prompt做缓存工具描述按需加载历史消息改摘要加入语义缓存提示词被用户输入“注入”模型不按指令走用户输入和系统提示词在同一个消息里模型边界感失效查看Prompt组装源码确认角色隔离是否生效复现恶意输入严格区分system/user消息对用户输入做前置检测必要时用输入分类模型过滤除开表格里的问题我再单独讲一个团队经常忽略的点评测机制的缺失。很多AI应用上线后改动提示词或调整检索参数没人知道是变好了还是变坏了。我们在实际项目里维护了一个评测集大概一两百条覆盖典型用户任务的样例每次调整架构或者改提示词就用这个评测集批量跑一遍人工打分对比。别看它初期要花时间后面所有优化工作都依赖这个基线否则你对“架构改得好不好”没有任何判断依据。还有一个和“多AI协作”相关的排查经验也能分享。当你把多个模型放进一条工作流里比如一个模型做意图解析另一个模型做内容生成结果经常出现后一个模型不满意前一个模型的输出格式。问题不一定出在模型能力上而是你没有在两步之间做“契约约束”。我现在会在每个模型调用的边界上清确定义输入输出的Schema前置模型输出先经过一次格式校正和提取再传给下一个模型。这个中间适配层比让模型自己去理解上一个模型的输出要稳定得多。个人落地感受和一个小技巧我自己把AI应用架构这套思路在不同项目里反复用了很多遍以后最大的感受是架构从来不是一次画出来的巨型蓝图而是一层层长出来的。最开始可能就是一个模型接入函数加一个RAG查询跑通之后你发现需要权限控制再加应用服务层的校验然后你发现Agent在工具调用里失控再补工具网关的统一描述和校验再之后你会发现同样的模型被好几个模块调用再加一个模型接入层做统一管理。每一步都是因为真实的痛点和真实的数据才把架构的某一块补齐。如果只能给一个建议我会说先把“上下文管理”这件事做好。我踩过最大的坑就是在Agent应用里无脑堆历史消息和检索片段导致模型输出幻觉严重、指令不稳定表面看是大模型选错了实际上我根本没做好提示词边界和上下文精准度。后面我把短期记忆、长期记忆、工作记忆拆开把每个模型调用限制在一个“精准上下文”的范围内之后整个系统的稳定性一下就上来了。架构图再复杂它最终服务的还是“让模型在合适的时间看到合适的信息”。这句话建议你每画一层架构设计都默念一遍。
返回列表