好的,我们正式进入规范的第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 APITable 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/nameResource URI (relative path after API URI)HTTP methodDescription (service operation)
VFL Training Subscriptions/subscriptionsPOSTCreate a new VFL Training Subscription.
Individual VFL Training Subscription/subscriptions/{subscriptionId}GETRetrieve an existing “Individual VFL Training Subscription” resource.
PUTRequest the update of an existing “Individual VFL Training Subscription” resource.
PATCHRequest the modification of an existing “Individual VFL Training Subscription” resource.
DELETERequest the deletion of an existing “Individual VFL Training Subscription” resource.

深度解读: 这张表是整个API的“功能地图”。它告诉我们,这个API只有两个核心资源端点:

  1. /subscriptions: 集合资源。它只支持一个POST方法,专门用于创建新的VFL训练订阅。
  2. /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 typePCardinalityDescription
VflTrainingSubsM1Represents the parameters to request the creation of a VFL Training Subscription.

2. 响应 (Response)

  • 成功 (201 Created):
    • Response Body: 响应体中会返回一个VflTrainingSubs结构,即刚刚创建的这个订阅的完整视图。
    • Headers: 响应头中必须包含Location字段,指明新创建资源的确切URI。

Table 6.1.3.2.3.1-3: Data structures supported by the POST Response Body on this resource

Data typePCardinalityResponse codesDescription
VflTrainingSubsM1201 CreatedSuccessful 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

NameData typePCardinalityDescription
LocationstringM1Contains the URI of the newly created resource…{apiRoot}/naf-vfl-train/<apiVersion>/subscriptions/{subscriptionId}

场景实现 (Team Alpha的代码逻辑): Team Alpha的后端工程师小李开始设计POST /subscriptions的处理逻辑:

  1. 定义一个Controller方法,监听POST /naf-vfl-train/v1/subscriptions
  2. 方法参数中,将请求体自动反序列化为一个VflTrainingSubs对象。
  3. 调用业务逻辑层(Service Layer): a. 验证VflTrainingSubs对象中的参数是否合法。 b. 生成一个全局唯一的subscriptionId。 c. 将订阅信息持久化到数据库。 d. 启动后台的VFL训练参与者任务。
  4. 如果成功,构建一个201 Created响应。
  5. 在响应头中设置Location为新生成的URI。
  6. 将持久化后的VflTrainingSubs对象序列化为JSON,放入响应体。
  7. 如果失败,根据错误类型,抛出相应的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 typePCardinalityDescription
VflTrainingNotifyM1Represents 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 nameData typePCardinalityDescription
vflTrainSubsarray(VflTrainingSub)M1..N包含一个或多个具体的VFL训练集订阅。
notifUriUriM1回调地址。AF将向此URI发送通知。
notifCorrIdstringM1关联ID。AF发回的通知中会包含此ID。
reportingReqsReportingInformationO0..1报告要求,定义通知的触发策略。
trainReportsarray(VflTrainingNotify)O1..N训练报告。仅当订阅时要求立即报告,此字段才会出现在创建订阅的响应中。
suppFeatSupportedFeaturesC0..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 nameData typePCardinalityDescription
vflTrainSubsarray(VflTrainingSub)O1..N更新后的VFL训练集。
notifUriUriO0..1更新后的回调地址。
notifCorrIdstringO0..1更新后的关联ID。
reportingReqsReportingInformationO0..1更新后的报告要求。

深度解读: 注意,VflTrainingSubsPatch所有字段都是可选的(Optional)。这正是PATCH的精髓所在——客户端只需提供它想要修改的字段。例如,一个只包含notifUriPATCH请求,就是用来修改回调地址的。


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 Request404 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 Redirect308 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) 负责。流程大致如下:

  1. 服务注册: “天穹智脑”AF在启动时,会向网络中的NRF发送一个“注册”请求(通过Nnrf_NFManagement服务),告诉NRF:“我是NF实例XXX,我能提供naf-vfl-train服务,我的服务地址是https://brain.operator.com”。
  2. 服务发现: 当NWDAF想要调用naf-vfl-train服务时,它会向NRF发送一个“发现”请求,询问:“请告诉我一个能够提供naf-vfl-train服务的AF实例的地址”。
  3. 获取地址: NRF会从其注册列表中,根据负载均衡、位置等策略,选择一个合适的“天穹智脑”实例,并将其apiRoot地址返回给NWDAF。
  4. 发起调用: NWDAF拿到apiRoot后,就可以拼接出完整的URL,并发起POST /subscriptions请求了。这个机制使得NF之间的耦合度大大降低,系统可以灵活地扩缩容和升级。