拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

企业级LLM架构设计:从单机Demo到生产级服务的工程化实践

企业级LLM架构设计:从单机Demo到生产级服务的工程化实践

1. 从单机Demo到企业级LLM:为什么“能跑通”和“能扛住”是两码事

很多团队第一次把大模型接入业务系统时,走的都是同一条路:本地拉个开源模型,写个Python脚本调通接口,输出一段看起来像模像样的回答,然后兴冲冲地拿去给业务方演示。演示效果通常不错,但一旦进入真实生产环境——并发上来了、请求变长了、知识库更新了、多个业务线同时要接——问题就会像潮水一样涌出来。

我在过去两年里参与过好几个企业级LLM项目的落地,从最初的“单机跑通”到后来的“多租户稳定服务”,中间踩的坑足够写一本小册子。这一篇主要聊的是企业级LLM的架构设计思路和落地细节,不涉及具体某个模型的调参技巧,而是聚焦在工程化这个层面:怎么让LLM从一个玩具变成一个真正能支撑业务的基础设施。

先说一个最核心的认知转变:企业级LLM的本质不是一个模型,而是一套服务系统。模型只是其中的一个组件,围绕它还需要有网关层、缓存层、知识检索层、监控层、降级策略、成本控制等等。很多团队失败的原因不是模型选得不好,而是把全部精力放在了模型上,忽略了周边工程。

这篇文章适合谁看?如果你正在负责或参与企业内部的LLM平台建设,或者你是一个开发者想了解生产级LLM系统和Demo之间的差距,那接下来的内容应该对你有直接参考价值。我会尽量把每个设计决策背后的“为什么”讲清楚,而不是只给一堆配置。

2. LLM网关层:企业级架构的第一道关口

2.1 为什么不能业务系统直连模型

在Demo阶段,业务代码直接调模型的API是完全没问题的。但到了企业级场景,这种做法的弊端会迅速暴露。我列几个实际遇到过的问题:

  • 密钥管理混乱:每个业务线各自持有模型API Key,一旦有人离职或者Key泄露,排查和轮换成本极高。
  • 无法统一限流:某个业务线突然发起大量请求,把模型服务的配额打满,其他业务线全部受影响。
  • 模型切换困难:今天用A模型,明天想换B模型,每个业务系统都要改代码、重新测试、重新上线。
  • 缺乏可观测性:谁在调、调了多少次、花了多少钱、响应时间多少,全都是一笔糊涂账。

LLM网关的核心价值就是把这些横切关注点从业务系统中抽离出来,统一在网关层解决。你可以把它理解成一个“模型流量的反向代理+策略中心”。

2.2 网关的核心功能拆解

一个合格的企业级LLM网关,至少需要覆盖以下几块能力:

统一接入与协议适配。不同模型提供商的API协议各不相同,有的用OpenAI兼容格式,有的用自己的一套。网关需要做一层协议转换,对上暴露统一的接口规范,对下适配不同的后端模型。这样业务系统只需要对接网关的接口,换模型时业务代码零改动。

鉴权与租户隔离。每个业务线或团队分配独立的租户ID和访问凭证,网关根据租户ID做权限校验、配额管理和计费统计。这里有个细节:租户的粒度设计很关键。太粗了没法精细化管理,太细了运维成本高。我的经验是按“业务线+环境”来划分租户,比如“客服系统-生产”“客服系统-测试”是两个独立租户。

限流与熔断。限流策略要分多个维度:按租户限流、按接口限流、按模型限流。熔断则是在后端模型服务出现异常时,快速失败而不是让请求堆积。这里推荐用令牌桶算法做限流,配合滑动窗口做统计,实测下来比固定窗口更平滑。

请求路由与负载均衡。同一个模型可能部署了多个实例,网关需要根据实例的健康状态和负载情况做路由。如果有多模型策略(比如简单问题走小模型、复杂问题走大模型),路由层还需要支持基于规则或语义的分流。

日志与可观测性。每一次请求的输入、输出、耗时、Token消耗、模型版本都要记录。这些数据不仅是计费依据,更是后续优化的重要素材。但要注意:日志中可能包含敏感信息,必须做脱敏处理。

2.3 网关选型:自研还是用开源

这是很多团队纠结的问题。我的建议是:如果团队有较强的后端工程能力,优先考虑基于开源网关做二次开发;如果团队规模小、时间紧,直接用成熟的开源方案。

目前社区里比较活跃的方案有几类:一类是基于Nginx/OpenResty做扩展,性能好但开发效率一般;一类是用Go或Java写的专用LLM网关,功能更贴合场景;还有一类是在API网关(如Kong、APISIX)上挂插件。

我实际用过的一个组合是:APISIX做基础网关 + 自定义Lua插件做LLM特有的逻辑(Token计数、模型路由)。这个方案的好处是APISIX本身的功能很完善(限流、鉴权、监控都有现成的),只需要补LLM特有的部分。缺点是Lua的开发和调试体验一般,复杂逻辑写起来比较痛苦。

如果重新选一次,我可能会考虑用Go写一个轻量级的专用网关,核心逻辑自己掌控,性能也足够。但前提是团队里有人能维护这个服务。

注意:网关层不要做太重的业务逻辑。我见过有团队把Prompt模板管理、结果后处理都塞进网关,结果网关变成了一个巨大的单体应用,改一处影响全局。网关的职责应该保持单一:流量管理、鉴权、路由、日志。

3. 知识检索层:RAG不是万能药,但没有RAG万万不能

3.1 企业知识库的特殊性

通用大模型的知识来自公开训练数据,但企业内部的业务知识——产品文档、操作手册、历史工单、内部规范——模型是不知道的。让模型回答这类问题,要么胡编,要么拒答。RAG(检索增强生成)就是解决这个问题的标准方案。

但企业知识库和通用知识库有几个显著区别,直接影响了RAG系统的设计:

知识更新频率高。产品文档可能每周都在改,工单每天都有新增。这意味着索引必须支持增量更新,不能每次全量重建。

知识结构复杂。有结构化的表格数据,有半结构化的Markdown文档,有非结构化的聊天记录,还有扫描件PDF。不同结构的数据需要不同的解析和切分策略。

权限控制严格。不同部门的员工能看到的知识范围不同。HR的政策文档不能让研发看到,财务的数据不能让销售看到。RAG系统必须和企业的权限体系打通。

对准确率要求高。通用场景下模型说错一句话无所谓,但企业内部如果给出了错误的操作指引,可能导致生产事故。所以RAG的召回质量和答案的可靠性要求更高。

3.2 文档切分:最容易被低估的环节

很多人做RAG时把大量精力花在向量模型选型和检索算法调优上,却忽略了最基础的一步:文档切分。我踩过的坑里,至少有一半和切分策略有关。

固定长度切分是最简单的做法,比如每500个字符切一段。但这样很容易把一段完整的逻辑切断,导致检索到的片段缺少上下文。比如一个操作步骤被从中间切开,模型拿到半截步骤,生成的答案就是错的。

更好的做法是基于文档结构切分。Markdown按标题层级切,HTML按DOM树切,PDF先做版面分析再按段落切。每个片段除了正文内容,还要保留它的“上下文路径”——比如它属于哪个章节、哪个子章节。这样检索时可以把路径信息一起带给模型,帮助它理解片段的语境。

对于表格数据,切分策略又不一样。一个表格不能按行切散,要么整表保留,要么按业务逻辑分组。如果表格很大,可以考虑把表头和每一行拼在一起作为一个独立片段。

还有一个细节:片段之间的重叠。相邻片段之间保留10%-20%的重叠内容,可以避免关键信息刚好落在切分边界上被丢失。但重叠太多会增加索引体积和检索噪音,需要权衡。

3.3 检索策略:从向量检索到混合检索

最早的RAG方案基本就是“向量检索+拼接”,把用户问题向量化,在向量库里找最相似的Top-K片段,塞进Prompt让模型生成答案。但实际用下来,纯向量检索有几个明显问题:

  • 对关键词不敏感:用户搜“错误码E5021”,向量检索可能返回一堆语义相似但不包含这个错误码的片段。
  • 对精确匹配支持差:产品型号、人名、专有名词这类需要精确匹配的场景,向量检索经常翻车。
  • 召回率不稳定:不同的问题类型,向量检索的效果波动很大。

所以现在企业级RAG基本都会上混合检索:向量检索 + 关键词检索(BM25/全文索引),两路结果做融合排序。融合算法常用RRF(Reciprocal Rank Fusion),简单有效,不需要调太多参数。

再进一步,还可以加一层重排序。先用混合检索召回较多的候选片段(比如Top-50),再用一个交叉编码器模型做精排,选出最相关的Top-5送给大模型。这一步能显著提升答案质量,但会增加延迟,需要根据业务场景决定是否启用。

如果知识库规模很大(比如超过百万片段),还可以考虑分层检索:先按分类或标签做粗筛,再在子集内做精细检索。这样既能保证召回率,又能控制检索延迟。

3.4 GraphRAG与知识图谱的融合

最近半年GraphRAG是一个热门方向。简单说,就是在传统RAG的基础上引入知识图谱,把实体和实体之间的关系也纳入检索范围。这样做的好处是能回答一些需要多跳推理的问题。

举个例子:用户问“A产品的某个功能在B版本中是否被移除了”。传统RAG可能只能分别检索到A产品的功能文档和B版本的更新日志,但无法建立两者之间的关联。GraphRAG可以通过知识图谱找到“A产品-功能X-版本B”这条关系链,给出更准确的答案。

但GraphRAG的落地成本不低。构建知识图谱需要做实体抽取、关系抽取、图谱存储和查询,每一步都有技术挑战。我的建议是:如果业务场景确实需要多跳推理,再考虑上GraphRAG;如果只是简单的问答检索,传统混合检索已经够用了。不要为了追新技术而过度设计。

4. 模型服务层:推理部署与性能优化

4.1 推理框架的选择逻辑

企业级LLM的推理部署,核心要考虑三个指标:吞吐量、延迟、显存占用。这三个指标往往是互相矛盾的,需要根据业务场景做取舍。

目前主流的推理框架有vLLM、TensorRT-LLM、TGI等。vLLM的优势是PagedAttention技术带来的高吞吐和低显存碎片,社区活跃,上手快。TensorRT-LLM的性能上限更高,但编译和调优成本也更高,适合对性能有极致要求的场景。TGI是HuggingFace出的,和Transformers生态集成好,但性能上不如前两者。

我实际项目里用得最多的是vLLM。它的Continuous Batching机制对多并发场景非常友好,实测在A100上跑7B模型,吞吐量比朴素实现高出好几倍。而且它支持OpenAI兼容的API,和网关层对接很方便。

如果模型需要量化部署(比如INT8或INT4),vLLM也支持AWQ和GPTQ量化格式。量化能显著降低显存占用,但会带来一定的质量损失。我的经验是:7B以上的模型做INT8量化,质量损失基本可以接受;INT4量化则要看具体模型,有些模型量化后会出现明显的质量下降。

4.2 多模型策略:不是所有问题都需要大模型

企业级场景下,如果所有请求都走最大的模型,成本会高得离谱。实际上,很多请求用一个小模型就能处理好。所以多模型分级策略是控制成本的关键手段。

具体怎么做?可以在网关层加一个请求分类器,根据问题的复杂度、领域、预期输出长度等特征,决定路由到哪个模型。分类器可以是一个轻量级的文本分类模型,也可以是基于规则的判断。

比如:简单的FAQ问答走7B小模型,复杂的分析报告走70B大模型,代码生成走专门的代码模型。这样整体成本能降下来一大截,而用户体验几乎不受影响。

分类器的准确率很关键。如果分类错了,简单问题走了大模型,浪费成本;复杂问题走了小模型,答案质量差。所以分类器需要持续迭代,用线上数据做反馈优化。

4.3 缓存策略:省钱又提速的利器

LLM推理是计算密集型的,同样的请求重复计算非常浪费。缓存策略分两个层面:

精确缓存:对完全相同的请求(相同的Prompt、相同的参数),直接返回缓存结果。实现简单,用Redis就行。但命中率取决于业务的重复请求比例。客服场景下重复问题多,命中率可能到30%以上;创意生成场景下几乎不重复,命中率很低。

语义缓存:对语义相似但不完全相同的请求,也返回缓存结果。比如“怎么重置密码”和“密码忘了怎么办”语义相同,可以命中同一个缓存。语义缓存需要用向量相似度来判断,实现复杂度更高,但命中率也更高。

语义缓存的关键是相似度阈值的设定。阈值太高,命中率低;阈值太低,可能返回不相关的答案。我的经验是从0.95开始试,根据实际效果逐步调整。另外,缓存要设置合理的过期时间,特别是知识库更新后,旧缓存要及时失效。

5. 可观测性与成本控制:看不见的才是最难管的

5.1 监控指标体系

企业级LLM系统的监控不能只看“服务是否存活”,需要建立一套完整的指标体系:

指标类别具体指标监控目的
可用性请求成功率、错误率、超时率判断服务是否正常
性能P50/P95/P99延迟、首Token时间评估用户体验
吞吐QPS、并发数、Token处理速度评估系统容量
质量答案采纳率、用户反馈评分评估输出质量
成本Token消耗量、单位请求成本控制预算
安全敏感内容拦截率、异常请求比例合规审计

这些指标需要按租户、按模型、按接口维度分别统计,才能定位到具体问题。比如整体成功率下降了,是某个租户的请求出了问题,还是某个模型实例挂了,还是某类问题触发了安全拦截。

5.2 成本归因与优化

LLM的成本主要是Token消耗。输入Token和输出Token的单价不同,不同模型的单价也不同。要做好成本控制,首先得做好成本归因:每个租户、每个业务线、每个功能模块分别消耗了多少Token,花了多少钱。

有了归因数据,才能有针对性地优化。常见的优化手段包括:

  • Prompt压缩:精简系统提示词,去掉冗余的示例,能省不少输入Token。
  • 输出长度限制:根据业务需要设置max_tokens,避免模型生成过长的无用内容。
  • 缓存复用:前面提到的精确缓存和语义缓存。
  • 模型降级:非关键场景用更便宜的小模型。
  • 批量处理:非实时场景可以把多个请求合并成一个批次处理,提高GPU利用率。

我见过一个团队,上线第一个月Token费用超预算三倍,排查后发现是系统提示词写得太长,每次请求都带了几千Token的冗余说明。精简之后成本直接降了一半。所以成本优化往往不需要多高深的技术,先把基础工作做扎实就能省很多钱。

5.3 告警与应急响应

监控数据要配合告警才有意义。告警规则的设计要避免两个极端:太灵敏会导致告警疲劳,太迟钝会错过问题。我的经验是分级别设置:

  • P0告警:服务完全不可用、错误率超过阈值、成本异常飙升。需要立即响应。
  • P1告警:延迟明显上升、某个模型实例异常、缓存命中率骤降。需要在工作时间内处理。
  • P2告警:质量指标下降、某个租户用量异常。可以定期review。

应急响应方面,最重要的是降级预案。当大模型服务不可用时,能不能自动切换到备用模型?当检索服务挂了时,能不能退化为纯模型问答?这些预案要提前设计好并定期演练,不能等出事了再想。

6. 落地过程中的几个真实教训

6.1 不要一开始就追求完美架构

我参与的第一个企业级LLM项目,光是架构设计就讨论了两个月,画了几十张图,结果上线时间一推再推。后来复盘发现,很多设计决策在当时的信息条件下根本做不对,只有先上线跑起来,才能知道真正的瓶颈在哪里。

所以我的建议是:先用最小可行架构上线,然后根据实际运行数据迭代。第一版可以简单到“网关+单模型+RAG”,先把流程跑通,把监控埋好,然后根据数据决定下一步优化什么。不要一开始就上多模型、GraphRAG、语义缓存这些复杂的东西。

6.2 知识库的质量比检索算法更重要

很多团队花大量时间调检索算法,却忽略了知识库本身的质量。我见过一个项目,检索算法用的是最先进的混合检索+重排序,但知识库里的文档大量过时、重复、格式混乱,导致检索出来的内容本身就是错的,再好的算法也救不回来。

所以在做RAG之前,先花时间做知识治理:清理过时文档、去重、统一格式、补充元数据。这一步的投入产出比远高于调算法。

6.3 用户反馈闭环是持续优化的关键

LLM系统上线后,怎么知道答案好不好?靠人工评估不现实,靠自动评估指标又不够准确。最有效的方式是建立用户反馈闭环:在答案旁边加“有用/没用”按钮,收集用户的显式反馈;同时记录用户的隐式行为(是否复制了答案、是否追问、是否放弃了对话)。

这些反馈数据是优化Prompt、调整检索策略、选择模型的重要依据。我负责的一个项目,通过分析用户反馈发现,某类问题的答案采纳率特别低,排查后发现是检索时没有正确匹配到对应的知识片段。调整切分策略后,采纳率从40%提升到了75%。

6.4 安全合规不能事后补

企业级LLM系统必须考虑安全合规问题:输入内容是否包含敏感信息?输出内容是否合规?用户数据是否被妥善保护?这些问题如果在架构设计阶段不考虑,后期补起来的成本会非常高。

具体来说,需要在网关层做输入输出的内容过滤,在日志层做敏感信息脱敏,在数据层做租户隔离和加密存储。这些工作不复杂,但必须提前规划。

7. 一些关于技术选型的个人看法

聊了这么多架构和落地的东西,最后说几个我在技术选型上的个人偏好,不一定对,仅供参考。

推理框架:优先vLLM,除非有极致的性能需求才考虑TensorRT-LLM。vLLM的社区生态和迭代速度是最大的优势。

向量数据库:小规模(百万级以下)用pgvector就够了,和业务数据库放在一起,运维简单。大规模(千万级以上)考虑Milvus或Qdrant。不建议一上来就上分布式向量库,运维复杂度太高。

网关:如果团队有Go开发能力,建议自研轻量级网关,核心逻辑可控。如果不想自己维护,APISIX+自定义插件是折中方案。

缓存:Redis做精确缓存,语义缓存可以用Redis+向量索引实现,也可以单独用一个轻量级向量库。

监控:Prometheus+Grafana是标配,LLM特有的指标(Token消耗、首Token时间等)需要自定义Exporter。

这些选型没有绝对的对错,关键是要和团队的技术栈和运维能力匹配。一个需要三个人维护的“先进架构”,不如一个一个人就能搞定的“够用架构”。

我在实际项目中最深的体会是:企业级LLM的挑战从来不是模型本身,而是如何把模型嵌入到现有的业务流程和技术体系中。这需要的不只是AI知识,更多的是后端工程、运维、安全、成本管理这些“传统”能力。把这些问题想清楚、做扎实,LLM才能真正在企业里发挥价值。

返回列表