ARTICLE DETAIL

资讯详情

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

隔离内网部署AI Agent实战:MCP、Skills与离线依赖全攻略

隔离内网部署AI Agent实战:MCP、Skills与离线依赖全攻略 1. 为什么要在隔离内网里折腾 AI Agent先把场景说清楚。所谓隔离内网就是那种物理上跟公网断开、或者只允许极少数白名单流量出入的办公/生产网络。金融、政企、制造业的研发区、医院的影像科室、芯片设计公司的EDA机房基本都是这个形态。你在这种环境里想跑一个 AI Agent第一反应通常是模型怎么调——但真正卡住你的往往不是模型而是依赖拉不下来、工具连不出去、日志传不出来这三件事。我在去年下半年接手过一个内网知识库问答 Agent 的落地前后踩了差不多三周的坑最后跑通的方案核心就一句话把所有需要联网的环节全部前置到一台能上网的机器上完成内网只负责运行和编排。这个思路听起来朴素但真做起来MCP、Skills、模型权重、Python 依赖、向量库、前端静态资源每一样都有各自的坑。这篇东西写给谁看三类人。第一类是被公司网络策略卡住、但又必须交付 Agent 功能的后端/算法工程师第二类是想把 Claude Code、Codex 这类带 Skills 的工具搬进内网做研发提效的技术负责人第三类是单纯好奇AI Agent 到底怎么在内网跑起来的爱好者。不管你是哪一类下面的内容都能直接抄作业我会把每一步为什么这么做讲透。需要提前说明的是内网环境千差万别有的只是不能出公网但内网互通有的是完全物理隔离连U盘都要审批。我会按最严格的假设来写你按自己环境的宽松程度做减法就行。2. 整体架构设计与选型思路2.1 三层分离外网准备层、摆渡层、内网运行层我最终采用的架构是三层分离这个划分是整个方案的地基后面所有细节都围绕它展开。外网准备层一台能正常访问公网的机器可以是你的个人笔记本也可以是公司给的跳板机。它的唯一职责是把内网需要的一切东西下载齐、打包好。模型权重、pip wheel 包、npm 包、MCP server 的可执行文件、Skills 的目录结构全部在这一层搞定。摆渡层负责把外网准备层的东西送进内网。严格隔离环境下就是刻盘或者走审批过的文件交换区半隔离环境下可能有一条单向的数据导入通道。这一层的核心原则是只进不出或者进出都走审批绝不为了图方便私搭通道。内网运行层真正跑 Agent 的地方。这里没有公网所有服务通过内网 IP 互相访问模型走本地推理或者内网推理集群工具调用走内网部署的 MCP server。为什么这么分因为内网里最痛苦的就是缺一个包要重新走一遍审批。三层分离之后你在外网准备层可以反复试错、反复下载直到打包完整了再一次性摆渡进去。我见过太多人图省事在内网里发现缺个依赖就想办法临时开个口子结果安全审计一查一个准得不偿失。2.2 模型选型本地推理还是内网集群模型这块内网环境下基本告别了调云端 API 的可能。两条路一是本地跑量化模型二是内网如果有 GPU 集群就走集群推理。本地跑的话我实测下来 7B 到 14B 的量化模型Q4 或 Q5 量化在单张消费级显卡上能跑得比较舒服32B 的 Q4 需要 24G 显存起步。推理框架选 llama.cpp 或者 vLLM 都行前者对 CPU 和低显存更友好后者吞吐高适合多人共用。这里有个经验内网 Agent 对模型的要求不是最聪明而是稳定输出结构化结果。因为 Agent 的核心是工具调用和流程编排模型只要能把 JSON 格式的 function call 稳定吐出来7B 完全够用没必要硬上大模型。如果内网有推理集群那就走 OpenAI 兼容接口。vLLM、TGI、SGLang 这些框架都提供/v1/chat/completions接口你的 Agent 代码里把 base_url 指向内网 IP 就行代码几乎不用改。这是最省心的方案前提是你得有集群资源。2.3 工具调用协议为什么选 MCPMCPModel Context Protocol这两年火起来不是没道理的。在它之前每个 Agent 框架都有自己的工具定义方式LangChain 一套、AutoGPT 一套、各家自研的又一套工具没法复用。MCP 把工具怎么描述、怎么调用、怎么返回标准化了一个 MCP server 写一次Claude Code、Codex、各种支持 MCP 的客户端都能用。内网环境下 MCP 的价值更大。因为你可以把内网的各种能力——数据库查询、文件检索、内部 API 调用——都封装成 MCP server然后 Agent 通过统一的协议去调。这样即使以后换 Agent 框架工具层不用重写。MCP server 的传输方式主要有两种stdio标准输入输出本地进程通信和 SSE/HTTP网络通信。内网部署我强烈建议优先用 stdio因为不涉及端口暴露安全审计好过。只有当 MCP server 需要独立部署、多个 Agent 共用时才考虑 HTTP 方式这时候记得绑定内网 IP 而不是 0.0.0.0。2.4 Skills 机制把经验固化成可复用单元Skills 是最近半年特别热的概念Claude Code、Codex 都在推。简单说一个 Skill 就是一段封装好的能力描述 执行逻辑Agent 在需要的时候自动加载。它跟 MCP 的区别在于MCP 偏工具Skills 偏工作流和领域知识。内网环境下 Skills 特别有用因为很多内部规范、操作流程是没法让模型自己悟出来的。比如查询生产数据库前必须先走审批表登记这种规则你写成 Skill 塞给 Agent它就知道该怎么做。Skills 的目录结构一般是skills/技能名/SKILL.md加一些辅助脚本摆渡的时候整个目录打包带走就行。3. 外网准备层的完整实操3.1 模型权重的下载与量化模型权重动辄几个 G 到几十个 G下载和摆渡都是体力活。我的做法是在外网机器上用huggingface-cli或者modelscope下载原始权重然后本地量化。# 下载模型以 Qwen 系列为例具体模型按需替换 pip install huggingface_hub huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./qwen2.5-7b # 用 llama.cpp 量化成 Q4_K_M git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make python convert_hf_to_gguf.py ../qwen2.5-7b --outfile qwen2.5-7b-f16.gguf ./llama-quantize qwen2.5-7b-f16.gguf qwen2.5-7b-q4km.gguf Q4_K_M量化参数怎么选Q4_K_M 是性价比最高的档位7B 模型量化后大概 4.5G质量损失很小。如果你显存紧张Q3_K_M 也能用但复杂推理任务会明显掉点。Q5、Q6 质量更好但体积大除非你有充足显存否则没必要。注意量化过程很吃内存7B 模型转 f16 大概需要 16G 内存32B 需要 64G 以上。内存不够的话直接下载别人量化好的 GGUF 文件省事。3.2 Python 依赖的离线打包这是内网部署最容易翻车的地方。内网 pip 装不了包你得把所有依赖的 wheel 文件提前下好。# 在外网机器上根据 requirements.txt 下载所有 wheel pip download -r requirements.txt -d ./wheels --platform manylinux2014_x86_64 \ --python-version 310 --only-binary:all: # 如果有些包只有源码没有 wheel去掉 --only-binary 单独处理 pip download -r requirements.txt -d ./wheels这里有几个坑必须说。第一--platform和--python-version必须跟内网目标机器完全一致否则下下来的 wheel 装不上。第二有些包依赖系统库比如 psycopg2 依赖 libpqwheel 里不含这些得单独把系统库也准备好。第三如果内网是 ARM 架构比如某些国产服务器--platform要改成manylinux2014_aarch64。我的经验是先在内网目标机器上跑一遍pip install把报错信息记下来回到外网针对性补包。来回两三次基本就齐了。别指望一次成功。3.3 MCP Server 与 Skills 的打包MCP server 如果是 Node.js 写的用npm pack打成 tgzPython 写的就用上面的 wheel 方式。Skills 目录直接 tar 打包。# 打包 Skills 目录 tar -czvf skills-bundle.tar.gz ./skills/ # 打包 MCP serverNode 示例 cd mcp-server npm install --production npm pack打包的时候记得把node_modules或者虚拟环境一起带上内网重新装依赖太痛苦。体积大点没关系摆渡一次搞定比来回折腾强。4. 内网运行层的部署与编排4.1 模型服务的启动与验证东西摆渡进来之后先起模型服务。用 llama.cpp 的话# 启动 llama.cpp server绑定内网 IP ./llama-server -m ./models/qwen2.5-7b-q4km.gguf \ --host 192.168.1.100 --port 8080 \ -c 8192 -ngl 99 --parallel 4参数解释一下。-c 8192是上下文长度Agent 场景建议至少 8K因为工具调用的描述和返回会占不少 token。-ngl 99是把所有层都放到 GPU 上有多少放多少。--parallel 4是并发槽位允许多个请求同时处理这个跟AI Agent 怎么扛并发直接相关——单槽位的话请求会排队Agent 一多就卡。启动后用 curl 验证一下curl http://192.168.1.100:8080/v1/chat/completions \ -H Content-Type: application/json \ -d {model:local,messages:[{role:user,content:你好}]}能正常返回就说明模型服务通了。如果返回慢或者超时先看显存是不是爆了再看是不是上下文设太大。4.2 MCP Server 的注册与联调MCP server 部署好之后要在 Agent 客户端里注册。以 Claude Code 的配置为例配置文件里加一段{ mcpServers: { internal-db: { command: python, args: [/opt/mcp/db_server.py], env: { DB_HOST: 192.168.1.200, DB_PORT: 5432 } } } }stdio 方式的 MCP server 是 Agent 启动时拉起子进程所以command和args要写对路径。联调的时候先单独跑一下 server看能不能正常启动、能不能响应initialize请求。MCP 协议有握手流程server 起不来通常是依赖缺失或者路径写错。提示内网部署 MCP server 时把日志级别调到 DEBUG方便排查。但正式跑起来之后记得调回 INFO不然日志文件涨得飞快。4.3 Skills 的加载与测试Skills 目录放到 Agent 能读到的位置然后在配置里指定 skills 路径。测试的时候故意问一个需要触发 Skill 的问题看 Agent 会不会自动加载。比如你写了个查询内网工单的 Skill就问帮我查一下工单号 12345 的状态看它会不会去调。Skills 加载失败最常见的原因是SKILL.md的格式不对。这个文件有固定的 frontmatter 格式name、description这些字段必须写全description 要写清楚什么时候该用这个 Skill因为 Agent 是靠 description 来判断要不要加载的。5. 并发与性能调优实战5.1 Agent 并发到底卡在哪AI Agent 怎么扛并发是热搜词说明大家都在踩这个坑。我实测下来Agent 的并发瓶颈通常不在模型而在三个地方工具调用的串行等待、上下文膨胀、以及 MCP server 的单点阻塞。模型推理本身vLLM 这类框架做了 continuous batching并发能力很强。但 Agent 的工作流是模型输出 → 调工具 → 工具返回 → 再喂给模型这个循环里工具调用往往是串行的。如果工具是查数据库一次查询 200ms一个任务要调 10 次那就是 2 秒纯等待。5.2 三个立竿见影的优化手段第一工具调用并行化。如果 Agent 一轮里要调多个互不依赖的工具让它们并行执行。LangGraph 里可以用并行节点自己写的话用asyncio.gather。import asyncio async def call_tools_parallel(tool_calls): tasks [execute_tool(tc) for tc in tool_calls] return await asyncio.gather(*tasks)第二控制上下文长度。Agent 跑久了上下文会越来越长推理变慢还费显存。我的做法是给工具返回结果做截断超过一定长度就摘要或者只保留关键字段。别把整个数据库查询结果原样塞回去。第三MCP server 做连接池。如果 MCP server 每次调用都新建数据库连接并发一高就崩。用连接池把连接复用起来。5.3 压测方法与参考数据压测别用真实业务写个脚本模拟并发请求就行。我用 locust 压过一轮配置是 7B Q4 模型 单张 4090 4 并发槽位结果是纯对话场景 QPS 大概 8 到 10带工具调用的 Agent 场景因为多了工具往返QPS 掉到 2 到 3。这个数据供参考你的硬件和任务复杂度不同结果会差很多。关键结论是Agent 场景别追求高 QPS追求的是单任务完成时间。用户等一个 Agent 任务 10 秒能接受等 30 秒就开始骂人了。所以优化重点应该放在减少工具往返次数上。6. 常见问题与排查速查6.1 依赖与环境的坑内网部署最烦的就是环境问题。我整理了一个速查表现象可能原因排查方法pip 装包报找不到wheel 平台/版本不匹配检查--platform和--python-version导入模块报缺 .so系统库缺失ldd看依赖补装系统库MCP server 起不来路径错或依赖缺单独跑 server 看报错模型加载 OOM显存不够或量化档位太高降量化档位或减-ngl6.2 网络与端口的坑内网虽然不出公网但内网内部的网络问题一样不少。Agent 连不上模型服务先ping一下再telnet端口。我遇到过内网有物理 DHCP 服务器导致 IP 冲突的情况Agent 服务起在一个被占用的 IP 上怎么都连不通最后换 IP 解决。还有防火墙策略有些内网机器之间默认不通得找网管开策略。6.3 模型输出的坑内网模型能力有限最常见的两个问题工具调用格式不稳定和幻觉。格式不稳定的话在 prompt 里给足 few-shot 示例把期望的 JSON 格式写死。幻觉的话Agent 场景下最危险的是编造工具返回结果所以工具调用一定要有真实的执行和返回不能让模型自己编。注意内网 Agent 上线前一定要做工具调用真实性校验确保每个工具调用都真的执行了而不是模型幻觉出来的。7. 我踩过的几个真实坑第一个坑是摆渡时漏了字体文件。Agent 生成报告要转 PDF内网机器没中文字体出来的全是方块。这种小依赖最容易漏打包时列个清单逐项核对。第二个坑是Skills 的 description 写太泛。我写了个处理文档的 Skill结果 Agent 什么文档任务都往里塞包括它自己能处理的。后来把 description 改成仅用于处理扫描件 OCR 后的文本清洗触发就精准了。第三个坑是并发压测时把内网数据库打挂了。Agent 并发一高工具调用把生产库连接占满影响了正常业务。后来给 Agent 单独开了只读从库物理隔离。第四个坑是日志写满磁盘。MCP server 的 DEBUG 日志忘了关跑了两天把分区写满了Agent 全挂。现在我的习惯是日志按天切割 定期清理。8. 后续可以怎么扩展这套架构跑通之后扩展方向挺多的。一是把更多内网能力封装成 MCP server比如内部代码仓库检索、CI 流水线触发、监控告警查询让 Agent 真正成为内网操作的统一入口。二是做 Skills 的版本管理内网多人共用时Skills 的更新和回滚要有机制。三是考虑多 Agent 协作把复杂任务拆给不同角色的 Agent这个在内网环境下反而比公网好做因为网络延迟低、数据不出内网。我个人在实际操作中的体会是内网 AI Agent 的难点从来不是 AI 本身而是工程化的琐碎细节。模型选型、协议设计这些高大上的部分网上资料一大堆真正让你加班到深夜的是那个装不上的 wheel 包和连不通的端口。把工程细节做扎实Agent 才能在内网里真正下地干活。
返回列表