
1. 从能跑通到敢上线企业级 LLM 到底卡在哪很多人第一次接触 LLM 应用都是从一个几十行的脚本开始的调个 API拼一段 prompt本地跑通效果惊艳然后信心满满地跟老板说这个能做。结果真到了要接入公司业务系统、要面对真实用户、要处理敏感数据的时候才发现事情完全不是那么回事——模型偶尔胡说八道、响应时快时慢、成本算不清楚、数据合规过不了审、出了问题根本不知道是哪一环崩的。这就是企业级 LLM和个人玩票 LLM之间那道看不见的鸿沟。所谓企业级核心不是模型参数有多大、榜单排名有多高而是这套系统能不能在真实业务压力下稳定、可控、可观测、可追溯、可迭代。它要面对的是并发、是成本、是合规、是故障恢复是半夜三点报警了谁去处理这种极其现实的问题。我打算用几篇的篇幅把企业级 LLM 从架构设计到落地运维的完整链路拆开讲清楚。这一篇先解决最顶层的问题企业级 LLM 系统的整体架构应该怎么搭各个模块的边界在哪里以及为什么很多团队一开始就把方向搞错了。不管你是刚被安排去做公司大模型应用的工程师还是正在评估要不要自建 LLM 平台的负责人这篇都能帮你少走至少半年的弯路。需要先说明一点企业级 LLM 不是一个单一技术而是一整套工程体系。它至少包含模型接入层、编排调度层、数据与知识层、评测与观测层、安全与权限层这几大块。下面我会逐块拆解每一块都会讲清楚为什么需要它常见做法是什么坑在哪里。2. 企业级 LLM 的架构分层别把编排层和模型层搅在一起2.1 为什么一个脚本打天下必然失败我见过太多团队第一版 LLM 应用就是一个 Flask 接口里面直接写死了模型调用、prompt 拼接、业务逻辑、数据库查询。刚开始只有一两个功能改起来还挺快。等到功能涨到十几个、模型从一家换成三家、prompt 要按用户角色动态调整的时候这个文件就变成了没人敢动的屎山。问题的根源在于职责没有分层。模型调用是会变的今天用 A 家明天可能换 B 家或者本地部署prompt 是会变的业务方天天提需求业务逻辑是会变的产品经理的脑洞但它们的变更频率和变更原因完全不同。把它们耦合在一起任何一处改动都会牵一发动全身。企业级架构的第一原则就是按变更频率分层。变更最频繁的放最上层最稳定的放最底层。模型接入层相对稳定除非你要频繁换供应商编排层变化中等业务逻辑层变化最快。分层之后换模型不用动业务代码改 prompt 不用重新部署整个服务。2.2 五层架构的职责边界我把企业级 LLM 系统拆成五层从下往上说模型接入层Model Gateway这一层负责屏蔽底层模型的差异。不管是云端 API、私有化部署的开源模型还是不同厂商的接口统一收敛成一套内部协议。它的核心价值是可替换性——当某个供应商涨价、限流、或者服务不稳定时你能在配置层面切换而不是改代码。这一层还要处理重试、超时、限流、熔断这些基础的稳定性问题。编排调度层Orchestration这是整个系统的大脑。它负责把用户请求拆解成一系列步骤——要不要检索知识库、要不要调用工具、要不要多轮推理、用哪个模型处理哪一步。现在流行的 Agent、Workflow、RAG 都发生在这一层。它的核心是把复杂任务拆成可控的原子操作并且每一步都可观测、可干预。数据与知识层Data Knowledge企业级 LLM 和通用聊天机器人的最大区别就是它要基于企业自己的数据回答问题。这一层包括向量库、文档处理管道、知识图谱、以及数据的更新和版本管理。它的难点不在技术选型而在数据治理——文档格式五花八门、内容过期、权限复杂这些才是真正耗时间的地方。评测与观测层Eval Observability这是最容易被忽略、但企业级最不能省的一层。没有评测你根本不知道改了一版 prompt 之后效果是变好还是变差没有观测线上出了问题你只能靠猜。这一层要记录每一次调用的完整链路输入、输出、耗时、token 消耗、命中的知识片段并且有一套自动化的评测集来回归验证。安全与权限层Security Governance企业数据不能随便喂给外部模型用户只能看到自己有权限的内容输出不能包含敏感信息。这一层要处理数据脱敏、访问控制、内容审核、审计日志。很多团队做到一半才发现合规过不了回头返工代价极大。2.3 分层不是目的解耦才是需要强调的是分层本身不是目的。小团队完全可以把前两层合并甚至五层都塞进一个服务里只要模块之间的接口是清晰的。我见过一个三人团队用单体架构把 LLM 应用做得非常稳因为他们把每个模块都写成了独立的类接口定义得很干净将来要拆随时能拆。反过来我也见过一上来就上微服务、上消息队列、上 K8s 的团队结果因为人手不够运维成本压垮了整个项目。架构的复杂度要匹配团队的规模和业务的真实需求这是我在多个项目里反复验证过的经验。企业级不等于复杂企业级等于该有的都有不该有的一个都不多。3. 模型接入层把换模型变成改一行配置3.1 统一协议是接入层的地基模型接入层要解决的核心问题是让上层代码不感知底层用的是哪家模型。做法是定义一套内部统一的请求和响应格式所有外部模型都通过适配器Adapter转换到这套格式。一个典型的内部请求结构大概长这样class LLMRequest: messages: list[dict] # 对话历史统一成 role/content 结构 model_alias: str # 内部别名如 fast、smart、cheap temperature: float max_tokens: int tools: list[dict] | None # 工具定义统一格式 metadata: dict # 业务透传信息如用户ID、会话ID注意这里用的是model_alias而不是具体的模型名。上层业务只说我要一个快的或者我要一个聪明的具体映射到哪个厂商的哪个模型由配置决定。这样当你想把smart从 A 模型换成 B 模型时只改配置业务代码一行不动。响应格式同理要统一成包含content、tool_calls、usage、finish_reason这些字段的结构。不同厂商的字段名千奇百怪适配器的工作就是把这些差异吃掉。3.2 重试、超时、限流稳定性三件套模型调用是典型的不可靠外部依赖。网络会抖、供应商会限流、偶尔会返回 5xx。接入层必须把这些处理掉不能让上层业务去操心。超时要分层设置。连接超时短一点比如 5 秒读取超时长一点比如 60 秒因为大模型生成慢。但要注意流式输出streaming场景下超时逻辑不一样不能用固定的读取超时而应该用两个 token 之间的最大间隔来判断。重试要区分错误类型。网络超时、5xx 可以重试4xx比如参数错误、余额不足重试没意义重试只会浪费时间和钱。重试要加指数退避避免雪崩。我一般设置最多重试 2 次间隔 1 秒、2 秒。限流要双向做。一方面限制对上游供应商的调用速率避免触发对方的限流另一方面限制下游业务对模型的调用避免某个业务把配额吃光。用令牌桶或者滑动窗口都行关键是按业务维度隔离别让一个业务拖垮所有业务。# 简化的重试逻辑示意 def call_with_retry(request, max_retries2): for attempt in range(max_retries 1): try: return adapter.call(request, timeout(5, 60)) except RetryableError as e: if attempt max_retries: raise time.sleep(2 ** attempt) except NonRetryableError: raise3.3 成本核算接入层顺手就做了成本控制是企业级绕不开的话题。好消息是成本核算放在接入层做最自然因为所有调用都经过这里。每次调用记录下模型、输入 token 数、输出 token 数乘以单价就能算出这次调用的成本。我建议在接入层就把成本算出来写进响应的 metadata 里透传给上层。这样业务侧可以按用户、按功能、按部门做成本归集。很多公司到了月底才发现账单爆炸就是因为没有在调用发生时就记录成本。提示不同模型的计费方式差异很大有的按输入输出分别计价有的有缓存命中折扣有的按图片/音频单独计费。接入层的成本计算模块要能配置这些规则别写死。3.4 一个容易踩的坑别在接入层做业务判断接入层要克制。它的职责就是把请求可靠地送到模型把结果可靠地带回来不要在里面塞业务逻辑。我见过有人在接入层做如果用户是 VIP 就用贵模型这种判断结果后来业务规则变了改起来特别别扭。这类判断应该放在编排层接入层只认model_alias。4. 编排调度层Agent 不是越自主越好4.1 从固定流程到动态编排编排层要回答的核心问题是一个用户请求应该经过哪些步骤才能得到答案。最简单的场景是直接问模型复杂一点的场景是先检索知识库再让模型基于检索结果回答再复杂就是模型自己决定要不要调用工具、调用哪个工具、调用几次。这三种对应了三种编排模式直连、固定工作流Workflow、自主 Agent。很多团队一上来就想做自主 Agent觉得这样最智能。但我的经验是在企业场景里固定工作流的性价比远高于自主 Agent。原因很简单企业业务大多是有明确流程的。报销就是报销客服就是客服这些流程的步骤是确定的用工作流把步骤固定下来可控、可测、可优化。自主 Agent 虽然灵活但它的不确定性正是企业最怕的东西——同样的输入今天走这条路明天走那条路出了问题很难复现评测也很难做。4.2 工作流编排的三种粒度固定工作流也有粒度之分。最粗的是整链路固定比如检索→重排→生成→审核四步写死。中等的是步骤内可选比如检索这一步可以选向量检索或关键词检索。最细的是步骤内参数动态比如根据问题类型动态调整检索的 top_k。我一般建议从整链路固定开始跑通了再逐步细化。因为一开始你根本不知道哪个环节是瓶颈过早优化是浪费。等有了评测数据发现检索召回率不够或者生成阶段幻觉多再针对性地调整那一步。4.3 工具调用的边界设计如果确实需要工具调用比如查订单、发邮件、算数据工具的设计有几个原则工具要少而精。给模型 20 个工具它选择错误的概率会大幅上升。我一般控制在 5 个以内超过就考虑分组或者用路由先分类。工具描述要写清楚什么时候用。很多人只写工具功能不写使用场景。模型不知道边界就会乱用。好的描述应该包含这个工具做什么、什么情况下该用、什么情况下不该用、参数的含义和格式。工具要有幂等性和超时保护。模型可能会重复调用同一个工具工具本身要能处理重复请求。工具执行也要有超时不能让一个卡住的工具拖垮整个请求。4.4 上下文管理编排层的隐形战场多轮对话、多步推理会产生大量上下文而模型的上下文窗口是有限的。编排层要负责上下文的裁剪和压缩。常见做法有几种滑动窗口只保留最近 N 轮、摘要压缩把早期对话总结成一段话、关键信息提取只保留实体和结论。我实测下来摘要压缩 关键信息提取的组合效果最好但实现也最复杂。这里有个反直觉的经验不是上下文越长效果越好。太长的上下文会让模型注意力分散反而降低回答质量还增加成本。我一般会把上下文控制在模型窗口的 50% 到 70% 之间留出空间给检索结果和工具返回。5. 数据与知识层RAG 的成败 90% 在数据治理5.1 向量检索不是银弹RAG检索增强生成现在几乎是企业 LLM 的标配。但很多人对它的理解停留在把文档切块、embedding、存向量库、检索 top_k这个层面结果做出来的效果很差然后得出结论RAG 没用。问题不在 RAG在于数据治理没做好。企业文档的实际情况是格式混乱Word、PDF、Excel、PPT、扫描件、结构不一有的有标题层级有的是纯文本、内容重复同一份文档多个版本、时效性差三年前的制度还在库里。这些脏数据直接切块入库检索出来的东西自然不靠谱。5.2 文档处理管道的四个关键环节一个靠谱的文档处理管道至少要经过四个环节解析把各种格式转成纯文本同时保留结构信息标题、段落、表格。PDF 解析是重灾区扫描件要 OCR复杂排版要版面分析。这块没有银弹只能针对企业实际文档类型逐个攻克。清洗去掉页眉页脚、水印、乱码、重复内容。这一步很枯燥但极其重要脏数据会污染整个检索结果。切块不是简单地按字数切。好的切块要按语义边界切比如按标题层级、按段落。块的大小也要权衡太小则信息不完整太大则检索精度下降。我一般把块控制在 300 到 800 字之间并且保留一定的重叠overlap来避免边界信息丢失。元数据标注给每个块打上来源、部门、时间、权限等标签。这些元数据在检索时可以用来过滤比如只检索用户有权限的部门文档只检索最近一年的内容。5.3 混合检索向量 关键词纯向量检索有个明显短板对精确匹配不敏感。用户问XX-2024-001 号文件的第三条向量检索可能找不相关的内容因为它不理解这种精确的编号。解决办法是混合检索向量检索负责语义相似关键词检索BM25 之类负责精确匹配两路结果融合后重排。融合算法可以用 RRFReciprocal Rank Fusion简单有效。def hybrid_search(query, top_k10): vector_results vector_store.search(query, top_ktop_k) keyword_results bm25_index.search(query, top_ktop_k) # RRF 融合 scores {} for rank, doc in enumerate(vector_results): scores[doc.id] scores.get(doc.id, 0) 1 / (60 rank) for rank, doc in enumerate(keyword_results): scores[doc.id] scores.get(doc.id, 0) 1 / (60 rank) return sorted(scores.items(), keylambda x: -x[1])[:top_k]5.4 重排把好钢用在刀刃上检索出来的 top_k 结果顺序未必对。这时候用一个重排模型Reranker对结果重新排序能显著提升最终效果。重排模型比 embedding 模型慢但比大模型快得多性价比很高。我的做法是检索阶段召回多一点比如 20 个重排阶段精选少一点比如 5 个最后喂给大模型。这样既保证了召回率又控制了上下文长度。5.5 数据更新别让知识库变成历史博物馆企业知识是不断更新的。制度改了、产品迭代了、价格调整了知识库必须跟着更新。但很多团队的知识库是一次性的建完就不管了半年后里面的内容全过期了。数据更新要解决两个问题怎么知道要更新和怎么更新。前者可以靠文档管理系统的变更通知或者定期全量扫描对比。后者要支持增量更新——新增文档入库、修改文档重新切块、删除文档清理索引。这里有个坑向量库的删除和更新往往比插入慢。如果更新频繁要考虑用支持高效更新的向量库或者用版本化的方式新版本入库、旧版本标记失效定期清理。6. 评测与观测没有度量就没有优化6.1 为什么评测是企业级的门槛个人玩 LLM效果好不好靠感觉。企业级不行因为你要对效果负责要能回答这版比上版好在哪里为什么这个用户投诉了。评测体系要解决三个层次的问题单点评测某个 prompt 改动的效果、链路评测整个 RAG 或 Agent 流程的效果、线上评测真实用户场景的效果。三个层次缺一不可。6.2 构建评测集的实操方法评测集不是随便找几个问题就行。好的评测集要满足覆盖真实场景、有标准答案、有难度梯度。我的做法是从线上真实请求里采样人工标注标准答案按业务场景和难度分类。初期每个场景 20 到 50 条就够用随着系统迭代逐步扩充。关键是评测集要冻结不能因为某次评测结果不好就偷偷改评测集那就失去意义了。评测指标要分场景选。问答类看准确率和召回率生成类看人工评分或 LLM-as-Judge工具调用类看调用成功率。LLM-as-Judge 现在很流行但要注意它本身也有偏差最好和人工评分做校准。6.3 全链路追踪出问题能定位到具体环节线上出问题时最怕的是不知道哪一步错了。全链路追踪要记录每一次请求的完整链路用户输入、编排决策、检索结果、模型调用、工具执行、最终输出每一步的耗时和中间结果都要留痕。技术上可以用 OpenTelemetry 这类标准方案也可以用简单的日志表。关键是trace_id 要贯穿全链路从入口到出口能串起来。我一般会在请求入口生成一个 trace_id透传到每一层所有日志都带上这个 id。6.4 线上监控的几个关键指标除了常规的 QPS、延迟、错误率LLM 系统还要盯几个特有指标指标含义异常信号Token 消耗每次调用的输入输出 token 数突然飙升可能是 prompt 膨胀或死循环检索命中率检索结果被模型实际引用的比例偏低说明检索质量差工具调用成功率工具执行成功比例下降说明工具或依赖出问题拒答率模型拒绝回答的比例突然升高可能是 prompt 或安全策略问题用户反馈率点赞点踩的比例是效果的最直接信号这些指标要配告警。比如 token 消耗超过阈值、错误率超过 5%、延迟 P99 超过 10 秒都要触发告警。7. 安全与权限合规是底线不是上限7.1 数据不出域企业最硬的约束很多企业尤其是金融、医疗、政务有硬性要求数据不能出企业内网。这意味着不能用公有云的模型 API必须私有化部署。私有化部署的代价是模型能力可能不如云端最强模型、需要自己维护 GPU 集群、运维成本高。如果确实要用云端模型那就要做数据脱敏把敏感信息姓名、身份证、手机号、金额在发送前替换成占位符收到结果后再还原。但脱敏本身有风险替换和还原的逻辑要非常严谨否则会出错。7.2 权限控制用户只能看到他能看的RAG 场景下权限控制尤其重要。用户 A 不能通过提问获取到用户 B 或别的部门的数据。做法是在检索阶段就做权限过滤——每个文档块带权限标签检索时只返回当前用户有权限的块。这里有个坑权限过滤要在检索前做不能检索后再过滤。因为检索后再过滤会导致返回结果数量不足而且可能泄露存在但无权访问的信息。正确做法是把权限条件作为检索的硬性过滤条件。7.3 输出审核模型可能口无遮拦模型输出可能包含敏感信息、不当言论、或者幻觉编造的内容。企业级系统必须有输出审核环节。审核可以是规则关键词黑名单、模型用另一个模型判断、或者两者结合。审核的难点是平衡安全和体验。审核太严正常问题也被拦用户体验差审核太松风险内容漏出去。我的经验是分级处理高风险内容直接拦截中风险内容加提示低风险内容放行。分级规则要根据业务场景调整。7.4 审计日志出了问题能追溯企业级系统要能回答谁在什么时候问了什么、系统回答了什么。审计日志要完整记录请求和响应并且不可篡改。日志本身也要做权限控制不是谁都能看。审计日志的存储要考虑成本和合规要求。一般热数据存几个月冷数据归档。归档的数据要能按需检索以备合规检查。8. 落地节奏别想一口吃成胖子8.1 从最小可用闭环开始我见过太多团队一上来就想做一个全能 LLM 平台结果做了半年还没上线。正确的做法是先做一个最小可用闭环选一个具体的业务场景把从输入到输出的完整链路跑通哪怕只有最基础的直连模型先上线拿到真实反馈。这个最小闭环要包含一个真实场景、一套基础评测、基本的日志记录。有了这个你才能知道下一步该优化什么。没有真实反馈的优化都是瞎猜。8.2 迭代的优先级排序拿到真实反馈后优化要有优先级。我的排序原则是先解决错得离谱的问题再解决不够好的问题。比如检索完全找不到相关内容这是错得离谱优先解决回答风格不够正式这是不够好可以往后放。很多团队把精力花在调 prompt 让回答更漂亮却忽略了检索质量这个根本问题本末倒置。8.3 团队配置的现实建议企业级 LLM 项目需要的能力包括后端工程、数据处理、算法调优、运维。小团队不可能每个方向都配专人但至少要有人能覆盖一个人负责工程架构和稳定性一个人负责数据和评测。算法调优可以后期再补因为前期主要是工程问题不是算法问题。我特别想强调评测这个角色。很多团队没有专人做评测导致优化全靠感觉。哪怕只有半个人力也要把评测体系建起来这是企业级和玩票的分水岭。8.4 一个真实的踩坑教训最后分享一个我踩过的坑。早期做 RAG 时我们花大力气优化了 embedding 模型和检索算法效果提升有限。后来发现真正的问题是文档切块——我们按固定字数切把很多完整的语义单元切碎了。改成按标题和段落切之后效果直接上了一个台阶。这个教训是在 LLM 系统里数据质量的重要性往往高于算法。与其花时间调模型参数不如先把数据管道做扎实。这个道理听起来简单但真正做的时候人总是倾向于去调那些看起来更高级的东西。企业级 LLM 这条路技术只是其中一部分更多的是工程判断和取舍。下一篇我会具体讲编排层的实现细节包括工作流引擎怎么选、Agent 的边界怎么定、以及多模型路由的实战策略。