什么是MD-CLI

文章目录

    • CLI和MD-CLI是什么
    • 为什么要有MD-CLI
    • MD-CLI和传统CLI相比有什么优势
    • MD-CLI和YANG是如何对应的



MD-CLI(Model-Driven Command Line Interface)是基于YANG模型生成的既有机机交互又有人机交互能力的命令行工具。相比传统CLI,具有配置逻辑简单、机器解析处理容易和学习成本低等优点。


CLI和MD-CLI是什么

CLI:命令行接口,一种以命令行形式与设备进行交互的工具。

CLI(Command Line Interface)即命令行接口,是用户与设备进行交互的常用工具之一,被广泛应用于新业务发放、日常运维等场景中。用户登录到设备,出现命令行提示符后,即进入命令行接口。系统向用户提供一系列命令,用户可以通过命令行形式输入命令,实现用户与设备的交互。CLI与Windows系统上的图形界面类似,只不过CLI是文字形式,而Windows的图形界面主要是可视化的形式。目前,网络设备支持的命令行接口分为传统CLI和MD-CLI。

MD-CLI:基于YANG模型生成的命令行接口。

传统CLI所使用的数据模型是不统一的,这也解释了为什么类似的功能,在不同设备上需要输入不同的命令行。MD-CLI的核心理念在使用YANG模型作为数据建模语言。MD-CLI为用户提供以目录形式访问YANG模型节点的方法,用户在了解相关YANG模型中的节点层次结构后,可以自动推导出相应的MD-CLI操作命令行,反之亦然。

为什么要有MD-CLI

随着网络时代的飞速发展,网络设备成几何级数量剧增,与此同时,设备厂商以及网络设备的类别也越来越多,这使得网络管理任务愈发困难。在云网络时代下,网络设备面临的最大转型是管理和运维的转型,即由原来的单网元人机管理演进到全网自动化管理的机机管理。传统CLI作为典型的人机接口,是人和设备交互的主要方式。在SNMP出现以前,传统CLI脚本编写是实现网络自动化管理的主要方式。然而,传统CLI不统一的命令行句式和非结构化的输出,使得CLI脚本维护困难,成本高昂。在这种背景下,SNMP成为广泛应用于TCP/IP网络的网络管理标准协议。随着时间推进,由于SNMP配置效率低,不支持事务机制等问题,基于YANG模型的多种网络配置协议如NETCONF、RESTCONF等应运而生。用户可以使用web端或者app通过控制器批量对设备进行管理与维护。至此,网络设备管理形成了传统CLI实现单点设备配置,各网络配置协议实现自动化管理的工作模式。即传统CLI作为人机接口,各网络配置协议作为机机接口。

在网络规模剧增的今天,为了完成网络管理,无论是人机接口还是机机接口都是不可或缺的。有没有一种方式,既可以用作人机交互,又可以作为机机交互的工具呢?答案是肯定的。MD-CLI便是同时具有两种能力的新一代交互方式。与NETCONF、RESTCONF等相同,MD-CLI也使用YANG模型作为数据建模语言。YANG模型定义了数据的层次化结构,使得机器可以有效地对运维数据进行识别与解析。因此,MD-CLI也可以被应用于网络自动化的场景中。作为机机接口,MD-CLI为用户提供以目录形式访问YANG模型节点的方法,相较偏向机机交互的网络配置协议更具有可读性,用户不需要借助上层应用也能批量对设备进行管理与维护。作为人机接口,MD-CLI只有几个基本的操作指令,熟悉YANG模型的用户学习之后,便可直接使用MD-CLI对设备进行单点配置,不用为设备复杂多变的命令行形式而苦恼。

MD-CLI的出现既方便了用户也方便了开发工作者。从用户层面讲,MD-CLI省去了用户对不同厂商不同设备的多套CLI学习的过程,只需要学习YANG模型。更重要的是,当多种设备交互方式都统一基于YANG模型时,一旦用户清楚了YANG结构后,便可以根据实际场景,灵活的选择更适合的设备交互方式。从开发工作者层面讲,MD-CLI省去了不同CLI模型的开发,而只需要专注YANG的开发,大大减少了开发工作量。

基于YANG模型的多种设备交互方式示意图

MD-CLI和传统CLI相比有什么优势

优点一:简化配置逻辑

传统CLI在执行每条命令时,都会检查该命令操作对象的依赖关系,因此在配置时,需要严格遵守各条命令之间的依赖顺序。

传统CLI检查依赖关系示意图

MD-CLI的依赖校验是在提交阶段才执行,配置过程不需要配置逻辑校验,用户只需保证在提交时,相关的配置依赖关系已经满足即可,在编辑过程中,无需严格遵守业务之间的依赖逻辑。

MD-CLI检查生效示意图

优点二:降低学习成本

在网络管理场景下,用户需要学习传统CLI,以便对设备按需进行单点配置。同时,随着网络规模的增大,用户也需要学习YANG模型,以实现自动化管理。因此,新手用户需要同时学习传统CLI和YANG。另外,在传统CLI的学习中,用户还需进一步阅读相关的手册去确认不同厂商以及不同设备的功能和命令行形式是否有不同,学习过程长,成本高。

传统CLI场景下需求解决过程

若使用MD-CLI,这一过程便只需要聚焦在设备不同的YANG结构上。用户在了解设备YANG模型结构和MD-CLI的几个基本操作指令后,即可导出MD-CLI的操作命令行,直接对设备进行配置。如果有自动化管理的需求,也可以利用MD-CLI进行脚本的编写,实现多设备进行批量管理。整个学习过程省去传统CLI命令格式的学习以及对不同厂商命令行格式较大差异的识别,降低了学习成本。


MD-CLI场景下需求解决过程

优点三:利于机器解析处理

传统CLI主要是面向人机交互界面,强调人的可读性,其命令行形式没有统一语法约定,各厂商差异大。并且,传统CLI命令回显是纯文本的,以便人可以阅读和理解。如果想采用机器对回显结果进行解析,难度就很大了。因为回显结果是非结构化的,有的是表格,有的是字符串,应用程序没有统一的标准去解析。除非针对每一个命令的回显结果去做适配,这会大大加大运维管理成本,其复杂性也会影响应用程序的稳定性。以下以查看指定接口不同长度范围的报文收发统计信息来展示传统CLI的命令行输出。

<HUAWEI> system-view [HUAWEI] display interface statistics 100ge 1/0/1 verbosePacketLength(Bytes)Send(packets)Receive(packets)1~64 0 1 65~127 183703 109222 128~255 0 0 256~511 12251 12249 512~1023 0 0 1024~1518 0 0 1519~9216 0 0

MD-CLI的输出采用JSON格式,遵循业务YANG的定义和相关标准,结构化的信息便于使用自动化工具统一解析。它的内容层使用YANG模型,很好的弥补了人机接口的不足。以下以查看当前视图下candidate数据库中的配置为例,演示MD-CLI的命令行输出。

[*(ex)ADMIN@HUAWEI]/ifm/interfaces/interface[name="MEth0/0/0"] MDCLI> display this candidate{"name":"MEth0/0/0","class":"main-interface","type":"MEth","number":"0/0/0","description":"To deviceB MEth0/0/0","admin-status":"up","link-protocol":"ethernet","router-type":"broadcast","clear-ip-df":false, "link-up-down-trap-enable": true, "statistic-enable": true, "statistic-mode": "interface-based", "mtu": 1500, "spread-mtu-flag": false, "vrf-name": "_public_", "l2-mode-enable": false, "huawei-ip:ipv4":{"addresses":{"address":[{"ip":"10.1.1.255","mask":"255.255.254.0",---- More ----

MD-CLI和YANG是如何对应的

YANG模型
MD-CLI的命令是根据设备支持的YANG模型生成的。YANG模型主要节点类型包括:

  • Container(容器)节点:Container节点用来描述若干相关节点的集合。Container节点只有子节点,而没有值。对于子节点数目和类型不作要求,可以是Container节点、Leaf节点、Leaf-list节点或者List节点。
  • Leaf(叶)节点:一个Leaf节点包含简单的数据,如整形数据或字符串。该节点对每个特定类型仅有一个确定值,并且没有子节点。
  • Leaf-list(叶列表)节点:Leaf-list列表节点是一系列具备特定类型的叶节点的集合,每个叶节点对特定数据类型有一个确定值。
  • List(列表)节点:List节点定义了列表条目序列,每个条目就像一个结构体或者一个记录实例,由其关键Leaf节点的值(key值)唯一识别。List节点可定义多个关键Leaf节点,也可能是一系列包含任意数据类型(包括Leaf节点、List节点、Container节点等)的子节点。
  • Rpc节点:Rpc可以对其模型顶层的操作进行定义,包含操作名称、输入参数和输出参数。

在MD-CLI配置过程中,通过查看指定路径下支持的YANG树结构,可以清晰看到数据的层级结构,辅助MD-CLI的配置操作。例如,查看ifm/interfaces/interface路径下的YANG树。在YANG树结构的左侧为在YANG文件中定义的节点的名称,右侧为Leaf/Leaf-list节点的数据类型说明,如果某个节点有默认值,则在数据类型后,增加 <> 表示,如statistic-mode的默认值为interface-based。

[ADMIN@HUAWEI] MDCLI> tree ifm/interfaces/interfacemodule:huawei-ifm +--rw ifm +--rw interfaces +--rw interface* [name] +--rw namehuawei-pub-type:if-name +--rw class? class-type +--rw type? port-type +--rw parent-name? -> /huawei-ifm:ifm/interfaces/interface/name +--rw number? string +--rw description? string +--rw admin-status? port-status +--rw link-protocol? link-protocol +--rw router-type? router-type +--rw clear-ip-df? boolean <false> +--rw link-up-down-trap-enable? boolean <true> +--rw statistic-enable? boolean +--rw statistic-mode? statistic-mode <interface-based> +--rw(bandwidth-type)? | +--:(bandwidth-mbps)| | +--rw bandwidth? uint32 | +--:(bandwidth-kbps)| +--rw ban uint32 +--rw mtu? uint32 ---- More ----

MD-CLI与YANG模型各节点对应关系

我们将从YANG的Container节点、Leaf节点、Leaf-list节点、List节点和Rpc节点分别展示和MD-CLI的对应关系。

  • YANG模型中的Container节点,映射为MD-CLI的节点视图,Container节点名称对应为MD-CLI的节点视图名称。Container节点是若干相关节点的集合,因而Container节点只有子节点,而没有值。
    以huawei-arp.yang为例,在YANG树结构中,arp和speed-limits两个节点均为Container节点。
module:huawei-arp +--rw arp +--rw speed-limits

在MD-CLI中,arp和speed-limits节点,将会映射为节点视图。

[ADMIN@HUAWEI] MDCLI> arp [ADMIN@HUAWEI]/arp MDCLI> speed-limits [ADMIN@HUAWEI]/arp/speed-limits MDCLI>

对于多级Container节点,用户可以一次指定多级Container节点的名字,直接进入目标Container节点对应的视图。

[ADMIN@HUAWEI] MDCLI> arp speed-limits [ADMIN@HUAWEI]/arp/speed-limits MDCLI>
  • YANG模型中的Leaf和Leaf-list节点,映射为MD-CLI的操作对象,节点名称为操作对象的名称。Leaf-list节点是Leaf节点的合集,每个Leaf节点对特定数据类型有一个确定值。用户输入对象名称和参数值进行配置修改,执行命令remove <对象名称> 删除配置。
    以huawei-arp.yang为例,在YANG树结构中,strict-learn-enable、l2topo-detect-enable和rate-trap-interval都是Leaf节点。
module:huawei-arp +--rw arp +--rw global +--rw strict-learn-enable? boolean +--rw l2topo-detect-enable? boolean +--rw rate-trap-interval? uint32

在MD-CLI中,strict-learn-enable、l2topo-detect-enable和rate-trap-interval节点映射为MD-CLI的操作对象。执行命令remove <对象名称> 可以删除配置。

[*(ex)ADMIN@HUAWEI]/arp/global MDCLI> strict-learn-enable false [*(ex)ADMIN@HUAWEI]/arp/global MDCLI> remove rate-trap-interval

进行配置操作时,用户可以在一条MD-CLI命令行中,输入多个操作对象和值。

[*(ex)ADMIN@HUAWEI]/arp/global MDCLI> strict-learn-enable false l2topo-detect-enable true
  • YANG模型中的List节点,也映射为MD-CLI的节点视图。List节点定义了列表条目序列,每个条目就像一个结构体或者一个记录实例,由其关键叶节点的值(key值)唯一识别。与Container节点不同的是,进入List视图,除了指定List的节点名称外,还需要指定所有List节点的相关Key值。
    以huawei-arp.yang为例,在YANG树结构中,speed-limit节点为List节点,其Key由三个节点组成,分别为slot-id、suppress-type和ip-type。
module:huawei-arp +--rw arp +--rw speed-limits +--rw speed-limit* [slot-id suppress-type ip-type] #speed-limit节点的三个key节点 +--rw slot-id string +--rw suppress-type suppress-type +--rw ip-type suppress-ip-type +--rw suppress-value uint32

在MD-CLI中,speed-limit节点映射为MD-CLI的节点视图,进入节点视图时,需要同时指定slot-id、suppress-type和ip-type的值。

[ADMIN@HUAWEI]/arp/speed-limits MDCLI> speed-limit slot-id 1 suppress-type arp ip-type src-ip [ADMIN@HUAWEI]/arp/speed-limits/speed-limit[slot-id="1"][suppress-type="arp"][ip-type="src-ip"] MDCLI>

在Container嵌套List的情况下,用户也可直接同时指定Container和List,直接进入List视图。

[ADMIN@HUAWEI] MDCLI> arp speed-limit slot-id 1 suppress-type arp ip-type src-ip [ADMIN@HUAWEI]/arp/speed-limits/speed-limit[slot-id="1"][suppress-type="arp"][ip-type="src-ip"] MDCLI>
  • YANG模型中的RPC节点,为维护类节点,用户通过RPC节点进行一些维护操作。和Container节点、List节点类似,RPC节点名称映射为MD-CLI的节点视图名称。
    以huawei-file-operation.yang为例,在YANG树结构中,copy-file为RPC节点。
module:huawei-file-operation +---x copy-file +---- input +---w src-file-name leafref +---w des-file-name string

在MD-CLI中,copy-file节点映射为MD-CLI的节点视图。用户可以输入RPC节点的名称,进入RPC视图,然后进行维护操作,例如文件复制。

[ADMIN@HUAWEI] MDCLI> copy-file [(x)ADMIN@HUAWEI]/copy-file MDCLI> src-file-name file-1.txt des-file-name file-2.txt [(x)ADMIN@HUAWEI]/copy-file MDCLI> emit

huawei-arp.yang与MD-CLI对应示例

由上可知,YANG树的层次结构,在MD-CLI中通过视图的层次结构进行表达,通过下图,可直观的看到YANG节点和MD-CLI的命令之间的映射关系。在右侧的MD-CLI命令列表中,缩进表示MD-CLI视图嵌套关系,粗体表示MD-CLI视图名称和操作对象命令,斜体表示相关命令参数(包含具体的参数类型)。

YANG树结构 MD-CLI命令列表module:huawei-arp +--rw arp ----------------------------------------------------------> arp +--rw global -----------------------------------------------------> global | +--rw strict-learn-enable? boolean -----------------------> strict-learn-enable boolean | +--rw l2topo-detect-enable? boolean -----------------------> l2topo-detect-enable boolean | +--rw rate-trap-interval? uint32 ------------------------> rate-trap-interval uint32 | +--rw passive-learn-enable? boolean -----------------------> passive-learn-enable boolean | +--rw topo-detect-disable? boolean -----------------------> topo-detect-disable boolean | +--rw con-send-enable? boolean -----------------------> con-send-enable boolean | +--rw con-send-maxnum? uint16 ------------------------> con-send-maxnum uint16 | +--rw gratuitous-drop? boolean -----------------------> gratuitous-drop boolean | +--rw vlanif-expiretime? uint32 ------------------------> vlanif-expiretime uint32 | +--rw host-conflict-period? uint16 ------------------------> host-conflict-period uint16 | +--rw host-conflict-threshold? uint16 ------------------------> host-conflict-threshold uint16 | +--rw broadcast-max-num? uint16 ------------------------> broadcast-max-num uint16 +--rw speed-limits -----------------------------------------------> speed-limits | +--rw speed-limit* [slot-id suppress-type ip-type] ------------> speed-limit slot-id string suppress-type type ip-type ip-type | +--rw slot-id string | +--rw suppress-type suppress-type | +--rw ip-type suppress-ip-type | +--rw suppress-value uint32 -----------------------------> suppress-value uint32 +--rw static-arps ------------------------------------------------> static-arps +--rw static-arp* [ip-addr ni-name] ---------------------------> static-arp ip-addr ipv4-address ni-name string +--rw ip-addr ipv4-address-no-zone +--rw ni-name leafref +--rw mac-addr mac-address -----------------------------> mac-addr mac-address +--rw vlan-id? uint16 -----------------------------------> vlan-id uint16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义tabs(支持横向/竖向排列)

效果展示&#xff1a;组件代码&#xff1a;CustomTabs.vue组件代码如下&#xff1a;<template><div class"custom-tabs" :class"[tabs-${type}, { tabs-vertical: type vertical }]"><!-- 横向布局 --><template v-if"type ho…

小文件自动化处理流程

# 1. 查看表的存储目录&#xff08;先执行show create table your_table;找到LOCATION&#xff09; hdfs dfs -ls /user/hive/warehouse/your_db.db/your_table/pt2026-01-06# 2. 【新增】备份原目录小文件&#xff08;防止误删&#xff0c;关键&#xff01;&#xff09; hdfs …

2026大模型风口已至!产品经理学习路线+免费资料,助你月薪30K+,建议收藏!

本文详细介绍了大模型产品经理的五阶段学习路线&#xff1a;基础知识、大模型技术、产品管理、实战经验和持续提升。行业数据显示大模型领域存在47万岗位缺口&#xff0c;初级工程师平均薪资达28K。文章提供四阶段实战学习计划&#xff08;初阶应用、高阶应用、模型训练、商业闭…

金属导电涂层双极板垂直比电阻仪

金属导电涂层双极板垂直比电阻仪 电导率与电阻的关系Rρll/σ定义或解释 电阻率的倒数为电导率。σ1/ρ (2)单位: 在国际单位制中,电导率的单位是西门子/米。 (3)说明 电导率的物理意义是表示物质导电的性能。电导率越大则导电性能越强,反之越小。金属导电涂层双极板垂直比电…

C++中的指针与内存管理

引言 在C++编程中,指针和内存管理一直是让许多程序员头疼的问题。今天,我们通过一个实际的例子来探讨C++中指针的使用,特别是关于**悬空指针(Dangling Pointer)和数组越界(Out of Bounds Access)**的问题。 实例分析 假设我们有一个音频播放程序,需要根据不同类别的…

零基础转行AI大模型产品经理,我的完整学习路线与资源分享

文章讲述了作者从风景园林专业成功转型为AI大模型产品经理的经历。通过自学产品知识、参与项目实践&#xff0c;最终获得AI领域龙头企业offer。作者指出AI产品经理入门成本不高&#xff0c;无需深入算法细节&#xff0c;而应关注用户和业务视角。文章提供了AI大模型学习的七个阶…

NestJS 中动态 Swagger 参数文档的实现

在 NestJS 项目中,常常需要对 API 的参数进行验证和文档化。特别是在使用 UUID 作为参数时,确保参数格式的正确性以及在 Swagger 中正确展示这些参数是非常重要的。今天我们来探讨如何在 NestJS 中创建一个自定义装饰器来验证 UUID 格式,并动态生成 Swagger 文档。 背景介绍…

双极板材料四探针低阻电阻测试仪

双极板材料四探针低阻电阻测试仪 四端测试法是目前较先进之测试方法&#xff0c;主要针对高精度要求之产品测试&#xff1b;本仪器广泛用于生产企业、高等院校、科研部门&#xff0c;是检验和分析导体材料和半导体材料质量的一种重要的工具。双极板材料四探针低阻电阻测试仪 …

Java 程序员如何快速上手浏览器插件开发?一篇文章讲透 Chrome Extension

作者背景&#xff1a;8 年 Java 开发 阅读建议&#xff1a;收藏 实操 适合人群&#xff1a;Java / 后端 / 想做自动化工具的程序员一、写在前面&#xff1a;我为什么要学浏览器插件&#xff1f; 作为一个 Java 程序员&#xff0c;我以前一直有个刻板印象&#xff1a;浏览器插件…

制码指南:轻松生成文本二维码和文件二维码

对于想要生成二维码的用户来说&#xff0c;了解基本步骤至关重要。生成二维码的过程并不复杂&#xff0c;您只需&#xff1a; 选择工具&#xff1a;通常可以在网络上找到多种免费的二维码生成工具。输入内容&#xff1a;无论是上传文件还是输入文本&#xff0c;确保信息准确无…

MATLAB实现稀疏编码中的基学习:使用拉格朗日对偶方法带L2范数约束

在稀疏编码(Sparse Coding)和字典学习领域,一个核心任务是从数据中学习一组过完备基(dictionary或basis),使得数据样本可以用这些基的稀疏线性组合来表示。传统的字典学习通常交替优化稀疏系数和字典,但计算开销较大。 今天我们要探讨一种高效的字典学习方法:针对固定…

速卖通关键词搜索接口深度实战:智能优化与跨境搜索精准化全方案

速卖通&#xff08;AliExpress&#xff09;关键词搜索接口是跨境选品、市场调研、竞品监控的核心入口。不同于国内电商搜索接口&#xff0c;速卖通搜索需适配 “多语言关键词、跨境筛选条件、区域化商品展示” 等特色场景&#xff0c;常规调用方案常面临关键词匹配度低、筛选条…

低代码破局零售电商数字化转型:从流量争夺到效率革命

年轻消费群体崛起&#xff0c;“线上种草、线下拔草”成常态&#xff0c;直播带货、社区团购等新场景涌现&#xff0c;零售电商行业竞争已从“流量争夺”升级为“效率比拼”。但多数企业数字化转型步履维艰&#xff1a;线上线下数据孤岛林立&#xff0c;用户信息不通&#xff1…

融云 回顾:「韧性」生长,「邪修」破局

2025 的进度条已经拉满&#xff0c;各个平台的年度词单也都如期而至了。从大洋彼岸权威词典的严肃定义&#xff0c;到中文互联网上脑洞大开的野生热梗&#xff1b;从传统媒体的时代注脚&#xff0c;到社交平台深夜刷屏的情绪共鸣。虽然语境不同、出处各异&#xff0c;但这些词一…

二维码工具是什么?主要有哪几种应用?

二维码工具的出现&#xff0c;极大地方便了信息的传递与管理。主要功能包括信息存储、链接活码和设备巡检二维码等。其中&#xff0c;信息存储让用户可以快速获取网址、文本和联系方式等信息&#xff1b;链接活码技术可实现内容实时更新&#xff0c;提升用户使用体验&#xff1…

Doris 开启 Partial Update:实现不存在就插入,存在就更新,NULL 不更新原值

这篇文章用一个测试表完整跑通 Doris 的 Partial Column Update&#xff08;部分列更新&#xff09;&#xff1a; 不存在就插入存在就只更新指定列值为 NULL 时不覆盖原值&#xff08;保持原值&#xff09; 1. 先搞懂&#xff1a;Partial Update 的前提条件 1.1 必须是 Uniqu…

docker快速部署docker私有仓库

前言 记录docker快速部署docker私有仓库命令 docker部署私有仓库 1. 创建认证密码文件 安装htpasswd工具 # CentOS/RHEL centos执行这个 yum install -y httpd-tools # Ubuntu/Debian apt-get install -y apache2-utils 2. 创建认证目录 mkdir -p /zero/registry/auth sudo…

【确认出席】卢勇 上海市数商协会秘书长丨上海·1月14日

第八届金猿论坛嘉宾“本次大会&#xff0c;现场将会举行十年先锋人物、十年标杆产品、CIO、数据要素价值释放、AI Infra领先企业、创新技术、Data Agent创新应用、国产化优秀代表厂商八项大奖的“第八届金猿季颁奖典礼”欢迎报名参与&#xff0c;观礼见证。大数据产业创新服务媒…

AI+敏捷时代,专项测试人员是否还有存在的必要?

一、PO 程序员 AI 能否覆盖全部测试需求&#xff1f;1. PO&#xff08;产品负责人&#xff09;的角色PO关注的是业务价值和用户需求&#xff0c;通过用户故事表达功能期望。虽然PO会参与验收&#xff08;UAT&#xff09;&#xff0c;但通常不具备系统性测试思维&#xff0c;也…

成为一名优秀的AI产品经理:2025年AI产品经理必备:大模型产品经理终极学习路线图,一篇就够了!

成为一名优秀的AI产品经理&#xff0c;需要具备深厚的技术背景、良好的产品直觉、敏锐的市场洞察力以及出色的沟通协调能力。以下是一份详尽的AI产品经理学习路线&#xff0c;旨在帮助有意进入该领域的学习者建立起坚实的基础&#xff0c;并逐步成长为行业内的专家。 一、基础知…