☰
企业级Agent平台搭建实战
2026/10/31 2:06:11 网站建设 项目流程

企业级 Agent 平台从 0 到 1:技术选型、架构设计与核心模块拆解

很多团队的经历是相似的:三天跑通一个 Demo,半年上不了一个生产平台。

问题几乎从来不是"模型不够强",而是把Agent 框架当成了Agent 平台。框架回答"模型怎么调工具、怎么循环推理";平台回答"成百上千个 Agent 怎么被创建、发布、治理、计量和排障"。

这篇文章给出一套可落地的分层架构、一份经过取舍的选型矩阵,以及九个核心模块的设计要点和踩坑清单。


一、先划边界:企业级到底"级"在哪里

一个 Agent 框架的核心抽象通常只有四五个:模型、工具、消息、循环。而一个企业级平台要在此基础上再叠加三层能力,这三层才是真正难的部分:

  1. 多租户—— 不同部门 / 客户的会话、知识、模型配额、工具权限必须隔离,且隔离要能论证。
  2. 可治理—— 每一次模型调用、工具调用、数据访问都要可审计、可追溯、可追责。
  3. 可运营—— 成本、质量、延迟必须被度量,并且能持续优化,而不是上线即失明。

由此可以倒推出平台的能力清单,以及哪些必须自建:

域能力是否自建说明
控制面Agent 定义 / 版本 / 发布 / 灰度必须开源框架基本不提供
控制面模型、工具、知识库的注册与授权必须平台的核心壁垒
控制面租户、配额、计费必须企业内部结算与成本分摊
数据面Agent 运行时(编排执行)可基于开源不建议从零写
数据面模型网关必须(但要做薄)承上启下的关键一跳
数据面RAG 检索服务可基于开源卖点是数据治理不是向量库
支撑可观测 / 评测 / 审计必须决定能否长期迭代
支撑执行沙箱必须安全底线

这里有一条贯穿全文的设计原则:控制面与数据面分离。

控制面是标准的企业级系统——CRUD、权限、审批、版本、租户,用 Java / Go 写最稳;数据面是 AI 运行时——编排、推理、检索,生态在 Python。把这两件事塞进同一个服务,最后一定会变成"既不敢改 AI 逻辑,也不敢改权限逻辑"的泥球。


二、技术选型

2.1 先问四个问题,再谈选型

选型矩阵本身没有意义,有意义的是约束。落地前先回答:

  1. 团队主语言是什么?这一条能决定 80% 的选择。让 Java 团队维护 LangGraph 服务,或者让 Python 团队维护一套 Spring 权限体系,都是在给自己埋雷。
  2. 自建还是先买?半年内要见效就买(Dify / RAGFlow),要做长期平台资产就必须自建控制面和网关。
  3. 规模预期?10 个 Agent 和 1000 个 Agent 对版本管理、调度、隔离的要求是两个量级。
  4. 是否私有化 / 信创?直接排除一批 SaaS 依赖,也决定了模型接入方式。

2.2 推荐选型矩阵

能力层默认选择备选 / 适用场景
Agent 编排LangGraph(Python)Spring AI Alibaba Graph(Java 团队);Dify(低代码入口,不作核心运行时)
模型网关LiteLLM Proxy 或 Higress(AI 网关模式)OneAPI / NewAPI(轻量);Kong AI Gateway(已有 Kong 体系)
工具协议MCP(Streamable HTTP)私有协议仅在内网极端场景考虑
长流程 / 人审TemporalCamunda 8(BPMN 业务审批);Argo Workflows(批处理)
向量库pgvector(< 千万级 chunk)Qdrant(中等规模、运维简单);Milvus(大规模、独立集群)
文档解析MinerURAGFlow DeepDoc;Unstructured(通用格式)
Embedding / 重排bge-m3 + bge-reranker云厂商 embedding(省运维,注意数据出境)
可观测Langfuse(可自托管)+ OpenTelemetry GenAIArize Phoenix;商业 APM 的 LLM 插件
评测Ragas + DeepEval自建评测集 + LLM-as-judge
身份认证Keycloak / Casdoor对接企业现有 IdP(LDAP / OAuth2 / OIDC)
策略引擎OPA自研权限中心(已有中台时)
沙箱E2B / gVisor / Firecracker容器 + 网络出口白名单(最低配)
消息队列Kafka / NATSRabbitMQ(团队熟悉时)
存储PostgreSQL + Redis + MinIO—
前端Next.js + Ant Design ProVue 团队用 Element Plus
部署Kubernetes + Helm小规模可先 Docker Compose

2.3 三条落地路线

路线 A:Java 为主的企业团队(国内最常见)

用 Spring Boot 3 承载控制面,Spring AI Alibaba 做编排与模型接入,天然对接 Nacos(配置 / 注册)、Higress(网关)、DashScope 等国产模型。优势是与现有中台、运维、安全体系完全复用,评审和合规容易过;代价是 AI 新特性跟进慢半拍,复杂 Agent 的调试体验不如 Python 生态。

路线 B:Python / AI 团队

FastAPI + LangGraph + LiteLLM + Langfuse,开发效率最高。建议把租户、计费、审批这类企业事务单独拆一个 Java 或 Go 服务,不要让 Python 承担强一致性和复杂权限。

路线 C:先买后建

用 Dify / RAGFlow 在两个月内跑通业务,但自建模型网关和 MCP 工具层。这两层是"换平台也带得走"的资产。半年后根据规模和治理诉求,再决定是否替换编排层。

2.4 三个反直觉的结论

  • 模型网关比编排框架重要。平台后期 90% 的痛点——模型切换、限流、成本归属、密钥泄露——都在网关。编排框架是可以换的,网关换起来伤筋动骨。
  • 不要自研向量库和 embedding 模型。没有亿级规模就没有收益,直接用成熟组件。
  • 多 Agent 不是银弹。先做单 Agent + 丰富工具,跑不通再拆。过早多 Agent 化会把调试成本放大一个数量级。

三、架构设计

3.1 分层架构

flowchart TB subgraph ACCESS["接入层"] A1["Web 控制台"] A2["OpenAPI / SDK"] A3["IM / 企微 / 钉钉"] end subgraph CONTROL["控制面 · Java / Spring Boot"] C1["租户与权限"] C2["Agent 注册中心"] C3["版本与发布 / 灰度"] C4["配额与计费"] C5["审计中心"] end subgraph DATA["数据面 · Python 运行时"] D1["模型网关"] D2["Agent Runtime"] D3["工具中心 · MCP"] D4["知识库服务"] D5["记忆服务"] D6["工作流引擎"] end subgraph SUPPORT["支撑层"] S1["可观测 / 评测"] S2["执行沙箱"] S3["PG / Redis / 向量库 / 对象存储"] S4["消息队列"] end M1["外部模型服务"] M2["企业系统 ERP / CRM / DB"] A1 --> CONTROL A2 --> CONTROL A3 --> CONTROL A1 --> D1 A2 --> D1 CONTROL -. "配置下发 · 版本 Pin" .-> D2 D2 --> D1 D2 --> D3 D2 --> D4 D2 --> D5 D2 --> D6 D1 --> M1 D3 --> M2 D3 --> S2 D2 --> S1 D2 --> S4 D2 --> S3 C5 --> S3

几个结构性要点:

  • 控制面只下发配置,不参与请求链路。控制面挂了,已经在跑的 Agent 不应受影响。
  • 所有模型调用必须经过网关,业务代码里不允许出现厂商 SDK 的直连。
  • 工具调用统一经过工具中心,哪怕只有一个工具。这层是权限和审计的落点。

3.2 一次请求的完整链路

sequenceDiagram autonumber participant U as 用户 / 业务系统 participant P as 平台 API participant R as Agent Runtime participant G as 模型网关 participant K as 知识库 participant T as 工具中心 MCP participant O as 可观测 U->>P: 调用 Agent(租户 + Agent + 版本) P->>P: 鉴权 / 配额 / 审计前置 P->>R: 创建会话(session_id, trace_id, 版本 Pin) R->>K: 检索(携带 ACL 过滤条件) K-->>R: Top-K 文档 R->>G: 规划请求(stream=true) G-->>R: 流式 token + tool_call R->>T: 执行工具(参数校验 + 二次鉴权) T-->>R: 结构化结果 / 可恢复错误 R->>G: 二次推理 G-->>R: 最终回答 R-->>P: SSE 流 P-->>U: SSE 流 R->>O: trace / 成本 / 质量埋点

注意链路里的两个细节:版本在入口处就被 Pin 住(会话中途改配置不会导致行为漂移);trace_id 从网关一路透传到工具层,否则出了问题只能靠猜。

3.3 控制面与数据面的契约

两者之间只有一份契约:Agent 定义(声明式配置)。

  • 控制面负责编辑、审核、发布、灰度,产出一个不可变的版本快照。
  • 数据面只认版本快照,不查控制面数据库,失败时读本地缓存。
  • 配置变更通过配置中心 / 消息推送增量下发,数据面支持按版本号拉取。

这条契约让两个团队可以独立演进,也让"回滚"变成一次指针切换,而不是一次代码发布。

3.4 部署拓扑

flowchart LR subgraph K8S["Kubernetes 集群"] subgraph NS1["namespace: platform-control"] CP["控制面服务"] DB1[("PostgreSQL")] end subgraph NS2["namespace: platform-runtime"] RT["Runtime 无状态副本 × N"] GW["模型网关"] RAG["知识库服务"] end subgraph NS3["namespace: platform-infra"] RD[("Redis")] MQ["Kafka / NATS"] OBS["Langfuse + OTel Collector"] end subgraph NS4["namespace: sandbox"] SB["gVisor / 隔离容器池"] end end RT --> GW RT --> RAG RT --> RD RT --> MQ RT --> OBS RT --> SB CP --> DB1 CP -.配置下发.-> RT

隔离原则:沙箱单独一个 namespace 并限制网络出口;运行时无状态、可水平扩缩容;控制面与数据面的数据库实例分离。


四、核心模块的关键设计点

4.1 Agent Runtime:状态机,而不是 while 循环

最容易被低估的模块。很多团队的第一版就是:

while not done: resp = llm.invoke(messages) if resp.tool_calls: messages.append(execute(resp.tool_calls)) else: done = True

这段代码在 Demo 里能跑,在生产里会同时暴露五个问题:进程重启丢任务、无法人工介入、无法限预算、无法重放、无法审计。

正确的抽象是"带持久化检查点的状态机":

flowchart TD START(["进入"]) --> PLAN["规划 / 推理"] PLAN --> DECIDE{"需要工具?"} DECIDE -- "是" --> TOOL["工具执行"] TOOL --> OBS["观测结果 / 裁剪"] OBS --> CHECK{"预算与步数?"} DECIDE -- "否" --> FINAL["生成最终答案"] CHECK -- "超限" --> ABORT["终止并降级"] CHECK -- "正常" --> PLAN PLAN --> HUMAN{"需要人工确认?"} HUMAN -- "是" --> WAIT["中断 · 状态落库"] WAIT --> RESUME["人工输入"] RESUME --> PLAN HUMAN -- "否" --> DECIDE FINAL --> END(["结束"]) ABORT --> END

关键设计点:

设计点做法不做的后果
状态持久化每个节点执行后写 checkpoint(PG / Redis)进程重启任务丢失,长任务无法恢复
节点幂等工具调用带 idempotency key,重试不重复扣费网络抖动导致重复下单、重复发消息
硬性预算最大步数、最大 token、最大时长、最大工具调用次数死循环烧钱,且无人能解释账单
上下文工程历史摘要压缩、工具结果截断、只保留结构化中间态上下文爆炸,成本翻倍且效果下降
中断与恢复interrupt原语 + 状态落库 + 外部恢复接口人工审批无法实现,或实现成阻塞线程
可重放记录每一步的输入输出快照线上问题无法复现,只能靠日志猜

上下文工程值得单独强调。生产 Agent 的失败大多不是"模型不会推理",而是"该给的信息没给、不该给的塞了一堆"。实践中的四条规则:

  1. System prompt 只放稳定约束,动态信息放消息体。
  2. 超过 N 轮自动摘要,但保留原始工具调用记录用于审计。
  3. 工具返回值先裁剪再入上下文(大 JSON 只留模型真正需要的字段)。
  4. 检索结果按相关度截断,不要把 Top-50 全塞进去。

注意事项:

  • 多 Agent 编排(supervisor / handoff)会显著增加不可控性,先把单 Agent 的工具边界做清楚。
  • 工具执行必须设超时,且超时后要能告诉模型"失败了、为什么",而不是直接抛异常中断整个流程。
  • 所有 LLM 输出都要能解析失败并降级,不要假设模型一定返回合法 JSON。

4.2 模型网关:平台最不该省的一层

网关的职责不是"转发请求",而是把模型的不确定性收敛成平台可控的接口。

必须具备的能力:

能力说明
统一协议对外暴露 OpenAI 兼容接口,屏蔽厂商差异
路由按租户、任务类型、成本、地域选择模型
降级与熔断主模型超时 / 限流时自动切备用,并标记降级
限流与配额按租户 / 用户 / Agent 维度限 TPM、RPM、并发
成本核算记录 token 用量,按租户归集,支持预算告警
缓存精确缓存 + 语义缓存(必须按租户隔离)
审计与脱敏记录请求元数据,敏感字段落库前脱敏
密钥托管厂商 Key 不下发到业务代码和前端

容易踩的坑:

  • 流式透传:SSE 的 chunk 边界和 tool_call 增量拼接很容易出错,必须原样透传并单独测。
  • 结构化输出兼容性:不同厂商对 JSON Schema 的支持程度差异巨大,网关要做能力探测和降级策略。
  • 多模态:图片、音频的 token 计费规则不同,成本统计不能只算文本。
  • 重试语义:LLM 调用天然可重试,但工具调用不可盲目重试——两者要分开处理。
  • 语义缓存:跨租户命中就是数据泄露,缓存 key 必须包含 tenant_id + 模型版本。

4.3 工具层:MCP 是协议,治理才是平台

工具是 Agent 的"手"。这一层的核心矛盾是:开放能力和最小权限天然对立。

建议结构:

flowchart LR RT["Agent Runtime"] --> HUB["工具注册中心"] HUB --> AUTH["鉴权 / 参数校验 / 限流"] AUTH --> MCP1["MCP Server: 内部知识"] AUTH --> MCP2["MCP Server: 业务系统 API"] AUTH --> MCP3["MCP Server: 代码执行"] MCP3 --> SB["隔离沙箱 · 出口白名单"] HUB --> AUDIT[("审计日志")]

关键设计点:

  • 工具描述就是 Prompt。工具名、描述、参数 schema 的写法直接决定调用准确率。要求:动词开头、说明副作用、参数带单位与示例、明确"什么时候不该用"。
  • 两级权限:工具级(能不能调这个工具)+ 数据级(能查哪些行、哪些字段)。后者通常要实现成"参数注入",而不是让模型自己填租户 ID。
  • 结果裁剪:工具返回给模型的内容要过滤掉内部字段、主键、敏感信息,同时控制体积。
  • 错误分层:可恢复错误(参数错、查无数据)以结构化结果返回给模型自我修正;不可恢复错误(权限不足、系统故障)才终止流程并上报。
  • 幂等键:写操作类工具必须支持幂等,否则重试就是事故。
  • 沙箱:代码执行、文件操作类工具必须在隔离环境运行,且网络出口白名单化。

4.4 知识库 / RAG:权限过滤必须发生在检索时

RAG 的链路很长,每一段都能成为瓶颈:

flowchart LR I["采集"] --> P["解析"] P --> C["清洗 / 切分"] C --> E["增强 · 标题 / 摘要 / 元数据"] E --> V["向量化"] V --> X[("向量索引 + 倒排索引")] Q["Query"] --> RW["改写 / 扩展"] RW --> R["混合检索"] X --> R R --> RR["重排 Rerank"] RR --> CTX["上下文组装"]

关键设计点:

  • 混合检索:BM25 + 向量,用 RRF 融合。纯向量在专有名词、编号、代码场景上很差。
  • 权限过滤前置:ACL 必须以 metadata filter 的形式进入检索条件。先检索再过滤会造成两个问题:召回数量塌陷,以及过滤逻辑写错就泄露。
  • 增量更新:文档要支持增删改与版本,删除必须同时清理向量和缓存,否则会出现"已删除的知识仍被召回"。
  • 切分策略:不是越小越好。按语义结构(标题层级、表格、代码块)切,chunk 之间保留重叠,并在每个 chunk 中带上文档标题与章节路径。
  • 表格与图片:必须单独处理(表格转结构化、图片走 OCR / 多模态),否则企业知识库里最有价值的部分恰好丢了。
  • 评测:分别度量召回率、重排收益、答案忠实度。只测最终答案无法定位问题在检索还是在生成。

4.5 记忆系统:写入策略比存储更重要

把"记忆"当成"把聊天记录存下来"是最常见的误解。生产记忆要分三层:

类型存储生命周期典型用途
会话记忆Redis会话级多轮上下文
长期记忆PG + 向量库长期用户偏好、事实画像
情景记忆PG / 对象存储长期历史任务、成功案例复用

注意事项:

  • 谁来决定写什么?让 LLM 自由抽取记忆会产生大量噪声和错误事实。建议:显式记忆(用户主动说"记住")+ 规则抽取 + 定期人工审核。
  • 冲突与遗忘:同一事实的新旧版本要能覆盖,且要有 TTL 和删除接口。
  • 隐私:记忆是合规重灾区。必须支持按用户查看、导出、删除,并纳入审计。

4.6 工作流与人工审批

企业场景里,纯自主 Agent 只能覆盖一部分。真正高频的是"固定流程 + 若干智能节点 + 人工审批"。

  • 流程编排用 DAG + 条件分支,不要用 Agent 的自由循环去模拟业务流程。
  • 长事务用 Temporal:等待审批、等待外部回调、跨天任务,必须有 Durable Execution。
  • 人工节点要能做到:展示上下文、支持修改、支持拒绝并附带理由,拒绝理由要回流到后续节点。
  • 补偿事务:流程中某步失败,前面的写操作要能回滚或标记,不能留下半成品数据。

4.7 可观测与评测:上线第一天就要有

Agent 是概率系统,"没报错"不等于"做对了"。

Trace 要覆盖四类 span:LLM 调用(模型、token、延迟、成本)、检索(query、命中、分数)、工具(参数、结果、耗时)、编排(节点、分支、重试)。用 OpenTelemetry GenAI 语义约定,避免后期返工。

指标分三层:

层次指标
系统QPS、P95 延迟、首 token 延迟、错误率、可用性
成本单次会话 token、单任务成本、按租户成本
质量任务完成率、工具成功率、检索命中率、人工采纳率、用户反馈

评测体系:离线数据集(覆盖典型任务 + 边界 + 对抗样本)+ 自动评分(规则 / LLM-as-judge)+ 人工抽检。把评测接入 CI,Prompt 或模型变更必须过回归门禁。

4.8 安全与治理:把"信任模型"变成"不信任模型"

这是企业级和 Demo 最大的分水岭。核心思路是:假设模型会被诱导,所有安全控制放在模型之外。

  • 多租户隔离:全链路强制tenant_id,数据库行级隔离或独立 schema;向量库、缓存、对象存储的 key 都要带租户前缀。
  • 权限模型:RBAC 管功能,ABAC / OPA 管数据。工具调用的鉴权要在服务端做,不能依赖 Prompt 里写"你只能查本公司数据"。
  • Prompt 注入:输入侧分类器 + 工具最小权限 + 输出侧过滤,三者缺一不可。特别注意间接注入——RAG 检索到的文档、工具返回的内容都可能是攻击载荷。
  • 数据安全:落库前脱敏、DLP 检测、审计日志留存。日志里不要存完整 Prompt 中的敏感信息。
  • 模型安全:内容审核、越狱检测、敏感话题策略。
  • 沙箱:代码执行、文件操作、网络访问必须隔离,出口白名单。

4.9 发布与版本:配置即代码

Agent 的行为由Prompt + 模型 + 工具集 + 知识库 + 参数共同决定,任何一项变化都可能导致行为漂移。所以:

  • Agent 定义用声明式配置,纳入 Git,走 Code Review。
  • Prompt、模型版本、工具 schema、知识库快照都要能独立版本化。
  • 发布支持灰度:按租户 / 按流量比例 / 按用户白名单。
  • 会话入口 Pin 版本,运行中不切换。
  • 回滚是指针切换,秒级生效。

一份 Agent 定义大致长这样:

apiVersion: platform.example.com/v1 kind: Agent metadata: name: contract-reviewer tenant: legal-dept version: 1.4.2 spec: model: primary: qwen-max fallback: [deepseek-chat] params: { temperature: 0.2, max_tokens: 4096 } prompt: ref: prompts/contract-reviewer@v7 tools: - ref: tools/contract-db@v3 scopes: [read] - ref: tools/doc-parser@v2 knowledge: - ref: kb/legal-clauses@2026-09 topK: 8 rerank: true runtime: maxSteps: 12 maxTokens: 60000 timeoutSeconds: 180 humanApproval: before: [tools/contract-db.write] observability: sampleRate: 1.0

五、工程化:非功能指标与阶段路线

5.1 建议的 SLO

指标目标
首 token 延迟P95 < 1.5s
简单任务端到端P95 < 10s
平台可用性99.9%(控制面与数据面分别计算)
工具调用成功率> 99%
单会话成本有预算上限并可按租户归集
事故可定位时间< 30 分钟(依赖 trace)

5.2 分阶段路线

阶段周期目标交付
MVP1–2 月跑通一个高价值场景单 Agent + 网关 + 基础 RAG + trace
治理3–6 月能对外服务多部门多租户、权限、版本发布、审计、评测
规模化6–12 月平台化运营工具市场、工作流、成本运营、灰度体系

不要在第一阶段就做工具市场和多 Agent 编排。先用一个真实场景把链路跑穿,比先搭一个"什么都能做"的空壳平台有价值得多。


六、失败模式清单

上线前对照检查,命中三条以上就要返工:


七、结语

搭建企业级 Agent 平台,真正的工作量不在"让 Agent 变聪明",而在把概率系统装进确定性的工程框架里:用网关收敛模型的不确定性,用状态机收敛执行的不确定性,用权限和沙箱收敛工具的不确定性,用 trace 和评测收敛效果的不确定性。

如果只能记住一句话:先把模型网关、MCP 工具层、可观测这三件基础设施做扎实,编排框架反而是最后可以替换的部分。这三层决定了平台能不能撑住企业级要求,而编排框架只决定开发效率。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询