ARTICLE DETAIL

资讯详情

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

从0到1搭建企业级AI Agent平台:架构、核心组件与落地实践

从0到1搭建企业级AI Agent平台:架构、核心组件与落地实践 先说个真实场景。上个季度我带着一个数据平台项目组里满打满算只有三个后端业务方排进来的需求已经堆到两个月后。那阵子我经常刷到 AI Agent 的讨论也试过几个市面上的 Agent 产品但问题都一样要么太重动辄一套完整 SaaS要么太僵没法接我们内部的 CMDB、GitLab 和告警系统。我最后决定不等了自己从零开始搭一个 AI Agent 平台。当时脑子里冒出来的念头就是如果 Agent 有了工厂人人都能按需“造同事”那团队是不是就不用靠堆人头扛需求了这篇文章就是那次实践的全过程复盘。我会从 Agent、LLM、AI 模型这三者到底什么关系讲起再拆一个企业级 Agent 平台该怎么设计最后给你一套可以直接照着落地的从 0 到 1 搭建路径。适合两类人看一类是刚接触 AI Agent、满脑子都是“Agent 到底是什么、和 ChatGPT 有什么不一样”的初学者另一类是已经做过 demo、但想把它变成一个真正能被团队使用、可运维、可扩展的平台的工程师。整个过程我会把我踩过的坑、后来复盘出来的设计逻辑都写出来不藏着掖着。1. 先搞清楚三件事Agent、LLM 和 AI 模型不是一回事1.1 用一个比喻拆开三层结构很多人一上来就喊“我要做个 AI Agent”但真追问下去他其实根本分不清 Agent、LLM 和 AI 模型。我自己面试候选人的时候十个人里至少有四个会把“我用过 DeepSeek”理解成“我会做 Agent”。这个误区必须第一个填平。我用一个生活化的比喻解释这三者的关系。AI 模型是一个“大脑”它是一堆参数和权重你给它文字它回你文字。它可能很聪明但它没有手、没有脚、没有记忆宫殿你跟它说“帮我把那份报表发给老板”它只能回你一段话做不到自己去打开报表、找到老板的邮箱、点击发送。LLM 是 AI 模型里专门处理语言的那一类全称叫 Large Language Model像 GPT 系列、DeepSeek、Qwen、Llama 都属于这一类而 AI 模型还包括多模态模型、语音识别模型、传统机器学习模型范围更广。那 Agent 呢Agent 是一个“会干活的人”。它包含一个大脑LLM但还得配上一套工作流知道自己现在要干什么规划 Planning、记得之前说过什么记忆 Memory、会调用外部工具工具 Tool Use、能把工具结果反馈给大脑继续判断行动 Action。所以你可以理解为Agent LLM 规划 记忆 工具 执行循环。LLM 只是 Agent 里的一个零件就像 CPU 只是电脑里的一个零件一样。1.2 为什么说“先有模型再有 Agent最后才有平台”这个顺序特别重要。我见过太多人直接跳过前两层上来就想搭一个大而全的 Agent 平台结果连“接哪个模型、用哪个提示词模板、工具返回结果怎么解析”都没定项目自然烂尾。正确顺序是第一层先把模型选好搞清楚你和团队最常用的是哪个模型服务它的上下文窗口多大、支持不支持函数调用、响应速度如何。第二层再在模型外面包一层 Agent 运行时让模型具备规划、记忆、工具调用的能力。第三层才是平台也就是把很多个 Agent 放在一起统一管理、统一调度、统一监控形成所谓的“Agent 工厂”。拿 DeepSeek 来举例。你问“DeepSeek 是属于哪一层”答案是模型层。它是一个大语言模型可以被 OpenAI SDK 兼容的方式调用。它在我的平台里是作为“大脑”被接入的具体是跑 Agent 还是普通聊天取决于外面那层 Agent 运行时怎么包装。所以如果你觉得自己“会调 DeepSeek API 就会做 Agent”那就像“会用 CPU 就会装电脑”一样中间差了好几层工序。也有朋友会问既然 DeepSeek 这么强能不能只靠它自己完成复杂任务短时间可以但模型本身不持久化记忆不主动调用你内部系统的接口也不知道你们项目的上下文。所以 Agent 平台的意义就是把模型的“聪明”翻译成组织能用的“产出”这才是工厂模式的本质。2. Agent 工厂的整体设计把“造同事”变成一条流水线2.1 平台架构五层模型我搭 Agent 工厂之前画过一张草稿后来项目迭代过程中不断调整最终沉淀成五层结构。这五层从下往上分别是模型层、接入层、编排层、技能层、应用层。用工厂类比模型层是“原材料仓库”接入层的模型网关是“统一采购部”编排层是“流水线的机械臂”技能层是一个个“标准工位”应用层则是“质检出货口”。模型层不用多说就是各类大模型DeepSeek、Qwen、GPT 等甚至本地私有化部署的开源模型都算。接入层是容易被新手忽略的一层实际非常关键。很多团队手里已经买了多个模型服务有的模型在某个任务上效果好有的模型便宜如果你给每个上层应用都直接写模型的原生 SDK那模型一换所有应用都要跟着改这是典型的反模式。所以接入层要做一个统一模型网关对外暴露一套统一的 API 格式内部再把请求路由到不同模型上。这样上层业务不感知模型切换成本也能控制住。编排层是 Agent 的核心也就是后面我要讲到的 Harness。它的职责是驱动一次完整的 Agent 思考与行动循环接收目标、拆解任务、选择技能、调用模型、执行工具、评估结果直到任务完成或达到最大轮数。技能层则是把“某个具体任务的提示词模板 工具 参数校验 结果后处理”打包成可复用的技能单元。应用层说白了就是用户能看到的形态比如一个“智能客服同事”、一个“代码审查同事”、一个“周报同事”。2.2 四大核心零件Harness、Skill、Memory、MCP这个标题里的四个词是我认为 Agent 工厂里最核心的四个零件也是热搜词里反复出现的 AI Agent 关键概念。我把它们一个个说透。Harness 这个词很多人翻译成“线束”或者“控制框架”我更喜欢叫它“Agent 运行时”。它解决的核心问题是一个 Agent 到底靠什么循环跑起来。最朴素的循环就是 While 循环给定目标 - 调模型 - 模型返回要调用工具 - 执行工具 - 把结果回传给模型 - 判断是否结束。Harness 就是这个循环的骨架它要管循环次数上限、超时、重试、异常兜底、日志埋点。没有 Harness 的 Agent 就是一把散装零件跑不了几分钟就崩。Skill 是技能包就像工厂里一个工位上的操作规程。它把提示词模板、可用工具列表、输入输出 schema 固化下来所以同一个 Agent 可以按需加载不同 Skill。举个例子我有一个“代码审查技能”它包含一份针对团队编码规范的提示词模板工具列表里有 GitLab 拉取 MR diff 的接口还有一个“周报技能”它的工具列表里有读取 Git 提交记录的接口。Skill 做得好不好直接决定 Agent 在具体任务上的表现。Memory 是记忆系统分为短期记忆和长期记忆。短期记忆就是当前会话的上下文随着对话轮数变长上下文越来越大成本也越来越高所以需要摘要压缩长期记忆是把重要的信息固化到向量数据库里比如用户的偏好、历史决策、项目背景这样下次新会话还能“想起来”。没有 Memory 的 Agent 是“金鱼记忆”每次对话都等于重来。MCPModel Context Protocol是模型上下文协议它解决的是工具连接标准化的问题。以前每个工具都要写不同的接入代码OpenAI 有 OpenAI 的方式LangChain 有 LangChain 的方式烦不胜烦。MCP 定了同一套协议工具提供方只要实现一个 MCP ServerAgent 运行时通过 MCP Client 就能调用。这就像 USB-C 接口统一了充电线生态一下子活起来了。2.3 技术选型为什么我选择了 Java Spring AI 作为工厂底座在动手之前我其实纠结过技术栈。最开始倾向的是 Python因为 AI 生态大部分都在 Python 这边LangChain、LangGraph 这些框架很成熟身边很多朋友也在用。但考虑到我们团队的实际背景——主力是 Java 工程师公司已有系统大部分跑在 Spring Cloud 上运维体系也是围绕 JVM 搭建的我最后选了 Java Spring AI 作为工厂底座。这是一个典型的“选团队熟悉的技术栈”的决策不是 Python 不好而是 Java 这套更符合我们团队的长期维护成本。Spring AI 这个框架在 2024 年后开始火起来它做了几件很实在的事一是抽象了 ChatClient、EmbeddingModel 等接口让你能以相对统一的方式对接多个模型供应商二是内置了对 MCP 的支持无论是作为客户端连接 MCP Server还是把 Spring Boot 应用暴露成 MCP Server都有对应组件三是它天然长在 Spring 生态里和 Spring Cloud、Spring Boot、Spring Security 配合得非常好。这对做企业级平台来说太重要了因为你要考虑认证、限流、配置中心、注册发现而这些正是 Spring 家族的强项。如果你没有 Java 背景也不想为平台引入一套新语言那用 Python 也完全可以。我的建议很务实不要为了追新框架而追新框架先看你团队现有技术栈和后续谁来维护。只要是能快速出活、团队愿意长期投入的方案就是好方案。3. 从 0 到 1 实现最小可用平台3.1 环境准备和工程骨架我搭建的时候用的基础环境是这样的JDK 17Spring Boot 3.3.xSpring AI 0.8.x 左右这个版本迭代很快建议用你接触时最新的稳定版Maven 3.9。数据库用了 MySQL 和 Redis向量库先用了 Chroma 做本地测试后续正式环境准备换 Milvus。开发机是 Mac生产部署走 Linux Docker。工程骨架建议起一个多模块 Maven 项目模块拆分为agent-core核心运行时、agent-skill技能实现、agent-gateway模型网关、agent-api对外接口、agent-admin平台管理后台。如果只是做最小验证可以先单模块跑通但我建议从一开始就按多模块拆否则后期拆分的成本比现在还高。依赖方面最核心的是这几个dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-mcp-client/artifactId /dependency第一段重点是 spring-ai-starter-model-openai它不只是连 OpenAI 官方用的因为 Spring AI 的 OpenAI Client 实现只要你把 base-url 改掉就能对接很多兼容 OpenAI API 格式的服务包括 DeepSeek 和国内一些云厂商的模型服务。第二个是 MCP 客户端依赖后面接工具生态会用到。3.2 接入大模型网关一套 API 对接 DeepSeek、OpenAI、Qwen模型网关是我最先写的一块原因很简单没有模型后面都白搭。Spring AI 的配置方式很直接在 application.yml 里填上对应配置即可。我当时的配置大概是这样的注意 base-url 被我换成了自己的统一网关地址这是企业里很常见的做法spring: ai: openai: base-url: https://your-model-gateway.example.com/v1 api-key: ${MODEL_API_KEY} chat: options: model: deepseek-chat temperature: 0.3 max-tokens: 4096这里的关键点在三个地方。第一是 base-url通过指向统一模型网关上层代码就再也不需要关心模型具体是 DeepSeek 还是 Qwen 了第二是 temperature我建议做任务型 Agent 时控制在 0.3 以下因为这个场景要的是稳定输出而不是天马行空我实测过 temperature 调到 0.7 时同样一个“整理会议纪要”任务有几次会自动脑补出会上根本没提到的行动项第三是 model 字段按需切换同一个接口可以动态切换。理解了这三个点你就能明白为什么很多人用模型 API 做 Agent 会觉得“效果不稳定”很多时候不是模型的问题而是你没给它一个稳定执行的环境。3.3 核心循环手写一个最简 Agent Harness说句实在话市面上框架里的 Agent 循环封装得太高级反而容易让新手晕。我建议第一次做的时候先手写一个最简 Harness把原理跑通再用框架的封装不迟。这里我给一个核心骨架。public class AgentHarness { private final LlmGateway llm; private final SkillRegistry skillRegistry; private final Memory memory; public AgentResult execute(String objective) { String fullPrompt objective; // 1. 从长期记忆中检索和当前任务相关的背景 ListMemoryChunk relatedMemories memory.search(objective); // 2. 进入 agent 循环 for (int step 0; step maxIterations; step) { LlmResponse resp llm.chat(fullPrompt); if (resp.isFinished()) { return buildResult(resp); } // 3. 模型决定调用某个技能 Skill skill skillRegistry.find(resp.getSkillName()); ToolResult toolResult skill.execute(resp.getSkillArgs()); // 4. 把工具结果回填给模型 fullPrompt ToolResponseAppender.append(fullPrompt, toolResult); } throw new MaxIterationsExceededException(); } }这段代码的精华在于那个 for 循环。它体现了 Agent 最核心的机制模型给指令Harness 执行工具结果回填模型再看下一步直到任务收敛。注意 maxIterations 非常关键我一开始没设上限结果一个 Agent 在“查询订单状态”这个任务上因为工具返回格式不匹配硬生生循环了 37 次把 token 消耗烧掉一大截。后来统一设了最大 10 步的限制理论上 99% 的业务任务 10 步内都能完成剩下的基本是坏任务不如直接给用户一个兜底回复。3.4 Skill 开发规范以“写周报”技能为例Skill 是 Agent 工厂里的“工位”也是我觉得最有必要规定开发规范的部分。我定了一套简单的规则一个 Skill 由四部分组成——元信息名称、描述、参数格式、提示词模板、工具清单、输出解析器。命名上统一用动词短语比如generate_daily_report、review_code_diff、query_incident这样 Agent 在规划时更容易准确匹配。拿“写周报”这个场景来拆一下。我的周报 Skill 长这样元信息技能名generate_weekly_report参数{devName: 某开发者, dateRange: 2024-01-01~2024-01-07}。提示词模板里面写清楚了周报的结构要求包括标题、本周完成事项、风险与阻塞、下周计划并且强调“只基于工具返回的真实提交记录来写不要编造”。工具清单包含一个get_git_commits工具负责在日期范围内拉取指定开发者的 Git 提交记录。输出解析器把模型生成的 Markdown 解析成结构化周报 JSON 存储。写好这个 Skill 之后用户只需要在对话里说一句“帮我生成本周的周报”Agent 会自己去调get_git_commits把提交记录拼进提示词模板再让模型生成最终文档。这个过程中用户不需要看到工具细节这就是“造同事”的感觉。3.5 记忆系统短期上下文、长期向量库、工作记忆记忆系统是我后期最花精力的一块因为它直接决定了“同事”用得顺不顺手。我第一次做的时候只想做一个简单上下文拼接把历史对话全塞给模型结果上下文窗口很快就爆了而且成本暴涨。后来我把记忆拆成三层。短期上下文就是当前对话窗口超过一定轮数就做摘要比如“用户之前已经确认了 A 方案的架构后续不要再重复介绍”然后把摘要和历史关键信息一起交给模型。长期记忆放在向量库里每次新会话开始时做一个检索召回相当于一个“预习”动作这样用户不需要重复交代背景。工作记忆则是当前 Agent 执行过程中产生的中间状态比如查到的订单 ID、待确认的候选人列表通常放在 Redis 里便于多轮对话中快速读取。向量库的选型我建议分阶段。开发环境用 Chroma 或者 FAISS 就够了它跑在本地、部署简单到了生产环境如果企业里已经有用好的向量库比如 Milvus就直接接如果还没有建议慎重选型因为向量数据迁移很痛苦。我对这块最大的心得是不要一上来就追求复杂的长期记忆体系先把短期上下文搞稳定再逐步加入向量检索否则排查问题的时候会非常抓狂。3.6 用 MCP 扩展工具生态MCP 可以说是这两年 AI Agent 生态里最能提升效率的协议。它最核心的好处是标准化一个 MCP Server 写好后可以被多个 Agent 客户端复用。我目前接了两类 MCP Server一类是文件系统 MCP可以让 Agent 直接读取服务器上的指定目录用于日志分析和配置检查另一类是数据库 MCP通过只读账号让 Agent 执行安全的 SQL 查询。用 Spring AI 的 MCP Client 组件配置其实不复杂spring: ai: mcp: client: enabled: true name: default-agent-client type: syncMCP Server 可以是一个独立的 Spring Boot 进程也可以是一个 stdio 启动的子进程。我自己的经验是独立进程模式更好维护因为可以看到日志、可以单独重启不跟主业务耦合。MCP Server 的启动参数里需要注入访问凭据但切记不要把密码明文写在代码里要放到配置中心或者环境变量否则审计科来找你喝茶的时候别怪我没提醒。有一点要提醒MCP 只是一个“把工具变成统一协议”的通道它不解决权限问题。你在接数据库 MCP 的时候最好给数据库分配一个只读账号并做网络隔离防止 Agent 因为提示词注入意外执行了删表操作。这个风险是真的存在的别觉得模型很聪明就不会犯错。3.7 部署落地Docker Jenkins 接入已有 CI/CD平台写完之后部署是很多初学者容易忽略但企业落地必须做的一关。我当时的做法是用多阶段 Dockerfile 构建把编译、打包、运行分开最终运行镜像只包含 JAR 和必要的基础工具镜像体积从 800MB 减到 300MB 左右。Dockerfile 的关键部分大致是这样FROM maven:3.9-eclipse-temurin-17 AS build COPY . /app WORKDIR /app RUN mvn -DskipTests package FROM eclipse-temurin:17-jre COPY --frombuild /app/target/agent-platform.jar /opt/agent-platform.jar ENTRYPOINT [java, -jar, /opt/agent-platform.jar]这里有一个小坑Maven 构建时如果一直拉不到 Spring AI 的快照依赖多半是你的 Maven 仓库配置里没有加 Spring 的里程碑仓库需要在 pom.xml 的 repositories 里加上 Spring Milestones 地址不是网络问题。生产环境我们用了 Jenkins 做 CI/CD。这里的玩法可以有深有浅浅玩法是 Jenkins 构建、跑测试、推送镜像、滚动更新深玩法是让 Agent 本身成为自动化运维的一部分比如用 Agent 去解析 Jenkins 构建日志自动诊断失败原因甚至自动生成修复补丁。后面这种玩法属于“Jenkins AI Agent”方向我们目前还在探索阶段但方向是明确的运维系统中的告警信息、构建日志、网关指标都可以做成 MCP Server让 Agent 去分析从而辅助人工排障。4. 多智能体协作让同事与同事开始配合4.1 角色拆分主管 Agent、执行 Agent、质检 Agent单 Agent 能解决不少问题但真正像团队一样协同工作需要多个 Agent 配合。我参考了软件开发团队的角色在平台里拆出三类职责。主管 Agent 负责接收用户需求拆解任务分配合适的执行 Agent最后汇总结果执行 Agent 聚焦某个领域比如代码审查、SQL 编写、会议纪要它不需要关心全局只需要把自己的活干好质检 Agent 对执行 Agent 的产出做二次检查比如检查代码审查结果里是否包含高风险漏洞关键词、检查生成文档里是否有明显的时间逻辑错误。这个设计的思路很像工厂流水线加上质检环节。任务到达时先由“主管”做任务分解再分发到不同“工位”最后统一做质量检验。这里最重要的原则是职责隔离不要试图让一个 Agent 既当运动员又当裁判那样结果一定是质检失效。4.2 三种编排模式串行、并行、异步事件多 Agent 编排是一个很容易踩坑的地方我做下来发现其实就是三种模式反复组合。第一种是串行编排上一个 Agent 的输出是下一个 Agent 的输入适合有严格顺序要求的场景比如“先总结会议纪要再生成待办任务再创建 Jira 工单”这个模式下需要保证数据格式在环节间稳定传递。第二种是并行编排多个执行 Agent 互不依赖比如“同时分析三个仓库的代码质量”这种模式下最重要的是把并发数控制在合理范围否则多个大模型同时调用模型网关很容易被限流。我实测过同一个模型服务并发超过 5 个请求后响应延迟会显著上升所以并行度建议设置一个可配置的线程池上限。第三种是异步事件编排适合长耗时的任务比如 Agent 需要你去审批一个流程审批完再继续执行事件驱动机制就要接进来。异步编排更复杂但对于企业级场景很重要因为不是所有 Agent 任务都能在几秒内完成。4.3 两个真实场景代码审查助手、PLC 编程辅助先说代码审查助手这个场景。我们把 MR 的 diff 通过代码仓库 MCP Server 拉取下来由一个代码审查 Agent 按团队编码规范做检查输出包含问题等级、修改建议、示例代码的结构化结果再自动以评论形式发回 MR。这个 Agent 上线后我们一期配置的是“只读”模式只有建议权、没有合并权避免它一上来就闯祸。后来跑了一个月准确率稳定后才让它对低风险问题自动打标记。另一个场景是 PLC 编程辅助。这个场景有点垂直但很有意思因为热词里也出现了“ai agent与plc编程”的讨论。PLC 工程师经常需要写梯形图或结构化文本这类工作很吃经验很多代码片段被开发一遍又一遍。我们可以把企业内部的 PLC 程序模板、历史故障案例都收集到知识库里做成一个 PLC 编程辅助 Agent工程师遇到“诊断一台皮带输送机的过载保护逻辑怎么张”这样的问题时Agent 能基于历史案例和规范文档给出程序框架和参数建议。它不是直接生成最终的工业控制程序因为那需要合规审核而是作为一个“资深同事”提供参考方案显著减少工程师的检索和试错时间。5. 常见问题与排查技巧实录5.1 高频问题速查表这段时间使用下来我总结了几个出现频率最高的问题整理成了速查表方便你直接对照问题现象可能原因排查思路Agent 陷入无限循环缺少最大迭代轮数控制检查 Harness 的循环上限设置合理步数阈值回答内容明显夸张、编造事实temperature 过高或者缺少证据约束降低 temperature提示词里强制要求引用工具结果上下文越来越大成本失控短期记忆不做摘要压缩实现滑动窗口或摘要记忆适当丢弃早期冗余内容工具返回结果无法被模型理解工具输出格式不规范标准化工具返回结构统一为 JSON并在提示词中说明 schemaMCP Server 调用超时服务端处理过慢或网络隔离问题调大超时阈值检查 Server 日志必要时拆分成多个小粒度工具同样的任务效果时好时坏prompt 不稳定模型选择随机性固定 temperature做回归测试集版本化 prompt上游模型服务限流并发请求过多模型网关加本地限流和排队动态降级到备用模型5.2 几条值得收藏的排障心法排障这件事经验比知识更重要。我分享几个自己踩过坑之后沉淀下来的心法。第一凡是 Agent 回答很奇怪先看日志里的工具调用记录不要只看最终回答。工具调用的中间结果暴露了最多问题模型会一本正经地推理但如果它拿到的工具返回本身就是错的那最终回答越好反而越危险因为你更不容易察觉异常。所以我的日志埋点里工具调用前后的关键参数和返回体的前 500 个字符一定会输出方便排查。第二模型输出的格式校验必须前置。很多人习惯让 Agent 输出 JSON 后自己解析但模型偶尔会在 JSON 前后加一些 Markdown 代码块标记或者在中途插入一句“好的我来分析”。这种事我遇到不下十次后来就让模型在一开始就指定output_formatjson并且加了 ResponseParser 做容错清理效果立刻改善。第三对 Agent 的能力预期要克制。它是很好的“效率放大器”但不是“完全自动化替代”。我搭平台的过程中最反反复复纠结的就是这个定位问题。后来我定了一条原则凡是高风险动作比如改生产配置、直接回复客户消息一律只在“人工确认”模式下开放高风险信息查询比如涉及核心数据的 SQL默认不让 Agent 直接执行它只负责生成语句和建议执行权交还给人类。这不是技术做不到而是责任模型必须清楚一旦出了事承担责任的还是人。这套平台从需求梳理到初步可用前后花了大约三周的一个多月时间。我自己最大的感受是搭建一个真正能用的 AI Agent 平台难点不在于调用大模型 API而在于把工程化思维和 AI 能力黏合在一起。Harness、Skill、Memory、MCP 这四样东西本质上都是在给模型“加规矩、加记忆、加工具”让它的聪明真正转化为组织的产出。最后再给一个小技巧刚开始做 Agent 平台不要贪多先把一个最常用的场景做透。我最初只做“写周报”这一个技能从中学会了工具调用、上下文管管、输出校验一整套流程然后再去复制到代码审查、运维助手这些场景上速度就快了很多。先有一个能跑的“同事”再让其他“同事”陆续上岗流水线就有了雏形。
返回列表