微软和 SAP 在 Sapphire 2026 上发布了一轮新公告,核心信号很明确——企业 AI 不再只是演示和试点,而是要在 Azure 上跑出规模。从运营流程、决策辅助到创新加速,双方正在把 AI 能力嵌入 SAP 生态的每一层,而不是停留在"外挂一个聊天窗口"的阶段。
不只是"部署 SAP 到 Azure",而是让 AI 成为运行时的一部分
过去几年,SAP on Azure 的主叙事是"把 ERP 搬上云"——SAP HANA 上 Azure、S/4HANA 迁移、ACSS(Azure Center for SAP Solutions)提供一键部署。这些基础设施层面的工作已经成熟。
Sapphire 2026 的新方向是:AI 不再是事后叠加的分析层,而是嵌入 SAP 业务运行时的原生能力。这意味着:
- SAP BTP(Business Technology Platform)上的 AI 服务直接调用 Azure OpenAI 和 Azure AI Services,无需自建模型基础设施。
- Joule(SAP 的 AI 助手)在 Azure 上获得更深的集成路径,能触达 SAP 系统数据的同时调用 Azure 的推理和搜索能力。
- 企业不再需要在"用 SAP 的 AI"还是"用 Azure 的 AI"之间选边——两者在架构层面被打通。
三个落地方向:运营、决策、创新
公告把企业 AI 的价值锚定在三个方向上,每个方向都有具体的场景支撑:
运营自动化——从采购审批到发票匹配,AI 不只是"建议",而是能在 SAP 流程中执行动作。例如,匹配异常发票时 Joule 可以直接在 S/4HANA 中创建处置单,而不是只发一封提醒邮件。
决策加速——通过 Azure AI Search + SAP BTP 数据模型的组合,把散落在多个系统中的业务数据变成可查询、可推理的知识库。管理层问"上季度华东区毛利率下降的原因",AI 能跨系统归因,而不是只返回一张报表。
创新孵化——SAP 和 Azure 提供的 AI 工具链让业务团队可以快速构建行业微应用。比如零售企业用 SAP 主数据 + Azure OpenAI 生成商品描述和定价建议,从想法到原型只需几天。
实践:在 Azure 上为 SAP 数据接入 AI 推理能力
下面是一个可操作的示例——把 SAP 导出的业务数据通过 Azure AI Search 建立索引,再用 Azure OpenAI 实现自然语言查询。这是当前很多企业"让 ERP 数据变得可对话"的最短路径。
注意:以下示例假设你已有 Azure 订阅、Azure OpenAI 资源,以及从 SAP 导出的 JSON 格式业务数据。具体 SAP 数据导出方式取决于你的系统版本和权限配置。
第一步:用 Azure CLI 创建 AI Search 资源
# 设置变量
RESOURCE_GROUP="sap-ai-rg"
LOCATION="eastus"
SEARCH_SERVICE="sap-search-demo"
# 创建资源组
az group create --name $RESOURCE_GROUP --location $LOCATION
# 创建 Azure AI Search 服务(基本层,适合验证)
az search service create \
--name $SEARCH_SERVICE \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--sku basic
# 获取搜索服务 admin key,后续索引需要用到
az search admin-key show \
--service-name $SEARCH_SERVICE \
--resource-group $RESOURCE_GROUP
第二步:用 Python 创建索引并导入 SAP 数据
"""
前提:pip install azure-search-documents openai
将 SAP 导出的销售数据保存为 sap_sales_data.json
格式示例:
[
{"id": "SO-001", "region": "华东", "product": "Widget-A",
"quantity": 1200, "revenue": 360000, "margin_pct": 22.5,
"quarter": "Q3-2025", "notes": "大客户折扣导致毛利率偏低"},
...
]
"""
import json
from azure.search.documents import SearchClient
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import SearchIndex, SimpleField, SearchField, SearchableField
from azure.core.credentials import AzureKeyCredential
# ===== 配置(替换为你的实际值)=====
SEARCH_ENDPOINT = "https://sap-search-demo.search.windows.net"
SEARCH_ADMIN_KEY = "<上一步获取的 admin key>"
INDEX_NAME = "sap-sales-index"
# ===== 创建索引 =====
index_client = SearchIndexClient(
endpoint=SEARCH_ENDPOINT,
credential=AzureKeyCredential(SEARCH_ADMIN_KEY)
)
fields = [
SimpleField(name="id", type="Edm.String", key=True),
SearchableField(name="region", type="Edm.String", filterable=True),
SearchableField(name="product", type="Edm.String", filterable=True),
SimpleField(name="quantity", type="Edm.Int32", filterable=True),
SimpleField(name="revenue", type="Edm.Double", filterable=True),
SimpleField(name="margin_pct", type="Edm.Double", filterable=True, sortable=True),
SearchableField(name="quarter", type="Edm.String", filterable=True),
SearchableField(name="notes", type="Edm.String"),
]
index = SearchIndex(name=INDEX_NAME, fields=fields)
index_client.create_or_update_index(index)
print(f"索引 {INDEX_NAME} 已创建")
# ===== 导入数据 =====
search_client = SearchClient(
endpoint=SEARCH_ENDPOINT,
index_name=INDEX_NAME,
credential=AzureKeyCredential(SEARCH_ADMIN_KEY)
)
with open("sap_sales_data.json", "r", encoding="utf-8") as f:
documents = json.load(f)
result = search_client.upload_documents(documents=documents)
print(f"已导入 {len(documents)} 条记录,成功: {result.succeeded_count}")
# ===== 查询示例 =====
results = search_client.search(
search_text="毛利率偏低",
filter="region eq '华东'",
select=["id", "product", "margin_pct", "notes"],
top=5
)
for r in results:
print(f"{r['id']} | {r['product']} | 毛利率: {r['margin_pct']}% | 备注: {r['notes']}")
第三步:接入 Azure OpenAI,让数据"可对话"
from openai import AzureOpenAI
# ===== 配置(替换为你的实际值)=====
AOAI_ENDPOINT = "https://<your-resource>.openai.azure.com"
AOAI_KEY = "<your-azure-openai-key>"
AOAI_DEPLOYMENT = "gpt-4.1" # 你的部署名称
client = AzureOpenAI(
azure_endpoint=AOAI_ENDPOINT,
api_key=AOAI_KEY,
api_version="2025-04-01-preview"
)
def ask_sap_data(question: str) -> str:
"""先从 AI Search 检索相关数据,再让 GPT 基于事实回答"""
# 1. 从索引中检索相关记录
search_client = SearchClient(
endpoint=SEARCH_ENDPOINT,
index_name=INDEX_NAME,
credential=AzureKeyCredential(SEARCH_ADMIN_KEY)
)
search_results = search_client.search(
search_text=question,
top=10,
select=["id", "region", "product", "quantity", "revenue", "margin_pct", "quarter", "notes"]
)
# 2. 把检索结果组装为上下文
context_items = []
for r in search_results:
context_items.append(
f"订单{r['id']}:{r['region']}区,产品{r['product']}, "
f"收入{r['revenue']}元,毛利率{r['margin_pct']}%, "
f"季度{r['quarter']}, 备注:{r['notes']}"
)
context = "\n".join(context_items) if context_items else "未找到相关数据"
# 3. 让 GPT 基于上下文回答
response = client.chat.completions.create(
model=AOAI_DEPLOYMENT,
messages=[
{"role": "system", "content": "你是 SAP 业务数据分析助手。只根据提供的数据回答,如果数据不足以回答,明确说明。"},
{"role": "user", "content": f"基于以下 SAP 数据回答问题:\n{context}\n\n问题:{question}"}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
answer = ask_sap_data("华东区上季度毛利率下降的主要原因是什么?")
print(answer)
运行前需要修改的配置项:
- SEARCH_ADMIN_KEY:从 Azure CLI 输出中获取
- AOAI_ENDPOINT、AOAI_KEY、AOAI_DEPLOYMENT:你的 Azure OpenAI 资源信息
- sap_sales_data.json:替换为你从 SAP 实际导出的业务数据
这个模式的核心思路是 Search → Context → Generate,也是当前企业把结构化数据变成"可对话资产"的主流架构。SAP BTP 上的 AI 服务未来会提供更原生的集成路径,但今天用 Azure AI Search + OpenAI 组合是最快能跑起来的方案。
落地前想清楚的三件事
数据边界比模型选择更重要。 SAP 系统里的数据有严格的权限模型——谁能看哪个组织的数据、哪个成本中心的明细。把数据导出给 AI 查询时,权限边界不能丢。建议在 AI Search 的 filter 中硬编码组织约束,而不是指望 prompt 来"尊重权限"。
先选一个痛点场景闭环,再谈规模。 Sapphire 公告描绘的是全栈 AI 化的愿景,但落地时最有效的路径是选一个高频痛点——比如发票异常处理、供应商风险预警、销售报价生成——做到从数据接入到 AI 辅助决策再到 SAP 系统回写的完整闭环。一个闭环跑通,比十个半成品更有说服力。
Azure 区域和 SAP 系统的就近原则。 AI Search 和 OpenAI 资源部署在离 SAP HANA 同区域,能减少数据传输延迟和合规风险。ACSS 部署的 SAP 系统通常在特定区域,AI 资源应跟随而非跨区。
Sapphire 2026 的公告标志着 SAP on Azure 从"基础设施层合作"进入了"AI 运行时层合作"。对企业来说,这意味着不需要在 SAP 生态和 Azure AI 之间做架构妥协——两者正在变成同一根管道上的不同接口。下一步要做的,不是等更多公告,而是用现有能力在一个真实业务场景里跑出第一个闭环。