ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ZenML Annotators 组件指南:在 ML 工作流中集成数据标注(Label Studio / Argilla / Pigeon / Prodigy)

ZenML Annotators 组件指南:在 ML 工作流中集成数据标注(Label Studio / Argilla / Pigeon / Prodigy) ZenML Annotators 组件指南在 ML 工作流中集成数据标注Label Studio / Argilla / Pigeon / Prodigy【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml本文是 ZenML 开源仓库中 Annotators标注器堆栈组件的完整实战指南。标注器是 ZenML 堆栈中的可选组件用于把数据标注/数据打标作为 ML 工作流的一等公民接入管线覆盖从启动阶段的数据引导bootstrapping、新数据持续标注、推理样本回流标注到临时人工干预等典型场景。读完本文你将掌握如何在 ZenML 中注册与配置 Label Studio、Argilla、Pigeon、Prodigy 四种标注器并把它们加入堆栈如何使用zenml annotator系列 CLI 与 SDK 管理数据集和标注任务以及标准 Step、标签配置生成器等底层实现原理。什么是 Annotator 堆栈组件Annotators 是 ZenML 堆栈中的一类堆栈组件StackComponentType.ANNOTATOR它让数据标注成为 ZenML 堆栈与管线的一部分。通过配套的 CLI 命令你可以启动标注界面、配置数据集并统计当前有多少已标注任务可供训练使用。数据标注/打标是 MLOps 的核心环节之一却常常在讨论中被忽略。ZenML 正逐步构建支持迭代式标注工作流的能力把执行标注的人以及他们的工作流与行为视为机器学习流程的有机组成部分。目前 ZenML 提供了标准 Step 来支撑下述典型标注场景同时标注器的抽象层也在持续演进使其更易于使用。什么时机应该做标注标注发生的时机与 ML 生命周期中的位置强相关文档梳理了四类典型的标注介入点项目启动阶段At the start你可能从零数据起步或者手握大量数据却缺少准确标签。此时可以先用「标注少量数据 → 训练模型 → 用模型建议标签加速标注 → 再迭代」的方式做模型引导bootstrapping。早期标注还能帮你澄清并收敛团队内部的标注规则与标准例如为某些概念给出明确界定以保证跨成员的标注一致性。新数据持续进入As new data comes in新数据源源不断到来时你需要在固定周期介入标注流程以接触新数据。虽然通常需要围绕数据/概念漂移检测做自动化但对某些非结构化数据而言原始数据的直接人工反馈永远无法完全替代。推理样本回流Samples generated for inference模型对真实世界数据做预测时若把推理样本存储并标注就能得到一组「人工标注 vs 模型预测」的对照数据这是发现各类漂移的又一途径。这些数据在隐私与用户同意的前提下还可用于重训或微调模型。其他临时干预Ad hoc interventions识别错误标签、定位模型难以正确预测的困难样本、处理类别严重不平衡的场景时可以做临时标注来补充模型学习的原材料。从源码角度看标注器在堆栈中的身份由 src/zenml/annotators/base_annotator.py 定义BaseAnnotator继承自StackComponentBaseAnnotatorFlavor继承自Flavor并把type固定为StackComponentType.ANNOTATOR。这意味着标注器与 orchestrator、artifact store 等组件一样遵循 ZenML 统一的 flavor/注册/堆栈机制。何时使用它标注器是 ZenML 堆栈中的可选组件其抽象被设计为嵌入更大的 ML 用例尤其是训练与部署环节。标注工作流的核心能力包括在训练 Step 中无缝使用标签或标注结果处理标注数据的版本管理versioning支持标注数据在自定义格式之间相互转换处理标注器特有的任务例如生成 Label Studio 的 Web 标注界面所需的 UI 配置文件label config。可用的 Annotator 种类一览针对生产场景ZenML 在integrations模块中提供多种 flavor。下表汇总了当前支持的标注器工具标注器FlavorIntegration说明ArgillaAnnotatorargillaargilla将 ZenML 与 Argilla 对接LabelStudioAnnotatorlabel_studiolabel_studio将 ZenML 与 Label Studio 对接PigeonAnnotatorpigeonpigeon对接 Pigeon仅限 Notebook且仅支持图像与文本分类任务ProdigyAnnotatorprodigyprodigy对接 Prodigy商业工具自定义实现_custom_—扩展标注器抽象并提供自己的实现查看当前环境可用的标注器 flavorzenml annotator flavor list该命令会列出各 flavor 所属的集成integration以及它们可适配的服务连接器service connector。若想查看某个 flavor 的详细参数可运行zenml annotator flavor describe FLAVOR_NAMEAnnotator 核心 CLI 命令标注器的全部交互入口都挂在zenml annotator命令组下实现位于 src/zenml/cli/annotator.py。其子命令结构如下zenml annotator register ANNOTATOR_NAME --flavor ANNOTATOR_FLAVOR [--ANNOTATOR_OPTIONS]注册一个标注器组件。你也可以用--label/-l标志为组件添加任意标签例如-l key1value1 -l key2value2。zenml annotator list列出所有已注册可用的标注器。zenml annotator dataset list列出当前激活标注器中可用的数据集。源码中该命令调用annotator.get_dataset_names()并以表格形式输出无数据集时会给出提示。zenml annotator dataset stats dataset_name展示某数据集的标注统计。CLI 实现会调用annotator.get_dataset_stats(dataset_name)拿到(labeled_task_count, unlabeled_task_count)二元组并输出总任务数、已标注任务数与未标注任务数由于 Prodigy 无法获取未标注任务数其输出会省略最后一行见 src/zenml/cli/annotator.py 中的dataset_stats。zenml annotator dataset delete dataset_name删除指定数据集执行前会要求确认使用--all/-a标志可删除全部数据集。zenml annotator dataset annotate dataset_name启动指定数据集的标注界面。对 Prodigy 特殊处理需要额外传入--command...参数并透传给 Prodigy 的 CLI详见 Prodigy 一节。注意dataset子命令组会先从激活堆栈中查找StackComponentType.ANNOTATOR类型的组件若堆栈中没有注册标注器会直接报错提示「请先注册标注器并加入堆栈」。也就是说这些命令都以激活堆栈中的标注器为操作对象。命名约定Dataset 与 Task各标注工具对核心概念命名的标准化程度不一ZenML 对堆栈组件与集成的用词做了统一取舍关键差异如下Label Studio 把「一组标注/任务的集合」称为Project而大多数其他工具称之为Dataset因此 ZenML 统一称其为Dataset。「一条标注 对应源数据」这一元单位在不同工具中称呼各异ZenML与 Label Studio 一致统一称之为Task。其余核心概念尤其是 annotation「标注」与 prediction「预测」在各标注工具间已被广泛通用。实战一Label Studio 标注器功能最完整Label Studio 是数据科学家与 ML 从业者最常用的开源标注平台之一用于创建或编辑可供训练/验证工作流使用的数据集。它支持广泛的标注类型计算机视觉图像分类、目标检测、语义分割音频与语音分类、说话人分离、情感识别、音频转录文本/NLP分类、NER 命名实体识别、问答、情感分析时间序列分类、分割、事件识别多模态/领域对话处理、OCR、带参考的时间序列。何时使用 Label Studio当你需要在 ML 工作流中对数据做标注时就可以考虑把标注器作为可选堆栈组件加入 ZenML 堆栈。当前支持在主 Annotators 文档描述的各阶段使用标注并额外提供了生成图像分类与目标检测 Label Studio 标签配置文件的自定义工具函数。重要限制Label Studio 集成目前仅支持三类云对象存储作为工件存储artifact storeAWS S3、GCP/GCS 与 Azure Blob Storage。纯本地堆栈目前无法配合标注组件工作——这与sync_new_data_to_label_studio等 Step 依赖云端工件存储的实现密切相关。部署与注册Label Studio flavor 由label_studio集成提供先安装集成zenml integration install label_studio然后获取 Label Studio API Key。以下步骤针对本地实例如果使用已部署实例可直接从其获取 API Keygit clone https://github.com/HumanSignal/label-studio.git cd label-studio docker-compose up -d # 在 http://localhost:8080 启动 label studio访问http://localhost:8080/登录再访问http://localhost:8080/user/account从右上角获取你的 Label Studio API Key。保持 Label Studio 服务器持续运行因为 ZenML Label Studio 标注器会以它为后端。随后把 API Key 注册为自定义 Secret替换中的两处为自定义名称zenml secret create label_studio_secrets --api_keyyour_label_studio_api_key注册标注器zenml annotator register label_studio --flavor label_studio --authentication_secretlabel_studio_secrets --port8080 # 使用已部署实例时可传入 URL例如 # zenml annotator register label_studio --flavor label_studio --authentication_secretLABEL_STUDIO_SECRET_NAME --instance_urlyour_label_studio_url --port80使用已部署的 Label Studio 实例时实例 URL末尾不能带斜杠/需要显式指定端口如标准 HTTP 连接的 80 端口。Hugging Face 部署快速上手 Label Studio 的方式请参考对应部署文档。最后把这些组件组装成堆栈并设为激活堆栈zenml stack copy default annotation zenml stack update annotation -a YOUR_CLOUD_ARTIFACT_STORE # 这一步必须单独执行以确保其他必需堆栈组件已先注册 zenml stack update annotation -an YOUR_LABEL_STUDIO_ANNOTATOR zenml stack set annotation # 可选 zenml stack describe运行zenml annotator dataset list若无报错即表示标注器已就绪可以接入 ML 工作流。源码视角配置参数与默认值从 src/zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py 可以看到LabelStudioAnnotatorConfig由三部分组合而成BaseAnnotatorConfig含notebook_only类变量默认False、LabelStudioAnnotatorSettings运行时设置与AuthenticationConfigMixin认证配置。关键设置项及默认值instance_urlLabel Studio 实例地址默认http://localhostport标注界面端口默认8093注意注册命令示例中按实际部署可改为 8080api_keyLabel Studio API Key类型为SecretField默认None——这正是注册时推荐通过--authentication_secret引用 ZenML Secret 而不是明文传入的原因。LabelStudioAnnotatorFlavor还提供docs_url、sdk_docs_url与logo_url属性供 Dashboard 展示与文档跳转使用。使用方式CLI 与数据集管理ZenML 假定用户已按上述步骤注册了云端工件存储与标注器当前仅支持该组合未来会补充纯本地堆栈方案。数据与标注的访问统一通过zenml annotator ...CLI 完成zenml annotator dataset list查看正在使用的数据集信息zenml annotator dataset annotate dataset_name进入特定数据集的标注工作。标准 Steps 与配套配置对象ZenML 为 Label Studio 集成提供了开箱即用的标准 Step 及其配置对象实现在 src/zenml/integrations/label_studio/steps/label_studio_standard_steps.py快速上手只需组合它们LabelStudioDatasetRegistrationConfig注册数据集用的 Step 配置对象配合get_or_create_datasetStep 使用。LabelStudioDatasetSyncConfig配合sync_new_data_to_label_studioStep 使用。注意该配置要求预先在工件存储对应的云平台上注册好 ZenML Secret 来保存云厂商认证信息Label Studio 官方文档说明了这些 Secret 所需的权限。get_or_create_datasetStep接收LabelStudioDatasetRegistrationConfig含数据集名称。若数据集已存在则直接返回其名称否则 ZenML 会连同合适的 label config 一起在 Label Studio 中注册该数据集。源码实现中该 Step 通过Client().active_stack.annotator获取标注器并校验必须是LabelStudioAnnotator实例否则抛出TypeError若连接不可用则抛出StackComponentInterfaceError。get_labeled_dataStep获取某数据集的全部已标注数据。注意其输出是 Label Studio 标注格式需在后续按具体用例转换为合适格式。源码中通过dataset.get_labeled_tasks()拉取已标注任务。sync_new_data_to_label_studioStep确保 ZenML 管理标注、文件存储与同步到云端工件存储的关键 Step。它在持续标注工作流中至关重要——后续 Step 需要与不断新增/更新的标注保持同步。源码实现会校验uri必须以激活工件存储的路径开头否则抛出ValueError并将uri解析出的路径设置为同步prefix再调用connect_and_sync_external_storage建立外部存储同步连接若同时传入predictions还会把预测结果按任务 ID 映射后写入数据集dataset.create_predictions实现「模型预标注 人工修正」的加速闭环。LabelStudioDatasetSyncConfig的关键参数源码字段含默认值包括storage_type目标存储类型可选[gcs, s3, azure, local]默认local、label_config_type必填label config 类型、prefix云存储内的数据导入前缀本地存储时为数据所在目录的绝对路径、regex_filter过滤导入文件的正则默认.*、use_blob_urls数据是原始图像/视频还是 JSON 任务默认True、presign是否生成预签名 URL默认True、presign_ttl预签名 URL 有效期默认 1、description数据集描述以及各家云厂商凭证字段azure_account_name、azure_account_key、google_application_credentials、aws_access_key_id、aws_secret_access_key、aws_session_token、s3_region_name、s3_endpoint。标签配置生成器Label Config GeneratorsLabel Studio 在创建/注册数据集时要求提供所谓的label config——一种类 HTML 语法字符串用于定义自定义标注界面。ZenML 在 src/zenml/integrations/label_studio/label_config_generators/label_config_generators.py 中提供了四个构造函数每个函数返回(label_config, label_config_type)二元组generate_text_classification_label_config(labels)文本分类基于 Label Studio 情感分析模板。当labels为空时抛出ValueError。生成的 XML 片段包含Text nametext value$text/与单选Choices。generate_image_classification_label_config(labels)图像分类基于图像分类模板使用Image nameimage value$image/与Choices。generate_basic_object_detection_bounding_boxes_label_config(labels)目标检测边界框基于 image_bbox 模板使用RectangleLabels与Label元素。generate_basic_ocr_label_config(labels)OCR 标注基于光学字符识别模板组合了带缩放/旋转控制的Image、Filter、Rectangle、Polygon以及用于记录转写文本的TextArea perRegiontrue。这些函数的任务类型均来自zenml.enums.AnnotationTasks枚举模块中还定义了TASK_TO_FILENAME_REFERENCE_MAPPING把各类标注任务映射到数据中的image字段引用供预测文件名与任务 ID 互转使用。实战二Argilla 标注器文本标注 Human-in-the-loopArgilla 是面向 AI 工程师与领域专家的协作工具用于构建高质量数据集。它通过人类与机器双重反馈加速数据策展支撑从数据标注到模型监控的 MLOps 全流程尤其强调 human-in-the-loop 的具体用例。何时使用 Argilla当你在 ML 工作流中需要标注文本类数据时可考虑把 Argilla 标注器加入堆栈。Argilla 集成目前支持本地Docker 支撑实例与已部署实例两种方式例如可通过 Hugging Face Space 快速部署 Argilla。部署与注册安装集成zenml integration install argilla有两种方式传入 API Key直接传入zenml annotator register命令或注册为 Secret 后传入 Secret 名称。出于安全考虑推荐后者。若采用 Secret 方式需先为所选工件存储注册对应 Secret并把 Secret 名称作为--authentication_secret传入标注器zenml secret create argilla_secrets --api_keyyour_argilla_api_keyAPI Key 请从 Argilla 文档与界面获取。注册标注器zenml annotator register argilla --flavor argilla --authentication_secretargilla_secrets --port6900使用已部署实例时实例 URL 末尾不能带/。若使用 Hugging Face Spaces 实例且可见性为 private还必须设置headers参数携带 HF Tokenzenml annotator register argilla --flavor argilla --authentication_secretargilla_secrets --instance_urlhttps://[your-owner-name]-[your_space_name].hf.space --headers{Authorization: Bearer {[your_hugging_face_token]}}组装堆栈并激活zenml stack copy default annotation # 单独执行确保其他必需组件先注册 zenml stack update annotation -an YOUR_ARGILLA_ANNOTATOR zenml stack set annotation # 可选 zenml stack describezenml annotator dataset list无报错即表示就绪。源码视角配置参数从 src/zenml/integrations/argilla/flavors/argilla_annotator_flavor.py 可知ArgillaAnnotatorSettings含instance_url默认本地地址、api_keySecretField、port默认 Argilla 本地端口6900、headers请求附加头可传 JSON 字符串。配置类还通过field_validator(instance_url)自动剔除 URL 末尾的/与文档「实例 URL 末尾不能带斜杠」的要求一一对应同时保留了对旧参数名extra_headers的兼容性迁移。使用方式CLI 与 SDK除zenml annotator ...CLIdataset list/dataset annotate dataset_name打开 Argilla Web 界面开始标注外ZenML 还通过 SDK 暴露了部分常用 Argilla 功能。Python 中先取客户端对象再调用方法from zenml.client import Client client Client() annotator client.active_stack.annotator # 列出数据集名称 dataset_names annotator.get_dataset_names() # 获取某个数据集 dataset annotator.get_dataset(dataset_name) # 获取数据集标注结果 annotations annotator.get_labeled_data(dataset_namedataset_name)实战三Pigeon 标注器Notebook 内轻量标注Pigeon 是轻量级开源标注工具专为在 Jupyter Notebook 内快速、便捷地标注数据而设计界面直观简单支持文本分类图像分类文本字幕Text Captioning何时使用 Pigeon当需要标注中小规模数据集、且希望直接在 Jupyter Notebook 内完成时Pigeon 是理想选择特别适合不需要完整标注平台的快速标注任务、ML 项目探索阶段的迭代式标注、Notebook 环境内的协作标注。部署与注册安装集成zenml integration install pigeon注册标注器指定标注文件的输出目录zenml annotator register pigeon --flavor pigeon --output_dirpath/to/diroutput_dir是相对于仓库或 Notebook 根目录的路径。然后加入堆栈并激活zenml stack update YOUR_STACK_NAME --annotator pigeon使用方式在 Notebook 中通过 ZenML Client 使用。文本分类任务示例from zenml.client import Client annotator Client().active_stack.annotator annotations annotator.annotate( data[ I love this movie, I was really disappointed by the book ], options[ positive, negative ] )图像分类任务可传入自定义显示函数渲染图片from zenml.client import Client from IPython.display import display, Image annotator Client().active_stack.annotator annotations annotator.annotate( data[ /path/to/image1.png, /path/to/image2.png ], options[ cat, dog ], display_fnlambda filename: display(Image(filename)) )launch/annotate方法返回标注结果列表每个元素是「数据项 对应标签」的元组。也可用zenml annotator dataset命令管理数据集zenml annotator dataset list列出所有可用数据集zenml annotator dataset delete dataset_name删除指定数据集zenml annotator dataset stats dataset_name查看数据集统计。标注文件以 JSON 格式保存在指定的output_dir中每个标注文件对应一个数据集文件名即数据集名。源码视角Pigeon 实现说明从 src/zenml/integrations/pigeon/annotators/pigeon_annotator.py 可以看到PigeonAnnotator继承BaseAnnotator但把get_url/get_url_for_dataset实现为NotImplementedErrorPigeon 没有 Web URL仅在 Notebook 内交互get_datasets()直接列出output_dir下以.txt结尾的标注文件。该实现基于 Anastasis Germanidis 的 Pigeon 包修改而来原包代码已不兼容较新的ipywidgets版本ZenML 在其仓库中直接内嵌了适配后的代码并做了小幅 UI 改进。实战四Prodigy 标注器商业工具CLI 透传Prodigy 是现代标注工具用于创建训练与评估数据也可用于数据检查与清洗、错误分析以及开发与统计模型配合的规则系统。它包含一系列预置工作流与命令行命令组件文档完善支持自定义工作流脚本可指定数据加载/保存方式、改变标注界面提问、甚至自定义 HTML 与 JavaScript 改变前端行为Web 应用针对快速、直观、高效的标注做了优化。提示Prodigy 是付费标注工具需要许可证才能下载并与 ZenML 一起使用。部署与注册安装集成导出依赖清单zenml integration export-requirements --output-file prodigy-requirements.txt prodigyProdigy 需要单独安装需要许可证且当前要求urllib32依赖请务必安装对应版本。然后注册标注器zenml annotator register prodigy --flavor prodigy # 可选--custom_config_pathPATH_TO_CUSTOM_CONFIG_FILEcustom_config_path允许覆盖 Prodigy 默认配置详见 Prodigy 配置文档。组装堆栈zenml stack copy default annotation zenml stack update annotation -an prodigy zenml stack set annotation # 可选 zenml stack describezenml annotator dataset list无报错即就绪。使用方式与 Label Studio 不同无需预先启动标注器服务——直接用 Prodigy 原生命令再通过 ZenML 包装/API 获取标注数据即可。CLI 用法zenml annotator dataset annotate DATASET_NAME CUSTOM_COMMAND等价于在终端运行prodigy CUSTOM_COMMAND。例如zenml annotator dataset annotate your_dataset --commandtextcat.manual news_topics ./news_headlines.jsonl --label Technology,Politics,Economy,Entertainment该命令以textcat.manual配方启动 Prodigy 界面数据集为news_topics标签为 Technology、Politics、Economy、Entertainment数据从news_headlines.jsonl加载。常见工作流是照常标注数据后在本地管线 Step 中导入标注from typing import List, Dict, Any from zenml import step from zenml.client import Client step def import_annotations() - List[Dict[str, Any]]: zenml_client Client() annotations zenml_client.active_stack.annotator.get_labeled_data(dataset_namemy_dataset) # 对标注数据做后续处理 return annotations在云环境中运行时可手动导出标注存入云端某处后再在 ZenML 中引用——具体方式高度依赖用例难以给出通用方案。开发自定义标注器现状说明在深入实现前建议先熟悉 ZenML「编写自定义堆栈组件 flavor」的通用指南理解 flavor 概念。当前状态标注器的基类抽象仍在演进中base abstraction in progress因此暂时不支持扩展自定义标注器。如需在堆栈中使用标注器请从上述已有 flavor 中选择。custom.md 中对此有明确警告且 ZenML 仓库目前的_custom_flavor 亦无现成实现代码。基类抽象BaseAnnotator 的统一接口虽然目前不允许外部扩展但理解 src/zenml/annotators/base_annotator.py 中定义的基类接口有助于理解各集成 flavor 的能力边界与 CLI 背后的调用链。BaseAnnotator通过abstractmethod强制子类实现的核心方法包括get_url()/get_url_for_dataset(dataset_name)返回标注界面或某数据集标注界面的 URLget_datasets()/get_dataset_names()枚举当前可用于标注的数据集get_dataset_stats(dataset_name)返回(labeled_task_count, unlabeled_task_count)标注统计元组launch(**kwargs)启动标注界面add_dataset(**kwargs)/get_dataset(**kwargs)/delete_dataset(**kwargs)数据集的新增、获取与删除get_labeled_data(**kwargs)/get_unlabeled_data(**kwargs)获取已标注/未标注数据。BaseAnnotatorConfig目前仅含一个类变量notebook_only: ClassVar[bool] False——Pigeon 这类仅限 Notebook 的标注器正是通过该标志区分的。所有集成Label Studio、Argilla、Pigeon、Prodigy的 annotator 类都继承此基类各自的 flavor 类则继承BaseAnnotatorFlavor并返回对应的config_class与implementation_class从而接入zenml annotator register ... --flavor FLAVOR的统一注册机制。总结如何把标注接入你的 ZenML 工作流把标注器接入 ZenML 工作流的完整路径可归纳为五步安装集成zenml integration install integrationProdigy 用export-requirements导出依赖并单独安装准备后端与凭证启动或部署标注服务获取 API Key 并注册为 ZenML SecretLabel Studio 需注意纯本地工件存储不受支持应使用 AWS S3 / GCP GCS / Azure Blob Storage 之一注册标注器zenml annotator register name --flavor flavor --authentication_secretsecret [--instance_url... --port...]已部署实例的 URL 末尾不能带/组装并激活堆栈zenml stack update ... -an annotator在注册好其他必需组件后单独执行并zenml stack set投入标注工作流用zenml annotator dataset list / annotate / stats / delete管理数据集或在管线中组合标准 Step如 Label Studio 的get_or_create_dataset、get_labeled_data、sync_new_data_to_label_studio与 SDK 方法Client().active_stack.annotator.get_labeled_data(...)获取标注结果用于训练与评估。标注器是 ZenML 堆栈抽象中「人机协同」的接口层它把数据集注册、任务统计、标注导出、预标注回灌等能力统一到一套 CLI/SDK/Step 接口之下让你能在同一个 MLOps 平台上完成从原始数据到可训练标注数据集的闭环管理。可结合仓库中 examples/computer_vision 等示例进一步查看标注结果如何流入训练与推理管线。【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表