好的,我们正式进入规范的第6章,从代码和协议的视角,解剖AI/ML服务的实现细节。
深度解析 3GPP TS 29.530:6.1 Naf_VFLTraining Service API (VFL训练服务的实现蓝图)
本文技术原理深度参考了 3GPP TS 29.530 V1.0.0 (2025-09) Release 19 规范,我们将聚焦于第6.1章“Naf_VFLTraining Service API”。本章是
Naf_VFLTraining服务的Stage 3协议实现天书,它将第5章描述的业务流程,转化为工程师可以直接编码实现的具体API接口、资源和数据模型。
在“天穹智脑”的开发指挥中心,Team Alpha的成员们围坐在一起。他们刚刚在首席架构师Dr. Evelyn Reed的指导下,学习了Naf_VFLTraining服务的高层交互流程。现在,Dr. Reed将一本更厚的、标着“Chapter 6”的技术手册分发给众人。
“你们已经理解了‘为什么’和‘做什么’,”Dr. Reed说道,“现在,欢迎来到‘怎么做’的世界。第6章就是我们的开发者圣经。它没有一行多余的文字,每一个表格、每一个字段定义,都是我们构建‘天穹智脑’这座大厦时,必须遵循的精确蓝图。今天,我们的任务就是将第6.1章的每一个字节,都转化为可执行的、坚不可摧的代码逻辑。让我们从API的入口,URI结构开始。”
1. 6.1.1 & 6.1.2 - API入口与通信基础
在深入具体的资源操作之前,规范首先定义了API的“门牌号”和“通信规则”。
1.1 6.1.1 Introduction - API的统一资源标识符 (URI)
规范原文引用 (Clause 6.1.1 Introduction) The Naf_VFLTraining shall use the Naf_VFLTraining API. The API URI of the Naf_VFLTraining API shall be:
{apiRoot}/<apiName>/<apiVersion>… with the following components:
- The {apiRoot} shall be set as described in 3GPP TS 29.501.
- The
shall be ” naf-vfl-train “. - The
shall be “v1”.
深度解读:
{apiRoot}: 这是一个变量,代表了API的根路径,例如https://operator.com/api。它不是固定的,而是由NF消费者通过查询NRF(网络功能仓库功能)来动态发现“天穹智脑”AF实例的地址。这体现了5G SBA的动态服务发现能力。<apiName>: 这是我们在Table 5.1-1中见过的API名称,规范在此明确了其值为naf-vfl-train。这个名称将成为URI中固定的一部分。<apiVersion>: 版本号,目前是v1。
因此,Naf_VFLTraining服务的所有API请求,其URL都将以{apiRoot}/naf-vfl-train/v1作为前缀。例如,一个完整的请求URI可能是https://brain.operator.com/naf-vfl-train/v1/subscriptions。
1.2 6.1.2 Usage of HTTP - 通信协议与数据格式
本节规定了API通信的技术细节。
- HTTP/2: 强制使用HTTP/2(IETF RFC 9113),因为它提供了多路复用、头部压缩等高级特性,比HTTP/1.1更适合高并发、低延迟的信令交互。
- TLS: 如果AF是非可信的,则必须使用TLS加密传输,保证通信安全。
- Content-Type: 所有请求和响应体的数据格式都应是
application/json。
Team Alpha的工程师们点点头,这些都是5G SBA的标准配置,他们早已驾轻就熟。现在,是时候进入真正的核心——资源定义了。
2. 6.1.3 Resources - API的核心骨架
本节定义了Naf_VFLTraining API暴露的所有资源以及可以对它们执行的操作。
2.1 6.1.3.1 Overview - 资源与方法总览
Figure 6.1.3.1-1: Resource URI structure of the Naf_VFLTraining API和Table 6.1.3.1-1: Resources and methods overview共同勾勒出了API的结构。
资源URI结构:
{apiRoot}/naf-vfl-train/<apiVersion>
|
+-- /subscriptions
|
+-- /{subscriptionId}
资源与方法概览表 (Table 6.1.3.1-1):
| Resource purpose/name | Resource URI (relative path after API URI) | HTTP method | Description (service operation) |
|---|---|---|---|
| VFL Training Subscriptions | /subscriptions | POST | Create a new VFL Training Subscription. |
| Individual VFL Training Subscription | /subscriptions/{subscriptionId} | GET | Retrieve an existing “Individual VFL Training Subscription” resource. |
PUT | Request the update of an existing “Individual VFL Training Subscription” resource. | ||
PATCH | Request the modification of an existing “Individual VFL Training Subscription” resource. | ||
DELETE | Request the deletion of an existing “Individual VFL Training Subscription” resource. |
深度解读: 这张表是整个API的“功能地图”。它告诉我们,这个API只有两个核心资源端点:
/subscriptions: 集合资源。它只支持一个POST方法,专门用于创建新的VFL训练订阅。/subscriptions/{subscriptionId}: 单个成员资源。它支持GET,PUT,PATCH,DELETE,分别用于对一个已存在的特定订阅进行查询、全量更新、部分更新和删除。
这种设计是典型的RESTful风格,清晰、规范且富有逻辑。
2.2 6.1.3.2 Resource: VFL Training Subscriptions - 创建订阅的精确指令
本节详细定义了如何在/subscriptions资源上创建一个新的订阅。
规范原文引用 (Clause 6.1.3.2.3.1 POST) The HTTP POST method allows a service consumer to request the creation of a VFL Training Subscription at the AF.
HTTP POST /subscriptions 请求与响应详解:
1. 请求 (Request)
- Request Body: 请求体必须包含一个
VflTrainingSubs类型的数据结构。这是创建订阅的“申请表”。
Table 6.1.3.2.3.1-2: Data structures supported by the POST Request Body on this resource
| Data type | P | Cardinality | Description |
|---|---|---|---|
VflTrainingSubs | M | 1 | Represents the parameters to request the creation of a VFL Training Subscription. |
2. 响应 (Response)
- 成功 (
201 Created):- Response Body: 响应体中会返回一个
VflTrainingSubs结构,即刚刚创建的这个订阅的完整视图。 - Headers: 响应头中必须包含
Location字段,指明新创建资源的确切URI。
- Response Body: 响应体中会返回一个
Table 6.1.3.2.3.1-3: Data structures supported by the POST Response Body on this resource
| Data type | P | Cardinality | Response codes | Description |
|---|---|---|---|---|
VflTrainingSubs | M | 1 | 201 Created | Successful case…a representation of the created “Individual VFL Training Subscription” resource shall be returned. An HTTP “Location” header…shall also be included. |
Table 6.1.3.2.3.1-4: Headers supported by the 201 Response Code on this resource
| Name | Data type | P | Cardinality | Description |
|---|---|---|---|---|
Location | string | M | 1 | Contains the URI of the newly created resource…{apiRoot}/naf-vfl-train/<apiVersion>/subscriptions/{subscriptionId} |
场景实现 (Team Alpha的代码逻辑):
Team Alpha的后端工程师小李开始设计POST /subscriptions的处理逻辑:
- 定义一个Controller方法,监听
POST /naf-vfl-train/v1/subscriptions。 - 方法参数中,将请求体自动反序列化为一个
VflTrainingSubs对象。 - 调用业务逻辑层(Service Layer):
a. 验证
VflTrainingSubs对象中的参数是否合法。 b. 生成一个全局唯一的subscriptionId。 c. 将订阅信息持久化到数据库。 d. 启动后台的VFL训练参与者任务。 - 如果成功,构建一个
201 Created响应。 - 在响应头中设置
Location为新生成的URI。 - 将持久化后的
VflTrainingSubs对象序列化为JSON,放入响应体。 - 如果失败,根据错误类型,抛出相应的HTTP异常(如400 Bad Request),并附带
ProblemDetails信息。
2.3 6.1.3.3 Resource: Individual VFL Training Subscription - 订阅的生命周期管理
本节定义了如何管理一个已经存在的、特定的订阅。
GET /subscriptions/{subscriptionId} (查询)
- 目的: 允许NF消费者查询一个VFL训练订阅的当前状态。
- 成功响应 (
200 OK): 响应体中返回该订阅的VflTrainingSubs完整信息。 - 场景: 城市NWDAF的运维界面需要刷新“智慧城市交通大脑”训练任务的详情,就会调用此接口。
PUT /subscriptions/{subscriptionId} (全量更新)
- 目的: 完全替换一个已存在的订阅。
- 请求体: 必须包含一个完整的、更新后的
VflTrainingSubs对象。 - 成功响应:
200 OK: 更新成功,并在响应体中返回更新后的完整资源。204 No Content: 更新成功,但响应体为空。
- 场景: 训练任务的参数发生了重大变化,NWDAF决定发送一个全新的配置来覆盖旧的。
PATCH /subscriptions/{subscriptionId} (部分更新)
- 目的: 对一个已存在的订阅进行局部修改。
- 请求体: 包含一个
VflTrainingSubsPatch对象,其中只包含需要变更的字段。 - 成功响应: 与
PUT类似,200 OK(带内容)或204 No Content(不带内容)。 - 场景: NWDAF只想修改一下训练的回调通知地址(
notifUri),使用PATCH只需发送这一个字段,比PUT更高效。
DELETE /subscriptions/{subscriptionId} (删除)
- 目的: 终止一个VFL训练订阅,释放所有相关资源。
- 成功响应 (
204 No Content): 表示删除成功,响应体为空。 - 场景: 训练任务完成或被取消,NWDAF调用此接口来清理订阅,通知“天穹智脑”可以“下班”了。
3. 6.1.5 & 6.1.6 - 通知的细节与数据的结构
这两节深入到API的“血肉”,定义了异步通知的实现细节和所有交互数据的精确结构。
3.1 6.1.5 Notifications - 异步报告的实现
本节定义了AF如何向消费者发送Notify消息。
规范原文引用 (Clause 6.1.5.2 VFL Training Notification) The VFL Training Notification is used by the AF to notify a previously subscribed NF service consumer on VFL Training report(s). The Callback URI “{notifUri}” shall be used…
POST {notifUri} 请求与响应详解:
- 动作: AF主动向订阅时指定的
notifUri发送POST请求。 - 请求体: 包含一个
VflTrainingNotify数据结构。
Table 6.1.5.2.3.1-1: Data structures supported by the POST Request Body
| Data type | P | Cardinality | Description |
|---|---|---|---|
VflTrainingNotify | M | 1 | Represents the VFL Training Notification. |
- 成功响应: 消费者收到通知后,应返回
204 No Content以示确认。
3.2 6.1.6 Data Model - 数据的精确定义
这是Stage 3规范的核心价值所在,它定义了前面所有流程中提到的数据结构的每一个字段。
Type: VflTrainingSubs (订阅创建/更新的数据结构)
Table 6.1.6.2.2-1: Definition of type VflTrainingSubs是本节最重要的表格之一。
| Attribute name | Data type | P | Cardinality | Description |
|---|---|---|---|---|
vflTrainSubs | array(VflTrainingSub) | M | 1..N | 包含一个或多个具体的VFL训练集订阅。 |
notifUri | Uri | M | 1 | 回调地址。AF将向此URI发送通知。 |
notifCorrId | string | M | 1 | 关联ID。AF发回的通知中会包含此ID。 |
reportingReqs | ReportingInformation | O | 0..1 | 报告要求,定义通知的触发策略。 |
trainReports | array(VflTrainingNotify) | O | 1..N | 训练报告。仅当订阅时要求立即报告,此字段才会出现在创建订阅的响应中。 |
suppFeat | SupportedFeatures | C | 0..1 | 支持的特性,用于特性协商。 |
深度解读:
- 强制三要素:
vflTrainSubs,notifUri,notifCorrId是强制的(Mandatory)。这意味着任何一个创建订阅的请求,都必须包含这三项信息,否则“天穹智脑”应返回400 Bad Request错误。 vflTrainSubs: 这是一个数组,意味着一个订阅请求可以同时请求参与多个相关的VFL训练任务。suppFeat: 这是实现特性协商的关键字段,允许客户端和服务器就某些可选功能(如是否支持某种特定的加密算法)达成一致。
Type: VflTrainingSubsPatch (订阅部分更新的数据结构)
Table 6.1.6.2.3-1: Definition of type VflTrainingSubsPatch定义了用于PATCH方法的数据结构。
| Attribute name | Data type | P | Cardinality | Description |
|---|---|---|---|---|
vflTrainSubs | array(VflTrainingSub) | O | 1..N | 更新后的VFL训练集。 |
notifUri | Uri | O | 0..1 | 更新后的回调地址。 |
notifCorrId | string | O | 0..1 | 更新后的关联ID。 |
reportingReqs | ReportingInformation | O | 0..1 | 更新后的报告要求。 |
深度解读:
注意,VflTrainingSubsPatch中所有字段都是可选的(Optional)。这正是PATCH的精髓所在——客户端只需提供它想要修改的字段。例如,一个只包含notifUri的PATCH请求,就是用来修改回调地址的。
4. 总结:从蓝图到代码的最后一公里
通过对第6.1章的逐一解剖,Team Alpha已经将Naf_VFLTraining服务从一个抽象的业务流程,彻底转化为了一份详尽的、可执行的开发说明书。
- URI结构定义了服务的“地址”。
- 资源和方法定义了服务的“功能菜单”。
- 数据模型定义了服务交互的“语言语法”。
这份蓝图不仅告诉工程师们要实现哪些接口,更重要的是,它规定了接口的行为、参数的约束、错误的响应方式,确保了“天穹智脑”一旦建成,就能无缝地融入5G SBA的大家庭,成为一个标准、可靠、可互操作的VFL客户端。
Dr. Reed在总结会议上说:“今天,我们完成了从架构师到工程师的转变。我们手中的这份规范,就是代码的另一种形态。精准地实现它,我们的‘天穹智脑’就迈出了从概念到现实的第一步,也是最坚实的一步。”
5. FAQ 环节
Q1:在实现PATCH方法时,如何处理请求体中未出现的字段?
A1:PATCH的核心是“部分更新”,因此对于请求体中未出现的字段,服务器绝对不能做任何修改。例如,一个VflTrainingSubsPatch请求体只有notifUri,那么服务器的逻辑应该是:只更新该订阅的notifUri字段,而vflTrainSubs, notifCorrId, reportingReqs等字段必须保持原样。如果错误地将未出现的字段理解为null或空值并更新到数据库,将导致数据丢失,是严重的实现错误。
Q2:第6.1章中提到的ProblemDetails是什么?它在错误处理中扮演什么角色?
A2:ProblemDetails是一个标准化的、用于在HTTP API中返回错误信息的数据结构,定义在IETF RFC 7807中,并被3GPP TS 29.500采纳。当API调用失败时(例如,返回400 Bad Request或404 Not Found),服务器不应只返回一个状态码,还应该在响应体中提供一个application/problem+json类型的ProblemDetails对象。这个对象包含了如type(错误类型的URI)、title(错误的简短描述)、status(HTTP状态码)、detail(错误的详细解释)等字段,能为客户端提供丰富、结构化的错误信息,极大地提升了API的可用性和调试效率。
Q3:规范提到了安全(Security, 6.1.9)和HTTP重定向(HTTP redirection, 6.1.10),它们在实际部署中有多重要?
A3:这两者都至关重要。
- 安全 (6.1.9): 规范指出,API的访问可能受OAuth2保护。这意味着,NF消费者(如NWDAF)在调用“天穹智脑”的API之前,必须先向NRF(作为授权服务器)申请一个Access Token。然后,在每一次API调用时,都需要在HTTP的
Authorization头中带上这个Token。天穹智脑的API网关则必须验证这个Token的有效性,以确保请求是合法的。没有这层保护,API将完全暴露在网络中,是极不安全的。 - HTTP重定向 (6.1.10): 这是一个实现负载均衡和高可用的关键机制。如果“天穹智脑”部署了多个实例,当一个实例过载或需要维护时,它可以不对请求进行处理,而是返回一个
307 Temporary Redirect或308 Permanent Redirect响应,并在Location头中指向另一个健康的实例地址。客户端收到重定向响应后,应自动向新地址重新发起请求。这使得整个服务集群对消费者来说是透明的,大大提升了服务的健壮性。
Q4:数据模型中为什么vflTrainSubs是一个数组array(VflTrainingSub),而不是单个对象?
A4:这是一个为了灵活性和效率的设计。将vflTrainSubs设计为数组,允许一个Naf_VFLTraining订阅请求捆绑多个相关的训练任务。例如,城市NWDAF可能需要同时启动针对“路口拥堵”、“主干道车流”、“行人密度”三个子模型的VFL训练,这三个子模型可能共享一些上下文(如地理区域、时间范围)。通过在一个订阅请求中包含这三个VflTrainingSub对象,可以减少API调用的次数,并便于AF将它们作为一个项目进行统一管理和资源调度。
Q5:如果我是NF消费者,如何发现“天穹智脑”AF的{apiRoot}地址?
A5:这个过程被称为“服务发现”,是5G SBA的核心机制之一,由NRF (Network Function Repository Function) 负责。流程大致如下:
- 服务注册: “天穹智脑”AF在启动时,会向网络中的NRF发送一个“注册”请求(通过
Nnrf_NFManagement服务),告诉NRF:“我是NF实例XXX,我能提供naf-vfl-train服务,我的服务地址是https://brain.operator.com”。 - 服务发现: 当NWDAF想要调用
naf-vfl-train服务时,它会向NRF发送一个“发现”请求,询问:“请告诉我一个能够提供naf-vfl-train服务的AF实例的地址”。 - 获取地址: NRF会从其注册列表中,根据负载均衡、位置等策略,选择一个合适的“天穹智脑”实例,并将其
apiRoot地址返回给NWDAF。 - 发起调用: NWDAF拿到
apiRoot后,就可以拼接出完整的URL,并发起POST /subscriptions请求了。这个机制使得NF之间的耦合度大大降低,系统可以灵活地扩缩容和升级。