用 OpenAI SDK 或 LangChain 调大模型,是很多团队的标准做法。问题在于:一旦想把模型迁到 AWS SageMaker AI 上托管,就得写 SigV4 签名、换客户端、改调用逻辑——迁移成本不小。今天 SageMaker AI 正式推出了 OpenAI-compatible API 支持,实时推理端点直接暴露 /v1/chat/completions 这类接口,OpenAI SDK、LangChain、Strands Agents 只改一行 base_url 就能对接,不需要自定义客户端或签名包装器。
改了什么
过去调用 SageMaker AI 端点,要走 AWS 自己的 InvokeEndpoint API,请求体格式和 OpenAI 完全不同,认证靠 SigV4 签名。现在 SageMaker AI 在端点前面加了一层兼容层:
- 路径对齐 OpenAI:
/v1/chat/completions、/v1/completions、/v1/embeddings等 - 请求/响应 JSON 结构与 OpenAI 一致
- 认证方式仍然是 AWS SigV4,但兼容层自动处理——SDK 侧不再需要手动签名
这意味着你现有的 OpenAI SDK 代码、LangChain chain 定义、Strands Agent 配置,几乎不用改业务逻辑,只需把 base_url 指向 SageMaker AI 端点即可。
用 OpenAI SDK 直接调 SageMaker AI
最直接的验证方式:拿 OpenAI Python SDK,把 base_url 换成 SageMaker AI 端点地址。下面是一段可以立即跑的代码:
# pip install openai boto3
# 先确保 AWS 凭证已配置(环境变量、~/.aws/credentials 或 IAM Role)
from openai import OpenAI
# 关键改动:base_url 指向 SageMaker AI 端点
# 格式:https://runtime.sagemaker.{region}.amazonaws.com/endpoints/{endpoint-name}/v1/
client = OpenAI(
base_url="https://runtime.sagemaker.us-east-1.amazonaws.com/endpoints/my-llm-endpoint/v1/",
# OpenAI SDK 要求提供 api_key,但 SageMaker 兼容层用 SigV4 认证
# 这里填任意非空字符串即可,实际认证由底层 boto3 完成
api_key="no-key-needed",
)
response = client.chat.completions.create(
model="my-llm-endpoint", # SageMaker 端点名称
messages=[
{"role": "system", "content": "你是一个简洁的技术顾问。"},
{"role": "user", "content": "用一句话解释什么是向量数据库。"},
],
max_tokens=128,
)
print(response.choices[0].message.content)
运行前要改的地方:
region——换成你端点所在的 AWS 区域,比如us-west-2。my-llm-endpoint——换成你实际创建的 SageMaker 端点名称。- AWS 凭证——确保当前环境有权限调用
sagemaker-runtime:InvokeEndpoint。
注意 api_key="no-key-needed" 这一行:OpenAI SDK 强制要求传入 api_key,否则初始化报错。SageMaker 兼容层不走 API Key 认证,所以填任意非空字符串占位即可,真实鉴权由底层 boto3 的 SigV4 机制完成。
LangChain 和 Strands Agents 怎么切
LangChain 的 ChatOpenAI 同样接受 base_url 参数,改动方式几乎一样:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
llm = ChatOpenAI(
base_url="https://runtime.sagemaker.us-east-1.amazonaws.com/endpoints/my-llm-endpoint/v1/",
api_key="no-key-needed",
model="my-llm-endpoint",
)
# 直接用在 chain 里
response = llm.invoke([HumanMessage(content="列出三种常见的缓存策略。")])
print(response.content)
Strands Agents 的配置思路相同——在 agent 定义中把模型端点 URL 指向 SageMaker AI,其余 agent 逻辑(工具调用、多步推理)保持不变。
什么时候值得切过来
兼容层降低了迁移门槛,但不是所有场景都该立刻切换。几个判断维度:
| 维度 | 适合留在 OpenAI | 适合迁到 SageMaker AI |
|---|---|---|
| 模型选择 | 需要 GPT-4o、o1 等独家模型 | 用开源模型(Llama、Mistral、Qwen 等)或自托管微调模型 |
| 数据合规 | 数据可以出境到 OpenAI | 数据必须留在 AWS 区域内(金融、医疗、政务) |
| 成本控制 | 调用量小、按 token 计费可接受 | 大规模推理、需要竞价实例或自定义硬件降本 |
| 延迟要求 | 可接受公网延迟 | 需要端点在 VPC 内、与业务服务同区域低延迟 |
迁移前检查清单:
- 端点已创建并处于
InService状态——在 SageMaker 控制台或用aws sagemaker describe-endpoint确认。 - IAM 策略包含
sagemaker-runtime:InvokeEndpoint,且资源范围覆盖目标端点。 - 端点部署的模型支持兼容层——目前覆盖了主流开源模型容器镜像,自建容器需确认是否暴露了 OpenAI 格式接口。
- 如果用了 streaming,确认端点和 SDK 侧都支持
stream=True——兼容层已支持 SSE 流式输出。
兼容层最大的价值不是"比 OpenAI 更好",而是让已经在 OpenAI SDK 生态里写好的代码,能以最小改动跑在自控的 SageMaker 端点上。换一行 URL,试一次调用,再决定要不要全面迁移。