AI应用架构实战:分层设计、RAG检索与企业知识问答机器人搭建
发布时间:2026/10/12 3:32:46 锦皓数字建站

这两年做AI应用落地我最大的感受是把模型接口拉通并不难难的是让一个项目从demo真正跑成生产环境。很多团队一上来就调模型API跑通一个问答Demo然后就开始接业务——结果需求一变化代码推倒重来不是模型不够强而是AI应用架构没理清楚。该拆的层没拆该有的中间层没有数据流路径模糊最后全在应用层里打补丁。这篇文章想干一件事把AI应用架构这张图一张张拆开给你看。不聊空泛的原则也不堆概念直接落到每层组件、选型逻辑和实操参数最后用一个企业知识问答机器人的场景完整走一遍搭建流程。做完之后你能自己画出这张架构图也能对着图去设计和评审实际的AI应用。适合谁看如果你是AI应用开发者、后端工程师转AI、或者正在做技术方案选型的架构师这篇应该能帮你少走一些弯路。有基础的可以直接看第3节的参数推导和避坑部分刚入门的建议从头到尾顺着读层次结构是完整的。1. 从“调接口”到“搭系统”AI应用架构到底在解什么题1.1 传统应用与AI应用的本质差异先泼一盆冷水用写传统Web应用的经验来写AI应用大概率会翻车。传统应用的逻辑是可枚举的输入输出类型明确你写一个接口就知道它会返回什么。但AI应用不一样核心逻辑跑在一个不可完全预测的大模型上同样的输入可能每次输出都不一样。这意味着架构要解决的不再是“调用是否成功”而是一堆新问题模型输出不可靠怎么办用户上下文怎么管理私有数据怎么安全地喂给模型一次请求可能要跨多个服务链路怎么追踪模型调用按token计费成本怎么控制这些问题如果不在架构层面处理全堆在代码里系统很快变成一团乱麻。我见过一个真实的项目团队把提示词模板直接写在业务代码里加密逻辑散落各处文档切片逻辑在三个服务里各写了一份。后来业务换了一个模型供应商改了一个星期——因为提示词、参数、回调逻辑全部绑死。这就是典型的“模型直连”模式系统长在模型API上面模型一换系统跟着哭。1.2 一张图理清AI应用的完整链路在画架构之前先忘掉那些花哨的框架和组件我们从一张最朴素的物理分层图开始。AI应用的各个部分天然是有层级的从上到下大概五层----------------------------------------------------- | 接入层 | | Web页面 / 小程序 / 企业IM / 办公套件 / 开放API | ----------------------------------------------------- | 编排层 | | 会话管理 / 路由分发 / Agent编排 / 工具调度 / 记忆管理 | ----------------------------------------------------- | 模型层 | | 模型网关 / 提示词模板 / 模型路由 / 缓存 / 降级策略 | ----------------------------------------------------- | 数据层 | | 向量数据库 / 文档库 / 业务数据库 / 搜索引擎 / 外部工具 | ----------------------------------------------------- | 基础设施层 | | 日志 / 监控 / 权限认证 / 链路追踪 / 配置中心 | -----------------------------------------------------这张图是所有复杂度的基础。你可以把AI应用想象成一个餐厅接入层是大堂用户直接接触编排层是后厨总管决定先做哪个菜、怎么搭配模型层是灶台和大厨负责真正“烹饪”的部分数据层是食材仓库基础设施层是水电和消防平时没存在感出事了才觉得命根子。中间任何一层出了问题餐厅都会翻车。1.3 架构设计的三个关键决策域对照这张图AI应用架构里真正需要拍板的关键决策其实集中在三个域。第一个是模型域用一个大模型还是多个直接接官方API还是自建模型网关统一收口要不要做模型热迁移避免供应商波动时系统瘫痪第二个是数据域哪些数据走向量库做语义检索哪些数据走结构化查询精确取数文档切片的颗粒度怎么定这直接决定RAG效果的上限。很多人以为检索效果差是模型不够聪明其实是数据层没设计好。第三个是编排域复杂任务怎么拆解路由会话上下文放哪里Agent需不需要能调工具调工具时权限边界在哪如果编排层设计成“一笔糊涂账”后面再加功能改一行代码都痛苦。记住这三个决策域后面每一层都是在为这三个域服务。架构设计不是画个分层图就完了真正的功夫在每一层之间的接口契约上——哪一层负责什么、依赖谁的输出、出错了如何降级这些都必须在设计阶段定清楚。2. 分层架构拆解每一层选型背后的门道2.1 接入层别让AI接口裸奔最容易被忽视的往往是接入层。很多项目直接把大模型API暴露给前端省事是真省事但问题也真多。第一是安全失控前端拿着API Key等于把保险柜钥匙挂在门口第二是不可控你没法在中间做流量控制、内容审核、计费统计第三是耦合严重前端一旦直接依赖某个模型接口后面换模型、加参数前端都要跟着改。所以接入层应该统一抽象成你自己的后端API。对外暴露的接口只关心业务语义——比如“提交一个问题”“获取会话列表”不暴露任何模型细节。你的API最好做到就算某天后台把模型供应商换了前端一行代码都不用动。另一个容易被忽略的点是内容安全审核。大模型输出不是100%可靠的接入层如果要做内容合规必须加一道审核过滤。这不是业务要不要做的问题而是生产环境的底线。审核放在接入层最合适因为所有流量都经过这里一次统一拦截比在业务代码里到处打补丁强得多。接入层的选型现成方案很多想做轻量就直接在后端框架里加一个路由模块想做得重可以拆成独立的网关服务。我个人的习惯是初期把接入逻辑放在应用服务里等到需要给第三方开放API时再抽离成独立网关不要一上来就造网关的轮子。2.2 编排层做任务拆解与记忆管理编排层是整个AI应用的“大脑”也是最容易写成一锅粥的地方。它的核心职责有四个理解用户意图、拆解任务、调度模型和工具、维护会话记忆。意图理解这件事过去在传统应用里靠的是写死路由但AI场景下用户输入千变万化。常见做法是先用一个轻量模型做意图识别把“闲聊”“查数据”“执行任务”分流到不同处理器更复杂一些的直接让主模型自己判断并输出结构化指令编排层去解析执行。两种方式没有绝对优劣前者更可控后者更灵活我建议初阶场景先选前者跑稳了再升级。记忆管理是编排层里技术含量最高的部分。大模型自身上下文窗口有限你不可能把用户所有聊天记录全塞进提示词。常见的做法是分层记忆短期记忆存当前会话的最近几轮长期记忆存在外部存储里当用户重新提到某件事时检索相关历史注入上下文。你别小看这个设计很多AI应用“聊着聊着就失忆”就是因为没做记忆分层。再就是工具调度。Agent要调用业务系统时编排层是关键闸口。这里有两个必须注意的细节一是给模型暴露的工具不要太多五六个就足够了多了模型会犯选择困难症反而误调用二是所有工具调用必须考虑失败场景工具挂了系统要能告诉用户“当前服务暂时不可用”而不是让模型编一个假结果出來。编排层的设计心法宁可让逻辑复杂不要让数据流复杂。什么意思编排层你内部函数多、分支多都不怕那些都在代码里可维护。但数据流如果理不清——哪个模块读了哪些数据、写到哪里出问题的时候很难查。所以在设计编排层时第一版本不要一上来就上复杂的Agent框架先用一个明确的路由加处理管线把数据流走通再加编排自由度。2.3 模型层模型网关与提示词资产化模型层是很多人理解的一个“调API的地方”但真正生产级的模型层远比这个复杂。先说模型网关。生产环境里几乎不可能只用一个模型。轻量任务用轻模型省钱复杂推理用大模型保质量主模型出故障时要有备胎供应商价格调整时你可能想切流。创建一个模型网关把所有供应商API统一封装成一套接口核心功能包括模型路由根据任务类型分发到不同模型、请求转发、超时重试、熔断降级、以及token计量。这能解决很大一个痛点模型层面的事故不会直接变成整个系统的灾难。我遇到过最典型的场景某天夜里上游推理服务大规模限流如果当时没有模型网关的降级逻辑整个应用就瘫痪了有了降级系统自动切到备用模型用户体验只是稍微慢了一点一晚上无感知度过。再说提示词资产化。大部分团队都把提示词当成“代码里的字符串”这是一个巨坑。提示词应该当成产品的一部分来管理有版本、有命名、有测试集。每次改提示词要能回答“改了哪些版本、为什么改、对效果有什么影响”。我建议把提示词模板单独抽出来用版本管理工具独立管理配一个简单的测试用例集每次修改都自动跑一遍回归。这套动作看起来不起眼实际收益极大。模型层的另一个关键是缓存策略。对于高频、确定性要求高的请求比如查天气、查政策条款完全没必要每次都让模型从头推理。可以把结果按语义相似度做一个缓存层命中缓存直接返回。我实测过在问答类应用中引入缓存能省掉30%以上的token消耗对成本控制立竿见影。2.4 数据层向量检索与传统数据库的分工数据层是大模型应用与业务结合的关键。很多人一提到AI应用数据架构第一反应就是上向量数据库这个思路其实有点偏。向量数据库解决的是“语义相似”检索的问题但你现在的业务数据大部分是结构化的、精确的。查“员工张三的入职日期是多少”用向量检索反而不精确这种精确查询应该走传统数据库或结构化取数接口。所以在架构里数据层要做分流知识库文档、手册、聊天记录这类非结构化内容做切片、向量化进向量库业务系统里的人员信息、订单状态、库存数据走结构化接口用固定逻辑取数然后拼进提示词上下文。我现在比较推荐的做法是把数据访问统一封装成“知识服务”。业务层不关心数据到底存在哪、向量化用什么模型只调一个统一接口。知识服务内部决定是走向量检索、走SQL还是走搜索引擎。这样做的好处是数据源变更时不影响上层逻辑我在实际项目里因为换过两三次向量库全靠这一层隔离才没折腾到业务团队。向量库本身的选型有几个具体指标要盯检索质量召回率、写入吞吐、索引重建成本、运维复杂度。开源方案胜在可控云托管方案胜在省心没有万能的答案。中小团队如果没有专门的运维人力托管方案通常更合适对数据合规要求高的企业自建更稳。3. 用一个企业内部知识问答场景完整走一遍搭建流程3.1 场景定义与需求拆解理论讲完开始实操。我们用一个人人都能理解、又足够有代表性的场景企业内部知识问答机器人。业务目标是这样的员工可以在聊天界面里问“年假政策是什么”“报销流程怎么走”“某某系统应该怎么用”机器人基于企业规章制度文档给出准确回答。初期阶段只要支持文本问答不用做Agent自动办事。我先把需求拆解成几张表。业务层面核心的约束有这几个知识库内容是PDF和Word总量大约2000份文档总计约100万汉字答案必须基于知识库内容严禁模型编造每天预估请求量3000次集中在工作时段首响应时间不超过5秒系统必须能追踪每一条回答引用了哪份文档。这五个需求直接决定了架构里的几个关键选择RAG检索增强生成是必须的因为要防止幻觉并知道引用来源文档解析和切片是重点需要监控召回率和引用准确率性能上要关注检索生成的端到端延迟。3.2 选型思路与核心组件清单基于需求我开始选型。先画一个我们最终要实现的目标架构仍然是分层思想接入层企业内部IM机器人入口Webhook/消息接口 编排层应用服务负责会话管理、问题改写、答案组装 模型层统一模型网关接入主模型与备用模型 数据层文档解析服务 向量数据库 元信息存储 基础设施日志采集、指标监控、权限控制具体组件怎么定我按每一层来说。接入层走公司现有的IM机器人。这不牵扯开发量很快就能接上。编排层先不引入重型Agent框架。自己写一个轻量管道接收用户消息 → 判断是否有检索需求 → 改写问题 → 检索 → 构造提示词 → 调模型 → 输出。为什么要改写问题因为用户问“它怎么休”如果没有上下文检索器根本不知道“它”指什么。加一步改写把指代词替换成具体名称召回质量能好不少。模型层模型网关我建议直接用主流的开源网关方案做二次开发重点配置主模型选通用能力强的中大型模型备用模型选一个稳定且延迟低的模型两者通过网关自动容灾切换。提示词模板单独管理里面预留知识库引用格式。数据层向量库这里我选开源自托管方案因为数据合规要求高不能出内网。Embedding模型选开源中文向量模型维度1024。文档解析用文本抽取工具把PDF和Word里的文字抽出来再按规则切片。3.3 数据准备解析、切片与入库的完整步骤数据准备是RAG的基石这一步做不好后面检索必然稀碎。我把步骤拆开写每一步都直接可执行。第一步文本抽取。PDF和Word先用解析工具抽文本。这里有个坑很多扫描版PDF里面其实是图片必须加OCR步骤。我一开始没加结果有三分之一的文档检索不到内容召回率惨不忍睹。后来把OCR加进处理流水线文本提取覆盖率才上来。第二步清洗。抽出来的文本有大段页眉页脚、目录、特殊字符这些对检索都是噪音。清洗包括去页眉页脚、去页码、去目录、去无效换行、统一中英文符号。清洗规则不要写得太复杂正则就够了重点是把干扰项剔掉。第三步切片。切片参数直接决定检索质量。我最终选的是按段落优先切段落过长时再按句子边界二次切目标单块长度在300到500字之间。为什么是这个范围块太短语义不完整模型拿不到足够的上下文块太长向量表示平均化检索精度下降而且会浪费大量token。300到500字算是中文场景里一个比较稳的区间。第四步向量化。每块文本调用Embedding模型生成1024维向量。这里要记录“原文ID-切块ID-向量ID”的映射关系后面展示引用来源时要用。第五步入库。向量写入向量库原文和元信息文档名、章节、更新时间写入一个普通数据库表。等你之后做答案溯源可以直接通过切块ID去关联原始文档中的段落。这几个步骤跑完之后我还会做一个验证动作把清洗前的文档量和清洗后的量做对比把每份文档切出的块数做统计。如果某份文档切块数异常少通常说明解析或清洗出问题了要回查。3.4 关键参数的计算与推导过程这里把几个核心参数拿出来正经算一下很多朋友问我“你们怎么定的这个数”我把推导逻辑晒出来。先算token消耗。假设平均每个请求的检索结果召回4个切块每个块平均400字那就是1600字左右的上下文加上系统提示词和用户问题一次请求大概消耗2000 token的输入。每天3000次请求一天的输入token消耗大约是600万。输出方面每条回答平均300字约400 token一天约120万输出token。这样一天的token总量在720万左右。用这个数去乘模型单价能直接算出成本底线比拍脑袋预算靠谱得多。再算向量库索引参数。我用的HNSW算法核心参数是M每个节点的最大连接数和efConstruction构建时的搜索范围。100万条向量规模M设16efConstruction设200是兼顾查询性能和构建时间的常见组合。M太大会导致内存显著上涨M太小召回率下降。efConstruction越大构建越慢但索引质量越好。如果你的数据量只有几十万M设8到12就够了没必要盲目抄大厂配置。最后算延迟预算。5秒的总响应要求怎么拆向量检索大约100到200毫秒可以忽略主要耗时在模型推理。模型文字推理速度大约30-60 token每秒生成400 token需要7到13秒这已经超过5秒预算了。所以必须在架构上做优化一是流式输出让用户先看到文字逐字显示体验上首字响应已经发了二是对简单问题走轻量模型耗时降一半三是对高频问题命中缓存直接返回。三个手段叠加体感响应能控制在2到3秒内。3.5 搭建步骤从空项目到可运行系统选型和参数定好后搭建过程我按时间顺序排了个清单照着做就行。第一步初始化工程骨架。先建一个单体应用仓库把配置中心、日志、基础依赖都拉起来不急着拆分服务。第二步搭模型网关。把主模型、备用模型接入网关写一个最简单的chat接口先能用curl直接调通。验证两条链路都能通方便后面测容灾。第三步实现数据管道。把文档解析、清洗、切片、向量化、入库这条链跑起来做成一个命令行工具可以全量导入。这一步早点做因为要反复调试解析效果。第四步实现检索服务。写一个接口输入问题先做指代改写再做向量检索返回topK个切块。单独测试拿20个真实业务问题去检索检查每一条的召回结果质量。第五步拼装提示词与生成链路。把检索到的切块按模板拼进提示词调用模型生成答案要求模型只基于提供的材料回答并且标注“根据《文档名》”。这是防止幻觉的关键边界。第六步接IM入口。将IM消息回调转发给应用服务返回结果时带流式输出并把回答和引用来源发回聊天窗口。第七步加监控和日志。记录每一次请求的检索召回内容、生成的回答、token开销、耗时以及引用来源。这些日志不只是用来排查问题更重要的是月底能拿出来分析哪些问题总答不好哪些文档总被引用。整个流程我建议一个人一到两周能跑完一个可以内部试用的版本。不要一上来就上K8s、上微服务、上消息队列单体应用跑通等流量和团队规模确实需要了再拆分架构演进一定是跟着团队和复杂度走的。4. 架构落地里的常见问题与排查技巧实录4.1 检索质量差答非所问RAG系统最常背锅的问题就是“答非所问”。很多人第一反应是换更大的模型其实八成问题出在检索侧。排查起来有固定套路。第一步先看召回内容。把系统实际检索到的文本块打出来人工判断这几块内容到底相不相关。如果不相关问题在检索链路如果相关但答案仍然差问题在生成链路。就这个简单的分流能省你大量调参时间。检索链路这边常见原因有三个第一文档切片太粗一个段落里混了多个主题向量被平均化第二用户问题表述跟文档用词不匹配比如文档里写“休假管理办法”用户问“年假怎么请”语义上相关但向量距离不够近第三缺少关键词触发机制有些场景用传统关键词精确匹配比向量检索更可靠尤其是一些专有名词、编号比如“表单编号XX-2024-01”这种。我后来在架构里加了一层混合检索先向量检索召回一批再用关键词检索召回一批合并去重后一起送入模型效果提升明显。成本增加不多但召回覆盖好了不少。4.2 上下文超限与记忆错乱上下文窗口超限是生产环境里非常常见的问题。用户连续聊了几十个问题之后如果系统把之前的内容全塞进提示词必然撞上窗口上限。解决方案就是前面说的分层记忆方案短期记忆只保留最近5到6轮对话中期记忆保存当前对话的摘要长期记忆持久化到外部存储里只在用户明确提及旧内容时做检索召回。我遇到过一种情况用户第一天聊的某个需求第二天又问“那个方案还能改吗”系统因为没有长期记忆就完全懵了。解决方案不是把所有对话历史都塞进去而是把第一天的对话做摘要入库第二天检索到相关摘要后再拼进上下文。这就是为什么编排层一定要把记忆当成一等公民来设计。另外注意塞进提示词的记忆内容也有顺序问题。把最新信息放在靠近用户问题的位置模型会更敏感地利用它这是提示词工程里的位置效应。4.3 成本波动与性能瓶颈生产环境跑起来以后成本往往是最先失控的。我见过一个团队月底收到账单才发现费用超出预算三倍。成本排查有几个抓手。排查手段一看网关日志里token消耗量看是不是某些用户或某些高频问题消耗异常大。排查手段二看是不是有“请求风暴”某条消息触发了一个极其复杂的任务模型被调用了N次token翻了数倍。排查手段三看缓存命中率如果命中率低于20%缓存策略基本白配。优化方向我从收益大到小排序第一给高频、稳定场景接入缓存拦截大量重复请求第二模型分层简单问答走轻量模型复杂任务才用大模型第三控制RAG上下文长度不要贪多召回块的数量够用就行召回6块和召回10块在效果上未必有明显差别但token能省不少第四在网关层加配额限制防止单个用户恶意刷请求。性能方面大部分瓶颈都在模型推理而不是检索。除了流式输出和模型分层还可以考虑对推理做并发池化不过这块涉及推理服务搭建初期的业务应用不需要自己碰直接依赖模型网关的并发能力即可。4.4 过度设计与团队协作问题聊完技术最后必须说一个非技术问题过度设计。AI应用架构现在最大的风险不是做得太少而是做得太多。很多人看了几篇文章就把集群、算子、复杂Agent框架、消息引擎全堆上去。结果系统配置复杂到没人敢动改个提示词要过好几个组件发布效率反而低下。我的建议非常直接架构的复杂度永远跟着业务复杂度走。早期产品验证阶段你只需要“单体应用模型网关向量库”就够了。等到用户量、团队规模、业务场景确实上去了再逐步拆服务和上更重的组件。每一次架构升级都应该绑定一个具体的业务痛点。团队协作上也有一个值得注意的点提示词、文档切片、向量库索引管理这三类资产必须放在基础工程设施里做版本管理。很多团队把这三种资产散落在个人电脑和个人笔记里每次改动靠口头沟通这是项目后续最大的隐性风险。把它变成有版本的工程资产新人上手快线上变更可控出问题能回溯这笔投入回报率极高。我在实际项目中吃过最大的亏就是低估了数据处理和版本管理的重要性。模型API调用反而是最成熟、最不容易出问题的环节真正决定AI应用体验的是数据切得干不干净、上下文组织得合不合理、提示词版本管不管得住。建议所有正在做AI应用的朋友把至少一半的架构精力放在数据层和编排层上别让模型层的光芒掩盖了真正的工程重点。另外如果你要动手做还有一个忠告从真实、具体的业务场景出发去设计不要先选了一堆组件再找场景。先找到值得解决的业务问题再回来定架构顺序对了后面的路会顺很多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。