
1. 为什么“隔离内网 AI Agent”是个真问题而不是伪需求先把场景说清楚。所谓隔离内网指的是开发机、构建机、测试环境全部处在一个没有公网出口、或者出口被严格白名单管控的网络里。很多做金融、制造、政企交付的团队都是这种环境代码不能出网依赖包要走内部镜像连pip install都得先过一道审批。而 AI Agent 这套东西从它诞生那天起就是“吃网络”的——要调模型 API、要拉 MCP Server、要装 Skills、要访问外部工具。这两件事天然打架。我见过太多团队在这上面翻车。一开始大家在公网环境里玩得飞起Claude Code、Codex、各种 MCP 工具链跑得顺风顺水等到要把这套东西搬进内网做正式交付直接傻眼模型调不通、MCP 连不上、Skills 装不了、连个依赖都拉不下来。于是有人开始动歪脑筋想各种“绕出去”的办法这条路我不展开也不建议合规风险极高而且一旦被审计发现整个项目都得停。正确的思路只有一条把 AI Agent 的能力拆解成“必须联网的部分”和“可以本地化的部分”然后在内网里重建一套自洽的工程体系。这篇内容就是讲这套体系怎么搭。它适合三类人一是要在内网环境交付 AI 能力的工程团队二是想把 Agent 能力私有化落地的技术负责人三是单纯好奇“没有公网Agent 到底还能不能干活”的开发者。答案是能而且能干得挺漂亮前提是你得把工程链路想明白。我先把核心结论摆出来内网 Agent 工程的关键不在于“怎么连出去”而在于模型本地化、工具协议内网化、Skills 资产离线化、以及一套能扛住并发的调度层。下面按这个逻辑一层层拆。2. 内网 Agent 的能力边界哪些必须本地化哪些可以妥协动手之前先做一次能力盘点这一步很多人跳过结果做到一半发现某个环节根本没法在内网实现返工成本极高。我一般会拿一张表把 Agent 的依赖项全部列出来逐项判断“内网可行性”。2.1 把 Agent 依赖拆成四层来看AI Agent 的运行时依赖本质上可以分成四层从下往上依次是层级依赖内容内网可行性处理策略模型层大模型推理服务可本地化部署本地推理或接内网模型网关协议层MCP 等工具调用协议完全可本地化内网自建 MCP Server 集群资产层Skills、Prompt、工具描述完全可本地化离线包 内部制品库工具层浏览器、数据库、代码执行部分可本地化内网工具服务化模型层是最容易让人焦虑的。公网环境下大家习惯直接调云端大模型进了内网就抓瞎。但现在的现实是开源模型的推理能力已经足够支撑绝大多数 Agent 场景——代码生成、工具调用、结构化输出这些7B 到 32B 级别的模型配合好的 Prompt 工程完全能打。真正吃模型能力的是复杂推理和长链路规划这类任务在内网里要么降级处理要么用更大的本地模型扛。协议层是内网 Agent 工程里最值得投入的地方。MCPModel Context Protocol本质上是一套“模型怎么调用外部工具”的约定它跟网络位置无关你完全可以在内网起一堆 MCP Server让 Agent 通过内网地址去调用。这一点后面会展开讲。资产层经常被忽略。Skills 说白了就是一堆结构化的 Prompt 模板 工具声明 执行逻辑它本质上是文件不是服务。既然是文件就能打包、能离线分发、能进内部制品库。内网里完全可以建一个“Skills 市场”的私有版本。工具层是最麻烦的。浏览器自动化、外部 API 调用这些在内网里要么换成内网可访问的等价物要么直接砍掉。比如 Playwright 这种浏览器自动化工具内网里可以跑但它访问的页面必须是内网可达的。2.2 一个反直觉的判断不是所有能力都要保留我踩过的一个坑是总想把公网环境里的能力 1:1 搬到内网。结果发现有些能力在内网里根本没有对应场景硬搬过来只是增加维护负担。比如某些依赖外部公开数据的工具内网业务里压根用不到那就果断砍掉。判断标准很简单这个能力对应的业务场景在内网里真实存在吗如果不存在砍掉如果存在但实现方式不同替换如果完全一致直接搬。按这个标准过一遍你会发现需要真正本地化的能力可能只有原来的六成工程复杂度直接降一个量级。2.3 内网 Agent 的典型能力清单经过上面这轮筛选一个典型的内网 Agent 工程能力清单大概长这样代码理解与生成基于本地模型处理内网代码仓库内网知识检索对接内部文档库、Wiki、代码库数据库操作通过内网 MCP Server 访问业务数据库构建与部署辅助调用内网 CI/CD 接口测试用例生成与执行在内网测试环境跑工单与流程处理对接内部 OA、工单系统这份清单里没有一项需要公网。这就是内网 Agent 工程的底气所在——业务价值全部来自内网数据而不是外部信息。3. MCP 在内网怎么落地从协议理解到 Server 集群搭建MCP 是这两年 Agent 工程里最热的概念之一但很多人对它的理解停留在“一个协议”这个层面真到内网落地就懵了。我先把 MCP 的本质讲透再讲内网怎么搭。3.1 MCP 到底解决了什么问题用一句话概括MCP 让模型和工具之间的调用关系标准化了。在没有 MCP 之前每个 Agent 框架调工具的方式都不一样你给 A 框架写的工具换到 B 框架就得重写。MCP 出现之后工具方只需要实现一个 MCP Server任何支持 MCP 的客户端都能调。这个特性对内网工程意义重大。因为内网里工具往往是多个团队分别维护的如果每家都按自己的方式对接 Agent维护成本会爆炸。有了 MCP工具团队只管把自己的能力封装成 MCP ServerAgent 团队只管按协议调用两边解耦。MCP 的通信方式主要有两种stdio标准输入输出和 SSE/HTTP。内网里我强烈推荐用 HTTP 方式原因很简单——stdio 适合本地进程HTTP 适合服务化部署而内网 Agent 工程一定是服务化的。3.2 内网 MCP Server 集群的部署结构一个能扛住多人使用的内网 MCP 集群结构大概是这样[Agent 客户端] | v [MCP 网关/路由层] - 统一鉴权、限流、日志 | --- [代码工具 MCP Server] --- [数据库 MCP Server] --- [文档检索 MCP Server] --- [CI/CD MCP Server]关键在中间那层网关。很多人图省事让 Agent 直接连各个 MCP Server结果就是鉴权散落各处、限流没法统一做、出问题排查困难。加一层网关之后所有 MCP 流量都从这里过鉴权、限流、审计、日志一次性解决。网关的实现不复杂核心就是三件事路由转发、Token 校验、并发控制。路由转发按 MCP Server 的注册名分发Token 校验保证只有授权的 Agent 能调并发控制防止某个 Agent 把后端工具打爆。3.3 一个 MCP Server 的最小实现内网里写 MCP Server我建议用 Python 或 TypeScript生态最成熟。下面是一个 Python 版的最小示例展示一个“查询内网数据库”的 MCP Server 骨架from mcp.server import Server from mcp.server.models import Tool import asyncio app Server(internal-db-mcp) app.list_tools() async def list_tools(): return [ Tool( namequery_user_table, description查询内网用户表仅支持只读, inputSchema{ type: object, properties: { sql: {type: string, description: 只读 SQL} }, required: [sql] } ) ] app.call_tool() async def call_tool(name: str, arguments: dict): if name query_user_table: sql arguments[sql] # 这里做 SQL 白名单校验只允许 SELECT if not sql.strip().lower().startswith(select): raise ValueError(仅允许只读查询) result await run_query(sql) return {content: [{type: text, text: str(result)}]} if __name__ __main__: asyncio.run(app.run())这段代码里有两个内网工程的关键点。第一SQL 白名单校验必须做在 Server 侧不能指望 Agent 自觉因为 Agent 的 Prompt 可能被注入。第二工具描述要写清楚边界比如“仅支持只读”这样模型在规划时就知道这个工具的约束减少无效调用。3.4 MCP 内网部署的三个坑第一个坑是超时设置。内网服务之间的调用延迟比公网稳定但一旦某个 MCP Server 卡住Agent 会一直等。我一般把 MCP 调用超时设在 30 秒超过就返回错误让 Agent 换策略。第二个坑是工具数量爆炸。当 MCP Server 多起来之后Agent 每次规划都要看几十个工具描述Token 消耗巨大且容易选错。解决办法是做工具分组按业务域把工具分到不同 MCP ServerAgent 根据当前任务只加载相关分组。第三个坑是版本管理。MCP Server 的接口一旦变更所有依赖它的 Agent 都可能挂。内网里必须给 MCP Server 做版本号Agent 调用时指定版本新版本上线走灰度。4. Skills 资产的内网化管理从散落文件到内部市场Skills 这个词最近很火但很多人对它的理解还停留在“一堆 Prompt 模板”。实际上 Skills 是 Agent 工程里最容易被低估的资产——它决定了 Agent 在具体场景下“会不会干活”。4.1 Skills 的本质是“可复用的场景能力包”一个 Skill 通常包含三部分触发条件、执行逻辑、输出规范。触发条件告诉 Agent 什么时候该用这个 Skill执行逻辑是具体的步骤或工具调用序列输出规范约束结果格式。举个例子一个“生成单元测试”的 Skill触发条件是“用户要求为某个函数生成测试”执行逻辑是“读取函数代码 → 分析分支 → 生成测试用例 → 调用测试框架验证”输出规范是“测试文件必须能被内网测试框架直接执行”。内网里 Skills 的价值比公网更大因为内网业务场景高度特定通用 Agent 能力往往不够用必须靠 Skills 把领域知识固化下来。4.2 内网 Skills 制品库的搭建散落的 Skill 文件是维护灾难。我建议在内网建一个 Skills 制品库结构如下skills-repo/ ├── code/ │ ├── unit-test-gen/ │ │ ├── skill.yaml │ │ ├── prompt.md │ │ └── tools.json │ └── code-review/ ├── data/ │ ├── sql-gen/ │ └──>