当企业从一个智能助手走向多个能够规划、调用工具并协作完成任务的 Agent 时,真正的难题往往不只是模型效果。框架、模型、推理服务、云供应商和数据系统可能各自不同,团队还需要同时运营多套 Agent 系统。
要让 Agentic AI 在企业环境中持续扩展,关键是把业务流程与具体厂商实现分开:让模型可以替换,让 Agent 框架可以演进,让不同供应商的能力可以在同一套治理和观测体系下运行。
多一切环境带来的复杂度
企业中的 Agent 平台通常会面对多个维度的变化:
- 多个框架:不同团队可能选择不同的 Agent 编排框架,原因包括已有技术栈、任务类型和团队经验。
- 多个模型:通用模型、代码模型、推理模型和本地部署模型的成本、延迟与能力不同。
- 多个推理提供商:模型可能来自公有云、托管 API、私有集群或企业内部服务。
- 多个工具和数据源:Agent 需要访问搜索、数据库、工单系统、代码仓库和业务 API。
- 多个运行环境:开发、测试、生产以及不同区域可能具有不同的安全和合规约束。
如果业务代码直接依赖某个模型 SDK、某个 Agent 框架的消息格式,或者把供应商特有参数散落在各个任务中,迁移成本会快速上升。更严重的是,团队可能无法回答一个简单问题:当前系统到底依赖了哪些厂商特性?
因此,扩展设计应当围绕稳定的内部契约,而不是围绕某一个供应商的产品界面。
用适配层隔离供应商差异
一个可实践的分层方式是把系统拆成四个边界:
- 业务任务层:描述目标、约束、输入和输出,不直接调用厂商 SDK。
- Agent 编排层:负责规划、状态管理、工具调用、人工审批和多 Agent 协作。
- 模型与工具适配层:将不同模型、推理服务和工具转换为统一的内部接口。
- 平台治理层:统一处理身份认证、限流、成本、日志、追踪、评测和策略控制。
适配层并不意味着要抹平所有差异。不同模型的上下文长度、结构化输出能力、工具调用方式和推理特征可能完全不同。内部接口应当保持足够小,只抽象业务真正需要的能力,同时把供应商特性放进显式的能力描述中。
例如,应用层可以只依赖一个简单的 generate 接口,而模型注册表负责记录结构化输出、工具调用和视觉输入等能力。路由器根据任务要求和运行策略选择实现。
一个可运行的最小路由示例
下面的示例不依赖具体厂商 SDK,使用两个本地函数模拟不同模型提供商。将来接入真实 API 时,只需要替换适配器实现。示例展示了三个重要点:统一接口、能力声明和可替换路由。
保存为 agent_router.py 后,可以直接使用 Python 运行:
from dataclasses import dataclass
from typing import Callable, Dict, List
@dataclass(frozen=True)
class Model:
name: str
capabilities: frozenset[str]
call: Callable[[str], str]
def local_model(prompt: str) -> str:
return f"[local-model] {prompt}"
def hosted_model(prompt: str) -> str:
return f"[hosted-model] {prompt}"
MODELS: List[Model] = [
Model(
name="local-model",
capabilities=frozenset({"text", "private_data"}),
call=local_model,
),
Model(
name="hosted-model",
capabilities=frozenset({"text", "json", "tool_calling"}),
call=hosted_model,
),
]
def choose_model(required: set[str], preferred: str | None = None) -> Model:
candidates = [
model for model in MODELS
if required.issubset(model.capabilities)
]
if not candidates:
raise RuntimeError(f"No model supports: {sorted(required)}")
if preferred:
for model in candidates:
if model.name == preferred:
return model
return candidates[0]
def run_task(prompt: str, required: set[str], preferred: str | None = None) -> str:
model = choose_model(required, preferred)
print(f"selected_model={model.name}")
return model.call(prompt)
if __name__ == "__main__":
result = run_task(
prompt="Summarize the incident and return structured actions.",
required={"text", "json"},
preferred="hosted-model",
)
print(result)
运行命令:
python agent_router.py
生产环境中可以把 Model.call 替换为真实的 HTTP 客户端或 SDK 调用,把模型列表移动到配置中心,并增加区域、预算、延迟、数据敏感级别和故障转移等路由条件。重要的是,业务任务不需要知道模型来自哪个供应商。
把多 Agent 系统当作平台运营
多 Agent 架构的成本不只来自模型调用次数。一个任务可能经历规划、检索、工具调用、结果验证和人工审批等多个步骤。随着系统数量增加,平台团队需要把每次运行当作可观测、可评测和可审计的工作流。
建议统一记录以下信息:
- 工作流和 Agent 版本
- 使用的模型、供应商和区域
- 每一步的输入输出摘要
- 工具调用名称、参数校验结果和耗时
- Token、延迟、错误率和估算成本
- 是否触发人工审批或安全策略
- 最终结果与离线评测标签
日志不应默认保存完整的敏感提示词或业务数据。可以记录脱敏后的摘要、哈希、版本号和必要的追踪标识,把原始数据交给更严格的访问控制和保留策略管理。
评测也应从“模型分数”扩展到“任务完成质量”。例如,一个客服 Agent 即使生成文本质量很高,只要错误调用了退款工具,整体结果仍然是不合格的。评测集应覆盖工具选择、参数正确性、失败恢复、权限边界和人工接管等行为。
设计可替换性,而不是追求最低公分母
避免锁定并不等于把所有供应商能力压缩成最简单的文本补全接口。这样做会丢失结构化输出、工具调用、多模态输入和推理控制等重要能力。
更稳妥的做法是区分三类接口:
- 核心接口:所有实现都必须支持,例如请求、响应、超时、错误和追踪信息。
- 能力接口:只有声明支持的实现才能使用,例如工具调用、JSON Schema、视觉输入或长上下文。
- 扩展参数:供应商特有的参数必须放在隔离的扩展字段中,并经过配置校验。
当任务需要某项能力时,路由器应当在执行前检查能力,而不是等运行到一半才失败。对于不支持某项能力的模型,可以选择降级流程、切换提供商,或明确返回不可执行状态。
同时,跨供应商切换需要接受一定现实边界:不同模型的提示词行为、工具调用稳定性和输出风格不会完全一致。因此,迁移测试不能只检查 API 是否能调用,还应检查代表性任务的结果质量、成本、延迟和安全行为。
落地时的检查清单
可以按以下顺序推进企业级 Agent 平台建设:
- 为模型、工具和 Agent 定义版本化的内部契约。
- 用适配器隔离供应商 SDK,避免业务代码直接导入厂商客户端。
- 建立能力注册表,让路由逻辑依据能力和策略做选择。
- 将超时、重试、限流、熔断和故障转移放入共享运行时。
- 为每次 Agent 运行建立统一追踪,并关联成本和版本信息。
- 使用固定评测集验证跨模型、跨提供商迁移后的行为。
- 对敏感数据、工具权限和人工审批设置明确的策略边界。
- 定期演练供应商故障和模型替换,验证系统是否真的具备可移植性。
企业扩展 Agentic AI 的核心,不是选定一个永远不变的框架或模型,而是建立一套允许组件变化的运行方式。只要业务契约、能力声明、治理机制和评测体系保持稳定,框架、模型与提供商就可以在受控范围内演进,团队也能在获得新能力的同时保留技术选择权。