棕地 AI:如何在不重写的情况下将 LLM 功能集成到遗留代码库
每个 AI 演示都从绿地起步:一个干净的代码仓库、一个全新的 API key,不到一小时就能跑通流式聊天响应。然后有人问:"我们能把这个加到真正的产品里吗?"——那个运行在十年老单体系统上、存有无数未记录存储过程的产品,那个部署流程需要三个团队外加一个变更顾问委员会的产品,那个数据模型比 JSON 还古老的产品。
大多数 AI 集成工作都死在这里。不是因为 LLM 不好用,而是因为周围的系统根本不肯配合。超过 75% 的企业 AI 项目都卡在集成边界上——无法将 AI 能力与真正持有所需数据的系统连接起来。
本能反应是计划重写。别这样做。那些真正将 LLM 功能推进生产遗留系统的团队,都是以渐进的方式完成的——通过将现有代码库视为具有已知接口的黑盒的适配器模式。以下是具体做法。
为什么绿地演示无法在单体系统中存活
AI 原型与生产集成之间的鸿沟,并不在于模型本身,而在于模型周围的一切。遗留系统呈现出一组绿地演示从未遇到过的结构性问题:
- 没有干净的数据访问层。 业务逻辑与数据访问相互交织。你无法直接"查询数据库",因为一半重要状态是通过应用层转换派生出来的,而这些转换根本没有文档记录。
- 孤岛式架构。 AI 富化所需的数据分散在多个具有不兼容 schema 的系统中。"客户"在 ERP 里是一种含义,在 CRM 里是另一种,在计费系统里又完全不同。
- 延迟不匹配。 你的 LLM 能在 2 秒内生成响应,但它依赖的遗留批处理任务要每晚才跑一次。或者遗留 API 的响应时间是 50ms,而你插入的 LLM 调用会给用户期望瞬间完成的请求路径增加 3 秒延迟。
- 发布节奏不匹配。 AI 功能需要快速迭代——调整提示词、更换模型、调节阈值。而遗留系统每季度才部署一次,还要附上一份 40 页的变更申请。
核心洞察在于:你不需要对遗留系统进行现代化改造来添加 AI 能力。你需要建立一个隔离边界,让 AI 层能够按自己的节奏演进,同时遗留系统继续做它一直在做的事情。
边车模式:不触碰生产代码的 AI 集成
最无侵入性的集成 模式直接借鉴自服务网格领域。一个边车容器与遗留应用并行运行,在 AI 层与现有 API 接口之间进行转译——而无需修改任何一行生产代码。
实际运作方式如下:两个容器共享同一个网络命名空间(在 Kubernetes 中,它们位于同一个 Pod 内)。边车暴露一个对 AI 友好的接口——MCP server、GraphQL 端点,或你的 agent 框架所期望的任何接口。在内部,它通过 localhost 调用遗留 REST API。
遗留应用完全不知道边车的存在。它收到的是和以往一样的 HTTP 请求。边车负责处理所有转译工作:将 AI 工具调用映射到 REST 端点、在数据格式之间转换,以及处理模型预期与遗留系统提供之间的阻抗失配。
这种模式具备三个对棕地集成至关重要的特性:
- 独立部署。 你可以在不经过遗留系统发布流程的情况下更新边车(新的提示词模板、额外的工具映射、不同的模型提供商)。
- 安全隔离。 遗留 API 接口保持不对外暴露。只有边车的端点对 AI 层可见,为你提供了访问控制和审计日志的单一入口。
- 故障隔离。 如果 AI 层宕机或行为异常,遗留系统不受影响。边车中的熔断器可以防止级联故障。
对于无法运行 Kubernetes 的团队,同样的原则也适用于反向代理、坐在遗留 API 前面的 Lambda 函数,甚至是运行在同一主机上的简单 Node.js 服务。模式的核心是隔离边界,而不是编排层。
