ARTICLE DETAIL

资讯详情

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

企业级LLM落地实战:从网关、RAG到Agent的完整工程链路

企业级LLM落地实战:从网关、RAG到Agent的完整工程链路 企业级 LLM 写到了第五篇。前四篇里我把模型评估、私有化部署、微调数据、以及应用层接入的常见模式都过了一遍原本以为这一篇可以收尾了。结果真把几个项目从头跟到尾之后我发现一个不太舒服的事实能让你从 Demo 走向生产环境的往往不是榜单上那一两个点的模型分差而是一堆看起来很“外围”的事。比如调用入口谁来统一管、工具调用的报错为什么那么诡异、RAG 到底怎么和 ERP 数据打通、Agent 上线之后谁来审批、万一出错了怎么回溯。这些事单个拎出来都不难难的是它们分散在研发、运维、业务、数据多个环节里没人系统地讲。所以这一篇我不打算停留在单一算法或框架的功能列表上而是把从网关、工具调用、RAG、Agent 工作流再到团队知识沉淀这条完整链路拆开。每一段都会先说清楚“为什么要这么做”再给出我在实际项目里验证过的具体做法和避坑经验。如果你正在负责企业内部 LLM 平台的落地这篇应该能帮你少走不少弯路。1. 先把调用入口管起来企业级 LLM 网关到底在解决什么问题1.1 为什么现在的团队选择网关而不是 SDK 直连很多团队起步时都很直接拿到某个大模型的 API Key在代码里装个官方 SDK调一下chat.completions.create()就完事了。这个阶段没毛病特别是做原型验证的时候越快出效果越好。但它撑不到“企业级”。我见过一个真实案例某公司五个业务线各自接模型每个业务线的工程师都用自己的账号申请 Key代码里的密钥散落在配置文件、环境变量甚至有一次被提交进了 Git 仓库。到月底财务看账单的时候完全懵了因为根本分不清哪笔消耗是哪个项目产生的。后来要切换模型供应商得挨个业务线改代码每改一次都要回归一遍全部功能。这时候你需要的是一个独立的网关层。所有业务系统不再直连模型服务商而是统一走网关网关负责转发请求、管理模型路由、记录调用量和审计日志。对业务开发来说他们只看到一个和内网 API 一样的接口不关心后端到底接的是哪家模型。对平台团队来说切换模型、配置降级、限制某个部门的调用量都只是改网关配置的事。1.2 网关层要承揽的四类职责我做了这几年网关相关的工作认为核心职责可以归结为四件事统一接入、审计合规、成本治理、安全隔离。第一是统一接入。网关对外提供一套统一的接口协议内部再把请求转换成不同模型服务商需要的格式。这听起来简单做起来很繁琐因为各家对工具调用、多模态输入、参数命名都有差异。网关层可以把这些差异吞掉让上层应用只面对一种规范。第二是审计合规。企业内部调用模型意味着业务数据会离开内部网络这时候必须有完整的请求和响应日志。谁在什么时间调用了哪个模型、传了哪些字段、模型返回了什么结果全部要有记录。出现纠纷或者数据泄露疑云的时候这些日志就是第一手的证据。第三是成本治理。网关可以按部门、项目、应用三个维度统计 Token 消耗设定月度配额。超出配额之后可以选择告警、限流或者自动降级到成本更低的模型。没有这层控制大模型调用费用是一个无底洞。第四是安全隔离。多租户场景下A 团队不应该看到 B 团队的业务上下文和 API Key。网关可以在转发前做身份认证、请求体脱敏甚至拦截包含手机号、身份证、银行卡号等敏感信息的字段。关注维度应用内 SDK 直连独立网关层密钥管理散落在各环境配置里集中存储支持轮换与按团队隔离模型切换每个应用改代码后重新发布网关改一条路由规则即可成本统计靠服务商后台估算按部门、项目维度自动出报表故障恢复各应用各自处理网关统一降级、重试、熔断审计追踪基本没有全量请求日志留存1.3 选型时留意什么开源网关与自建的边界网关选型并没有那么复杂。现在开源社区里 LiteLLM、One API 这类项目已经相当成熟支持几十家模型服务商统一接入提供 Key 管理、配额限制、日志查询。多数企业不需要从零自研直接基于开源项目改一改就能用。真正的自研需求通常来自两个极端要么是安全合规要求极高需要完全自主掌控审计链路要么是多模态模型高度定制开源网关不满足转换逻辑。我给团队的建议是先跑通开源网关把统一接入、配额、日志这三件事做好。如果后续发现确实有无法扩展的硬需求再考虑在开源项目的基础上二次开发而不是一开始就启动一个大而全的自研计划。提示网关越早引入越好。等各业务线都已经写了大量直连代码再收口会有一段非常痛苦的迁移期因为每个应用的错误处理、重试逻辑、密钥获取方式都不一样。2. 一次生产环境报错排查provider rejected the request schema or tool payload2.1 现象复盘同样一段代码换模型就报错有一回我排查一个比较头疼的问题。业务方反馈产品检索 Agent 突然之间不可用了错误日志只留下一句话llm request failed: provider rejected the request schema or tool payload.从字面上看问题出在工具调用的 Schema 或者载荷上但业务方非常坚决地表示“代码没有动过”。更迷惑的是在测试环境里用同样的提示词、同样的工具定义跑一遍换一家人工智能模型服务商就可以正常返回一旦在生产环境切换到另一家模型就稳定复现报错。这种“换模型就翻车”的现象其实在网关架构里非常常见因为不同模型服务商对工具调用格式的接受程度完全不一样。2.2 完整的排查链路不要急着改代码遇到这类问题我的经验是先把整个调用链路画出来逐层排除。从业务代码到网关从网关到模型服务商每一层都可能引入差异。第一步把网关层保存的完整出站请求捞出来而不是只盯着业务代码里的入参。因为网关通常会做协议转换可能在前一步已经把原始参数改写过。我当时打印出实际发给供应商的请求体之后发现里面多了两个字段一个是strict: true另一个是additionalProperties: false。业务代码里根本没有传这两个字段是网关自动加上去的。第二步把工具定义拿去按 JSON Schema 规范校验。我用ajv跑了一遍Schema 本身是合法的。但合法并不代表每家供应商都接受。OpenAI 对工具名的限制是有长度限制且只能包含数字、字母、下划线和中划线Anthropic 的input_schema只支持 JSON Schema 的子集碰到oneOf、allOf这类组合关键字时大概率会拒绝。这两家对nullable的定义方式也不一样有些人习惯写type: string加一个nullable: true但在 Anthropic 的工具调用规范里正确写法是type: [string, null]。第三步把“网关最终发送的请求体”和“供应商文档里的约束清单”一条条对照。问题很快浮出水面业务代码里有一个工具入参对象其中某个字段是number类型但在网关转换过程中被并入了另一个内部结构导致发送到服务商时出现了两者都不认识的嵌套格式。供应商侧严格校验直接拒绝。2.3 根因协议转换惹的祸这类问题的根子通常不在业务代码而在“协议转换”这个环节。企业接了一家模型之后很容易在同一套系统里引入另一个模型做容灾或成本优化。A 家的工具调用格式是{ name: ..., description: ..., parameters: {...} }B 家要求的可能是{ name: ..., input_schema: {...} }。网关要做这个转换就得理解两边格式的对应关系。一旦转换逻辑不完善就会出现多余字段、嵌套层级错误、类型不一致这类问题。比如说OpenAI 在工具调用里基本接受任意合法的 JSON Schema包括oneOf但 Anthropic 的input_schema只接受 JSON Schema 的有限子集复杂校验关键字会被拒。如果你没有在网关层做“去差异化”处理把 A 家格式原封不动转给 B 家那目标供应商极大概率会抛类似错误。2.4 修复与预防把 schema 当作接口契约来管修复方案并不复杂。我在网关层加了一道工具 Schema 的“降级规整”内部定义统一使用最小公倍数的 JSON Schema 子集允许的类型严格限定为 string、number、integer、boolean、object、array 和 enum如果确实需要表达可空字段就写type: [string, null]不在业务上依赖的属性比如default、examples一律不要传。接着在网关转发之前用ajv再校验一次不合规的直接拦截避免把错误抛给线上请求。预防策略更重要。工具 Schema 要像接口一样做版本管理并发到线上之前至少走一遍代码评审。不过我发现不少团队只 review 提示词和代码逻辑完全忽略 Schema 里某些字段对特定供应商的兼容性。另外网关的日志系统要保留“发送到供应商侧”的最终请求体。很多时候你看业务代码没问题问题都藏在这一层没有原始报文的话排查时间会长好几倍。提示遇到provider rejected the request schema or tool payload不要第一时间怀疑业务代码。先确认网关出站请求和模型服务商文档之间的差异八成问题都在这里。3. RAG 不是向量数据库的事从企业知识库到本地 ERP 检索3.1 先把 RAG 的边界搞清楚很多团队一提到 RAG第一反应就是把 PDF、Word 全部塞进向量数据库然后接一个 Embedding 接口就算建好企业知识库了。这个做法处理制度文档、产品手册一类非结构化内容确实有效但放到真实的业务系统里问题就来了。企业里大量知识并不长在非结构化文档里而是长在 ERP、WMS、CRM 这类结构化系统里。物料主数据、库存数量、价格、供应商、订单状态、审批流程这些都是精确的字段和关系不是“语义相似”可以含糊处理的。你用向量检索问“这个月销量排名前五的 SKU 有哪些”它根本算不出来它擅长的是“哪些文档内容和这句话有点像”。所以我认为企业级 RAG 的第一课是分清知识的形态非结构化文本适合向量召回结构化业务数据适合 SQL 精确过滤两者之间需要用工作流编排起来。语义检索和规则查询不是谁替代谁而是分工配合。3.2 一个 ERP 产品检索的链路示例语义内核怎么用之前做过一个偏实战的落地方案拿 Semantic Kernel语义内核做协调层把自然语言提问拆解成“结构化查询 向量召回 结果融合”三步最后再交给模型生成带数据来源的答案。先解释一下语义内核是什么它是一个面向业务的 LLM 编排框架可以把它理解成一个容器你在里面注册各种插件和技能。插件里既可以是普通的函数调用也可以是与模型配合的语义函数。它负责调度这些能力而不是只丢一个提示词给模型瞎猜。场景是这样的业务人员在对话框里输入“20 块以内、保质期在半年以上的防锈螺丝有哪些型号可选”。如果只靠向量检索大概能得到一堆语义相近但价格、保质期完全不符的结果。这里正确的链路是意图理解与条件抽取。模型先从自然语言中解析出结构化条件价格小于等于 20保质期大于等于 180 天类目属于紧固件材质包含防锈相关的描述。结构化过滤。这些条件先在 ERP 商品主数据表里用 SQL 执行。价格和保质期是精确字段不需要靠向量直接走数据库索引过滤。语义扩展。像“防锈”这个词在商品描述里可能体现为“镀锌”“不锈钢”“环氧涂层”这些靠 SQL 的精确匹配做不好就需要利用向量召回把商品主数据中的规格说明、材料描述字段做 Embedding然后检索候选。结果合并。SQL 过滤结果和向量召回的结果取并集或交集具体取决于业务要求。我的经验是结构化过滤结果优先级更高向量召回结果作为补充两者合并之后生成候选集合。生成回答。把候选商品交给模型生成一个带型号、价格、保质期的表格化回答同时附上每条结果来自哪条商品记录方便业务方点击查看原始数据。这个链路里最重要的一点是不能让模型或向量检索去“算”那些本质上是确定性的业务条件。换句话讲价格 20 块就是 20 块不是一个语义相关性可以模糊处理的事。语义内核在这里的价值就是统一调度模型、SQL 查询和向量检索三者的顺序和参数传递让它们各干各的擅长活。3.3 GraphRAG 与本体设计关系比向量更值钱向量检索还有一个天生短板它很难表达多实体之间的关系。比如“这个供应商有哪些替代供应商”“这个物料和哪些质检批次关联”这类问题的本质是结构化关系推理。文本向量的语义相似度根本覆盖不了这种场景。这也是 GraphRAG 和本体ontology最近热度上升的原因。本体说白了就是“实体—关系—属性”的显式定义你别把它想得玄乎。在企业里做知识图谱第一步不是全量建模而是挑一个高频业务场景把里面的核心实体和关系定清楚。比如物料、供应商、批次、质检报告以及它们之间的“供应”“替代”“包含”“检测于”这些关系边。有了这张图之后模型不用靠猜而是把用户的自然语言问题翻译成图查询语句在图数据库里做精确的路径查询。比如“找某供应商所有替代供应商的物料列表”这在 RAG 里属于多跳推理光靠向量召回根本做不好在图里却只是一个简单的关系遍历。不过要提醒的是知识图谱维护成本比向量库高得多。本体设计一旦不合理后续所有数据更新都会很痛苦。所以我不建议企业一上来就搞全量图谱先围绕使用频率最高的业务子域建一小块验证价值再慢慢扩展。GraphRAG 在企业里的定位是补充不是替代。3.4 让 RAG 真正可维护的工程约束RAG 项目做一个漂亮原型只花一两周但让它半年后还能用是另一回事。我主要关注三件事一是增量更新。商品价格、库存数量天天在变如果向量库里的数据还是上周的检索结果自然不准。企业 RAG 必须有和 ERP 同步的更新管道把主数据变化按时推到索引中而不是定期全量重建。二是索引版本管理。Embedding 模型隔几个月就会更新版本。每次换模型版本都会导致向量空间变化老索引里的向量和新的向量没有可比性。升级时必须对全量索引重建而且要注意灰度不能新旧索引混着用否则检索质量会出现明显波动。三是评估集。找一个看不见摸不着的方式固化业务预期找业务方整理一百条典型问题把对应的正确结果记录下来。每次修改提示词、换 Embedding 模型、调整拆块逻辑都拿这批数据跑一遍回归。没有评估集的 RAG用不了几个月就开始悄悄腐烂等你发现效果不对已经很难追溯是哪个环节退化了。4. 在企业里跑 Agent花哨不是重点闭环才是4.1 企业需要的 Agent 和 Demo 里的 Agent 不是一回事这两年 Agent 的概念被讲得很热闹动辄“自主规划”“多步推理”。但企业业务部门想要的不是炫技而是“把一件事真正办完”。办完的意思是发起任务、执行、校验结果、通知干系人、留下审计记录。模型在这条链路里只负责其中的一部分比如生成建议、解析意图、写摘要其他部分需要工作流引擎、消息系统、人工审批环节来支撑。所以企业级 Agent 的第一性原理不是“模型有多聪明”而是“任务闭环是否可靠”。模型可能中间抽风一次两次但工作流要有重试机制模型生成的内容不能自动执行有财务影响的操作必须有人工审批整个执行过程要有 trace能回溯每一步发生了什么。4.2 两条落地路线n8n 工作流与代码框架实际落地时我见过两种主流路线一种是 n8n 这类可视化工作流平台另一种是 AgentScope、LangGraph、Semantic Kernel 这类代码开发框架。两条路我都试过各有明确的使用场景。维度n8n 工作流路线代码框架路线编排可视化强运营能直接改流程弱流程写在代码里开发灵活度有限复杂分支难维护高适合复杂状态机长流程可靠性自带执行状态持久化需要自己设计状态存储审计追踪默认记录执行历史要额外接入日志系统适合团队业务人员加少量 IT 支持后端工程师为主n8n 适合流程相对固定、业务人员需要随时调整规则的场景比如工单自动分派、数据定时同步、审批提醒。企业级部署 n8n 时我强烈建议不要用默认的 SQLite换成 PostgreSQL并且把执行记录持久化打开这样出了问题还能回看每一步的实际入参和输出。它自己带的定时触发、Webhook 和审批节点配上企业 SSO基本能覆盖大部分“业务流程编排”的需求。大规模并发部署可以考虑 K8s按队列消费任务避免单机执行堆积。代码框架则适合动作复杂、分支多、需要动态生成工具逻辑的场景。比如你希望 Agent 根据用户意图实时决定调用哪个 API并在多个子任务之间保持上下文状态这时候用代码框架写起来更顺手。AgentScope 这类以 Java 为主体的项目对后端技术栈正好接入 Spring Boot 生态很顺畅适合企业内部已经有大量 Java 服务的情况。4.3 审批、追踪与恢复Agent 运维的底线Agent 一旦拥有调用业务系统的能力就必须设置边界。我在项目里给 Agent 加了四道约束一是动作白名单模型只能选择定义好的工具不能自由调用任意 API二是金额阈值凡是涉及资金变动的操作模型只能生成申请草稿最终必须由业务负责人确认三是频控避免某个异常循环在短时间内反复调用高成本模型或者冲垮下游系统四是人工中断开关任何一次异常都能让人一键叫停整个 Agent 的执行链。追踪方面我建议从网关层就为每次请求生成一个全局trace_id并让它顺着 Agent 工作流一路传下去。模型调用、工具执行、数据库查询、审批动作每一步都挂上同一个 trace_id。出问题时直接拿 trace_id 在日志系统里检索就能还原整个执行链路。没有这套机制Agent 基本不敢放开跑。恢复机制方面工作流引擎要把执行状态持久化到数据库而不是放在内存里。这样即使服务重启也能从上次断点继续或者至少能清理掉半执行状态避免脏数据残留。5. 团队级 LLM Wiki让踩过的坑变成组织资产5.1 为什么这个步子不能省LLM 技术迭代太快了几乎每两三个月就有新模型、新工具框架、新最佳实践。很多团队的经验只存在老成员的脑子里或者散落在群聊记录和代码注释里。今天踩过一个坑明天另一个同事再踩一遍完全一样的坑这种事在 LLM 项目里尤其常见因为报错信息又新又怪搜索引擎都未必有答案。所以我在团队里推行“LLM Wiki”核心思路很简单把每一个踩过的坑、每一条选型决策、每一个故障复盘系统化沉淀成团队可检索的知识条目。它既是新人的入门教材也是老成员的“外脑”。新同学入职第一周不需要到处问人先读一遍 Wiki 里关联的故障档案就能了解整个系统哪些位置容易出问题、遇到类似报错怎么排查。哪怕最基础的概念比如 token 的 K/Q/V 分别代表什么——K 像一种标识属性Q 是你想找什么V 是你能给出的候选内容——多写一笔都会让后来人少花很多时间琢磨。5.2 一篇好的故障条目长什么样Wiki 条目不需要长篇大论关键是结构清晰、信息可复现。下面是我常用的故障条目模板标题网关 tool schema 回归provider rejected the request schema or tool payload 时间戳2025-XX-XX 影响范围产品检索 Agent全部业务 错误摘要llm request failed: provider rejected the request schema... 现象描述 - 生产环境切换模型后手工调用工具开始报错 - 测试环境同一段代码正常无法本地复现 根因分析 - 网关协议转换层给工具定义增加了 strict/additionalProperties 字段 - 目标模型供应商对 JSON Schema 组合关键字的兼容性不一致 修复动作 - 网关增加 schema 子集校验和归一化 - 工具定义统一移除 oneOf/allOf可空字段改写为 type: [string, null] 验证方式 - ajv 校验全部工具定义通过 - 使用 50 条回归问题集跑通全部流程 - 观察一周线上错误率归零 相关链接 - 网关配置 PR 链接 - 供应商工具调用文档链接写这个模板的目的不是让你变成 CV 工程师而是说人的记忆力不可靠。每个故障留下时间、影响范围、根因、修复做法下一次遇到相同报错直接搜索关键词就能看到完整前世今生。5.3 推动团队坚持写 Wiki 的三个实操技巧写 Wiki 这件事难的不是写作本身是坚持。我有三个实操技巧第一在故障修复之后立刻写。趁大家记忆还热的时候把复盘写完不要拖到周五统一补热度一过基本就不会有人写了。修复代码和写故障档案最好是同一个人或者同一个 Pair因为只有修复者最清楚中间踩了哪些弯路。第二每周安排一个固定的“踩坑会”时间不用长半小时以内。每个人花十分钟分享本周遇到的一个问题然后由记录人把内容补进 Wiki。时间久了这些条目就是团队最值钱的技术资产。第三把 Wiki 条目和代码仓库链接起来。在 Git 提交信息、PR 描述、流水线通知里加上故障档案链接。这样当你看到某段奇怪的代码时不一定能立刻明白为什么这么写但只要顺着关联跳到 Wiki就能看到当初的完整决策背景。写在最后这个系列写到第五篇我最大的体会是企业级 LLM 项目的复杂度从来不在模型本身而在模型之外的那一圈工程配套。好模型给你更高的上限但真正的稳定性来自统一的调用网关、规范的工具定义、扎实的 RAG 数据管道、可靠的 Agent 工作流以及持续沉淀的团队知识库。如果你的项目才刚起步我建议别急着追新模型先把最基础的“一个请求从业务系统到模型再回来”这条链路的日志和追踪做好。把这个做好了后面加模型、加 Agent、加知识库都是水到渠成的事。真正需要花钱花精力搞的是那些出了故障你能够查、能够恢复、能够避免二次踩坑的机制。这一点越早动手越划算。
返回列表