资讯动态

AI应用架构图解:从LLM、RAG到Agent与MCP的分层设计与实战

发布时间:2026/10/26 5:51:55 来源:尧图企业网站定制
1. 为什么“图解”才是理解AI应用架构的正确打开方式我做了七八年系统架构从最早的单体服务到微服务再到现在的AI原生应用有一个感受越来越强烈AI应用架构这件事光靠文字描述根本讲不清楚。你写一万字解释“Agent怎么调用工具”不如一张图把LLM、Memory、Tool、Planner之间的关系画出来。这也是为什么我一直在用“图解”的方式梳理AI应用架构——不是因为我喜欢画图而是因为架构的本质是关系关系的本质是拓扑结构而拓扑结构天然适合用图来表达。过去一年我参与过三个AI应用项目的架构设计有企业知识库问答、有多Agent协作的自动化工作流、也有基于MCP协议的工具集成平台。踩过的坑、推翻过的方案、半夜改架构图改到崩溃的经历加起来能写一本书。这篇文章我打算把这些经验系统性地整理出来围绕AI应用架构设计这个核心把Agent、LLM、MCP这几个关键概念串起来用图解的思路讲清楚每一层在干什么、为什么这么分层、实际落地时怎么选型。不管你是刚接触AI应用开发的新手还是已经做过几个Demo想往生产级架构进阶的开发者这篇文章应该都能给你一些可以直接抄作业的东西。我不会只讲概念每个架构层我都会给出具体的组件选型建议、参数配置思路、以及实际项目中遇到的问题和解决方案。文章会比较长建议收藏后慢慢看。2. AI应用架构的整体分层设计思路2.1 从一张“四层架构图”说起先给出我目前最常用的AI应用架构分层方案。这套方案是在经历了两次大规模重构之后稳定下来的目前在我负责的几个项目中运行良好。整个架构从下到上分为四层模型层Model Layer负责提供基础推理能力包括LLM、Embedding模型、Rerank模型、多模态模型等能力层Capability Layer把模型能力封装成可复用的服务包括RAG检索、工具调用、记忆管理、内容审核等编排层Orchestration Layer负责Agent的决策逻辑、任务规划、多Agent协作、流程控制应用层Application Layer面向最终用户的产品形态包括对话界面、API网关、业务逻辑集成这四层不是随便分的。我试过把能力层和编排层合并结果发现当Agent逻辑变复杂时代码会变得极其混乱——检索逻辑和决策逻辑搅在一起改一个检索策略要动整个Agent的代码。分开之后每一层的职责边界清晰可以独立迭代。注意分层不是目的隔离变化才是。模型层变化最频繁新模型层出不穷所以要用适配器模式隔离编排层业务逻辑最重所以要独立出来方便测试。2.2 为什么是这四层而不是三层或五层三层架构模型-编排-应用的问题是当你的RAG检索策略需要频繁调整时这些逻辑会散落在编排层各处。我见过一个项目光是检索相关的代码就散在十几个文件里改一个chunk size要全局搜索替换。五层架构把能力层再拆成工具层和记忆层的问题是过度设计。对于大多数项目来说工具调用和记忆管理的复杂度还没到需要独立分层的程度。当然如果你的Agent需要管理几十种工具和复杂的长期记忆拆成五层也合理。四层是我认为的“甜点区”——既保证了关注点分离又不至于引入过多的抽象层级。具体项目可以根据实际情况微调但核心原则是每一层只解决一类问题层与层之间通过明确定义的接口通信。2.3 架构设计中最容易犯的三个错误第一个错误是把LLM当成万能层。很多初学者把所有逻辑都塞进Prompt里让LLM自己决定检索、自己决定调什么工具、自己管理对话历史。结果就是Prompt越来越长token成本飙升而且行为不可预测。正确的做法是把确定性的逻辑如检索触发条件、工具参数校验放在代码层LLM只负责它擅长的部分——理解和生成。第二个错误是忽略状态管理。AI应用和传统Web应用最大的区别之一就是状态复杂度。对话历史、工具调用结果、中间推理步骤、用户偏好……这些状态如果没有统一的管理机制很快就会变成一团乱麻。我的建议是在能力层专门设一个状态管理模块统一负责状态的存储、检索和生命周期管理。第三个错误是不做降级设计。LLM服务挂了怎么办检索超时了怎么办工具调用失败了怎么办这些问题在Demo阶段不会暴露但上了生产就是事故。架构设计时必须考虑每一层的降级策略。3. 模型层LLM选型与接入的实战细节3.1 LLM选型的五个关键维度选LLM不是看排行榜就完事了。我在实际项目中总结出五个必须考虑的维度维度说明实际影响推理能力复杂推理、代码生成、多步规划决定Agent能处理多复杂的任务响应延迟首token时间、生成速度直接影响用户体验上下文窗口最大输入token数决定能塞多少检索结果和对话历史成本每百万token的输入/输出价格决定项目能不能规模化部署方式API调用还是本地部署影响数据安全和运维复杂度我的一般策略是主力模型选推理能力强的辅助任务用便宜快速的。比如Agent的核心决策用Claude或GPT-4级别模型但意图分类、实体提取这些简单任务用小模型就够了。实测下来这种混合策略能降低60%以上的推理成本而效果几乎无损。3.2 多模型接入的适配器设计生产级AI应用很少只用一个模型。你可能主力用一家备用另一家某些场景还要用本地部署的开源模型。这时候就需要一个统一的模型适配层。我的做法是定义一个统一的模型接口class BaseLLMAdapter: def chat(self, messages: list, **kwargs) - str: raise NotImplementedError def stream_chat(self, messages: list, **kwargs): raise NotImplementedError def count_tokens(self, text: str) - int: raise NotImplementedError然后每个模型提供商实现自己的适配器。这样做的好处是上层编排逻辑完全不关心底层用的是哪个模型切换模型只需要改配置。实操心得适配器里一定要实现count_tokens方法。很多项目上线后才发现token超限就是因为没有提前计算。不同模型的token计算方式不同必须用对应模型的分词器来算。3.3 本地部署模型的考量有些场景必须本地部署数据不能出内网、需要极低延迟、或者成本敏感。本地部署主要考虑这几点硬件要求7B模型至少需要16GB显存FP16量化后可以降到8GB左右推理框架vLLM适合高并发Ollama适合快速验证llama.cpp适合资源受限环境量化方案Q4量化通常能保持95%以上的效果但Q2以下就会明显退化我实测过在单张消费级显卡上部署7B模型用Q4量化vLLM并发10路的情况下首token延迟在300ms左右生成速度约30 tokens/s。对于内部工具类应用完全够用。4. 能力层RAG、工具调用与记忆管理的核心实现4.1 RAG检索增强生成的架构拆解RAG是AI应用中最常用的能力之一但做好RAG远不止“向量检索拼Prompt”这么简单。一个完整的RAG架构包含以下环节文档处理管线文档解析 → 分块 → 向量化 → 存储。这里面每一步都有讲究。分块策略直接影响检索效果我一般用递归分块chunk size设在512-1024 token之间overlap设10%-20%。对于结构化文档如表格需要特殊处理不能简单按字符切。检索策略纯向量检索在语义匹配上表现好但对关键词精确匹配不行。我的方案是混合检索——向量检索BM25关键词检索然后用RRFReciprocal Rank Fusion融合结果。实测下来混合检索的召回率比纯向量检索高15%-25%。重排序检索回来的Top-K结果用Rerank模型重新排序能显著提升最终效果。常用的Rerank模型有Cohere Rerank、BGE-Reranker等。这一步会增加延迟但通常值得。# 混合检索的简化实现思路 def hybrid_search(query, top_k10): vector_results vector_store.search(query, top_ktop_k*2) bm25_results bm25_index.search(query, top_ktop_k*2) fused rrf_fusion(vector_results, bm25_results) reranked rerank_model.rerank(query, fused[:top_k*2]) return reranked[:top_k]4.2 工具调用Function Calling的工程实践工具调用是Agent能力的核心。LLM根据用户意图决定调用哪个工具、传什么参数然后代码层执行工具并返回结果。工程上要注意几个点工具描述的质量决定调用准确率。工具的名称、描述、参数说明都要写得非常清晰。我见过因为工具描述模糊导致LLM频繁调错的情况。建议每个工具的描述包含功能说明、适用场景、参数含义、返回值格式。参数校验不能省。LLM生成的参数不一定合法必须在执行前做校验。类型检查、范围检查、必填检查都要做。校验失败时把错误信息返回给LLM让它重新生成。超时和重试机制。工具执行可能失败或超时要设置合理的超时时间一般5-30秒和重试策略最多重试2-3次。并行调用。如果多个工具调用之间没有依赖关系可以并行执行能显著降低总延迟。4.3 记忆管理的分层设计Agent的记忆分为短期记忆和长期记忆。短期记忆就是当前对话的上下文长期记忆是跨对话需要保留的信息。短期记忆的管理相对简单就是维护一个消息列表注意控制总token数不超限。超限时的截断策略有几种直接截断最早的、保留系统提示最近N轮、或者用LLM做摘要压缩。我一般用“保留系统提示最近N轮对更早内容做摘要”的混合策略。长期记忆就复杂了。我的方案是分三类存储事实记忆用户的基本信息、偏好设置用结构化存储如数据库情景记忆过去的交互摘要用向量库存储检索时按相关性召回语义记忆领域知识通常就是RAG的知识库记忆的写入时机也很关键。不是每轮对话都值得记我一般用LLM判断当前对话是否包含值得长期保留的信息只有确认有价值才写入。5. 编排层Agent架构与多Agent协作的设计模式5.1 单Agent的核心循环ReAct模式详解ReActReasoning Acting是目前最主流的Agent工作模式。核心循环是思考 → 行动 → 观察 → 再思考直到任务完成或达到最大步数。具体流程是LLM先分析当前状态和任务目标决定下一步做什么Thought然后选择调用某个工具Action代码层执行工具并返回结果ObservationLLM根据新信息继续思考循环往复。这个循环看起来简单但实际落地时有几个关键参数需要调最大迭代步数一般设10-20步太少任务完不成太多浪费token且可能陷入死循环每步的超时时间单步超过30秒还没结果就应该中断循环检测如果连续几步的Action相同说明可能卡住了需要强制中断或换策略踩坑记录我曾经做过一个数据分析Agent因为没设循环检测它在某次任务中连续调了20次同一个SQL查询工具每次参数都一样白白烧了几十万token。后来加了Action去重检测才解决。5.2 多Agent协作的三种拓扑结构当任务复杂度超过单Agent的处理能力时就需要多Agent协作。常见的拓扑结构有三种主管- worker模式一个主管Agent负责拆解任务和分配多个worker Agent各自执行子任务。适合任务可以清晰分解的场景比如“写一份报告”可以拆成“搜集资料”“分析数据”“撰写初稿”“审核修改”。流水线模式多个Agent按顺序处理前一个的输出是后一个的输入。适合有明确阶段划分的流程比如“需求分析→方案设计→代码生成→测试验证”。辩论模式多个Agent对同一问题给出不同方案然后互相评审最终由裁判Agent综合决策。适合需要多角度分析的场景比如风险评估、方案选型。选择哪种拓扑取决于任务特性。我的经验是能单Agent解决就别多Agent。多Agent的通信开销和协调复杂度很高不是所有任务都值得。5.3 Agent的容错与安全设计Agent自主决策意味着它可能犯错。容错设计的核心思路是在关键节点加人工确认在非关键节点加自动校验。具体措施包括危险操作二次确认删除数据、发送邮件、执行支付等操作必须经过确认输出格式校验Agent的输出必须符合预期格式不符合就重试工具调用白名单限制Agent只能调用经过审核的工具敏感信息过滤Agent的输入输出都要过一遍敏感信息检测执行日志全记录每一步的思考、行动、观察都要记录方便事后审计和问题排查关于Agent安全还有一个容易被忽略的点是记忆投毒。如果Agent的长期记忆被恶意注入虚假信息后续所有决策都会受影响。防护措施包括记忆写入时做来源验证、定期审计记忆内容、对关键记忆做交叉验证。6. MCP协议AI应用工具集成的标准化方案6.1 MCP是什么为什么需要它MCPModel Context Protocol是一个标准化协议用于连接AI应用和外部工具/数据源。你可以把它理解成“AI应用的USB接口”——以前每个AI应用要对接一个工具都得写一套专门的适配代码有了MCP之后工具提供方实现一次MCP Server所有支持MCP的AI应用都能直接用。这个协议解决的核心问题是工具集成的碎片化。在没有MCP之前我做过一个项目要对接5个外部服务每个服务的API风格都不一样光是写适配层就花了两周。如果这些服务都支持MCP可能两天就搞定了。MCP的核心概念包括MCP Server工具/数据提供方实现的服务器暴露资源Resources、工具Tools和提示模板PromptsMCP ClientAI应用侧的客户端负责连接Server、发现可用工具、发起调用传输层支持stdio和HTTPSSE两种传输方式6.2 MCP Server的开发要点开发一个MCP Server并不复杂但有几个关键点需要注意工具描述的规范性。MCP协议要求每个工具提供JSON Schema格式的参数定义。这个Schema的质量直接影响LLM调用工具的准确率。参数名要语义清晰描述要详细枚举值要完整。错误处理。MCP Server要能优雅地处理各种错误参数错误、执行超时、依赖服务不可用等。错误信息要结构化返回方便Client端和LLM理解。安全性。MCP Server可能暴露敏感操作必须做权限控制。建议实现认证机制并对危险操作加确认流程。# MCP Server工具定义示例伪代码 mcp_server.tool( namequery_database, description执行SQL查询并返回结果仅支持SELECT语句, parameters{ sql: {type: string, description: 要执行的SELECT语句}, limit: {type: integer, description: 返回行数上限, default: 100} } ) def query_database(sql: str, limit: int 100): # 校验SQL安全性 if not sql.strip().upper().startswith(SELECT): raise MCPError(仅支持SELECT语句) # 执行查询 result db.execute(sql, limitlimit) return result6.3 MCP在实际项目中的集成策略在实际项目中集成MCP我的建议是渐进式接入。不要一上来就把所有工具都改成MCP先从新工具开始用MCP老工具保持原有方式等MCP生态成熟后再逐步迁移。另一个建议是做好MCP Server的版本管理。工具的参数和返回值可能随版本变化Client端要做好兼容处理。我一般会在MCP Server的响应里带上版本号Client端根据版本号做不同的处理。7. 常见问题与排查技巧实录7.1 Agent行为异常的排查思路Agent不按预期工作时排查顺序建议是看Prompt系统提示是否清晰工具描述是否准确有没有歧义看上下文对话历史是否太长导致关键信息被淹没检索结果是否相关看工具返回工具返回的结果格式是否符合预期有没有报错信息被忽略看模型换一个模型试试排除模型本身的问题看参数temperature是否设得太高max_tokens是否够用我遇到最多的问题是工具描述不够清晰导致LLM选错工具。解决方法很简单把工具描述写得像给新人看的文档一样详细包括什么时候用、什么时候不用、参数怎么填。7.2 性能优化的常见手段AI应用的性能瓶颈通常在三个地方LLM推理、检索、工具调用。对应的优化手段瓶颈优化手段预期效果LLM推理慢流式输出、用小模型做简单任务、缓存常见问题的回答首token延迟降低50%检索慢向量索引优化、混合检索并行执行、结果缓存检索延迟降低30%-60%工具调用慢并行调用、超时设置、结果缓存总延迟降低40%还有一个容易被忽略的优化点是Prompt压缩。把系统提示精简到最必要的部分能显著降低token消耗和推理时间。我做过一个对比把系统提示从2000 token压缩到800 token效果几乎没变但成本降低了35%。7.3 成本控制的实战经验AI应用的成本主要是token消耗。控制成本的手段包括分级处理简单问题用小模型复杂问题才用大模型缓存策略相同或相似的问题直接返回缓存结果上下文管理及时清理不需要的对话历史避免无效token消耗输出限制设置合理的max_tokens避免模型生成过长的无用内容批量处理非实时任务攒批处理提高吞吐降低单价我负责的一个项目通过上述手段把月均token成本从3000多降到了800左右效果基本无损。7.4 常见问题速查表问题现象可能原因排查方向Agent不调用工具工具描述不清、Prompt未引导检查工具描述和系统提示工具调用参数错误Schema定义不严谨检查参数类型和描述回答与检索内容不符检索结果不相关、Prompt未约束检查检索质量和Prompt约束响应时间过长模型推理慢、串行调用多启用流式、并行化工具调用多轮对话后质量下降上下文超限、历史信息干扰优化上下文管理策略Agent陷入循环缺少循环检测、任务目标不明确加循环检测、明确任务终止条件8. 从架构图到代码一个完整AI应用的落地路径8.1 项目初始化的技术选型清单基于我多个项目的经验给出一套比较通用的技术选型开发语言Python生态最成熟或TypeScript前后端统一LLM接入LangChain或LlamaIndex做编排或者自己写轻量适配层向量数据库小规模用Chroma或FAISS大规模用Milvus或Qdrant后端框架FastAPIPython或HonoTypeScript前端React/Next.js Vercel AI SDK部署Docker 云服务或Kubernetes做编排选型原则是优先选生态成熟的其次选团队熟悉的最后才考虑性能极致优化的。AI应用领域变化太快选主流方案能保证遇到问题时容易找到解决方案。8.2 开发迭代的推荐节奏我的建议是分四个阶段迭代第一阶段1-2周跑通核心链路。用最简单的实现验证“用户输入→LLM处理→返回结果”这个基本流程。不要纠结架构先让东西跑起来。第二阶段2-4周加上RAG和工具调用。把知识库检索和核心工具集成进来验证Agent的决策能力。第三阶段2-4周完善架构分层。把代码按四层架构重构加上状态管理、错误处理、日志监控。第四阶段持续优化和扩展。性能优化、成本控制、多Agent协作、MCP集成等。每个阶段都要有可演示的产出不要憋大招。AI应用的不确定性很高快速迭代比完美设计更重要。8.3 上线前的检查清单上线前必须确认的事项所有工具调用都有超时和重试机制敏感操作有二次确认有完整的日志记录输入、输出、工具调用、错误有降级方案LLM不可用时怎么办有成本监控和告警有用户反馈收集机制做过压力测试并发、长对话、异常输入这份清单看起来简单但真正全部做到的项目不多。我见过太多项目因为没做降级设计LLM服务一抖动整个应用就挂了。9. 一些个人体会架构设计这件事最怕的就是过度设计。我早期做AI应用时总想把架构做得大而全结果就是开发速度极慢很多设计好的扩展点根本没用上。后来我学乖了先让东西跑起来遇到问题再重构。四层架构也不是一开始就设计好的是经历了两次重构才稳定下来的。另一个体会是AI应用架构和传统软件架构最大的区别在于不确定性。LLM的输出不确定Agent的行为不确定工具的执行结果也不确定。所以架构设计时要把“不确定性”当成一等公民来对待——每个环节都要考虑失败的情况每个决策都要有回退方案。最后说一个具体的技巧把架构图画出来贴在团队看得到的地方。不是为了好看而是为了让每个人对系统有统一的认知。我团队里新来的同学第一周的任务就是看懂架构图然后指出其中不合理的地方。这个方法帮我发现了好几个设计缺陷。这个领域变化很快今天的最佳实践明天可能就过时了。保持学习保持动手比什么都重要。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑