-
卷积神经网络是如何处理平移不变性的?
-
为什么要在CNN中引入池化层,它的作用是什么?
-
CNN中的卷积层是如何提取不同层次特征的?
-
为什么卷积神经网络在图像分类中优于传统机器学习方法?
-
1、活动中奖名单公布如下,公示期:2025年9月30日-2025年10月12日),如有疑问请在公示期间反馈,逾期未反馈视为放弃奖励!2、请中奖用户于10月12日18:00点前填写【中奖用户收货信息收集表】,逾期未填写视为放弃奖励,请知悉!3、公示期结束后,30个工作日内统一邮寄奖品,如有问题请与论坛版主【开发者学堂欢欢】联系。论坛昵称华为云账户名中奖奖品Dan**l777dan**lzi71华为云云宝盲盒lyc**eehid**69ftnyat0pt36-华为云云宝盲盒miy**ianhid**f120xjdev_3p9p华为云云宝盲盒yd_**1639784ma2**7219640华为云云宝盲盒yd_**9836623hw0**965199华为云云宝盲盒yd_**1421682hw0**242692华为云云宝盲盒yd_**1232643hid**uh5pap_evvd5m3华为云云宝盲盒yd_**8482500hid**2jjv4bqh7tojyj华为云云宝盲盒yd_**9120953hid**o8kr110cd1irkp华为云云宝盲盒东城**zjn**hd华为云云宝盲盒Key**nGT-**ymanlu开发者定制帆布袋Kyo**oKyo**o开发者定制帆布袋lap**lap**-开发者定制帆布袋onl**ehid**flez52-g4tnnea开发者定制帆布袋xia**uyunhid**j8lmus-xct997n开发者定制帆布袋yd_**773341Nic**lk开发者定制帆布袋yd_**1853307hw_**8618500324193_01开发者定制帆布袋yd_**3362082CSD**joseph122378开发者定制帆布袋yd_**2351385hwi**54qo76v2jedv3o9开发者定制帆布袋yd_**5084850hid**okixzf0gf3iqef开发者定制帆布袋yd_**5333295Nic**las_开发者定制帆布袋yd_**5647997qua**eihuang开发者定制帆布袋yd_**2303330hid**q8pz_rlfqysz5i开发者定制帆布袋yd_**7156534hw_**8617671701081_01开发者定制帆布袋yd_**4397534hid**broar4yuvv5de3开发者定制帆布袋yd_**7015753GT-**_56440853开发者定制帆布袋yd_**0067996hw0**891360开发者定制帆布袋yd_**0708279hid**xkb51_odsy84ud开发者定制帆布袋yd_**6610494hid**7x36ndk2fr3sg6开发者定制帆布袋yd_**5849640hid**us8m66oi7l6ztm开发者定制帆布袋yd_**7354561hid**2c7dpa7yyb8l77开发者定制帆布袋yd_**4865912hid**nelkuppcmu7l6o开发者定制帆布袋yd_**6239758sky**esfor开发者定制帆布袋yd_**3606035hw0**539305开发者定制帆布袋雪涧香**ten**un226开发者定制帆布袋yd_**4328856iro**enter开发者定制双肩包yd_**4615740hid**jt80_eivkwc69t开发者定制双肩包yd_**9152508GT-**rer开发者定制双肩包yd_**1422691x39**398533627308543开发者定制双肩包周星驰**hon**ongdoor开发者定制双肩包ban**nhid**jy7f3wd_u1ck19开发者定制水杯Bur**ar_CatBur**ar_Cat开发者定制水杯cxw**hw_**8618844196063_01开发者定制水杯yd_**4503415hid**tsrfcsgbbmx8q0开发者定制水杯梦影.**gxm**dppx开发者定制水杯aki**oaki**o开发者定制雨伞Lis**hw_**8618716409252_01开发者定制雨伞yd_**3444620hid**6evgnie_sxowxj开发者定制雨伞yd_**9106051hid**yun开发者定制雨伞yd_**8380014GT-**ixin_45445737开发者定制雨伞yd_**9302409ams**ing开发者定制雨伞yd_**9910332GT-**ong_min开发者定制雨伞yd_**3387282hid**s2ggjo4nf0gi1q开发者定制雨伞yd_**8812083GT-**_35655215开发者定制雨伞逆行时**nix**gshiguang开发者定制雨伞 (中奖名单如上展示,请中奖用户在公示期内填写收件信息,逾期未填写视为放弃奖励) 【活动时间】即日起—9月25日【活动流程】——领取奖励的用户必须完成活动报名+领取华为开发者空间一、活动报名二、免费领取华为开发者空间三、完成以下任意一个华为开发者空间案例,在本论坛贴评论区分享案例完成截图(完成时间+案例名称+案例完成截图+实验心得),活动结束后,将在评论区符合条件的用户中抽奖。指定空间案例(含实操入口)基于DeepSeek和Dify构建心理咨询师应用基于开发者空间搭建知识库构建儿科医生应用基于仓颉编程语言+DeepSeek实现智能聊天助手开发秘籍基于DeepSeek+Cherry Studio构建模拟面试助手FastGPT问答系统实战:知识库检索×联网搜索基于DeepSeek+Dify构建财务报表分析模型【活动奖品】奖品数量(个)云宝盲盒20开发者定制双肩包5开发者定制水杯5开发者定制帆布袋10定制雨伞10四、完成论坛回帖后,可以先填写中奖信息收集,如活动结束后中奖,奖品会发放到填写的地址。【活动礼品】 【空间案例实操方式】1、 登录个人华为账号,从上述指定开发者空间案例中选取任意1个,点击进入,下载自己感兴趣的案例,根据提示完成案例实操2、 本活动贴评论区:发送完成时间+案例名称+案例完成截图+实验心得【抽奖方式】活动结束后,我们将从评论区用户(华为云新老用户均可参与)中筛选出完成指定空间案例实操名单,通过巨公平台或Excel 函数形式抽取获奖用户,并在本活动帖进行公示获奖用户。 用户限制说明:1、参加本次社区活动的用户必须为华为云注册用户。同时为保证活动公平性,禁止用户以IAM账号身份参与活动,否则将视为无效。2、领取奖品的用户需为华为云实名用户,未完成实名认证的用户将不发放活动奖励。3、本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励。如在同一概率活动中,同一账号重复获奖,只发放首先获奖奖品。4、本次活动一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人,不予发放奖励。5、请开发者不要在活动期间随意修改社区昵称和华为云账号,由此产生的统计问题,如过了申诉期,小助手不再处理。(申诉期为活动结果公示3天内。)奖品发放说明:1、本活动结束之后10个工作日内公示获奖信息,获奖开发者用户需在截止时间在获奖信息收集表中填写获奖信息,获奖信息截止收集日过后30个工作日内,将统一发出奖品。华为云遵守《中华人民共和国个人信息保护法》规定,将以上个人信息仅用于礼品发放之目的,不会向任何第三方披露。若由于获奖开发者用户自身原因(包括但不限于联系方式有误、身份不符或超过截止登记日期等)造成奖品无法发送,视为获奖开发者用户放弃领奖。2、为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的开发者用户收回抽奖及奖励资格。3、若发放奖品时,出现库存不足,则优先发放等价值的其他实物奖品;开发者空间定制冲锋衣尺码随机发放,不指定尺码。4、所有参加本活动的开发者用户,均视为认可并同意遵守《华为云开发者用户协议》,包括以援引方式纳入《华为云开发者用户协议》、《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。5、如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
-
LlamaIndex专注于 检索增强生成(RAG) 场景,为开发者提供将私有或领域数据与大模型连接的高效方案。它通过“索引-检索-生成”三步流程,把大规模文档(如 PDF、网页、数据库)转化为向量表示,存储到向量数据库中,再根据用户查询检索相关片段并注入大模型上下文,从而显著提升回答的准确性和时效性。特色:提供 150 + 数据读取器(LlamaHub),支持 PDF、Notion、Slack、SQL 等格式;内置多种索引策略(向量、关键词、知识图谱等);5 行代码即可启动原型,配套 LlamaCloud 托管解析服务。适用:需要快速把企业内部知识库、技术文档或海量网页接入大模型的场景。LangChain一个通用的大模型应用开发框架,用链(Chain)和代理(Agent)将提示模板、外部工具、记忆、检索等组件组合成可复用的业务流程。核心概念:Chain:把多步调用(Prompt → LLM → 解析 → 工具)封装成一条流水线;Agent:让模型根据用户输入“自己决定”调用哪些工具(API、搜索、数据库等);Memory:支持短期/长期对话记忆;Callback:统一监控、日志、评估。生态:LangServe:一键把 Chain 部署成 REST API;LangSmith:调试、测试、监控 LLM 应用;LangChain Templates:官方参考架构模板,开箱即用。适用:需要灵活编排复杂业务逻辑、集成多种外部服务(如 CRM、Slack、GitHub)的 LLM 应用。AutoGen微软开源的多代理协作框架,让多个“会聊天”的 AI 角色(Agent)像团队一样分工协作完成复杂任务。关键特性:轻量化对话式编程:用自然语言描述角色和对话流程即可定义系统;异步自主协作:代理可自发交流、互相提问、纠正错误;异构 LLM 组合:不同代理可调用不同模型(如 GPT-4 负责创意,LLaMA 负责知识问答),取长补短;内置代码执行、检索、工具调用等能力,支持人机协同。典型场景:检索增强问答:一个代理负责向量检索,一个代理负责总结答案;多智能体编程:一个代理写框架,一个代理补业务逻辑,一个人类工程师做最终 review;自动化研究:模拟“研究员-审稿人-编辑”流水线。最后总结一下想做“把 20 G 内部文档变成聊天机器人”——试试 LlamaIndex;想“像拼积木一样快速搭 LLM 流程”——试试 LangChain;想“让多个 AI 角色自己开会完成任务”——试试 AutoGen。
-
<ModelArts Versatile-AI原生应用引擎 体验入口> 华为开发者空间 -- 开发平台 --Versatile Agent( 请在PC端打开 ) 什么是AI AgentAI Agent人工智能体,是一种能够自主感知环境、制定目标、规划行动、执行任务并持续学习的智能程序或系统。比如,告诉AI Agent帮忙下单一份外卖,它就可以直接调用 APP选择外卖,再调用支付程序下单支付,无需人类去指定每一步的操作。从本质上来讲,大模型作为大脑发号施令,推理能力决定它的决策能力上限,工具模块决定他行动能力的上限、可完成任务的横向宽度、操作场域。· AI Agent之ModelArts VersatileModelArts Versatile-AI原生应用引擎是一站式企业级全生命周期的智能体平台,为企业专属大模型应用开发的工具链,提供灵活的画布式AI Agent开发能力,让Agent能够准确解决复杂的业务场景问题。提供从Agent开发,使用,运营和运维的全生命周期管理能力。 快速了解 AI Agent的插件——MCP/工具 · MCP2024年11月底 Anthropic(Claude提供商)提出了MCP协议,并在Claude 客户端支持了MCP。MCP,全称Model Context Protocol,模型上下文协议。被认为是未来AI生态的「标准USB接口」,AI界的 “万能转换器”。MCP 是一个开放协议,核心目标是打通大语言模型(LLM)应用与外部数据源、工具之间的交互壁垒。由于每项数据源、工具或服务都有独立的格式规范、对接协议和认证体系,在传统的Agent开发场景中,如果AI模型需要与各类外部资源对接,开发者需要针对每个API进行独立的代码、文档、认证方式、错误处理和后续维护,这意味着每一种具体的连接都需要编写代码,效率低下且耗时费力。而MCP的出现,如同在AI模型与外部世界之间搭建了一座标准化的桥梁。MCP以通用的“标准语言”把工具、数据通过“MCP服务器”的方式供给(一次开发、无限连接),可以更高效、更便捷地实现Agent与成千上万的外部工具与数据的互通。 Before MCP:每个AI应用都需要单独封装API对接相同的外部系统,存在碎片化集成的问题。With MCP:统一抽象AI应用与外部系统的交互的标准化接口,不同AI应用通过相同Client即可连接到对应的Server。 MCP核心组件MCP Host:LLM应用程序(例如Claude Desktop,Agent智能体应用)MCP Client(MCP客户端):嵌入在MCP Host中,MCP Client对象与MCP Server的关系是1:1MCP Server(MCP服务器):向MCP Client提供上下文(例如外置的对话历史),工具执行,prompt模板等能力MCP Protocol(MCP协议):MCP Client和MCP Server之间数据传输的协议,当前支持本地stdio和远程http sse两种模式 其中MCP Server能力-工具执行:向AI应用提供工具执行能力,例如网页搜索、发送消息、执行LLM生成的代码等-资源访问:向AI应用提供资源访问的能力,例如访问文件系统、数据库等资源-Prompt模板:向AI应用提供预定义好的Prompt或工作流模板,指导LLM输出更准确的内容· 工具工具是一组相关的API集合,一个工具通常包含多个执行动作,每个执行动作用于实现特定功能,工具可以是函数、算法、或者是其他任何能够帮助Agent提高工作效率的辅助性资源。在创建Agent时调用工具,可以有效提高Agent开发的效率。例如,在人工智能领域,智能体可以通过调用不同的函数或算法来实现特定的功能,这些函数或算法可以被视为智能体的工具。通过这些工具的支持,智能体能够更加灵活地应对各种复杂任务和环境变化,从而提高其解决问题的效率和准确性。在创建工具时,需要先将选定的API服务注册为一个工具,然后再添加该服务下的API作为工具的执行动作。 ModelArts Versatile--AI原生应用引擎 MCP资产与工具的竞争力优势 · MCP资产 技术亮点01 ModelArts Versatile平台预置海量MCP资产,一键安装,开箱即用无码化开发,无需额外部署,预置MCP资产可实现Versatile AI Agent(智能体)能力边界拓展延伸。 02 兼容主流的三方插件及MCP接入标准,无缝集成MCP通过统一协议替代传统"MXN"式开发模式,使AI应用可通过单一接口访问文件、数据库、API、第三方工具等异构资源,降低开发复杂度300%以上。同时具备动态兼容性:当新增工具时,只需将其注册到MCP Server,所有接入MCP的LLM均可立即调用,无需重新训练或调整模型。 03 基于MoA架构和MCP协议,实现生态扩展及Multi Agent架构服务提供商按照MCP协议发布服务,一次发布。模型提供商按照MCP协议集成服务,一次集成。 相关特性ModelArts Versatile资产中心提供多种MCP资源,用户通过简单安装即可快速集成调用;平台支持灵活拓展,兼容开源社区MCP及自主开发MCP服务的接入。 · 工具 技术亮点01 预置60+常用工具资产Tools,让Agent天生具备强大问题解决能力,开箱即用ModelArts Versatile平台在资产中心预置了丰富的工具,拓展能力边界,突破模型固有局限,连接真实世界需求,提供广泛能力,并实现复杂任务自动化。 02 自定义插件工具,极大丰富智能体功能生态Versatile平台提供插件定制化体验、帮助用户构建专属工具、从广场选择他人插件/智能添加。同时也支持用户创建、上架、编辑、导入更新等工具管理方式,精准满足特定业务场景的需求。 03 灵活配置调用工具,保障Agent行动效率Agent支持工具识别、检索、调用;支持手动选择工具,支持工具搜索;支持根据基础信息自动选择工具; 相关特性资产库-预置工具:ModelArts Versatile资产中心展示了平台预置的第三方工具,这些工具可在创建Agent时便捷调用,同时可对60+工具可设置鉴权、收藏。创建工具:将选定的API服务注册为一个工具;添加API服务下的具体接口作为工具的执行动作。导入工具:平台支持通过导入OpenAPI规范文件(.json格式)自动解析并生成工具配置,从而提升工具创建效率。 · Versatile MCP资产与工具的差异与协作差异-工具:是AI 可调用的功能模块集合,实现智能体能力扩展。工具暂不适配MCP协议,部分为用户本地部署仅供内部使用,补齐能力。-MCP资产:该类资产适配当下大火的技术点——MCP协议,通过标准化协议实现AI模型与外部工具、数据源的高效连接。可在平台内一键安装,快速调用。而MCP标准化促进开发者生态的可持续快速发展。 协作单Agent (自主规划模式):MCP+工具相辅相成,加速能力延伸,快速构建出千行百业的AI智能体。MCP资产是工具Tools类插件在技术迭代背景下的升级,而MCP为基于大模型的助手与代理系统提供一个通用的接口标准,可实现即刻连接海量外部工具。两者加持赋能ModelArts Versatile,面向开发者、伙伴、生态,加速推动AI原生应用领域生态繁荣,实现智能体价值闭环。 Versatile--AI原生应用引擎 MCP/工具主要解决什么问题(Agent编排中心) · MCP使 AI 能够获取实时、准确的上下文信息;让不同平台、服务之间无缝协作;MCP是 Function Calling (函数调用)和 Tools 高效运行的基础。 打破数据孤岛:传统大模型无法直接访问实时数据或本地资源,而MCP让AI“连接万物”,例如,查询天气时自动调用气象API,分析企业数据时直接连接内部数据库。降低开发成本:在MCP出现之前,每个大模型需要为每个工具单独开发接口,导致重复劳动。而通过MCP,开发者只需写一次服务端,所有兼容MCP的模型都能调用。提升安全性与互操作性:MCP内置权限控制和加密机制,比直接开放数据库更安全;同时,类似USB接口的标准化让不同厂商的工具能“即插即用”,避免生态分裂。 · 工具 能力扩展:通过集成各种工具,AI Agent可以访问外部数据源、执行特定计算或操作,从而扩展其原生能力范围。任务执行:工具使AI Agent能将抽象决策转化为具体操作,如调用API、操作数据库、生成代码等。环境交互:通过传感器接口、设备控制等工具,AI Agent能感知物理/数字环境并施加影响。工业领域的IoT监控Agent就是通过专用工具实现设备状态采集。智能增强:特定工具可以提升Agent的推理、规划能力。如LangGraph框架中的状态机工具支持复杂业务流程的编排与回溯。 总体来说,ModelArts Versatile-AI原生应用引擎拥有丰富的插件生态,包含平台预置的海量MCP资产/工具、由用户自定义配置的实用插件等,达成Agent能力边界无限拓展。开发者们通过可视化轻松编排Agent,无码化分钟级构建智能体,推动AI生产方式革新,助力千行万业实现产业升级、数字化转型迈向新高度。 点击可前往>>华为云ModelArts Versatile-AI原生应用 引擎官网
-
案例介绍本案例使用Vanna配合本地Ollama/华为mass服务,并借助开发者空间云开发环境提供的免费GaussDB数据库和HCE2.0开发环境进行本地部署,来构建一个先进的AI自然语言分析系统。 案例内容一、概述1.1 案例介绍使用Vanna配合本地Ollama/华为mass服务,并借助开发者空间云开发环境提供的免费GaussDB数据库开发环境进构建一个先进的AI自然语言分析系统。GaussDB:华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。Vanna:作为数据处理和自然语言处理(NLP)的关键组件,Vanna负责数据的预处理、清洗、转换以及NLP任务的执行,如文本分类、情感分析、实体识别等。Ollama:作为AI模型和算法的核心,Ollama提供了丰富的机器学习模型和深度学习算法,用于训练和优化自然语言处理任务。它与Vanna紧密集成,共同实现高效的数据分析和知识提取。ModelArts Studio(MaaS)平台:是华为云推出的一款大模型即服务平台,可以一站式的对业界主流开源大模型进行部署托管,同时开放大模型API服务,可以结合业界主流Agent开发框架,轻松构建AI Agent应用。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云开发环境、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 案例流程说明:在开发者空间中安装Ollama与Vanna申请华为云开发者空间的GaussDB数据库;启动vanna链接GaussDB数据库进行自然语言数据库分析。申请ModelArts Studio(MaaS)免费服务1.5 资源总览本案例预计花费0.8元。资源名称规格单价(元)时长(分钟)华为开发者空间 - 云开发环境鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE2.0免费60华为开发者空间 - 生态版GaussDB单副本集中式版 | 4 vCPUs | 16G | HCE OS 64bit (200GB)免费60弹性公网IP按流量计费 5Mbit/s0.8元/GB60二、案例准备工作2.1 配置云开发环境根据案例《开发者空间 - 云开发环境使用指导》,请查看下面链接,配置云开发环境,并通过xshell、crt等链接工具登录云开发环境。开发者空间 - 云开发环境使用指导参考如上案例链接进行配置并连接:创建本地PC和远程云开发环境的隧道链接通过xshell、crt等链接工具登录云开发环境,进行测试2.2 领取GaussDB数据库2.2.1 免费领取GaussDB在线试用版(2025年 06月 21日 - 2025年 12月 31日)。华为开发者空间-GaussDB云数据库领取与使用指导注:部署的Django项目需要对接GaussDB,因此GaussDB需要绑定EIP,参考上述指导中领取部分第(5)步因为默认vanna的postgrs驱动连接gaussdb认证方式有问题,实例创建完成后修改password_encryption_type参数为0,然后在基本信息里修改一下root密码 2.2.2 进行数据初始化领取Gaussdb实例后连接数据库点击登录 输入用户名密码进行登录 点击新建数据库,创建数据库school,兼容选择mysql点击确定 点击去school数据库,创建schema名字school,点击确认 初始化表和数据点击sql窗口,数据库选择school,schema也选择上面创建的school,拷贝表和数据脚本到窗口栏,点击执行sql样例数据: CREATE TABLE students ( student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID', name VARCHAR(50) NOT NULL COMMENT '学生姓名', age INT COMMENT '年龄', major VARCHAR(100) COMMENT '专业', email VARCHAR(100) UNIQUE COMMENT '电子邮件'); INSERT INTO students (name, age, major, email) VALUES('张三', 20, '计算机科学', 'zhangsan@example.com'),('李四', 21, '电子工程', 'lisi@example.com'),('王五', 19, '数学', 'wangwu@example.com'),('赵六', 22, '物理', 'zhaoliu@example.com'),('钱七', 20, '化学', 'qianqi@example.com'),('孙八', 21, '生物', 'sunba@example.com'),('周九', 19, '历史', 'zhoujiu@example.com'),('吴十', 22, '哲学', 'wushi@example.com'),('郑十一', 20, '艺术', 'zhengshiyi@example.com'),('王十二', 21, '音乐', 'wangshier@example.com'),('陈十三', 19, '体育', 'chenshisan@example.com'),('冯十四', 22, '英语', 'fengshisi@example.com'),('董十五', 20, '法语', 'dongshiwu@example.com'),('萧十六', 21, '德语', 'xiaoshiliu@example.com'),('曹十七', 19, '日语', 'caoshiqi@example.com'),('许十八', 22, '韩语', 'xushiba@example.com'),('蒋十九', 20, '西班牙语', 'jiangshijiu@example.com'),('沈二十', 21, '意大利语', 'shenshier@example.com'),('韩二十一', 19, '心理学', 'hanershiyi@example.com'),('杨二十二', 22, '社会学', 'yangershi@example.com'); CREATE TABLE courses ( course_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID', course_name VARCHAR(100) NOT NULL COMMENT '课程名称', credits INT COMMENT '学分', teacher_id INT COMMENT '教师ID'); INSERT INTO courses (course_name, credits, teacher_id) VALUES('数据结构', 4, 1),('微积分', 3, 2),('编程基础', 3, 3),('物理实验', 2, 4),('化学原理', 3, 5),('生物技术', 4, 6),('历史概论', 2, 7),('哲学思考', 3, 8); CREATE TABLE enrollments ( enrollment_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '选课记录ID', student_id INT NOT NULL COMMENT '学生ID', course_id INT NOT NULL COMMENT '课程ID', grade FLOAT COMMENT '成绩'); INSERT INTO enrollments (student_id, course_id, grade) VALUES(1, 1, 85.5),(2, 2, 90.0),(3, 3, 78.5),(4, 4, 82.0),(5, 5, 88.5),(6, 6, 75.0),(7, 7, 80.5),(8, 8, 87.0),(9, 1, 81.0),(10, 2, 85.5),(11, 3, 79.0),(12, 4, 83.0),(13, 5, 86.5),(14, 6, 77.0),(15, 7, 82.5),(16, 8, 88.0),(17, 1, 84.0),(18, 2, 87.5),(19, 3, 80.0),(20, 4, 85.0),(21, 5, 83.5),(22, 6, 78.0),(23, 7, 81.5),(24, 8, 86.0),(25, 1, 82.0),(26, 2, 84.5),(27, 3, 79.5),(28, 4, 83.0),(29, 5, 86.5),(30, 6, 77.5); 2.3 验证云开发环境与GaussDB互通通过xshell或windows命令终端登录云开发环境,测试GaussDB能否连接,如下是通的 如不通去修改安全组的入方向规则,增加需要的端口如图(默认应该没通的)三、 安装Ollama首先我们要先配置pycharm远程开发环境可参考如下用例基于华为开发者空间-云开发环境,PyCharm SSH远程开发环境搭建:cid:link_2后续所有操作都基于pycharm的远程命令行进行操作 3.1 安装OllamaOllama 是一个强大的开源工具,旨在帮助用户轻松地在本地运行、部署和管理大型语言模型(LLMs)。它提供了一个简单的命令行界面,使用户能够快速下载、运行和与各种预训练的语言模型进行交互执行安装命令如下:方式一(推荐,安装速度快):curl -fsSL https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0035/install.sh | sudo bash 3.2 模型部署接下来可以借助 Ollama 工具来部署 Deepseek 大模型,部署 deepseek-r1:1.5b 版本,因为资源有限我们部署一个小一点的模型,执行命令:ollama pull deepseek-r1:1.5b 部署的时间长短依赖于网络的情况,部署完成后,我们就可以与 Deepseek 大模型进行对话了:ollama run deepseek-r1:1.5b 四、 安装配置Vanna4.1 更新python配置虚拟环境vanna使用python 安装建议3.10以上,开发者空间中的python版本为3.9.9,需要先升级python4.1.1 安装所需包sudo yum groupinstall "Development Tools" -ysudo yum install openssl-devel -ysudo yum install gcc -y sudo yum install gcc-c++ -y sudo yum install bzip2-devel -y sudo yum install libffi-devel -y sudo yum install zlib-devel -y sudo yum install wget -y sudo yum install make -y sudo yum install glibc-devel -y sudo yum install libgcc -y sudo yum install tar -y sudo yum install bzip2 -y sudo yum install zlib -y sudo yum install xz -y sudo yum install readline-devel -y sudo yum install sqlite-devel -y sudo yum install sqlite-libs -y 4.1.2 升级pythonsudo wget https://mirrors.huaweicloud.com/python/3.10.14/Python-3.10.14.tgzsudo tar xzf Python-3.10.14.tgzcd Python-3.10.14OPENSSL_PREFIX=/usrsudo ./configure --enable-optimizations --with-ensurepip=install \ --with-openssl=$OPENSSL_PREFIXsudo make -j$(nproc)sudo make altinstallpython3.10 -m sslpython3.10 --version4.1.3 配置python虚拟环境因为业务场景的Python开发,多数都是构建一个大型应用程序,并且不希望各种组件的各种版本之间相互冲突,所以需要设置一个虚拟环境。先需要更新下载源。执行如下命令sudo yum -y updatesudo yum -y upgradepip3 install virtualenv -i cid:link_8 #安装virtualenvpython3.10 -m venv myenv #创建虚拟环境source myenv/bin/activate #激活环境 4.2 python下安装Vannapython 安装建议3.10以上安装前更新下pip,然后执行安装python3.10 -m pip install --upgrade pip -i cid:link_8pip3 install 'vanna[chromadb,ollama,postgres]' -i cid:link_8 4.3 Vanna官网生成示例代码Vanna是一款基于开源Python框架的SQL生成工具,可以用日常用语提问,Vanna自动将其转换为SQL语句,简化数据库查询过程。生成实例代码官网:https://vanna.ai/文档:https://vanna.ai/docs/Vanna的例子,链接如下,按照如下图选择生成示例代码:https://vanna.ai/docs/postgres-ollama-chromadb/依次选择Ollama-ChromaDB-postgres 会生成示例代码, 选择使用的模型商选择使用向量数据库的类型 选择要连接的数据库 样例代码:from vanna.ollama import Ollamafrom vanna.chromadb import ChromaDB_VectorStoreclass MyVanna(ChromaDB_VectorStore, Ollama): def __init__(self, config=None): ChromaDB_VectorStore.__init__(self, config=config) Ollama.__init__(self, config=config)vn = MyVanna(config={'model': 'deepseek-r1:1.5b', 'ollama_host': 'http://localhost:11434'})vn.connect_to_postgres(host='xxxxxxx', dbname='school', user='xxxx', password='xxxx', port='8000')vn.train(ddl="""CREATE TABLE school.students ( student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID', name VARCHAR(50) NOT NULL COMMENT '学生姓名', age INT COMMENT '年龄', major VARCHAR(100) COMMENT '专业', email VARCHAR(100) UNIQUE COMMENT '电子邮件');CREATE TABLE school.courses ( course_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID', course_name VARCHAR(100) NOT NULL COMMENT '课程名称', credits INT COMMENT '学分', teacher_id INT COMMENT '教师ID');CREATE TABLE school.enrollments ( enrollment_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '选课记录ID', student_id INT NOT NULL COMMENT '学生ID', course_id INT NOT NULL COMMENT '课程ID', grade FLOAT COMMENT '成绩');""")from vanna.flask import VannaFlaskAppVannaFlaskApp(vn, allow_llm_to_see_data=True).run() 五、 启动应用并使用4.1 代码配置打开pycham把样例代码粘贴进main.py,并修改模型和数据库配置vn = MyVanna(config={'model': 'deepseek-r1:1.5b', 'ollama_host': 'http://localhost:11434'})vn.connect_to_postgres(host='xxxx', dbname='school', user='xxxx', password='xxxx', port='8000')上传代码到远程开发环境 5.2 启动应用进入自己配置的ssh远程目录启动应用nohup python3.10 main.py & 查看输出日志,日志最后有系统的登录地址tail nohup.out 创建应用启动的对应端口(8084)的隧道协议,可参考开发者空间 - 云开发环境使用指导-第4章2小节hdspace devenv start-tunnel --instance-id=0edfc31f922c4b54b74ba8819 --remote-port=8084 --local-port=8084 5.3 使用自然语言分析数据库在浏览器输入http://127.0.0.1:8084,进行登录,第一次比较慢等待一下 然后我们可以用自然语言操作数据库了,因为已开发环境内存有限,deepseek-r1:1.5b回答的不太好,如果资源充足可以换别的模型,生成的sql问题可以点击修复;使用自然语言提问:每门课程的做高分是多少 sql结果会自动生成表格和图表 六、 使用华为maas部署使用ollama本地模型比较安全但相对复杂,我们还可以使用华为ModelArts Studio(MaaS)服务来作为系统的智能模型6.1 申请ModelArts免费服务参考下面的步骤,免费体验ModelArts Studio(MaaS)预置服务cid:link_5按下面的步骤获取相关信息:区域切换到“西南-贵阳一”,依次点击:ModelArts Studio->模型推理->在线推理->预置服务->免费服务->领取 领取后点击->调用说明->OpenAI SDKAPI Key管理-> 创建API Key把api key,api地址,model参数保留好备用 6.2 生成vanna代码整体可参考<<四、安装配置vanna>>https://vanna.ai/docs/postgres-ollama-chromadb/依次选择OpenAI-ChromaDB-postgres 成示例代码 生成的示例代码6.3 安装python包注意: 要重新安装使用的包与ollama部署时的不一样pip3 install 'vanna[chromadb,openai,postgres]' -i cid:link_8pip3 install openai #安装openai本地客户端 6.4 修改代码并运行整体可参考步骤<<五、启动应用并使用>>在6.2生成的模板代码下我们进行修改,添加进去华为maas的参数及OpanAI客户端的代码运行前修改如下模型和数据库配置my_llm_api_key = 'key' #上面步骤我们创建的apikeymy_llm_base_url = 'https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/271c9332-4aa6-4ff5-95b3-0cf8bd94c394/v1' # 上面步骤调用说明里的apiurlmy_llm_name = 'DeepSeek-V3' #上面步骤的modelnamevn.connect_to_postgres(host='xxx', dbname='school', user='root', password='xxx', port='8000')代码:from vanna.ollama import Ollamafrom vanna.chromadb import ChromaDB_VectorStorefrom vanna.openai import OpenAI_Chatfrom openai import OpenAImy_llm_api_key = 'key' #上面步骤我们创建的apikeymy_llm_base_url = 'https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/271c9332-4aa6-4ff5-95b3-0cf8bd94c394/v1' # 上面步骤调用说明里的apiurlmy_llm_name = 'DeepSeek-V3' #上面步骤的modelnameclient = OpenAI( api_key=my_llm_api_key, base_url=my_llm_base_url)class MyVanna(ChromaDB_VectorStore, OpenAI_Chat): def __init__(self, client=None, config=None): ChromaDB_VectorStore.__init__(self, config=config) OpenAI_Chat.__init__(self, client=client, config=config)vn = MyVanna(client=client, config={"model": my_llm_name})vn.connect_to_postgres(host='xxx', dbname='school', user='root', password='xxx', port='8000')vn.train(ddl="""CREATE TABLE school.students ( student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID', name VARCHAR(50) NOT NULL COMMENT '学生姓名', age INT COMMENT '年龄', major VARCHAR(100) COMMENT '专业', email VARCHAR(100) UNIQUE COMMENT '电子邮件');CREATE TABLE school.courses ( course_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID', course_name VARCHAR(100) NOT NULL COMMENT '课程名称', credits INT COMMENT '学分', teacher_id INT COMMENT '教师ID');CREATE TABLE school.enrollments ( enrollment_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '选课记录ID', student_id INT NOT NULL COMMENT '学生ID', course_id INT NOT NULL COMMENT '课程ID', grade FLOAT COMMENT '成绩');""")from vanna.flask import VannaFlaskAppVannaFlaskApp(vn, allow_llm_to_see_data=True).run() 上传代码并运行整体可参考步骤<<五、启动应用并使用>>nohup python3.10 main.py & 在浏览器输入http://127.0.0.1:8084,进行登录使用,我们可以看到使用准确的模型一次就回答对了,如果生产部署选对模型很重要 至此本案例关于在开发者空间–远程开发环境中使用Vanna配合ollama/maas基于GaussDB的自然语言分析系统实践操作完毕。 我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 cid:link_7
-
体验华为开发者空间案例:基于开发者空间开发平台工作流构建旅行行程规划应用,反馈改进建议,请直接在评论区反馈即可。体验指导:cid:link_0
-
1 YOLO介绍YOLO(You Only Look Once)是一种流行的实时目标检测算法,以其高速和高精度著称。与传统的目标检测方法(如R-CNN系列)不同,YOLO将目标检测任务视为单一的回归问题,直接从图像像素中预测边界框和类别概率,实现了“端到端”的检测。 YOLO将输入图像划分为 S×S 的网格(例如7×7),每个网格负责预测多个边界框(Bounding Box)及其置信度(Confidence Score)和类别概率。边界框:包含框的中心坐标、宽高。置信度:反映框内是否存在目标以及预测的准确性。类别概率:使用Softmax预测框内物体的类别。 传统方法(如滑动窗口)需要多次扫描图像,而YOLO仅需“看一次”(You Only Look Once),通过卷积神经网络一次性输出所有检测结果,因此速度极快。 在昇腾(Ascend)平台上运行YOLO(You Only Look Once)目标检测算法具有重要的技术意义和商业价值,尤其在AI加速计算领域。昇腾是华为推出的高性能AI处理器(如Ascend 910/310),结合昇腾AI软件栈(CANN、MindSpore等),能够显著提升YOLO的推理和训练效率。以下是其核心意义:1. 高性能加速,满足实时性需求;2. 边缘到云的灵活部署;3. 软硬件协同优化。 2 系统环境安装 昇腾平台运行YOLO需要安装这些工具:1. Ascend-cann-toolkit_8.0.RC3_linux-aarch64,2. Ascend-cann-kernels-910b_8.0.RC3_linux-aarch64,3. mindspore=2.5.0,4. python=3.9, python3.9的环境的安装命令如下,python的版本号为3.10或者3.11会报错:conda create -n yolo20250705python3d9d8 python=3.9conda activate yolo20250705python3d9d8 下载CANN8.0相关工具的网址:https://www.hiascend.com/developer/download/community/result?module=cann&cann=8.0.RC3.beta1;将下载得到的工具包传至服务器,然后安装;使用CANN=8.1或者8.2运行YOLO有可能会报错;安装CANN的命令如下:/tmp/Ascend-cann-toolkit_8.0.RC3_linux-aarch64.run --install/tmp/Ascend-cann-kernels-910b_8.0.RC3_linux-aarch64.run --devel 下载MindSpore的网址:cid:link_0;安装MindSpore的命令如下:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.5.0/MindSpore/unified/aarch64/mindspore-2.5.0-cp39-cp39-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple 代码目录:/apply/yolo20250811/ 进入代码目录:cd /apply/yolo20250811安装环境包资源:pip install -r requirements.txt系统需要安装mesa-libGL工具包,不安装有时会报错:sudo yum install mesa-libGLpython环境需要安装这些工具包,不安装有时会报错;albumentations的版本号>=2.0会报错:pip install sympypip install tepip install albumentations==1.4.24 3 昇腾平台的YOLO的训练与推理训练命令;没有“--ms_mode 1”会报错:python train.py --epochs 600 --config ./configs/yolov11/yolov11-n.yaml --data_dir ./cache/data/coco --keep_checkpoint_max 1 --auto_accumulate True --per_batch_size 25 --weight ./cache/pretrain_ckpt/yolov11n.ckpt --ms_mode 1 推理命令:python ./demo/predict.py --config ./configs/yolov11/yolov11-n.yaml --weight ./cache/pretrain_ckpt/yolov11n.ckpt --image_path ./cache/data/coco/images/val2017/000000550691.jpg yolo训练日志: (yolo20250705python3d9d8) [root@bms-jp ascendyolo_run_for_v811_20250417a1]# python train.py --epochs 600 --config ./configs/yolov11/yolov11-n.yaml --data_dir ./cache/data/coco --keep_checkpoint_max 1 --auto_accumulate True --per_batch_size 25 --weight ./cache/pretrain_ckpt/yolov11n.ckpt --ms_mode 1/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero. setattr(self, word, getattr(machar, word).flat[0])/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero. return self._float_to_str(self.smallest_subnormal)/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero. setattr(self, word, getattr(machar, word).flat[0])/root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero. return self._float_to_str(self.smallest_subnormal)2025-07-05 22:45:27,447 [INFO] parse_args:2025-07-05 22:45:27,447 [INFO] task detect2025-07-05 22:45:27,447 [INFO] device_target Ascend2025-07-05 22:45:27,447 [INFO] save_dir ./runs/2025.07.05-22.45.272025-07-05 22:45:27,447 [INFO] log_level INFO2025-07-05 22:45:27,447 [INFO] is_parallel False2025-07-05 22:45:27,447 [INFO] ms_mode 12025-07-05 22:45:27,447 [INFO] max_call_depth 20002025-07-05 22:45:27,447 [INFO] ms_amp_level O22025-07-05 22:45:27,447 [INFO] keep_loss_fp32 True2025-07-05 22:45:27,447 [INFO] anchor_base False2025-07-05 22:45:27,447 [INFO] ms_loss_scaler dynamic2025-07-05 22:45:27,447 [INFO] ms_loss_scaler_value 65536.02025-07-05 22:45:27,447 [INFO] ms_jit True2025-07-05 22:45:27,447 [INFO] ms_enable_graph_kernel False2025-07-05 22:45:27,447 [INFO] ms_datasink False2025-07-05 22:45:27,447 [INFO] overflow_still_update False2025-07-05 22:45:27,447 [INFO] clip_grad True2025-07-05 22:45:27,447 [INFO] clip_grad_value 10.02025-07-05 22:45:27,447 [INFO] ema True2025-07-05 22:45:27,447 [INFO] weight ./cache/pretrain_ckpt/yolov11n.ckpt2025-07-05 22:45:27,447 [INFO] ema_weight 2025-07-05 22:45:27,447 [INFO] freeze []2025-07-05 22:45:27,447 [INFO] epochs 6002025-07-05 22:45:27,447 [INFO] per_batch_size 252025-07-05 22:45:27,447 [INFO] img_size 6402025-07-05 22:45:27,447 [INFO] nbs 642025-07-05 22:45:27,447 [INFO] accumulate 3.02025-07-05 22:45:27,447 [INFO] auto_accumulate True2025-07-05 22:45:27,447 [INFO] log_interval 1002025-07-05 22:45:27,447 [INFO] single_cls False2025-07-05 22:45:27,447 [INFO] sync_bn False2025-07-05 22:45:27,447 [INFO] keep_checkpoint_max 12025-07-05 22:45:27,447 [INFO] run_eval False2025-07-05 22:45:27,447 [INFO] conf_thres 0.0012025-07-05 22:45:27,447 [INFO] iou_thres 0.72025-07-05 22:45:27,447 [INFO] conf_free True2025-07-05 22:45:27,447 [INFO] rect False2025-07-05 22:45:27,447 [INFO] nms_time_limit 20.02025-07-05 22:45:27,447 [INFO] recompute False2025-07-05 22:45:27,447 [INFO] recompute_layers 02025-07-05 22:45:27,447 [INFO] seed 22025-07-05 22:45:27,447 [INFO] summary True2025-07-05 22:45:27,447 [INFO] profiler False2025-07-05 22:45:27,447 [INFO] profiler_step_num 12025-07-05 22:45:27,447 [INFO] opencv_threads_num 02025-07-05 22:45:27,447 [INFO] strict_load True2025-07-05 22:45:27,447 [INFO] enable_modelarts False2025-07-05 22:45:27,447 [INFO] data_url 2025-07-05 22:45:27,447 [INFO] ckpt_url 2025-07-05 22:45:27,447 [INFO] multi_data_url 2025-07-05 22:45:27,447 [INFO] pretrain_url 2025-07-05 22:45:27,447 [INFO] train_url 2025-07-05 22:45:27,447 [INFO] data_dir ./cache/data/coco2025-07-05 22:45:27,447 [INFO] ckpt_dir /cache/pretrain_ckpt/2025-07-05 22:45:27,447 [INFO] data.dataset_name coco2025-07-05 22:45:27,447 [INFO] data.train_set /apply/yolo20250811/cache/data/coco/train2017.txt2025-07-05 22:45:27,447 [INFO] data.val_set /apply/yolo20250811/cache/data/coco/val2017.txt2025-07-05 22:45:27,447 [INFO] data.test_set /apply/yolo20250811/cache/data/coco/test-dev2017.txt2025-07-05 22:45:27,447 [INFO] data.nc 802025-07-05 22:45:27,447 [INFO] data.names ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']2025-07-05 22:45:27,447 [INFO] train_transforms.stage_epochs [590, 10]2025-07-05 22:45:27,447 [INFO] train_transforms.trans_list [[{'func_name': 'mosaic', 'prob': 1.0}, {'func_name': 'copy_paste', 'prob': 0.1, 'sorted': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}], [{'func_name': 'letterbox', 'scaleup': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]]2025-07-05 22:45:27,447 [INFO] data.test_transforms [{'func_name': 'letterbox', 'scaleup': False, 'only_image': True}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。[INFO] albumentations load success[WARNING] ME(50295:281473090502688,MainProcess):2025-07-05-22:46:03.231.109 [mindspore/run_check/_check_version.py:305] The version 7.6 used for compiling the custom operator does not match Ascend AI software package version 7.5 in the current environment......2025-07-05 22:47:15,474 [WARNING] Epoch 1/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 32768.02025-07-05 22:47:15,809 [WARNING] Epoch 1/600, Step 2/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 16384.02025-07-05 22:47:16,184 [INFO] Epoch 1/600, Step 2/2, imgsize (640, 640), loss: 3.5250, lbox: 1.0629, lcls: 1.3194, dfl: 1.1426, cur_lr: 1.9966999388998374e-052025-07-05 22:47:17,505 [INFO] Epoch 1/600, Step 2/2, step time: 49088.29 ms2025-07-05 22:47:18,444 [INFO] Saving model to ./runs/2025.07.05-22.45.27/weights/yolov11-n-1_2.ckpt2025-07-05 22:47:18,444 [INFO] Epoch 1/600, epoch time: 1.65 min.2025-07-05 22:47:18,710 [WARNING] Epoch 2/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 8192.02025-07-05 22:47:19,024 [INFO] Epoch 2/600, Step 2/2, imgsize (640, 640), loss: 3.6963, lbox: 1.0847, lcls: 1.4422, dfl: 1.1694, cur_lr: 3.986799856647849e-052025-07-05 22:47:19,037 [INFO] Epoch 2/600, Step 2/2, step time: 296.27 ms2025-07-05 22:47:19,945 [INFO] Saving model to ./runs/2025.07.05-22.45.27/weights/yolov11-n-2_2.ckpt2025-07-05 22:47:19,946 [INFO] Epoch 2/600, epoch time: 0.03 min.2025-07-05 22:47:20,223 [WARNING] Epoch 3/600, Step 1/2, accumulate: 3.0, this step grad overflow, drop. Loss scale adjust to 4096.0 yolo推理日志: (yolo20250705python3d9d8) [root@bms-jp ascendyolo_run_for_v811_20250417a1]# python ./demo/predict.py --config ./configs/yolov11/yolov11-n.yaml --weight ./cache/pretrain_ckpt/yolov11n.ckpt --image_path ./cache/data/coco/images/val2017/000000550691.jpg /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for type is zero. setattr(self, word, getattr(machar, word).flat[0]) /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for type is zero. return self._float_to_str(self.smallest_subnormal) /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:549: UserWarning: The value of the smallest subnormal for type is zero. setattr(self, word, getattr(machar, word).flat[0]) /root/miniconda3/envs/yolo20250705python3d9d8/lib/python3.9/site-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for type is zero. return self._float_to_str(self.smallest_subnormal) 2025-07-05 22:50:19,157 [WARNING] Parse Model, args: nearest, keep str type 2025-07-05 22:50:19,204 [WARNING] Parse Model, args: nearest, keep str type 2025-07-05 22:50:19,584 [INFO] number of network params, total: 2.639747M, trainable: 2.624064M [WARNING] ME(66771:281473260486688,MainProcess):2025-07-05-22:50:26.245.7 [mindspore/train/serialization.py:1956] For 'load_param_into_net', remove parameter prefix name: ema., continue to load. 2025-07-05 22:50:26,023 [INFO] Load checkpoint from [./cache/pretrain_ckpt/yolov11n.ckpt] success. .Warning: tiling offset out of range, index: 32 .Warning: tiling offset out of range, index: 32 .Warning: tiling offset out of range, index: 32 Warning: tiling offset out of range, index: 32 Warning: tiling offset out of range, index: 32 Warning: tiling offset out of range, index: 32 ..2025-07-05 22:51:27,507 [INFO] Predict result is: {'category_id': [6, 3, 3, 6, 6], 'bbox': [[194.125, 54.75, 243.875, 354.25], [115.25, 286.5, 82.25, 68.0], [442.0, 283.0, 24.0, 20.0], [3.25, 215.25, 160.75, 64.0], [3.875, 215.5, 159.875, 96.5]], 'score': [0.93115, 0.90283, 0.70898, 0.58154, 0.45508]} 2025-07-05 22:51:27,507 [INFO] Speed: 61360.0/11.5/61371.5 ms inference/NMS/total per 640x640 image at batch-size 1; 2025-07-05 22:51:27,507 [INFO] Detect a image success. 2025-07-05 22:51:27,516 [INFO] Infer completed. 4 总结 在昇腾(Ascend)平台上成功运行YOLO模型的训练和推理,通过CANN软件栈和MindSpore框架的深度适配,实现了高效的算子优化及硬件加速(如昇腾910B/310)。关键技术包括动态分片、混合精度训练和DVPP硬件预处理,显著提升了目标检测的推理性能。昇腾NPU在CV任务中的具有强大的竞争力。昇腾显卡在边缘计算、智能安防等场景的AI部署具有重要的产业意义。
-
华为云ModelArts Versatile训练营基础实验之AI原生应用开发—零基础秒变大师!快速开发帮你打造爆款AI Agent:出行规划助手 一 基本信息实验类型实验难度:简单实验时长:30分钟实验类型:实操型实验简介本次实验将指导开发者通过零码快速构建复杂任务规划专家AI Agent“出行规划助手”,并在应用生成后体验试用,体验快速创建AI原生应用,轻松完成行业场景的乐趣实验目标完成出行Agent的从0创建自定义出行Agent描述,技能等与出行Agent交互,助手回答用户相关提问实验任务3.配置MCP服务信息4.创建并配置Agent信息2.创建MCP服务1.登录Versatile6.根据Agent返回确认结果5.点击开始体验登录Versatile界面点击创建MCP服务,进入MCP服务创建界面配置MCP服务信息创建并配置Agent信息点击开始体验,并在对话框中输入和出行Agent交互的内容根据Agent返回确认结果:根据出行Agent的返回内容,确认是否完成了用户的指令学前建议1. 了解相关技能2. 了解MCP服务3. 了解Agent知识二 实验实操步骤一:进入Versatile首页,左边菜单栏选择“我的MCP”点击创建MCP服务步骤二:配置MCP服务信息,部署12306和高德MCP服务1. 选择12306-MCP服务模板后点击下一步2. 点击安装MCP点击安装后,等待MCP服务安装完成,显示安装中。3. 选择高德地图MCP模板后点击下一步4. 配置高德api-key后点击安装MCP请填写api-key:API Key创建方式请见:cid:link_05. 等待MCP安装完成步骤三:创建并配置Agent信息1. 左边菜单栏选择“我的Agent”点击创建Agent。2. 选择单Agent(复杂任务规划),配置Agent信息并添加前面部署的MCP服务,点击发布。经验模板填写:# 工具使用你可以使用12306相关mcp工具查询火车票相关信息。你可以使用高德相关mcp工具查询导航相关信息。3. 填写api-key,点击发布。请填写api-key:API Key创建方式请见:cid:link_0步骤四:旅游出行助手交互体验1. 在agent列表中,选择“旅游出行助手”体验2. 在对话框中输入:6月23日中午坐高铁从深圳到上海,请规划详细的行程路线规划,我早上从深圳华为基地出发,坐地铁到高铁站。最终用网页为我呈现,并等待Agent返回:生成计划后,点击开始任务,也可以进一步修改任务:最终生成网页进行浏览:3. 完成后,可自由提问相关问题。
-
华为云ModelArts Versatile训练营基础实验之AI原生应用开发—零基础秒变大师!快速开发帮你打造爆款AI Agent:热点新闻助手 一 基本信息实验类型实验难度:简单实验时长:30分钟实验类型:实操型实验简介本次实验将指导开发者通过零码快速构建复杂任务规划专家AI Agent“热点新闻助手”,并在应用生成后体验试用,体验快速创建AI原生应用,轻松完成行业场景的乐趣实验目标完成出行Agent的从0创建自定义出行Agent描述,技能等与出行Agent交互,助手回答用户相关提问实验任务3.配置MCP服务信息4.创建并配置Agent信息2.创建MCP服务1.登录Versatile6.根据Agent返回确认结果5.点击开始体验登录Versatile界面点击创建MCP服务,进入MCP服务创建界面配置MCP服务信息创建并配置Agent信息点击开始体验,并在对话框中输入和出行Agent交互的内容根据Agent返回确认结果:根据出行Agent的返回内容,确认是否完成了用户的指令学前建议1. 了解相关技能2. 了解MCP服务3. 了解Agent知识二 实验实操步骤一:进入Versatile首页,左边菜单栏选择“我的MCP”点击创建MCP服务步骤二:配置MCP服务信息,部署中文趋势聚合服务1. 选择“中文趋势聚合”服务模板后点击下一步2. 点击安装MCP3. 点击安装后,等待MCP服务安装完成,显示安装中步骤三:创建并配置Agent信息1. 左边菜单栏选择“我的Agent”点击创建Agent。2. 选择单Agent(复杂任务规划),配置Agent信息并添加前面部署的MCP服务,点击发布。经验模板填写:# 工具使用- get-36kr-trending获取 36 氪热榜,提供创业、商业、科技领域的热门资讯,包含投融资动态、新兴产业分析和商业模式创新信息- get-bilibili-rank获取哔哩哔哩视频排行榜,包含全站、动画、音乐、游戏等多个分区的热门视频,反映当下年轻人的内容消费趋势- get-douban-rank获取豆瓣实时热门榜单,提供当前热门的图书、电影、电视剧、综艺等作品信息,包含评分和热度数据- get-douyin-trending获取抖音热搜榜单,展示当下最热门的社会话题、娱乐事件、网络热点和流行趋势- get-ifanr-news获取爱范儿科技快讯,包含最新的科技产品、数码设备、互联网动态等前沿科技资讯- get-netease-news-trending获取网易新闻热点榜,包含时政要闻、社会事件、财经资讯、科技动态及娱乐体育的全方位中文新闻资讯- get-tencent-news-trending获取腾讯新闻热点榜,包含国内外时事、社会热点、财经资讯、娱乐动态及体育赛事的综合性中文新闻资讯- get-toutiao-trending获取今日头条热榜,包含时政要闻、社会事件、国际新闻、科技发展及娱乐八卦等多领域的热门中文资讯3. 填写api-key,点击发布。请填写api-key:API Key创建方式请见:cid:link_0步骤四:热点新闻助手交互体验1. 在agent列表中,选择“热点新闻助手”体验2. 在对话框中输入:最近有哪些热点新闻、热门电影和即将上映的热门电影,请详细列举下,并用图文并茂的网页为我呈现,并等待Agent返回:生成计划后,点击开始任务,也可以进一步修改任务:最终生成网页进行浏览:3. 完成后,可自由提问相关问题。
开天aPaaS小助手Tracy
发表于2025-08-12 21:03:02
2025-08-12 21:03:02
最后回复
开天aPaaS小助手Tracy
2025-08-12 21:03:02
44 0 -
在 Kubernetes (K8s) 中,ServiceAccount 是一种特殊类型的 账户对象,用于为 Pod 中的容器提供身份标识。它的核心作用是为 Pod 内的进程(如应用程序)授予对集群内资源的访问权限。以下是详细说明及查看方法:一、什么是 ServiceAccount?核心功能:身份标识每个 ServiceAccount 都有一个唯一的名称和一个关联的加密签名密钥对(存放在 Secret 中),用于证明请求来自该账户。权限控制通过与 Role/ClusterRole + RoleBinding/ClusterRoleBinding 的组合,定义此账户能执行的操作(如读写 ConfigMap、调用外部 API 等)。自动挂载凭证当 Pod 使用了某个 ServiceAccount,Kubernetes 会自动将其凭证(包含 CA证书、命名空间、Token)注入到 Pod 的特定挂载点:/var/run/secrets/kubernetes.io/serviceaccount/包括三个文件:ca.crt, namespace, token。关键特点:特性 说明作用域 可作用于单个命名空间(默认)或整个集群(需配合 ClusterRole)默认行为 新创建的 Pod 若未显式指定 SA,则使用命名空间下的 default SA安全性 推荐遵循最小权限原则,仅授予必要权限二、如何查看 ServiceAccount 对象?以下是常用查看方式及命令示例:查看当前命名空间的所有 ServiceAccount# 查看当前命名空间的所有 SA(含简要信息)kubectl get serviceaccounts# 显示完整详细信息(JSON/YAML格式)kubectl get serviceaccounts -o wide # 表格+额外字段kubectl get serviceaccounts -o json # JSON格式kubectl get serviceaccounts -o yaml # YAML格式查看指定命名空间的 ServiceAccount# 查看名为 "my-namespace" 命名空间下的所有 SAkubectl get serviceaccounts --namespace=my-namespace# 查看特定 SA 的详细信息(如名为 "my-sa")kubectl describe serviceaccount my-sa --namespace=my-namespace跨命名空间搜索 ServiceAccount# 查看所有命名空间下的 SA 列表kubectl get serviceaccounts --all-namespaces1.2.导出 ServiceAccount 的配置为文件# 将名为 "my-sa" 的 SA 配置导出为 YAML 文件kubectl get serviceaccount my-sa -n my-namespace -o yaml > my-sa.yaml三、典型使用场景示例假设你有一个名为 app-pod 的 Pod,它使用了自定义的 app-sa ServiceAccount,并绑定了一个允许读取 ConfigMap 的角色:# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: app-deploymentspec: replicas: 1 template: metadata: {} spec: serviceAccountName: app-sa # 指定使用的 ServiceAccount containers: - name: app-container image: my-image此时,app-sa 就是该 Pod 的身份标识,其权限由对应的 RoleBinding 决定。四、注意事项不要混淆 IAM 账号Kubernetes 的 ServiceAccount ≠ 云厂商的 IAM 账号,它是集群内部的虚拟身份。避免裸奔权限默认的 default SA 通常没有绑定任何角色,但如果你手动绑定了高权限角色(如 edit),可能导致安全风险。多租户环境隔离在共享集群中,建议为不同团队/应用创建独立的 ServiceAccount 并严格限制权限。五、相关概念扩展对象类型 描述Role / ClusterRole 定义一组权限规则RoleBinding / ClusterRoleBinding 将角色绑定到 ServiceAccountPod 使用 ServiceAccount 的主体Secret 存储 ServiceAccount 的私钥和令牌总结ServiceAccount 是 Pod 的身份卡,用于控制容器对集群资源的访问。查看命令:kubectl get serviceaccounts(基础)、kubectl describe serviceaccount <name>(详情)。最佳实践:为每个应用创建专用 SA,并按需绑定最小权限角色。
-
**Raft协议**是一种专为分布式系统设计的共识算法,旨在解决多个节点之间的数据一致性问题。以下是对Raft协议的介绍以及核心内容的详细说明:### Raft协议概述1. **目标定位**:作为一种替代传统Paxos协议的新型方案诞生,侧重于提升可理解性与工程实践便利性。2. **核心理念**:采用强领导权模式,将复杂的一致性问题拆解为相互独立的子问题进行处理。3. **适用场景**:适用于构建高可用分布式存储系统、数据库集群等需强一致性的场景。### 核心角色与状态转换1. **三种节点状态** - **Leader(领导者)**:唯一有权接受客户端请求并协调日志复制的中心节点。 - **Follower(追随者)**:被动响应领导者或候选人的请求,定期接收心跳信号维持状态。 - **Candidate(候选人)**:当追随者超时未收到心跳时触发选举产生的临时角色,参与投票竞争成为新领导者。2. **状态转换逻辑** - **稳定期**:领导者持续发送心跳消息压制其他节点的选举行为。 - **选举触发**:若超过选举超时时间未收到心跳,追随者转为候选人发起投票。 - **多数决选**:获得集群多数选票的候选人晋升为领导者,开启新的任期。### 关键机制详解1. **领导者选举** - **任期机制**:每个任期用单调递增的数字标识,确保过期无效的请求不会被处理。 - **随机超时**:每个节点设置随机范围的选举超时时间,减少分裂投票概率。 - **投票规则**:节点按“先到先得”原则投票,且仅支持同一任期内的单一候选者。 - **心跳抑制**:领导者定期发送心跳消息重置追随者的选举定时器,防止不必要的选举。2. **日志复制** - **指令序列化**:客户端请求被领导者转换为日志条目,按顺序编号后同步至多数追随者。 - **提交条件**:当日志条目被复制到多数节点后,领导者提交该条目并通知所有节点执行。 - **一致性保障**:通过前缀匹配原则确保日志一致性,落后节点会丢弃冲突日志并同步最新条目。3. **安全属性** - **领导完备性**:领导者必须包含所有已提交的日志条目,保证后续操作基于完整数据。 - **日志匹配原则**:若两个日志条目索引和任期相同,则认定其内容一致。 - **只追加特性**:领导者不会修改或删除已存在的日志条目,仅做增量添加。### 技术优势1. **模块化设计**:将一致性问题分解为领导者选举、日志复制、安全性等独立模块,降低实现复杂度。2. **强领导权简化逻辑**:所有操作由领导者驱动,避免无主状态下的决策冲突。3. **容错能力**:可容忍集群内少数节点故障,只要多数节点存活即可维持服务。4. **易于调试**:清晰的日志结构和状态转换便于排查问题。总的来说,Raft协议通过结构化的领导权设计和严格的日志复制机制,在保证强一致性的同时提供了良好的可扩展性和容错能力。其模块化思想和清晰的状态转换逻辑使其成为分布式系统领域的重要基础组件。
-
k8s-node02 节点 `NotReady` 状态的详细分析和解决方案### **一、核心问题定位**从 `kubectl describe node` 输出可见,所有关键条件(MemoryPressure/DiskPressure/PIDPressure/Ready)均处于 **Unknown** 状态,且最终错误原因是 **"Kubelet stopped posting node status"**。这表明 **Kubelet 进程未能正常向 API Server 汇报节点状态**,导致节点被标记为 `NotReady`。### **二、分步解决方案**#### **1️⃣ 紧急修复:重启 Kubelet 服务**```bashsystemctl restart kubelet```**目的**:尝试恢复 Kubelet 进程与 API Server 的通信。 **注意**:若重启后仍无法恢复,需进一步排查底层原因。#### **2️⃣ 深度排查:查看 Kubelet 日志**```bashjournalctl -f -u kubelet # 实时查看日志journalctl -u kubelet --since "1 hour ago" # 查看历史日志``` **重点关注以下错误类型**:| 错误类型 | 可能原因 | 解决方案 ||||-|| `NetworkPluginNotReady` | CNI 插件(如 Calico)未就绪 | 检查 CNI 组件状态 || `Failed to connect to API Server` | 网络隔离/证书过期 | 检查网络连通性及证书 || `Disk pressure detected` | 磁盘空间不足 | 清理磁盘 || `Container runtime failed` | Docker/Containerd 异常 | 重启容器运行时 |#### **3️⃣ 检查 CNI 网络插件(Calico)**```bashkubectl get pods -n kube-system -l k8s-app=calico-node``` **若发现 Calico Pod 异常**:- 重新部署 Calico 组件: ```bash kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ```- 确保宿主机网络策略允许 Calico 流量(检查 `iptables` 规则)。#### **4️⃣ 验证容器运行时(Docker)**```bashsystemctl status docker # 检查服务状态docker info # 验证 Docker 功能```**若 Docker 异常**:- 重启 Docker 服务: ```bash systemctl restart docker ```- 检查 Docker 日志: ```bash journalctl -u docker.service ```#### **5️⃣ 检查磁盘空间**```bashdf -h # 查看全局磁盘使用率du -sh /var/lib/docker/* # 检查 Docker 目录占用``` **若磁盘空间不足**:- 清理无用镜像: ```bash docker system prune -a ```- 扩展磁盘配额或迁移数据到更大分区。#### **6️⃣ 校验 Kubelet 配置**检查 `/etc/kubernetes/kubelet.conf` 文件:- 确保 `cgroupDriver` 与集群其他节点一致(如 `systemd` 或 `cgroupfs`)。- 确认 `--container-runtime` 参数指向正确的容器运行时(如 `remote` 对应 containerd)。#### **7️⃣ 升级 Kubelet 版本**当前版本 **v1.20.15** 已过时,建议升级至最新稳定版(如 v1.28+):```bash# 示例:升级 Kubelet(需匹配控制平面版本)yum install -y kubelet-<new_version> && systemctl restart kubelet``` **注意**:升级前需备份配置文件,并确保控制平面兼容新版本。#### **8️⃣ 清理节点 Taints**当前节点存在两个危险 Taints:```bashTaints: node.kubernetes.io/unreachable:NoExecute node.kubernetes.io/unreachable:NoSchedule``` **清理命令**:```bashkubectl taint nodes k8s-node02 node.kubernetes.io/unreachable:NoExecute-kubectl taint nodes k8s-node02 node.kubernetes.io/unreachable:NoSchedule-```### **三、典型错误场景及处理**| **现象** | **可能原因** | **解决方案** ||--||-|| `NetworkPluginNotReady` | Calico 组件未启动 | 重启 Calico Pod 或重新部署 || `Failed to dial tcp ...` | API Server 网络不通 | 检查防火墙规则及节点网络配置 || `No space left on device` | 磁盘空间不足 | 清理磁盘或扩容 || `Connection refused by API Server` | API Server 未响应 | 检查控制平面健康状态 |### **四、预防措施**1. **监控告警**:部署 Prometheus + Grafana,监控节点 CPU/内存/磁盘使用率及 Kubelet 状态。2. **日志轮转**:定期清理 Kubelet 日志(`/var/log/kubelet.log`),避免磁盘占满。3. **版本管理**:保持 Kubelet 与 API Server 版本同步,避免兼容性问题。4. **CNI 高可用**:确保 Calico 等网络插件的冗余配置,避免单点故障。### **五、最终验证**执行以下命令确认节点状态:```bashkubectl get nodes k8s-node02 # 应显示 Ready 状态kubectl describe node k8s-node02 # 检查 Conditions 均为 True```若问题仍未解决,请提供以下信息进一步分析:1. `kubectl describe node k8s-node02 -o json > node.json`(导出完整 JSON)。2. `journalctl -u kubelet --since "1 hour ago"`(最近 1 小时 Kubelet 日志)。3. `docker ps` 和 `crictl ps`(容器运行时状态)。
推荐直播
-
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中 -
码道新技能,AI 新生产力——从自动视频生成到开源项目解析2026/04/08 周三 19:00-21:00
童得力-华为云开发者生态运营总监/何文强-无人机企业AI提效负责人
本次华为云码道 Skill 实战活动,聚焦两大 AI 开发场景:通过实战教学,带你打造 AI 编程自动生成视频 Skill,并实现对 GitHub 热门开源项目的智能知识抽取,手把手掌握 Skill 开发全流程,用 AI 提升研发效率与内容生产力。
回顾中
热门标签