ARTICLE DETAIL

资讯详情

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

图解AI应用架构设计:从需求流图到Agent工程落地

图解AI应用架构设计:从需求流图到Agent工程落地 搞AI应用开发的朋友应该都有过这种体验单看一个Agent Demo跑起来神乎其神代码也就两三百行可一旦要接进真实业务要处理用户会话、外部工具、多轮记忆、权限控制、成本监控整个项目瞬间变成一团乱麻。项目群里消息刷得飞快今天改这个Prompt明天加那个回调后天发现上下文爆了所有人都很忙但没人能说清楚系统到底是怎么跑通的。我做了几年架构设计最近一年密集落地LLM应用最大的感受是越复杂的AI应用越需要先把架构画明白。所谓图解AI应用架构设计就是用一套清晰的图把LLM应用的组件、流程、数据、边界全部钉死在纸面上让团队从拍脑袋写代码切换到按图施工。这篇内容我打算从五个方面展开为什么LLM应用非画图不可、图解需要哪几张核心图、一次完整的设计过程、图到代码的落地映射以及画图和落地过程中最常见的坑。整个篇幅会比较长但每一步都是我实际项目里验证过的方法适合正在做AI应用架构、或者准备把Agent项目推向生产环境的朋友参考。1. 为什么AI应用架构里图这么重要1.1 LLM应用和传统软件的根本差异传统后端应用核心逻辑是确定性的一个订单接口收到请求校验参数、查库存、建订单、调支付每一步都是可预判的。架构图的作用更多是记录把既定的模块关系标清楚不画图也能靠代码规范撑一阵子。但AI应用完全是另一回事。核心引擎是大模型同样的输入今天和明天的输出可能有细微差别同一个任务模型可能选择调用工具也可能选择直接回答更别提多Agent协作时A的输出会成为B的输入B的结果又可能回过头改变A的上下文。整个系统呈现高度非线性和不确定性。我见过一个很典型的翻车现场团队花两周搭了一个智能客服工单分类知识库问答的Agent上线前测试一切正常。结果一接真实流量用户一句话里既问了退换货政策又抱怨了物流慢Agent自作主张先调用了工单创建工具再回答政策问题最后把两个意图混在一个上下文里导致工单内容乱七八糟。事后复盘所有人盯着代码看了一下午谁也说不清请求链路到底经历了哪些分支——系统像一个黑盒开发人员自己都预测不了行为。这时候如果有一张清晰的流程图把意图路由、工具调用边界、兜底策略提前画明白这个事故完全可以避免。1.2 画图解决的是共识和失控问题AI应用项目里最大的成本不是写代码而是对齐。产品经理说让AI更智能一点后端工程师理解成多部署几个模型算法同学理解成微调模型前端同学理解为写更长的Prompt——如果没有一张大家都看得懂的图这些分歧会在联调阶段集中爆炸。图示法的核心作用是建立无歧义的语言。一张架构图摆在那里三层结构、五个核心组件、三条数据路径每个人看到的是同一个系统。后续所有的讨论都可以基于图进行这个工具的返回要走到哪个节点超时之后是重试还是转人工——这些问题在图上能直接指出来效率比文字文档高得多。更深一层画图解决的是失控预防。LLM应用调用链越长越容易积累隐性状态。你以为Agent只是执行了三步实际上每一步都带上了完整的历史上下文早把Token撑爆了你以为只调了一个外部API实际上工具层又嵌套调了两个服务延迟直接翻倍。画图强迫你把每个环节、每条数据路径都显式列出来等于把系统的熵摊在桌面上审视一遍。1.3 图解方法的核心价值把不确定性变成可控性我们画图的目的不是为了画一张挂墙上的装饰品而是为了把不确定性变成可控性。传统架构图表达的是稳定结构而AI应用架构图必须表达可能的分支和兜底的选择。比如用户意图不明显时走哪条路模型超时怎么办工具调用失败重试几次上下文超过窗口怎么截断这些不确定点必须在图上标出来然后逐个变成代码里的判断逻辑。画图的过程本质上是在把随机性翻译成可控的分支逻辑。一句话总结在AI应用里图不是文档是设计工具和沟通工具。没有图的Agent项目跑得越远越危险。2. 图解AI应用架构的几张核心图在实操中我画过几十张AI应用架构图常常用的是五张每一张解决一个层次的问题。下面逐个拆解。2.1 第一张需求层咨询流图这张图画的是用户从进来到被满足需求的完整旅程不涉及任何技术组件。拿我做过的AI旅游行程规划助手举例用户进来说帮我规划一个东京五天四夜的行程系统要经历意图识别、预算收集、偏好确认、行程生成、酒店/机票工具调用、行程调整、最终输出。这张图里只有方框、箭头和判断菱形每一个判断点都对应一个真实的用户体验决策点。画这张图有个技巧站在用户视角走查每一个可能的回答。比如用户说预算无所谓但是要亲子游系统要不要追问如果一次生成就输出行程质量大概率不高如果追问太多用户可能流失。这个平衡点用文字写不清楚但画出来一看就明白——追问机制该加在哪个节点、最多追问几轮。很多团队跳过这张图直接画技术架构结果技术栈搭得很豪华但用户需求链路根本没打通产品上线后使用率极低。需求层咨询流图是后续所有架构图的地基。2.2 第二张应用功能架构图这张图回答系统由哪些功能模块组成对应的是代码层面的模块划分。标准LLM应用的功能架构至少包含五个模块入口与会话管理、意图路由与任务规划、工具层Tools、模型编排层Agent Runtime、知识库/记忆模块。如果是多Agent协作系统还要加一个调度协调模块。画这张图的时候最容易犯的错误是把模块画成名词列表。真正有用的功能架构图必须标出模块间的调用方向、同步/异步关系、以及核心数据存储。比如记忆模块是内部挂在会话上下文里还是独立的向量库工具层是Agent直接调用还是经过一层网关统一鉴权这些关系不标清楚功能架构图就是一张摆设。我习惯用分层架构来画最外层是接入层Web/App/IM中间是Agent编排层意图路由、规划、工具调用底层是模型层和数据层LLM、向量库、业务数据库。每层内部组件画清楚跨层的调用线标方向这样一张图可以直接映射到工程代码的目录结构。2.3 第三张数据流与时序图这张图是AI应用架构里最值钱的图因为它记录了一次请求从进来到返回经历了哪些环节、每个环节的数据长什么样。LLM应用里数据流有两个显著痛点一是上下文数据如何组装二是中间产物如何存储。以RAG检索增强生成流程为例用户提问进来后系统要做查询改写、向量检索、重排序、拼接Prompt最后才交给模型生成。这个链条上每一步都可能出问题查询改写后语义漂移了怎么办检索结果为空怎么办重排序后top3结果都不相关怎么办把这些分支画在时序图上实现的时候才知道哪里要加判断。画时序图时注意区分两类流转用户可感知的外部流转比如用户提问→模型回复系统内部的自循环比如Agent调用工具→工具返回结果→Agent再决策。外部流转要追求低延迟和稳定内部自循环才是体现Agent智能的地方两者混为一谈最容易导致割裂设计。2.4 第四张部署与基础设施拓扑图这张图画的是系统跑在什么环境里依赖哪些外部资源。很多做Agent开发的工程师习惯了单机开发只要跑通Demo就觉得万事大吉。但真实生产环境要考虑的是模型API服务的可用性、限流和容灾向量数据库的容量与延迟外部工具API的鉴权与超时日志、追踪、监控系统的接入。我踩过一个实实在在的坑当时团队开发的Agent依赖三个外部API天气、酒店预订、支付开发环境所有接口都通一上生产环境支付接口突然开始出现5秒超时。排查了两天才发现生产环境的容器网络策略限制了到外部服务的连接导致每次调用都在等待超时。如果提前画好部署拓扑图把这个外部依赖关系标清楚这个问题在架构评审阶段就能通过网络连通性检查直接暴露。部署图不用画得很细但必须显式标出每个服务的运行环境、每个外部依赖的Provider、服务之间的网络关系、数据存储的灾备策略。2.5 第五张Agent行为状态机图这一张是AI应用区别于传统应用最特殊的图。Agent的本质是一个循环决策单元观察获取输入→思考规划下一步→行动调用工具或生成回复→再观察。这个循环什么时候终止很多系统设定为模型认为任务完成就终止但实际运行中模型经常误判比如工具返回异常它还会重试三次追问用户时用户又抛出新问题。状态机图要画出Agent的显式状态空闲、规划中、工具调用中、等待用户输入、已完成、异常、超时兜底。每个状态之间的转换条件和触发事件必须标注清晰。我见过最糟糕的实现是Agent无限循环模型认为需要调用工具工具返回结果后模型认为信息不足又去调用同一个工具白白烧掉几十万Token。画了状态机图之后这种自循环风险会被一眼识别因为你会被迫回答什么条件下从工具调用状态回到终止状态。所以不要觉得状态机图是传统软件开发的东西Agent开发同样适用甚至更加必要。状态机图是防止Agent失控的最后一道堤坝。3. 从0到1设计一个可落地的AI应用架构前面把五张核心图拆完了这一节用完整案例带大家走一遍设计全过程。我选择的是目前企业落地最多的场景企业知识库多Agent协作助手这几乎是一张标准卷子很多需求都能套用这套流程。3.1 需求边界与功能范围界定需求来自一个中等规模公司的内部诉求员工日常工作中有大量制度文档、技术手册、历史项目资料需要查询还有一部分高频的重复性事务请假流程查询、报销单填写指引、IT报障流程。希望做一个内部AI助手既能回答制度类问题又能引导员工完成事务流程最好还能在多轮对话中保持上下文连贯。先别急着写代码第一步是把需求边界画清楚否则会无限蔓延。约束条件我定为三条第一内容范围限定公司内部文档和流程不接公网第二对事实准确性要求极高制度问答不允许模型自由发挥第三事务流程需要对接现有OA系统的接口能力边界受限于OA开放API。这三条一划架构的底座就定了必须引入RAG来约束事实类回答事务类任务需要走工具调用两者之上才谈Agent编排。边界不划清楚后面一定会遇到AI可以帮我写周报吗之类的需求蔓延而能做什么、不能做什么应该在咨询流图阶段就达成一致。3.2 流程设计先画用户旅程再倒推技术方案我带着产品同学先画需求层咨询流图核心路径如下用户进入对话界面提出公司年假制度是什么系统判定为知识问答意图进入RAG检索检索结果拼接Prompt模型生成回答并附引用来源用户继续问那我今年能休几天系统需要在企业内部系统的员工信息里查询假期余额系统识别为个人数据查询走工具调用获取数据再生成个性化回答用户说帮我提交休假申请系统识别为事务流程调用OA接口创建申请单系统要求用户确认确认后提交成功。这条路径看似简单但每一个转折点都隐藏技术决策第一跳意图判断用什么模型第二跳知识检索准确率如何保证第三跳个人数据查询涉及隐私权限怎么鉴权第四跳事务提交涉及写操作怎么加用户确认机制倒推之后发现这个系统至少需要三个核心能力多轮意图识别与路由是否涉及个人数据/事务操作、可靠的RAG链路引用来源可追溯、受控的工具调用写操作必须二次确认。这三个能力构成了整个架构的三个支柱后续所有技术选型都围绕它们展开。3.3 功能架构与模块拆分基于上面的流程我把系统拆成六个模块接入与网关层负责统一鉴权、限流、对话入口管理意图路由模块负责判断用户请求类型是知识问答、个人数据查询、事务操作还是闲聊兜底RAG检索模块负责文档切分、向量检索、重排序工具调用模块封装OA流程查询、假期余额查询、工单创建等外部APIAgent编排模块核心负责多轮对话中的规划、调用、状态管理记忆与上下文模块负责短期对话记忆、长期用户偏好存储、向量库。模块拆完之后我习惯再画一张调用关系矩阵表把模块间的依赖方向列清楚这样做有两个好处一是避免循环依赖二是实现时可以并行开工。比如意图路由模块只依赖接入层输出不依赖RAG模块的细节工具调用模块只暴露标准接口给Agent编排层不参与业务判断。依赖关系清晰后三个后端工程师可以同时开发而不互相阻塞。3.4 关键技术决策与选型逻辑这个部分对新手特别重要因为选型不是抓阄每个决策背后都有明确的理由。大模型选型知识类回答对中文理解能力要求高同时要兼顾长上下文和工具调用能力我选择了主流商用大模型API而不是开源小模型。理由是内部场景调用量可控API成本在可接受范围商用模型的指令遵循能力明显强于本地部署的同参数级模型。如果预算紧张可以在路由层用一个小模型做意图判断主对话用大模型能省不少钱这是后话。RAG实现方案向量库我选了开源的Milvus因为团队已有K8s运维能力托管式向量库虽然省事但单价偏高文档切分采用标题结构切分固定窗口重叠先按文档标题结构块切超过上限的再按固定窗口切保留一定重叠度。重排序引入了一个开源的Rerank模型实测能明显提升top1准确率。Agent框架选型这里我格外谨慎。市面上的Agent框架很多但内部系统要求稳定可控框架的黑盒程度必须低。我最终没有选择重型编排框架而是在LangChain基础上封装了一层自己的调度逻辑。原因是框架给的是通用能力但我们的诉求是严格的流程控制先鉴权、再检索、后调用工具、写操作必须用户确认这些业务约束用框架的通用链式调用很难优雅表达自己写一层30行的状态判断反而更清晰。注意如果你不是为了追求极限灵活选一个生态成熟的框架完全没问题。但无论选哪个一定要确认它支持显式状态控制和可观测性输出否则后期排查Agent行为会非常痛苦。状态管理因为是多轮对话会话状态天然是运行时的不需要单独建库。但要注意一点不要把整个历史记录都塞进模型上下文。我采用的是三级记忆方案最近两轮完整对话放在上下文中间轮次做摘要后放入上下文更早的只存向量库需要时再检索。这样Token消耗大概能降到全量记录的1/3模型对最新意图的响应质量也更好。3.5 生产级细节延迟、成本与稳定性的平衡架构确定之后我快速算了一笔账。假设300个日活用户、每人每天20次对话、每次对话平均消费约3000个Token输入输出一个月的模型Token消耗大约为300人 × 20次 × 3000Token ≈ 1800万Token/月商用大模型按输入输出综合价格折算月成本大约在几百到几千元区间这和自建GPU集群的折旧成本对比后发现API方案明显更划算。这个计算让我对为什么不用开源模型本地部署这个问题有了量化支撑而不是拍脑袋做决定。延迟方面我也做了预估一次知识问答完整的链路是意图识别0.3s→向量检索0.1s→重排序0.2s→LLM生成1~2s整体延迟预计在2秒左右对内部工具来说可用。但如果接入的模型响应偏慢就得设计一部分改写回复用流式输出让用户先看到打字机效果体感会好很多。流式输出对于Agent应用来说不只是体验问题关键信息在生成过程中分段展示用户可以在中间打断纠偏这对长链路Agent特别有用。稳定性是这个系统真正见真章的地方。我设计了三级兜底第一级模型超时或报错直接返回服务暂时不可用请稍后再试第二级RAG检索结果置信度过低明确告知我没有找到相关信息而不是让模型强行编第三级工具调用失败提示用户改用手动流程AI助手退化为引导角色。这三个兜底策略在架构设计阶段就定下来而不是等线上事故后再补。4. 从架构图到工程落地的关键映射架构画得再完整最终要落到代码。这一节分享我落地过程中的几个关键决策和具体习惯。4.1 代码结构与架构图的映射关系很多团队架构图画得很好看代码却是一锅粥。为了阻止这种情况我习惯让代码目录结构和架构图模块一一对应src/ ├── gateway/ # 接入与网关层 ├── router/ # 意图路由模块 ├── rag/ # RAG检索模块 │ ├── loader/ # 文档加载 │ ├── chunker/ # 切分策略 │ ├── embedder/ # 向量化 │ └── reranker/ # 重排序 ├── tools/ # 工具调用模块 │ ├── oa/ # OA系统适配器 │ └── hr/ # HR系统适配器 ├── agent/ # Agent编排模块 │ ├── planner/ # 任务规划 │ ├── runner/ # 执行循环 │ └── state.py # 状态机定义 ├── memory/ # 记忆与上下文模块 └── main.py模块边界就是代码的包边界依赖方向就是import的方向。我要求团队代码评审时如果import关系跳出了架构图约定的依赖方向一律打回。这个规则看起来死板但在实际项目中省掉大量模块间互相引用的破窗问题后续调试和重构都非常顺畅。4.2 Agent编排层的实现要点Agent编排层是整个系统最核心也最容易失控的部分。我用一个简单的循环来表达它的骨架current_state start while current_state not in (completed, failed, need_user): if current_state start: user_input receive_user_message() current_state route(user_input) # 意图路由 elif current_state planning: plan llm_plan(user_input, tools_available) current_state tool_calling if plan.need_tool else generating elif current_state tool_calling: result call_tool(plan.tool_name, plan.args) current_state planning # 根据结果继续规划或终止 if result.status require_confirm: current_state waiting_user_confirm elif current_state waiting_user_confirm: confirm_result receive_user_message() current_state tool_calling if confirm_result else generating # 这里必须加最大重试次数防止无限循环 elif current_state generating: response llm_generate(final_prompt) current_state completed核心要注意两点循环必须有保护。我在代码里做了一层最大工具调用次数的判断例如一个任务最多调用4次工具超过就终止并返回当前信息不足以完成该操作。否则一旦模型陷入自循环Token消耗完全是失控的。状态机的每一步都要可观测。我在代码里打桩记录了每一步的状态、每次工具调用的参数与返回结果、每次模型决策的意图。上线之后通过这些日志可以完整还原一次对话的内部链路这才是Agent可调试性的基础。4.3 RAG链路落地时的三个细节RAG是整个系统里看着简单、落地最脏的模块。分享三个容易被忽视的细节切分参数选择文档切分大小直接决定检索质量。我做过对比实验固定256字符切分很多制度类问题的语义被拦腰截断检索效果很差。后来改成按标题结构优先切分语义完整块固定窗口兜底方案检索命中率提升了约20%。具体参数要根据文档类型反复调没有通用的最佳值。引用溯源既然是制度问答必须保证回答内容有出处。我在检索出的上下文里保留文档ID和原文片段Prompt中明确要求只基于提供的资料回答且在每个关键结论后标注引用来源编号。用户看到的回答最终格式化输出为答案来源文档名真实性有保障领导放心用户也信任。空结果兜底检索结果如果为空或者相关性分数低于阈值说明知识库里确实没有这个内容。此时必须让模型明确回答知识库中暂无该信息而不是用模型自带的通用知识胡编。这一步是RAG应用守住底线--幻觉的关键。4.4 工具调用的安全与确认机制工具调用模块是AI应用能做事的关键但也最容易出安全事故。我的设计里所有写操作提交申请、创建工单、修改状态都必须满足三个条件参数校验工具调用必须输出结构化参数经过后端校验后才能真正发起调用用户显式确认Agent调用工具后先输出一个确认卡片用户点确认后才真正执行接口调用核心业务操作的最后一公里永远不能由模型独自决定权限前置路由阶段就判断该用户是否有权限执行此类操作没有权限直接进入兜底话术而不是等工具调用失败后再报错。这三个约束如果不加轻则产生脏数据重则造成安全问题。在设计架构图的时候我特意在数据流图中画了一条工具调用确认回路这条回路从Agent出发绕到用户侧确认后再回到Agent执行。这个回路也是和产品、测试对齐AI能做什么、不能做什么的锚点。提示不要觉得确认步骤会降低体验恰恰相反没有确认机制的AI应用在真实业务里根本推不下去。业务方不会接受一个可能自作主张提交申请的助手。4.5 可观测性与全链路追踪做AI应用和做传统后端最不一样的地方后端的错误是异常堆栈AI的错误往往是结果不对但流程正常。因此可观测性建设必须前置。我的做法是在Agent编排层埋了结构化日志把每一次模型调用的输入输出、Token消耗、延迟、工具调用结果全部以JSON格式写入日志系统。配合分布式Trace ID关联用户会话。上线后最实用的一个视图就是某个用户从进来到最终解决/未解决之间Agent经历了哪些状态、调用了哪些工具、在哪一步中断了断言。如果没有这套追踪线上排查问题的唯一手段就是复现而LLM的随机性导致复现概率约等于0。有了日志链路抽查几个失败案例看日志找共性才是可行的排查方式。5. 图解AI应用架构的常见问题与避坑实录画图这件事听起来简单真正动手画的时候问题特别多。我把踩过的坑集中列出来给读者一个排查参考。5.1 图与实现脱节最普遍的坑架构图画完就归档代码写完后和架构图完全对不上。我跟团队定了一个规矩架构图和代码评审同步走新增模块、重构模块之前必须先更新架构图否则代码评审不过。一句话--如果图没有反映系统的真实状态那这张图就是负债而非资产。5.2 图画的层次混乱新手画图最常见的问题是想把一切画在一张图里既画了用户流程又画了部署拓扑还塞了数据流。结果图一复杂信息全糊在一起。我的解法是坚持一图一意咨询流图只画用户旅程功能架构图只画模块关系部署图只画环境拓扑。需要表达多个视角时宁可用5张简单图也不拼一张大而全的图。5.3 Agent自循环导致的Token浪费有一次线上观察到一个用户在一次会话里触发了18次工具调用每次都是同一个查询天气工具因为Agent每次拿到天气结果后都觉得信息不够反复查询。最后消费了超过6万Token才完成一个一句话就能回答的问题。排查后发现是因为Prompt中没有约束同一工具不允许连续调用超过3次。后来我在规划阶段加了一条硬性规则同一工具在单轮任务中最多调用两次相同参数的调用直接去重。效果立竿见影平均Token消耗下降了约35%。这个经验也建议所有Agent设计者提前考虑。5.4 外部API不稳定拖垮整体工具调用的稳定性往往不在自己掌控范围内第三方API超时、限流、返回格式变更都是常态。我在工具层做了一层适配器把所有外部API统一包装为内部标准工具接口统一处理超时、错误码转换和重试。这里再强调一次外部API的响应时间如果超过2秒就会显著拖垮整体对话节奏。适配器上要做超时降级例如遇到天气API超时直接返回暂时无法获取实时天气我给你一份历史天气参考而不是让整个链路卡死。5.5 上下文越攒越大很多人在多轮对话里把所有历史记录全部塞进上下文结果在2~3轮之后开始出现忘记用户最初需求的情况同时Token消耗迅速上升。解决方法是前面提过的三级记忆方案。在落地时我习惯在Prompt里明确给模型一段对话摘要区每次对历史做摘要后替换确保模型看到的关键信息密度最高。5.6 评估环节的缺失还有一个特别常见的坑AI应用上线后不知道效果到底好不好。传统功能有明确的验收标准而AI应用没有或者说了差不多能用就当过了。我在项目里推行的是评测集回归机制整理200条典型问答对每次调整Prompt或修改检索逻辑之后都跑一遍评测集看准确率变化。这个机制是AI应用工程化的长期竞争力壁垒不建评测集后面的优化就是无底洞每次改动都可能靠运气。6. 个人实操体会与后续扩展思路这套图解AI应用架构的方法我已经试用了大半年最大的体会是AI应用的复杂度不是靠代码管理出来的是靠清晰的边界和流程约束出来的。画图的过程强迫我把每一步都按逻辑想清楚很多在项目群里扯不清的问题在图上一分钟就能定位。对于刚开始做AI应用架构、或者准备把Agent项目推向生产环境的工程师建议从一张最简单的用户旅程图开始走一遍用户说了一句话系统内部到底发生了什么的完整链条。再逐步扩展功能架构、数据流、部署和状态机。不要指望一步到位画出一张完美架构图图的迭代本身就是你对系统理解加深的过程。我现在的习惯是每次代码重构前先花30分钟把架构图更新一遍再动手改代码。这个习惯帮我避免了很多改完这个模块、结果那个模块悄悄坏了的隐形问题。如果你也有类似的经历完全可以试试这套方法。最后分享一个小经验AI应用架构方案初次落地时先跑最简闭环即一个意图、一条RAG链路、一个工具调用、一个模型生成把这个闭环的数据流和图完全对齐再叠加多Agent、多记忆这类复杂能力。任何一个新能力上线都用图先画一遍代码才能跟着有章法地长出来。这套方法带来的稳定性回报远超多写几层代码的价值。
返回列表