• [案例共创] 【案例共创】基于华为云开发者空间的AI Agent [旅行灵感生成器]智能体
    基于华为云开发者空间的AI Agent [旅行灵感生成器]智能体随着全球化进程的加快和人们生活水平的提高,旅行已成为现代人放松身心、拓宽视野的重要方式。然而,尽管旅行的需求日益增长,很多人仍然在选择目的地、规划行程、设计旅行活动时面临着许多挑战。如何高效、便捷地找到适合自己兴趣与需求的旅行灵感,成为许多旅行者渴望解决的问题。传统的旅行推荐方式通常依赖于静态的旅游指南或有限的用户评价,难以提供个性化、实时且多元化的旅行建议。为了解决这一问题,基于华为云开发者空间,结合先进的AI技术,我们可以构建一个全新的智能体——旅行灵感生成器AI Agent。这一智能体将能够通过分析用户的兴趣、偏好、预算、季节等多个维度,提供量身定制的旅行灵感,助力用户规划个性化的旅行路线和活动。该智能体通过集成华为云的Flexus服务和DeepSeek大模型的强大推理能力,能够精准理解用户需求,生成创意十足的旅行建议。通过与大数据平台、社交媒体数据源、旅游网站等的深度结合,智能体可以实时更新热门景点、文化活动、独特目的地等信息,保证推荐的内容始终与用户的兴趣和全球旅游趋势保持同步。该平台不仅支持快速生成旅行灵感,还能够优化用户的旅行计划,通过分析目的地的天气、最佳出行时间以及当地的热门活动,确保用户能够享受到最佳的旅行体验。华为云开发者空间背景介绍华为云开发者空间是华为为全球开发者打造的一站式云端创新与协作平台,旨在帮助开发者更高效地开发、部署和管理各类AI应用与智能体项目。它集成了华为云强大的计算资源、大模型服务、应用托管能力,以及丰富的低代码/无代码工具,构建起从开发到部署、从测试到运维的完整生态闭环。在AI日益普及的当下,传统应用开发方式面临着复杂的模型管理、高昂的资源成本和部署流程繁琐等挑战。华为云开发者空间通过“低门槛、易集成、快部署”的理念,联合MaaS(Model as a Service)大模型服务平台与Flexus云服务体系,极大地降低了开发者使用大模型构建AI Agent(智能体)的门槛。此外,开发者空间还内嵌支持Dify、LangChain、Streamlit等多种主流AI应用开发框架,提供了灵活的工作流管理、Agent编排能力和丰富的API服务支持,助力开发者快速构建属于自己的AI应用,如智能问答助手、情绪分析助手、面试模拟官等。总的来说,华为云开发者空间不仅是一个技术平台,更是推动AI应用普及、激发开发者创造力的智能创新孵化器。借助它,开发者可以轻松将想法转化为可落地的AI产品,加速AI应用的落地与推广。AI Agent介绍AI Agent(人工智能智能体)是指具备自主感知、理解、推理和执行能力的智能程序实体。它能够基于用户输入、外部环境信息或系统状态,做出智能化的响应和决策,从而完成特定任务或持续交互。这类智能体广泛应用于对话助手、推荐系统、智能问诊、流程自动化、内容生成等场景中。核心特征目标导向性每个AI Agent围绕一个或多个特定目标构建(如智能客服、面试模拟、情绪管理等),具备明确的任务执行逻辑。上下文感知AI Agent能持续跟踪对话上下文、用户历史、环境数据等,实现个性化与情境相关的响应。语言理解与生成能力借助大语言模型(LLM),AI Agent可以高质量地理解自然语言输入并生成符合语境的回复、计划或建议。自主决策与执行部分高级AI Agent具备工具调用与任务链规划能力,可在无监督情况下自动完成较复杂的任务流程。可编排、可集成现代AI Agent通常由多个模块组成,可通过工作流引擎(如Dify、LangChain)进行灵活编排,也能嵌入到Web、App或企业系统中。技术基础大语言模型(如ChatGPT、DeepSeek等)提供强大的语言理解与生成能力,是Agent的“核心大脑”。工具调用接口(Tool Calling)支持Agent调用搜索引擎、数据库、API服务等外部工具,实现复杂任务分解。工作流引擎/框架(如Dify、LangChain)支持多Agent协作与任务编排。记忆系统与知识库提供上下文记忆、知识增强问答等能力,使Agent更加智能和精准。典型应用场景智能问答助手(如客服Bot、政务助手)个性化推荐(如智能菜谱、旅游规划)模拟对话训练(如面试官、语言学习伙伴)企业流程自动化(如审批流程助手、文档生成器)医疗/心理支持(如情绪识别、健康指导)AI Agent 正在成为AI应用的新范式。它不仅具备强大的自然语言交互能力,还融合了自主性、工具链调用能力和知识增强特性,正在改变人类与信息系统之间的交互方式。借助华为云Dify等平台,开发者可以快速搭建并定制自己的AI Agent,加速AI在各行业的落地。旅行灵感生成器AI Agent 搭建1.先进入开发者空间,点击创建Agent2.页面如下。3.基础信息一键解锁个性化旅行方案,从目的地推荐到行程规划,激发您的旅行灵感,打造专属的梦幻旅程。4.模型选择Deepseek5.角色设定角色定义: 作为旅行灵感生成器,你的核心任务是帮助用户一键解锁个性化旅行方案,从推荐目的地到详细行程规划,全面激发用户的旅行灵感,打造专属的梦幻旅程。你需要深入了解用户的偏好、旅行目的和预算,结合全球旅游资源,提供创意且实用的旅行建议,确保每位用户都能获得独一无二的旅行体验。 工具能力: 1. 用户偏好分析: 能够通过问卷或对话方式,精准捕捉用户的旅行偏好、兴趣点和预算范围。 2. 目的地推荐: 根据用户偏好,从全球范围内推荐最适合的目的地,包括热门景点和冷门秘境。 3. 行程规划: 自动生成详细的行程安排,包括交通、住宿、餐饮、景点游览等,确保行程合理且高效。 4. 实时信息更新: 提供目的地的实时天气、交通状况、当地活动等信息,帮助用户做出最佳决策。 5. 个性化建议: 根据用户的特殊需求,提供个性化的旅行建议,如亲子游、蜜月游、探险游等。 6. 预算管理: 帮助用户合理分配旅行预算,提供性价比高的选择,避免超支。 要求与限制: 1. 准确性: 提供的信息必须准确无误,包括目的地信息、行程安排、预算估算等。 2. 个性化: 每个旅行方案都必须高度个性化,贴合用户的独特需求和偏好。 3. 实时性: 及时更新目的地的最新信息,确保用户获取的是最新、最实用的建议。 4. 用户体验: 界面友好,操作简便,确保用户能够轻松使用并获取所需信息。 5. 多样性: 提供多样化的旅行方案,涵盖不同风格和类型,满足不同用户的需求。 6. 安全性: 确保推荐的行程和活动安全可靠,避免用户在旅行中遇到不必要的风险。 6.工具选择7.开场白设置您好!我是旅行灵感生成器,专为您提供个性化旅行方案。从精选目的地到定制行程,我助您激发旅行灵感,打造独一无二的梦幻旅程。告诉我您的喜好,让我们开启美好旅程吧!MCP创建点击创建服务选择Bing插件发布智能体智能体体验如何根据个人兴趣和预算选择理想的旅行目的地"选择理想的旅行目的地就像为自己定制一场专属的冒险,关键在于找到兴趣与预算的完美平衡点。让我用简单易懂的方式为你梳理:先问自己最想体验什么想躺平放松?巴厘岛的白沙滩或瑞士的温泉酒店会是不错选择热爱人文历史?西安的兵马俑或罗马的斗兽场能让你穿越时空追求刺激?新西兰皇后镇的蹦极或菲律宾的潜水值得考虑预算决定了旅行半径5千以内:国内云南/泰国清迈等性价比之选1-2万:日本/欧洲部分国家能玩得舒适无上限?迪拜帆船酒店或大溪地水上屋等你解锁小技巧让选择更轻松淡季出行能省30%-50%预算(比如春节后的三亚)多目的地旅行可优先选择相邻地区(如奥地利+匈牙利)善用比价工具关注机票折扣举个实际例子:如果你喜欢海岛但预算有限,马来西亚的兰卡威比马尔代夫节省一半费用;若钟情欧洲文化又怕贵,波兰克拉科夫比巴黎更经济实惠。需要我根据你的具体喜好(比如偏爱美食/摄影/购物等)和预算金额,帮你筛选几个精准目的地吗?"总结随着人工智能和大模型技术的持续演进,AI Agent已逐步成为提升用户体验和服务效率的重要工具。本文围绕“旅行灵感生成器”智能体的构建,系统展示了如何基于华为云开发者空间,结合Flexus云服务与DeepSeek大模型,打造一款集个性化推荐、实时信息分析与智能行程规划于一体的AI应用。通过详实的搭建流程、角色设定、功能说明以及界面引导,我们不仅实现了一个具备高可用性与可扩展性的旅行推荐助手,更展示了华为云在AI Agent构建领域的强大生态能力。该平台为开发者提供了低门槛、高效率、强兼容的开发体验,极大地加速了AI从技术到应用的落地过程。未来,随着Agent编排能力和大模型推理服务的进一步增强,旅行灵感生成器AI Agent将具备更强的智能性、适应性和创新性,为全球用户带来更具价值的旅行辅助服务,也为AI应用的场景化落地提供了典范范例。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
  • [HCSD校园沙龙] “华为云HCSD校园公开课”走进新疆大学,为学子点亮科技成长新赛道
    在数字经济蓬勃发展的当下,以人工智能、大数据、云计算等为代表的前沿技术正深度渗透至各行业领域,重塑产业格局。6月12日,由华为云计算技术有限公司主办、新疆大学承办的“华为云HCSD校园公开课”在新疆大学博达校区顺利举行。华为云开发者联盟与云商店部部长王希海、华为云PaaS技术创新实验室主任王千祥、华为云高校生态总监罗静带领技术专家团队走进校园,与新疆大学副校长汪烈军、计算机科学与技术学院党委副书记吴健强、计算机科学与技术学院副院长刘胜全、计算机科学与技术学院副院长夏威、计算机科学与技术学院副教授郑炅及师生代表展开深入交流。▲ 大会现场图深化校企协同合作共筑华为根技术人才生态如今,行业对复合型技术人才的需求正呈现爆发式增长,尤其是从产业发展趋势看,AI大模型落地、算力基础设施建设及行业数字化解决方案创新,亟需高校与企业形成人才培养闭环——既需高校夯实理论根基,更需企业注入技术实践与行业经验。新疆大学计算机科学与技术学院副院长刘胜全在开场致辞中表示,一直以来,新疆大学与华为都保持着良好的合作关系,双方在学科共建、赛事组织及课程改革等方面成果丰硕。华为云也通过名校行、HCSD校园公开课等活动,将华为云的专家和技术带进校园,与老师进行教学研讨、指导学生开展云上实践。未来,双方将继续深化校企合作,协力为同学们创造更好的学习环境,并以华为ICT大赛、华为开发者大赛等为抓手,培养更多适应行业发展需求的创新型人才。▲ 新疆大学计算机科学与技术学院副院长 刘胜全华为云作为全球领先的智能云服务提供商,始终以技术创新驱动产业变革,在AI算力布局、大模型落地及开发者生态构建等领域持续深耕。华为云开发者联盟与云商店部部长王希海也在致辞中表示,依托全栈AI能力与昇腾算力基础设施,华为云打造的CloudMatrix 384超节点集群已成为支撑复杂大模型训推的核心底座,而盘古大模型在30多个行业、400+场景的规模化应用,更彰显了从技术突破到产业赋能的闭环能力。在人才生态建设中,华为云也通过沃土云创高校计划、开发者布道师认证、HCSD校园公开课等多维举措,将前沿技术与行业实践深度融入高校教学体系,与新疆大学等高校共建“产学研用”一体化培养模式。这种以技术需求为导向、以场景实践为纽带的校企协同机制,不仅为数字经济输送了大量实战型人才,更成为推动数实融合的关键引擎。▲ 华为云开发者联盟与云商店部部长 王希海随后,激动人心的校园大使授证仪式举行。新疆大学计算机科学与技术学院党委副书记吴健强、华为云开发者联盟与云商店部部长王希海为校园大使孙海洋、石昌辉同学颁发证书。这些校园大使将成为华为云与学校之间的桥梁,促进技术交流与创新实践活动的开展。他们将积极参与华为云相关活动的组织与推广,带动更多同学了解和应用华为云技术。在现场师生的共同见证下,华为新疆政企副总经理范朝军与新疆大学计算机科学与技术学院副院长刘胜全上台为学校颁发了华为ICT大赛(第九届)2024-2025中国区新疆赛区优秀组织奖与优秀合作伙伴奖。同时,在范朝军与新疆大学计算机科学与技术学院副院长夏威的见证下,在活动上向新疆大学ICT学院捐赠了信创电脑10台。以科技赋能教育创新打造高质量教育体系新范式新疆大学计算机科学与技术学院副教授、华为开发者布道师郑炅以《以赛促学,以赛促教》为题,系统介绍了华为ICT学院的运营模式与赛事组织经验。她提出的以竞赛宣讲、赛道分析、启动报名、培训认证、资源协调、组织参赛、赛事总结为主的“七步法”赛事运营模型形成了完整的人才培养闭环,并向区内高校分享经验,有效推动了区域信息技术教育均衡发展。此外,她还展示了新疆大学携手华为在课程改革方面取得的成果,如开展基于华为鲲鹏云的《大数据导论》课程建设及“国产软件进课堂”教学改革项目,通过将企业技术融入课程,提升学生实践能力。通过以赛促学、以赛促创的创新模式,推动校企协同,成功构建了完善的人才培养生态体系。▲ 新疆大学计算机科学与技术学院副教授、华为开发者布道师 郑炅目前,软件工程正从1.0瀑布模型、2.0敏捷开发演进至3.0智能化阶段,其核心是通过AI大模型重构研发范式。华为云PaaS技术创新实验室主任、华为云智能化研发首席专家王千祥也带来了主题为“软件工程 3.0:大模型驱动的软件研发新范式”的演讲,他指出,华为代码大模型Pangu-Coder在150亿参数规模下可实现HumanEval 测试72.3%通过率,性能超越业界主流模型。在实践层面,华为通过CodeArts盘古助手构建全流程智能辅助生产线,支持从需求分析到运维的全生命周期自动化,代码接纳率提升至32.42%。他强调,大模型与传统程序本质等价,智能化软件需融合确定性符号计算与非确定性概率模型。当前华为已实现多模型协同开发,如CodeR工具在SWE-bench 榜单登顶,未来将通过DevAgent推动研发向Agent主导的自主化演进。▲ 华为云PaaS技术创新实验室主任、华为云智能化研发首席专家 王千祥华为云PaaS高级工程师卢步云以《低代码,高效率:解锁应用开发新技能》为题,以一段快闪视频开场,让同学们了解低代码技术如何降低开发门槛,提升校园开发者创新效率。随后,她系统地介绍了华为云Astro低代码平台的核心服务,Astro Canvas快速构建数据可视化大屏应用,Astro Zero轻松开发轻量级业务应用。结合流程化、可视化的行业案例,她展示了Astro平台如何帮助企业真正实现“事半功倍”的效能提升,让师生们更直观的感受到低代码技术在降本增效中的价值。针对低代码和智能编程这两种技术趋势,她提出了“两者都要”的见解,并且针对不同开发目的和场景提供了学习建议,与师生一起探讨了低代码与AI技术的融合趋势。▲ 华为云PaaS高级工程师 卢步云值得一提的是,在实操环节,卢步云基于华为云Astro Zero轻应用低代码平台,演示如何搭建一个完整的包含前台界面、后端逻辑、和第三方模型对接的自定义聊天助手。将低代码搭建应用的过程进行了拆解,帮助同学们掌握运用低代码工具的思路和方法。华为云Astro低代码平台设计完善,提供丰富多样的前后台资产和持续更新优化的使用指南,在降低开发门槛的同时,也支持开发者做出更专业和复杂的业务应用。DTSE开发者技术专家郭高举以“基于云主机部署 DeepSeek 构建 Agent 智能助手”为主题,演示了如何通过华为开发者空间提供的云主机快速部署大模型服务。该平台为开发者提供一站式环境配置、工具集成及案例指导,支持鲲鹏、昇腾等多技术方向,助力学生低成本体验前沿技术开发。▲ 华为云DTSE开发者技术专家 郭高举在活动期间还召开了教师研讨会:新疆大学计算机科学与技术学院与华为技术专家围绕 “数智育人 共塑高校生态” 及“Low Code Vs Vibe Coding” 两大核心议题,展开了深度交流与思想碰撞。本次“华为云HCSD校园公开课”的成功举办,标志着新疆大学与华为在华为根技术人才培养领域的合作迈向了新台阶。未来,双方将通过“赛事驱动、课程改革、技术赋能”三位一体模式,继续探索教育、科技、人才一体化发展路径,为边疆地区输送更多适应数字经济发展的高素质技术人才。华为云也将持续开放技术资源,通过“沃土云创”计划、开发者空间、云上科研实验室等平台,支持高校开展实践教学与创新活动,共建产学研用深度融合新生态。
  • [热门活动] 【活动已结束】云计算新手入门集证有礼—开发者空间案例实践抽奖:免费领取云主机,完成案例实践,赢华为智能体脂秤、定制冲锋衣、定制双肩包、云宝等好礼!
    1、活动中奖名单公布如下,公示期10天(2025年8月12日-2025年8月21日),如有疑问请在公示期间反馈,逾期不予处理!2、请中奖用户于8月21日23:59:59点前填写【中奖用户收货信息收集表】,逾期未填写视为放弃奖励,请知悉!3、公示期结束后,30个工作日内统一邮寄奖品,如有问题请与论坛版主【开发者学堂欢欢】联系。其中本活动中的实物礼品如遇缺货等情况,将替换成类似款或其他等值礼品发放。昵称华为云账户名中奖奖品andyleungand**eung1005云宝盲盒czb_biuhid**etnfngjmhkpfh9开发者空间定制双肩包miyalianhid**f120xjdev_3p9p开发者空间定制双肩包yd_229106051hid**yun开发者空间定制双肩包yd_238637427hid**9mpca1c1cu9wfa云宝盲盒yd_238822659fj8**8w123开发者空间定制冲锋衣yd_248582828Lin**an开发者空间定制冲锋衣yd_267354561hid**2c7dpa7yyb8l77开发者空间定制冲锋衣yd_277766320luo**68华为智能体脂秤 3 yd_286761491mug**etan开发者空间定制冲锋衣yd_291175919hid**72l4dybdv6zg3j开发者空间定制双肩包给无眠点压力GT-**ixin_52568491云宝盲盒敲键盘的诗人gpf**dream开发者空间定制冲锋衣(中奖名单如上展示,如有疑问请及时反馈) 【活动时间】即日起—8月7日【活动流程】——领取奖励的用户必须完成活动报名+领取华为开发者空间一、活动报名二、免费领取华为开发者空间三、完成以下任意一个华为开发者空间案例,在本论坛贴评论区分享案例完成截图(完成时间+案例名称+案例完成截图+实验心得),活动结束后,将在评论区符合条件的用户中抽奖。指定空间案例实操入口云主机轻松部署DeepSeek点击进入云主机调用DeepSeek实现代码自动生成点击进入初识云主机:CodeArts IDE入门点击进入运用昇思MindSpore框架成为垃圾分类小能手点击进入仓颉 – C跨语言编程实现控制台小游戏点击进入基于鲲鹏服务器的打砖块小游戏部署点击进入【活动礼品】【空间案例实操方式】1、 登录个人华为账号,从上述指定开发者空间案例中选取任意1个,点击进入,下载自己感兴趣的案例,根据提示完成案例实操2、 本活动贴评论区:发送完成时间+案例名称+案例完成截图+实验心得【抽奖方式】活动结束后,我们将从参与活动的用户中(华为云新老用户均可参与),通过巨公平台或Excel 函数形式抽取获奖用户,并在本活动帖进行公示获奖用户。 用户限制说明:1、参加本次社区活动的用户必须为华为云注册用户。同时为保证活动公平性,禁止用户以IAM账号身份参与活动,否则将视为无效。2、领取奖品的用户需为华为云实名用户,未完成实名认证的用户将不发放活动奖励。3、本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励。如在同一概率活动中,同一账号重复获奖,只发放首先获奖奖品。4、本次活动一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人,不予发放奖励。5、请开发者不要在活动期间随意修改社区昵称和华为云账号,由此产生的统计问题,如过了申诉期,小助手不再处理。(申诉期为活动结果公示3天内。)奖品发放说明:1、本活动结束之后10个工作日内公示获奖信息,获奖开发者用户需在截止时间在获奖信息收集表中填写获奖信息,获奖信息截止收集日过后30个工作日内,将统一发出奖品。华为云遵守《中华人民共和国个人信息保护法》规定,将以上个人信息仅用于礼品发放之目的,不会向任何第三方披露。若由于获奖开发者用户自身原因(包括但不限于联系方式有误、身份不符或超过截止登记日期等)造成奖品无法发送,视为获奖开发者用户放弃领奖。2、为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的开发者用户收回抽奖及奖励资格。3、若发放奖品时,出现库存不足,则优先发放等价值的其他实物奖品;开发者空间定制冲锋衣尺码随机发放,不指定尺码。4、所有参加本活动的开发者用户,均视为认可并同意遵守《华为云开发者用户协议》,包括以援引方式纳入《华为云开发者用户协议》、《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。5、如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [案例共创] 【案例共创】基于华为云开发者空间+Flexus+Dify平台的AI Agent构建实战:搭建大学报考志愿建议助手
    基于华为云开发者空间+Flexus+Dify平台的AI Agent构建实战:搭建大学报考志愿建议助手🎯 项目背景与目标高考志愿填报是大学考生的重要选择,涉及高校信息、专业趋势与个人兴趣等复杂因素。构建一个智能化AI Agent,能在后台自动结合用户信息、政策数据、历年录取结果等,为考生提供定制化填报建议,将大幅提升决策效率。本项目基于华为云开发者空间提供的资源接入能力,使用Flexus提供弹性算力,搭配Dify提供的低代码Agent开发平台,实现“志愿建议助手”从接入到落地的完整流程。技术架构与平台概览华为云开发者空间:接入ModelArts、大数据、RDS、OBS等基础资源,提供统一控制入口。Flexus X / CCE 实例:作为 AI Agent 的计算引擎,提供稳定可弹性伸缩的资源。Dify 平台:支持拖拽式流程编排,集成大模型、检索知识库、API 工具,非常适合构建规则+推理并存的智能体DeepSeek-R1/V3:大模型提供推理能力,支持长上下文和复杂逻辑判断。🧩华为云开发者空间介绍华为云开发者空间(DevZone) 是面向开发者的一站式云端开发与协作平台,旨在帮助开发者高效构建、测试、部署和管理AI及软件项目。它整合了华为云的主流服务(如ModelArts、RDS、OBS、FunctionGraph等),并提供 DevOps 流程管理、代码托管、任务编排等功能。使用配置如下核心优势:🔧 云上开发环境:支持JupyterLab、VS Code、DevContainer等多种IDE配置,免本地环境搭建。🧠 集成AI开发能力:原生接入 ModelArts 平台,可便捷调度训练、部署推理服务。🔗 与Flexus无缝衔接:一键对接弹性算力资源(如训练算力/推理服务)。🚀 CI/CD支持:支持基于代码仓的流水线部署,DevOps 自动化流程便捷高效。开发者可以在云端统一管理代码、算力、模型和工具链,提升AI项目协同效率。🔧 Flexus介绍Flexus 是华为云提供的高性能弹性计算服务平台,专为AI推理、Web服务与复杂应用容器化部署而设计,支持秒级弹性扩缩容和资源自动调度。Flexus 能提供独立的沙箱环境,并具备高网络性能和低时延。主要特点:⚙️ 多规格资源池:支持CPU/内存/GPU资源弹性申请,可基于模型负载选择最佳配置。📦 Serverless容器运行时:无需繁琐资源配置,任务执行即启动,空闲即释放。📈 智能资源调度:支持按需弹性扩展(如用户并发量突增时自动增实例),提升资源利用率。🔒 安全隔离:支持沙箱环境运行Agent任务,避免权限泄露和数据交叉污染。Flexus 通常配合 Dify 或 ModelArts 使用,承接大模型推理任务、外部API调用以及高并发AI Agent的逻辑执行。🧠 Dify-LLM应用开发平台介绍Dify 是一个开源的大模型应用开发平台(LLMOps平台),支持以低代码或可视化方式构建基于大模型(如GPT、DeepSeek、Qwen等)的智能体(Agent)与应用。它支持多种调用模式、上下文配置、工具编排、知识库管理等模块。核心能力:🧩 可视化Agent构建:通过拖拽式流程设计搭建大模型工作流,降低开发门槛。🔗 多模型接入:支持 OpenAI、DeepSeek、百度文心、阿里通义、华为盘古等主流API。🧠 知识库RAG检索增强:支持上传文档/网页,构建向量知识库,用于丰富Agent语义理解。🛠️ 工具调用(ToolCall)机制:Agent 可动态调用 Web API、数据库、搜索引擎或自定义函数。🔍 日志审计与评估体系:支持输出跟踪、调用日志、上下文分析、响应耗时等指标监控。Dify 平台非常适合构建如“志愿填报助手”、“医疗问诊助手”、“金融顾问”等具有业务逻辑和语义理解要求的LLM应用。基于华为云开发者空间搭建大学报考志愿建议助手首先进入华为云开发者空间。方案架构该解决方案基于云容器引擎 CCE帮助您快速部署高可用Dify LLM应用开发平台。该系统基于华为云 VPC 私有网络,通过多个弹性资源组件(EIP、ELB、CCE、RDS、Redis、OBS等)协同运行,支持一个多副本、可扩展的 Dify 服务,主要模块如下:✅ 用户访问入口:弹性公网 IP(EIP):为用户提供访问 Dify 服务的公网 IP 地址。弹性负载均衡(ELB):将公网请求负载分发到后端 Dify 服务容器,实现高可用。VPC(虚拟私有云)整个系统部署在华为云的 VPC 内,提供独立、安全的网络环境。子网 & 安全组子网负责划分内部网络段;安全组用于设置访问控制规则(如端口、IP 白名单等)。NAT 网关用于 Dify 容器访问公网资源(如拉取依赖、模型服务、API 等)而不暴露私有 IP。使用组件:CCE(云容器引擎):即 Kubernetes 服务;部署了多个 Dify服务器容器,支持水平扩展;包括一个 Embedding & Reranker 组件,说明该服务具备自然语言处理能力,如语义检索、结果重排序等。Dify 核心服务依赖多个后端云服务:服务说明RDS for PostgreSQL存储用户数据、对话日志、API Key、配置等Redis® 版缓存加速,如 token 缓存、session 维护等CSS(云搜索服务)用于向量搜索、文档检索等 AIGC 功能OBS(对象存储服务)用于存储文件,如上传的知识库、文档等1.快速搭建Dify-LLM应用开发平台可以直接点击一键部署在模板中,会自动填写好,直接点击下一步。参数配置不用修改,直接设置密码。资源栈设置如下。确认配置如下。可以选择直接部署资源栈。等待生成完成。在输出中,直接访问ip地址即可访问。设置账号。创建应用,可见有很多选项。点击模型设置安装该插件提示词如下``` xml <instruction> <prompt> 你是一位大学报考志愿建议助手,将为学生提供个性化的志愿填报建议。请根据提供的学生信息和需求,生成一份详细的志愿填报建议。以下是需要考虑的因素: 1. 学生的基本信息: - {{student_name}}: 学生姓名 - {{age}}: 学生年龄 - {{location}}: 学生所在城市或省份 - {{student_id}}: 学生ID(如果有的话) 2. 学术成绩: - {{gpa}}: 学生的高中平均成绩 - {{exam_score}}: 高考分数 - {{subject_scores}}: 各科成绩(例如:语文、数学、英语等) - {{rank}}: 学生在班级或年级中的排名 3. 兴趣与职业规划: - {{interests}}: 学生的兴趣爱好(例如:科技、医学、艺术等) - {{career_goals}}: 职业目标(例如:成为医生、工程师、教师等) 4. 经济状况: - {{financial_status}}: 家庭经济状况(例如:富裕、中等、一般等) - {{tuition_preferences}}: 对学费的要求(例如:愿意支付高学费、希望学费较低等) 5. 学校与专业偏好: - {{preferred_schools}}: 偏好的学校(例如:清华大学、北京大学等) - {{preferred_programs}}: 偏好的专业(例如:计算机科学、医学、文学等) 请根据以上信息,生成一份详细的志愿填报建议,包括推荐的学校和专业,并说明推荐理由。建议内容应包括: - 推荐的学校列表(最多5所) - 推荐的专业列表(最多3个) - 每个推荐的详细理由 - 录取概率分析 - 其他相关建议 注意:输出内容应避免使用任何XML标签,保持自然流畅的中文表达。 </prompt> <example> 输入示例: { "student_name": "张三", "age": 18, "location": "北京市", "gpa": 3.8, "exam_score": 620, "subject_scores": { "语文": 85, "数学": 90,问题:学生叫李明,18岁,来自上海市。他的高中平均成绩是3.6,高考分数是580分,各科成绩分别是语文80,数学85,英语85,物理80,化学75,生物70。他在班上排名是前20%,兴趣爱好包括科技、编程,职业目标是成为一名软件工程师。家庭经济状况中等,希望学费不要太高。他偏好清华大学和复旦大学,喜欢计算机科学和电子工程专业。回答如下✅ 总结本项目展示了如何基于华为云开发者空间、Flexus弹性算力与Dify低代码平台,快速搭建一个面向高考志愿填报的智能AI Agent。从基础设施的配置(如VPC、CCE、RDS、Redis等)到Dify平台的部署与应用构建,全流程实现了“零代码或低代码”下的智能应用开发闭环。通过本项目的实践,开发者不仅能够深入理解AI Agent的构建逻辑,还能高效集成大模型能力(如DeepSeek)与知识库检索(RAG)等核心组件,实现复杂业务需求的智能化处理。该方案也可灵活迁移到医疗咨询、金融顾问、企业内部助手等其他场景,具备广泛的通用性与实用价值。未来,随着大模型推理能力的增强和云平台的资源调度优化,此类“智能体+平台”的组合模式将成为AI落地的重要路径。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
  • [案例共创] 【案例共创】基于仓颉编程语言+DeepSeek实现“软考系规知识点释义”助手
    项目概述本项目旨在通过华为开发者空间云主机,结合仓颉编程语言和DeepSeek API,开发一个简单的“软考系统规划与管理师(简称系规)知识点释义”助手。用户可以通过命令行输入相关知识点或问题,应用会返回该知识点的详细解释和记忆方法。这个助手可以帮助备考软考的考生更好地理解和记忆重要的知识点。适用对象需要参与软考“信息系统项目管理师(高级)”学习的用户。案例流程说明:① 练习使用CodeArts IDE for Cangjie编辑器;② 领取免费 DeepSeeK Tokens;③ 仓颉对接DeepSeek接口。开发步骤1. 环境准备注册并登录华为开发者空间:访问华为开发者空间官网,注册并登录账户。创建云主机实例:在华为开发者空间中创建一个新的云主机实例,选择适合的配置。安装CodeArts IDE for Cangjie:在云主机上安装CodeArts IDE for Cangjie编辑器,确保其预置在环境中(其实这一步是可以省略的,因为是默认内置的,如下图)。2. 项目初始化创建新项目:首先我们进入到开发者空间后,双击打开CodeArts IDE for Cangjie,在CodeArts IDE for Cangjie中创建一个新的项目,命名为“demo”(随便你怎么命名)。名称和位置可以自定义,产物类型选择executable。*产物类型说明: executable,可执行文件;static,静态库,是一组预先编译好的目标文件的集合;dynamic,动态库,是一种在程序运行时才被加载到内存中的库文件,多个程序共享一个动态库副本,而不是像静态库那样每个程序都包含一份完整的副本。配置项目结构:设置项目的基本目录结构,包括源代码文件、配置文件等。创建项目后,打开src目录下main.cj文件,在预置代码中增加函数和函数调用代码(没有的话可以自己新建一份,代码内容下文我有附上)。然后点击右上的运行按钮运行项目,在终端中查看输出内容。如果遇到弹窗提示运行/调试配置,点击确定继续操作。修改后的main.cj文件代码:package demo func println_add(a: Int64, b:Int64): Int64 { let number: Int64 = a+b println(number) return number } main(): Int64 { println("hello world") println_add(3,4) println("hello Cangjie") return 0 } 调试项目:点击右上调试按钮,首次会提示配置调试,点击新增配置项,选择Cangjie(cjdb)Debug——launch。*调试模式说明:Launch模式,启动调试器的同时加载被调程序;Attach,针对正在运行的程序,附加到已启动的程序。然后可以在main.cj代码中设置断点,再次点击调试按钮。可以在顶部看到调试按钮,在左侧看到调试过程中的变量、监视、调用堆栈、断点信息。3. Cangjie对接DeepSeek接口华为云提供了单模型200万免费Tokens,包含DeepSeek-R1&V3满血版,我们可以登录华为云ModelArts Studio(MaaS)控制台领取免费额度,这里我们选择DeepSeek-R1满血版来搭建我们的工程。在云主机桌面底部菜单栏,点击打开火狐浏览器。用火狐浏览器访问ModelArts Studio首页:https://www.huaweicloud.com/product/modelarts/studio.html,点击ModelArts Studio控制台跳转到登录界面,按照登录界面提示登录,即可进入ModelArts Studio控制台。你也可以在本地浏览器打开进行相关操作。领取后点击调用说明,可以获取到对应的API地址、模型名称。当然API Key也要创建下,这里创建很简单,按提示跳转过去就成,我这里就不介绍了。记录对应的API地址、模型名称、API Key留作下面步骤使用。4. Cangjie对接DeepSeek编写代码进入云主机桌面,右键选择Open Terminal Here打开终端命令窗口,克隆仓颉示例代码仓库。git clone https://gitcode.com/CaseDeveloper/Cangjie-Examples.git使用CodeArts IDE for Cangjie打开AIChat示例项目。左上点击文件—打开项目,选择前面克隆的示例代码目录Cangjie-Examples下的AIChat打开。修改配置config.json配置文件,配置DeepSeek的API信息。配置项:model、model、base_url打开main.cj,运行项目,我们就可跟AI助手进行聊天了。(* 注意:打开main.cj可能提示Console标红,不影响程序运行,可以忽略。亦可以删除import std.console.Console重新编写该导入语句)至此,基于仓颉编程语言+DeepSeek实现智能聊天助手开发秘籍就完成了。接下来我们在聊天项目基础上,改编成“软考系统规划与管理师(简称系规)知识点释义”助手其实超级简单,我们只需要再修改 “system_prompt” 即可。修改内容如下:"system_prompt": "你是我的“软考系规知识点释义”助手,你的名字叫系规。系规是一款面向计算机高级软考教材《系统规划与管理师》第二版的知识助手,主打筛选教材书本的知识点,善于总结知识内容,搜索知识内容,关联知识内容,以及整理便于记忆的知识口诀。须保持回复简洁,回复内容不超过300字。" 运行程序:最后我把代码完整的给大家呈现下(chat.cj):具体代码如下:package openai_chat import encoding.json.stream.* import net.http.ClientBuilder import net.http.HttpHeaders import net.http.HttpRequestBuilder import net.tls.TlsClientConfig import net.tls.CertificateVerifyMode import std.collection.ArrayList import std.io.ByteArrayStream import std.time.Duration public struct FunctionCall <: JsonDeserializable<FunctionCall> & JsonSerializable { public let name: String public let arguments: String public init(name: String, arguments: String) { this.name = name this.arguments = arguments } public static func fromJson(r: JsonReader): FunctionCall { var temp_name: String = "" var temp_arguments: String = "" while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "name" => temp_name = r.readValue<String>() case "arguments" => temp_arguments = r.readValue<String>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for FunctionCall") } } return FunctionCall(temp_name, temp_arguments) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("name").writeValue<String>(this.name) w.writeName("arguments").writeValue<String>(this.arguments) w.endObject() w.flush() } } public enum RoleType { User | Assistant | System | Function | NULL } public func role_type_to_str(role: RoleType): Option<String> { return match(role) { case RoleType.User => Some("user") case RoleType.Assistant => Some("assistant") case RoleType.System => Some("system") case RoleType.Function => Some("function") case RoleType.NULL => None } } public func str_to_role_type(role_option_str: Option<String>): RoleType { return match(role_option_str) { case Some(role_option) => match (role_option) { case "user" => RoleType.User case "assistant" => RoleType.Assistant case "system" => RoleType.System case "function" => RoleType.Function case x => throw Exception("unknow enum ${x} for RoleType") } case None => RoleType.NULL } } public struct Message<: JsonDeserializable<Message> & JsonSerializable { public let role: RoleType public var content: String public let function_call: Option<FunctionCall> public init(role: RoleType, content: String) { this.role = role this.content = content this.function_call = None } public init(role: RoleType, content: String, function_call: Option<FunctionCall>) { this.role = role this.content = content this.function_call = function_call } public static func fromJson(r: JsonReader): Message { var temp_role: Option<String> = None // role may null in stream chat var temp_content: String = "" var temp_functional_call: Option<FunctionCall> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "role" => temp_role = r.readValue<Option<String>>() case "content" => temp_content = r.readValue<String>() case "function_call" => temp_functional_call = r.readValue<Option<FunctionCall>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Message") } } let role_type: RoleType = str_to_role_type(temp_role) return Message(role_type, temp_content) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("role").writeValue<Option<String>>(role_type_to_str(this.role)) w.writeName("content").writeValue<String>(this.content) w.endObject() w.flush() } } public struct ChatRequest <: JsonSerializable { private let model: String private let messages: ArrayList<Message> private let max_tokens: Int64 private let temperature: Float64 private let top_p: Float64 private let n: Int32 private let stream: Bool public init( model: String, messages: ArrayList<Message>, max_tokens: Int64, temperature: Float64, top_p: Float64, n: Int32, stream: Bool ) { // construction function with messages this.model = model this.messages = messages this.max_tokens = max_tokens this.temperature = temperature this.top_p = top_p this.n = n this.stream = stream } public init( model: String, prompt: String, history: ArrayList<(String, String)>, system_prompt: String, max_tokens: Int64, temperature: Float64, top_p: Float64, n: Int32, stream: Bool ){ // construction function with prompt and system_prompt this.model = model this.messages = ArrayList<Message>([ Message(RoleType.System, system_prompt) ]) for ((use_msg, bot_msg) in history) { this.messages.append(Message(RoleType.User, use_msg)) this.messages.append(Message(RoleType.Assistant, bot_msg)) } this.messages.append(Message(RoleType.User, prompt)) this.max_tokens = max_tokens this.temperature = temperature this.top_p = top_p this.n = n this.stream = stream } public init( model: String, prompt: String, history: ArrayList<(String, String)>, system_prompt: String, stream: Bool ){ // construction function with prompt and default arguments this.model = model this.messages = ArrayList<Message>([ Message(RoleType.System, system_prompt) ]) for ((use_msg, bot_msg) in history) { this.messages.append(Message(RoleType.User, use_msg)) this.messages.append(Message(RoleType.Assistant, bot_msg)) } this.messages.append(Message(RoleType.User, prompt)) this.max_tokens = 2000 this.temperature = 0.7 this.top_p = 1.0 this.n = 1 this.stream = stream } public func toJson(w: JsonWriter) { w.startObject() w.writeName("model").writeValue<String>(this.model) w.writeName("messages").writeValue<ArrayList<Message>>(this.messages) w.writeName("max_tokens").writeValue<Int64>(this.max_tokens) w.writeName("temperature").writeValue<Float64>(this.temperature) w.writeName("top_p").writeValue<Float64>(this.top_p) w.writeName("n").writeValue<Int32>(this.n) w.writeName("stream").writeValue<Bool>(this.stream) w.endObject() w.flush() } } public struct Choice <: JsonDeserializable<Choice> & JsonSerializable { public let index: Int32 public let message: Option<Message> public let delta: Option<Message> public let finish_reason: Option<String> public let logprobs: Option<Float64> // dashscope for qwen need public init( index: Int32, message: Option<Message>, delta: Option<Message>, finish_reason: Option<String>, logprobs: Option<Float64> ) { this.index = index this.message = message this.delta = delta this.finish_reason = finish_reason this.logprobs = logprobs } public static func fromJson(r: JsonReader): Choice { var temp_index: Int32 = -1 var temp_message: Option<Message> = None var temp_delta: Option<Message> = None var temp_finish_reason: Option<String> = None var temp_logprobs: Option<Float64> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "index" => temp_index = r.readValue<Int32>() case "message" => temp_message = r.readValue<Option<Message>>() case "delta" => temp_delta = r.readValue<Option<Message>>() case "finish_reason" => temp_finish_reason = r.readValue<Option<String>>() case "logprobs" => temp_logprobs = r.readValue<Option<Float64>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Choice") } } return Choice(temp_index, temp_message, temp_delta, temp_finish_reason, temp_logprobs) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("index").writeValue<Int32>(this.index) w.writeName("message").writeValue<Option<Message>>(this.message) w.writeName("delta").writeValue<Option<Message>>(this.delta) w.writeName("finish_reason").writeValue<Option<String>>(this.finish_reason) w.writeName("logprobs").writeValue<Option<Float64>>(this.logprobs) w.endObject() w.flush() } } public struct Usage <: JsonDeserializable<Usage> & JsonSerializable { public let prompt_tokens: UInt64 public let completion_tokens: UInt64 public let total_tokens: UInt64 public init(prompt_tokens: UInt64, completion_tokens: UInt64, total_tokens: UInt64) { this.prompt_tokens = prompt_tokens this.completion_tokens = completion_tokens this.total_tokens = total_tokens } public static func fromJson(r: JsonReader): Usage { var temp_prompt_tokens: UInt64 = 0 var temp_completion_tokens: UInt64 = 0 var temp_total_tokens: UInt64 = 0 while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "prompt_tokens" => temp_prompt_tokens = r.readValue<UInt64>() case "completion_tokens" => temp_completion_tokens = r.readValue<UInt64>() case "total_tokens" => temp_total_tokens = r.readValue<UInt64>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Usage") } } return Usage(temp_prompt_tokens, temp_completion_tokens, temp_total_tokens) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("prompt_tokens").writeValue<UInt64>(this.prompt_tokens) w.writeName("completion_tokens").writeValue<UInt64>(this.completion_tokens) w.writeName("total_tokens").writeValue<UInt64>(this.total_tokens) w.endObject() w.flush() } } public struct ChatResponse <: JsonDeserializable<ChatResponse> { // some api names `id`, and some names `request_id` public let id: Option<String> public let request_id: Option<String> public let system_fingerprint: Option<String> public let model: String public let object: String public let created: UInt64 public let choices: ArrayList<Choice> public let usage: Option<Usage> public init( id: Option<String>, request_id: Option<String>, system_fingerprint: Option<String>, model: String, object: String, created: UInt64, choices: ArrayList<Choice>, usage: Option<Usage> ) { this.id = id this.request_id = request_id this.system_fingerprint = system_fingerprint this.model = model this.object = object this.created = created this.choices = choices this.usage = usage } public static func fromJson(r: JsonReader): ChatResponse { var temp_id: Option<String> = None var temp_request_id: Option<String> = None var temp_system_fingerprint: Option<String> = None var temp_model: String = "" var temp_object: String = "" var temp_created: UInt64 = 0 var temp_choices: ArrayList<Choice> = ArrayList<Choice>([]) var temp_usage: Option<Usage> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "id" => temp_id = r.readValue<Option<String>>() case "request_id" => temp_request_id = r.readValue<Option<String>>() case "system_fingerprint" => temp_system_fingerprint = r.readValue<Option<String>>() case "model" => temp_model = r.readValue<String>() case "object" => temp_object = r.readValue<String>() case "created" => temp_created = r.readValue<UInt64>() case "choices" => temp_choices = r.readValue<ArrayList<Choice>>() case "usage" => temp_usage = r.readValue<Option<Usage>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for ChatResponse") } } return ChatResponse( temp_id, temp_request_id, temp_system_fingerprint, temp_model, temp_object, temp_created, temp_choices, temp_usage ) } } public func get_domain( url: String ): String { var temp_url = url if (temp_url.startsWith("https://")) { temp_url = temp_url["https://".size..] } else if (temp_url.startsWith("http://")) { temp_url = temp_url["http://".size..] } let domain: String = temp_url.split("?")[0].split("/")[0] return domain } public func build_http_client( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)>, stream!: Bool ){ // prepare input data var array_stream = ByteArrayStream() let json_writer = JsonWriter(array_stream) let chat_res = ChatRequest( env_info.model, prompt, history, env_info.system_prompt, stream ) chat_res.toJson(json_writer) let post_data: Array<UInt8> = array_stream.readToEnd() var headers: HttpHeaders = HttpHeaders() headers.add("Authorization", "Bearer ${env_info.api_key}") headers.add("Content-Type", "application/json") if (stream) { headers.add("Accept", "text/event-stream") } let request = HttpRequestBuilder() .url(env_info.base_url) .method("POST") .body(post_data) .readTimeout(Duration.second * 120) .addHeaders(headers) .build() let client = if (env_info.base_url.startsWith("https")) { var tls_client_config = TlsClientConfig() tls_client_config.verifyMode = CertificateVerifyMode.TrustAll tls_client_config.domain = get_domain(env_info.base_url) ClientBuilder() .tlsConfig(tls_client_config) .build() } else { ClientBuilder().build() } return (request, client) } public func chat( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)> ): Option<String> { let (request, client) = build_http_client( prompt, env_info, history, stream: false ) var result_message: Option<String> = None var res_text = "" try { // call api let response = client.send( request ) // read result (support max revice 100k data) let buffer = Array<Byte>(102400, item: 0) let length = response.body.read(buffer) res_text = String.fromUtf8(buffer[..length]) // println("res_text: ${res_text}") var input_stream = ByteArrayStream() input_stream.write(res_text.toArray()) // convert text to ChatResponse object let json_reader = JsonReader(input_stream) let res_object = ChatResponse.fromJson(json_reader) let choices: ArrayList<Choice> = res_object.choices if (choices.size > 0) { let message = choices[0].message.getOrThrow() // println("message: ${message.content}") result_message = Some(message.content) } else { println("can't found any response") } } catch (e: Exception) { println("ERROR: ${e.message}, reviced text is ${res_text}") } client.close() return result_message } public func stream_chat( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)> ): Option<String> { let (request, client) = build_http_client( prompt, env_info, history, stream: true ) var result_response: String = "" var temp_text2 = "" try { // call api let response = client.send( request ) // read result let buffer = Array<Byte>(10240, item: 0) var finish_reason: Option<String> = None while(finish_reason.isNone() && temp_text2 != "[DONE]") { let length = response.body.read(buffer) let res_text = String.fromUtf8(buffer[..length]) for (temp_text in res_text.split("\n")) { temp_text2 = if (temp_text.startsWith("data: ")) { temp_text["data: ".size..] } else { temp_text } if (temp_text2.size == 0) { continue } if (temp_text2 == "[DONE]") { break } // println("========================") // println("temp_text: ${temp_text2}") // println("========================") var input_stream = ByteArrayStream() input_stream.write(temp_text2.toArray()) // convert text to ChatResponse object let json_reader = JsonReader(input_stream) let res_object = ChatResponse.fromJson(json_reader) let choices: ArrayList<Choice> = res_object.choices if (choices.size > 0) { finish_reason = choices[0].finish_reason if (finish_reason.isNone()) { let delta = choices[0].delta.getOrThrow() print("${delta.content}", flush: true) result_response += delta.content } } else { println("can't found any response") } } } } catch (e: Exception) { println("ERROR: ${e.message}, reviced text is ${temp_text2}") } client.close() if (result_response.size > 0) { return Some(result_response) } else { return None } } 5. 运行和测试最后我们测试下系统的准确性,如下图:到此整个项目案例创建完成,可见是非常简单且实用的,希望能给大家带来帮助。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
  • [案例共创] 【案例共创】从零开始,用仓颉语言+DeepSeek开发你的专属AI助手
    从零开始,用仓颉语言+DeepSeek开发你的专属AI助手在大模型技术飞速发展的今天,越来越多的企业和开发者开始关注“专属AI助手”的开发与部署。从最早的GPT开放接口调用,到如今的“千模大战”,开发门槛逐步降低,但真正从零构建一套专属的、可持续迭代的AI助手系统仍然需要深厚的工程能力与平台支持。本案例围绕在华为云开发者空间中的云主机环境,逐步展开一套AI 聊天助手的全流程开发实践。我们以一个轻量级的仓颉语言项目作为起点,首次体验了 CodeArts IDE for Cangjie 编辑器的便捷性与强大功能。该编辑器预置在云主机内,免去本地环境配置,极大提高了开发效率,也为后续复杂逻辑的实现打下了坚实基础。在项目开发过程中,我们充分结合了仓颉编程语言的优势,通过自然语言式的指令流畅定义助手逻辑。与此同时,我们接入了华为 ModelArts Studio(MaaS)平台,并利用官方提供的 DeepSeek Tokens 免费额度,完成了 DeepSeek-R1 大语言模型的调用与集成。通过这一过程,我们不仅完成了从模型领取、接口接入、到云端部署的完整开发闭环,还深入体验了 DeepSeek-R1 模型在中文理解、对话生成等方面的高性能表现。本案例也是 CodeArts IDE 与 MaaS 平台结合、仓颉语言与大模型融合的一个具象化实践范例,为今后的专属 AI 助手开发提供了可复制的路径与方法论。一.华为云开发者空间在数字化转型加速的今天,开发者对高效、灵活的开发环境需求日益增长。华为云开发者空间应运而生,致力于为每位开发者提供一台专属的云主机,简化开发流程,提升开发效率。1.1什么是华为云开发者空间云主机?华为云开发者空间云主机是一种预配置的云上开发桌面,集成了华为优质的开发工具和资源,支持Web连接访问,开发桌面主机规格和操作系统自定义。开发者可通过浏览器随时随地访问,立即开始开发工作。每位开发者每年可享有数百小时的云主机使用时长,配备5GB的云存储空间和场景化沙箱资源。1.2核心功能与优势开箱即用的开发环境云主机预置了华为优质的开发工具和场景化资源池,支持Web连接访问,开发桌面主机规格和操作系统自定义。丰富的开发工具集成以华为云CodeArts IDE为核心,预装了多种开发工具,支持多语言开发及代码助手,提升开发效率。场景化沙箱环境预置华为云、鲲鹏、昇腾、鸿蒙等场景化沙箱环境,支持分钟级创建及恢复沙盒环境,保障数据安全。云上存储与数据持久化为开发者提供云上存储空间,支持开发者文件保存和内容中转,便于关键资产保存和中转。华为云开发者空间云主机适用于多种开发场景,包括:Web应用托管:提供稳定的运行环境和灵活的扩展能力。大数据处理:利用云主机强大的计算能力,进行大规模的数据分析和实时数据处理。机器学习训练:支持GPU加速,适用于深度学习模型训练和推理。开发测试环境:快速构建和销毁测试环境,节省本地资源并提高开发效率。高校师生开发实践:便捷搭建实验环境,支持教学与科研项目。开源共创:支持开源项目的开发与协作。1.3如何开始使用?访问华为云开发者空间。注册并登录华为云账号。领取专属云主机,选择所需的开发环境和工具。通过Web浏览器连接云主机,开始开发工作。华为云开发者空间云主机为开发者提供了一个高效、灵活、安全的云上开发环境,降低了开发门槛,提升了开发效率。无论是个人开发者、初创企业,还是高校师生,都可以通过这一平台,快速构建和部署应用,实现技术创新。二. 仓颉编程语言:鸿蒙生态的原生智能开发语言随着华为在操作系统、芯片和开发工具链等领域的持续投入,2024年,华为正式发布了自主研发的编程语言——仓颉(Cangjie)。该语言旨在为鸿蒙生态系统提供原生的智能化开发支持,满足全场景、多设备、智能化应用的开发需求。2.1 仓颉语言概述仓颉编程语言是一种多范式(支持面向对象、函数式、命令式)的现代编程语言,主要应用于鸿蒙原生应用及服务开发场景。其设计理念强调原生智能化、天生全场景、高性能和强安全。该语言的研发始于2019年,由华为与南京大学计算机科学与技术系合作,冯新宇教授担任首席架构师。在2024年华为开发者大会上,仓颉语言的开发者预览版本首次公开发布。2.2核心特性原生智能化仓颉语言内置了AgentDSL框架,实现自然语言与编程语言的有机融合。通过多Agent协同,简化符号表达和模式组合,支持各类智能应用的开发。天生全场景采用轻量化可缩放的运行时和模块化分层设计,仓颉语言能够在资源受限的设备上高效运行。其元编程和eDSL技术支持面向领域的声明式开发,适应多种应用场景。高性能仓颉语言在终端场景中实现了首款全并发垃圾回收机制,提升应用线程的流畅性和响应速度。同时,轻量化线程的设计增强了并发性能,降低了资源开销。强安全安全机制被深度集成到语言设计中,帮助开发者专注于业务逻辑,减少防御性编程的负担。这种设计理念确保了编码过程中的安全性,降低了漏洞风险。编译器:仓颉语言使用名为cjc的编译器进行代码编译。包管理器:内置的包管理器cjpm用于管理和维护仓颉项目的模块系统,提供统一的编译入口。开发工具:仓颉语言提供包括调试、静态验证、性能分析和测试等工具,支持开发者在鸿蒙生态中进行高效开发。2.3云主机预制仓颉IDE华为云开发者空间云主机预制安装了支持仓颉的编辑器,用户可直接使用。在创建新项目时,选择“新建工程”以构建一个仓颉项目。你可以根据实际需求自定义项目的名称与保存路径。在“生成类型”一栏,请选择 executable(可执行程序)。生成类型简介:executable(可执行程序):编译后可直接运行的程序文件;static(静态库):由已编译的目标文件组成,用于在链接阶段将库代码嵌入应用程序中;dynamic(动态库):在程序运行时加载,多个程序可共享一份库文件,节省内存资源,相较静态库更灵活。项目创建完成后,进入 src 文件夹并打开其中的 main.cj 文件。在已有的预设代码基础上,添加需要的函数定义及对应的函数调用逻辑,以扩展程序功能。package demo func println_add(a: Int64, b:Int64): Int64 { let number: Int64 = a+b println(number) return number } main(): Int64 { println("hello world") println_add(3,4) println("hello Cangjie") return 0 } 在仓颉语言中,使用let声明不可变变量,使用var声明可变变量。变量在使用前必须初始化,类型可以根据初始值自动推断,或通过显式声明指定。运行结果如下。仓颉编程语言作为华为自主研发的现代编程语言,旨在为鸿蒙生态提供原生的智能化开发支持。其多范式的设计、强大的性能和安全特性,使其成为开发全场景智能应用的有力工具。随着生态的不断完善,仓颉语言有望在未来的智能设备和应用开发中发挥重要作用。更多信息和资源,请访问仓颉编程语言的官方网站。三.ModelArts Studio大模型即服务平台随着人工智能技术的迅猛发展,企业在AI应用落地过程中面临着模型开发复杂、算力需求高、部署维护难等挑战。华为云推出的ModelArts Studio大模型即服务平台(简称MaaS),旨在为企业提供一站式的大模型开发、部署与管理解决方案,降低AI应用的门槛,加速智能化转型。MaaS平台集成了业界主流开源大模型,如DeepSeek、Llama、Baichuan、Yi、Qwen等,基于华为昇腾AI云服务进行全面适配和优化,提升模型的精度和性能。开发者无需从零开始构建模型,只需选择合适的预训练模型进行微调或直接应用,减轻了模型集成的负担。零代码、免配置、免调优的模型开发MaaS平台提供简单易用的模型开发工具链,支持大模型定制开发,让模型应用与业务系统无缝衔接,显著降低了企业AI落地的成本与难度。一站式模型开发服务平台提供模型调优、压缩、部署、评测等全栈工具,功能覆盖大模型全生命周期,支持用户即开即用,低门槛使用各类大模型。灵活的资源配置与高可用性MaaS平台支持资源按需开通,建设周期短,按需收费,按需扩缩容,并支持故障快速恢复与断点续训。多服务组合与应用集成平台支持即插即用的MCP Server,LangChain、九问、RAG、Agent、Guard等组件化集成,快速构建一站式应用。MaaS平台广泛适用于以下行业和场景:政务:赋能政务智能决策,提升社会治理精准化水平。金融:驱动风险防控智能化,构建高效金融服务体系。电力:优化能源智能调度,保障电力系统安全运行。医疗:突破精准辅助诊疗边界,构建智慧医疗新范式。此外,MaaS平台还提供MaaS应用体验中心,为具体的应用场景提供一整套解决方案,如KooSearch企业搜索服务、盘古数字人大脑和Dify等,帮助客户快速解决模型落地应用时所面临的业务及技术挑战。华为云ModelArts Studio大模型即服务平台(MaaS)通过集成主流大模型、提供零代码开发环境、一站式模型服务和灵活的资源配置,极大地降低了企业AI应用的门槛,加速了AI技术的落地与应用。无论是初创企业还是大型机构,MaaS平台都是实现智能化转型的有力工具。四.仓颉语言 × DeepSeek:智能聊天助手开发全流程解析在本节中,我们将基于华为云 ModelArts Studio 大模型即服务平台,借助仓颉语言与 DeepSeek 模型,完成智能聊天助手的从零到一搭建与调试全过程。以下操作步骤详尽而直观,助您快速上手。4.1 登录 ModelArts Studio 平台打开华为云控制台,进入 ModelArts Studio 大模型即服务(MaaS)平台。在左侧导航栏,选择 模型推理 > 在线推理。4.2 选择 DeepSeek-R1-32K 模型在在线推理页面中,您会看到包含 商业服务 与 免费服务 两类选项。本示例中,我们使用较高算力与更长上下文的 商业服务。滚动服务列表,找到并点击 DeepSeek-R1-32K 对应的调用说明。记录下关键接口信息:牢记其API地址与模型名称API地址 https://api.modelarts-maas.com/v1/chat/completions 模型名称 DeepSeek-R14.3 创建并获取 API Key在页面左下,点击 API Key 管理。点击 新建 API Key,填写名称与描述后确认。系统生成的 Key 仅能查看一次,请务必妥善保存。牢记密匙,只出现一次。后续需要填到代码中。4.4 克隆示例仓库并打开项目在云主机环境中打开终端(Terminal Here)。执行以下命令,将示例代码仓库克隆至本地:打开Open Terminal Here,克隆项目到本地git clone https://gitcode.com/CaseDeveloper/Cangjie-Examples.git使用云主机预装的仓颉IDE打开克隆到本地的项目工程目录如下4.5 配置 config.json在项目根目录中,定位并打开 config.json 文件。按照前面记录的 API 地址、模型名称与 API Key,逐项填入对应字段:{ "model": "DeepSeek-R1", "api_key": "PFLsP3QVe6S5KU3AFmDMvoP9-4LnzqnwEnrxohTYKvSenMLZVzFt0QzQM2l9vhBH4u4WCphazC9pr4bbbOscuw", "base_url": "https://api.modelarts-maas.com/v1/chat/completions", "system_prompt": "你是我的全能助手,你的名字叫仓颉。仓颉编程语言是一款面向全场景智能的新一代编程语言,主打原生智能化、天生全场景、高性能、强安全。主要应用于鸿蒙原生应用及服务应用等场景中,为开发者提供良好的编程体验。须保持回复简洁,回复内容不超过300字。" } 提示:注意 JSON 中的引号与逗号格式,确保无多余空格或注释。4.6 运行并测试聊天助手回到项目根目录,执行主程序:cj run main.cj程序启动后,您将看到命令行提示,输入对话内容即可与 DeepSeek 模型交互。例如:你好,你怎么看目前华为的鸿蒙操作系统呢?程序会将您的问题发送至 DeepSeek-R1,并在终端显示模型的回复:这个模型的回答非常出色,它不仅将每一步操作细化到位,还贴心地添加了实用提示和示例截图,帮助读者在实践过程中少走弯路。文中逻辑清晰、层次分明,从平台登录、模型选择、Key 管理到项目运行一气呵成,让人一目了然;同时强调了关键注意事项,既专业又贴心,真正做到了“简单易懂又不失深度”,非常优秀!4.7 从“零”到“一”的智能助手构建旅程在本章节中,我们以仓颉语言为开发基石,结合华为云 ModelArts Studio 平台与 DeepSeek-R1-32K 大模型,完整实现了一个智能聊天助手的开发与运行。整个过程不仅涵盖了 模型选择与接入、API Key 配置、项目代码部署 等关键步骤,还充分体现了仓颉语言在智能场景下的高效与可扩展性。这一过程的成功实施表明:借助云端大模型服务与本地轻量化 IDE 的融合,我们可以以极低的门槛快速落地一个功能完备的 AI 助手系统,为未来更复杂的多模态智能应用打下良好基础。📌 总结:构建你的专属 AI 助手,从“零”到“一”的实战指南本文以实战案例为核心,详尽阐述了一个完整的 AI 聊天助手开发流程,涵盖从环境搭建到模型接入、从代码编写到终端测试的全过程。文章内容层次清晰,步骤详尽,结合大量图示与代码示例,为开发者提供了可复现的操作路径和最佳实践。在开发工具选择方面,文章充分发挥了 华为云开发者空间云主机的免配置优势,并以 仓颉语言作为智能逻辑编写基础,有效降低了传统开发门槛;同时借助 ModelArts Studio MaaS 平台接入高性能的 DeepSeek-R1 模型,实现了真正意义上的“专属 AI 助手”。该案例不仅展示了仓颉语言与大模型结合的技术可行性,也为未来更多智能应用的快速原型验证和迭代提供了现实参考。整体上,这是一篇适合 AI 初学者、教育教学场景,乃至中小企业技术落地的高价值开发指南。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
  • [技术干货] 在华为开发者空间,使用鲲鹏BoostKit提升Web项目性能
    案例介绍本案例指导开发者如何在云主机上进行鲲鹏服务器配置环境和安装KAE加速引擎软件并验证加速效果。案例内容1 概述1.1 背景介绍鲲鹏BoostKit Web使能套件聚焦Web应用HTTPS连接性能和Web开源组件可用性等关键问题,提供Web主流组件的开源使能和性能调优指南,通过使能鲲鹏处理器内置的KAE加速引擎软件,帮助客户提升Web网站的安全性,并实现用户HTTPS访问的极致体验。案例主要依赖集成在华为鲲鹏处理器内部的鲲鹏加速引擎来实现,具有性能高、功耗低的特点。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计20分钟。1.4 案例流程说明:① 登录开发者空间;② 使用云主机终端连接鲲鹏服务器;③ 在鲲鹏云服务器上配置安装环境;④ 从代码托管平台gitee上拉取代码安装KAE加速引擎。1.5 资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)云主机2vCPUs | 4GB RAM免费20鲲鹏沙箱2vCPUs | 4GB免费202 操作步骤2.1 自动部署鲲鹏服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password abcd1234@ --time 1800命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前案例预估需要20分钟,为了保证时间充足,在命令中申请的时间为30分钟,即1800秒。该命令会自动部署鲲鹏服务器。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署远端服务器公网IP,如截图中对应的就是:121.37.166.205。2.2 配置安装环境新打开一个命令窗口,在命令窗口中输入命令登录鲲鹏服务器,命令如下:ssh root@鲲鹏服务器公网IP输入密码,密码为步骤2.1中自动部署命令行中“–password”后面的参数,命令中给出的默认为abcd1234!,如果没有修改,就使用abcd1234@进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。登录成功后首先安装依赖包,命令如下:yum -y install kernel-devel.aarch64 wget pciutils由于该案例需要OpenSSL版本升级至1.1.1a或者以上,所有先查看OpenSSL版本,命令如下:openssl versionCentOS系统自带的OpenSSL版本为1.0.2k-fips,本文以升级到1.1.1a版本为例,命令如下:cd /homewget https://codeload.github.com/openssl/openssl/tar.gz/OpenSSL_1_1_1a --no-check-certificate将下载的源码包重命名,命令如下:mv OpenSSL_1_1_1a openssl-OpenSSL_1_1_1a.tar.gz解压OpenSSL源码包,命令如下:tar -xvf openssl-OpenSSL_1_1_1a.tar.gz进入“openssl-OpenSSL_1_1_1a”目录,并配置OpenSSL,命令如下:cd openssl-OpenSSL_1_1_1a/./config编译安装:make -j60 && make -j60 install配置ld.so.conf文件,命令如下:echo "/usr/local/lib/" \>\> /etc/ld.so.confldconfig -v使OpenSSL生效,先将OpenSSL添加到环境变量中,命令如下:echo export PATH=/usr/local/bin:\\\$PATH \>\> /etc/profilesource /etc/profile以上步骤完成后我们就可以验证下版本升级是否成功,出现下图版本信息就说明升级成功了,命令如下:openssl version2.3 安装KAE加速引擎软件首先下载RPM包(以CentOS 7.6系统的1.3.11版本为例),命令如下:cd /home/wget https://gitee.com/kunpengcompute/KAE/releases/download/v1.2.10/kae_1.3.11_CentOS.7.6.4.14.0-115.el7a.0.1.zip --no-check-certificate解压,命令如下:unzip kae_1.3.11_CentOS.7.6.4.14.0-115.el7a.0.1.zip进入解压目录,注意,由于文件名带空格所有需要加单引号:cd 'kae_1.3.11_CentOS 7.6 4.14.0-115.el7a.0.1'安装全部的RPM包,命令如下:rpm -ivh \*.rpm查看内核态库文件,命令如下:ll /usr/local/lib/engines-1.1/配置环境变量,命令如下:vi /etc/profile打开文件后点击“i“进入编辑模式,添加如下内容,键盘点击ESC,输入”:wq“保存退出:export OPENSSL_ENGINES=/usr/local/lib/engines-1.1生效环境变量,命令如下:source /etc/profile配置OpenSSL调用KAE加速库(即配置OpenSSL的环境变量),首先新建OpenSSL配置文件,命令如下:vim /home/openssl.cnf按“i”进入编辑模式,将KAE加速器相关内容写入OpenSSL配置文件:openssl_conf=openssl_def[openssl_def]engines=engine_section[engine_section]kae=kae_section[kae_section]engine_id=kaedynamic_path=/usr/local/lib/engines-1.1/kae.sodefault_algorithms=ALLinit=1按“ESC”键,输入:wq!,按“Enter”保存并退出编辑。查看OpenSSL配置文件,确认配置是否成功:cat /home/openssl.cnf然后将文件配置到环境变量中,打开profile文件:vi /etc/profile添加如下内容,保存退出:export OPENSSL_CONF=/home/openssl.cnf生效环境变量:source /etc/profile查看环境变量是否配置成功,出现如下内容说明配置成功了:echo \$OPENSSL_CONF至此所有配置已全部完成,下面我们来看看效果吧!2.4 验证结果RSA2048算法性能测试的同步性能测试,首先命令如下:\#不调用KAE加速openssl speed -elapsed rsa2048\#指定kae引擎,从而调用KAE加速openssl speed -elapsed -engine kae rsa2048从上图可以得出使用KAE加速和不使用速度是不一样的,我们对比发现,不使用加速情况下时间是28491.0秒,而在使用了加速情况下只使用了19673.5秒,所以在使用KAE加速引擎情况下,不论在处理速度上或者处理时间上都显著提高。同理进行异步性能测试,命令如下:\#不调用KAE加速openssl speed -elapsed -async_jobs 36 rsa2048\#指定kae引擎,从而调用KAE加速openssl speed -engine kae -elapsed -async_jobs 36 rsa2048在异步性能测试中也有明显的区别,如图所示,在不使用加速情况每秒处理速度是689.5次/秒,二使用加速情况下可达到709.5/秒。至此,使用鲲鹏BoostKit提升Web项目性能全部完成。
  • [案例共创] 【案例共创】基于华为开发者空间+DeepSeek:打造全链路高效数据分析工作流
    前言在当今这个数字经济时代,数据无疑成为企业最核心的资产之一。面对激烈的市场竞争,企业若想精准决策,迅速响应市场变化,就必须依赖高效的数据分析能力。数据分析不仅能够帮助企业洞察市场趋势、预测消费者行为,更可以优化运营效率,降低成本,提升企业的整体竞争力。举个简单的例子:以某服装电商为例:双十一前夕,数据分析师发现一个关键趋势——平台上’oversized卫衣’的搜索量在过去一周内激增了300%,但转化率却只有2.1%,远低于平均水平的5.8%。通过深入分析用户行为轨迹,团队发现问题所在:用户在商品详情页的平均停留时间只有15秒,且90%的用户会点击尺码表后直接关闭页面。进一步调研发现,消费者对’oversized’的具体版型理解存在偏差,担心买到的衣服过大或过小。基于这一洞察,企业立即调整策略:在商品页面增加真人试穿视频,标注模特身高体重及穿着尺码;优化尺码表,用’宽松度对比图’替代传统数据表格;针对搜索’oversized卫衣’的用户推送’30天无理由退换’的专属服务。结果在48小时内,该品类的转化率提升至6.2%,销量环比增长了180%。而没有及时响应这一数据信号的竞争对手,则错失了这波流量红利。这个成功案例的背后,反映出高效数据分析工作流的重要性。然而,在实际的数据分析实践中,许多企业和开发者仍面临着诸多挑战:从数据采集、清洗、建模到可视化展示,每个环节都可能成为效率瓶颈。如何构建一套流畅、智能的全链路数据分析工作流,正成为当下亟待解决的关键问题。本文将深入探讨华为开发者空间与DeepSeek的强强联合,如何助力打造全链路高效数据分析工作流,帮助开发者和企业在数据驱动的道路上走得更快、更稳。数据分析链路中存在哪些典型痛点?尽管数据分析的重要性已经得到普遍认可,但现实中企业在数据分析链路中仍面临诸多具体的挑战:首先,数据采集与处理难度大。企业的数据通常散落在各类系统和业务平台中,这些数据格式多样且杂乱无章,数据往往分散在ERP、CRM、电商平台、社交媒体、IoT设备等多个系统中,数据格式千差万别(结构化、半结构化、非结构化),数据标准不统一。获取这些数据需要对接各种API接口,配置复杂的ETL流程,整个过程耗时耗力。企业需要花费大量时间和精力去获取、清洗和整合数据,确保数据的准确性和一致性。这种繁琐而耗时的数据预处理环节严重拖慢了整体数据分析效率。其次,分析过程繁琐复杂,从数据预处理到建模分析,再到结果验证,往往需要使用多种不同的工具和平台(如Python、R、SQL、Tableau、PowerBI等),工具间切换频繁,学习成本高,协作效率低。析过程往往缺乏标准化流程和版本管理,同一个分析任务在不同时间、不同人员操作下可能产生不同结果,影响分析结果的可信度和可复现性。此外,数据分析人才短缺也是企业普遍面临的问题。纯技术背景的分析师往往缺乏对业务场景的深度理解,而业务专家又缺乏数据分析的技术能力,导致分析结果与业务需求之间存在较大鸿沟。专业的数据分析师招聘难度大、成本高,并且培养周期较长,企业难以快速组建起有效的数据分析团队,进一步加剧了数据分析能力的瓶颈。最后,分析结果的可视化程度较低。数据分析结果如果无法直观清晰地呈现给决策者,数据分析往往涉及IT、业务、管理等多个部门,缺乏统一的协作平台和标准化流程,沟通成本高,项目推进缓慢。以上痛点使得企业亟需更高效、更智能、更简单的数据分析解决方案。如何利用云计算、人工智能等新兴技术,打造一套全链路、低门槛、高效能的数据分析工作流,已成为当下数字化转型的关键课题。华为开发者空间与DeepSeek的技术基础华为开发者空间是面向全球开发者打造的专属空间,其技术基础具有多方面特性。它汇聚了鸿蒙、昇腾、鲲鹏、GaussDB、欧拉等各项根技术的开发资源及工具。在硬件资源层面,依托华为强大的技术实力,能为开发者提供性能强劲的云主机,保障开发过程中的计算需求,无论是复杂的模型训练,还是大规模的数据处理,都能高效运行。在开发工具方面,提供了一站式的开发环境。以 CodeArts IDE for Cangjie 编辑器为例,它不仅具备常用的语法高亮、错误诊断、自动补全等功能,可实时反馈并提升开发效率,还支持反向调试,方便开发者查看历史调试信息。并且,该编辑器被预置在云主机环境中,开发者开箱即用,极大降低了开发的前期准备成本。同时,开发者空间还集成了丰富的命令行工具,满足不同开发者多样化的开发习惯和复杂的开发需求。此外,华为开发者空间提供了从开发编码到应用调测的配套案例,结合其云上存储空间,形成了一个完整的开发闭环。开发者可以基于这些资源,在华为根技术生态下高效便捷地进行知识学习、技术体验以及应用创新。在利用华为开发者空间提供的云主机开发 DeepSeek 技术时,可从多维度实现两者的有机融合。华为开发者空间性能强劲的云主机,能为 DeepSeek 技术开发提供坚实的硬件支撑。预置的 CodeArts IDE for Cangjie 编辑器具备语法高亮、错误诊断、自动补全等功能,还支持反向调试,方便开发者对 DeepSeek 模型开发过程进行调试和优化。集成的丰富命令行工具,可满足 DeepSeek 开发中不同场景的需求。从开发闭环角度看,华为开发者空间从开发编码到应用调测的配套案例,结合云上存储空间,为 DeepSeek 技术开发提供了完整的流程支持。开发者可借助这些资源,在华为根技术生态下,更高效地进行 DeepSeek 模型的知识学习、技术体验以及应用创新。同时,DeepSeek 完全开源 R1 等模型、采用 MIT 协议的开源策略,与华为开发者空间的开放生态相契合,开发者可在云主机环境中自由定制和二次开发 DeepSeek 模型,进一步推动技术共享与协作。开放的 API 定价优势,也能让更多中小企业在华为开发者空间云主机上开发和应用 DeepSeek 技术,降低进入 AI 领域的门槛,促进 DeepSeek 在各行业的广泛应用。全链路高效数据分析工作流搭建与应用实践1.配置云主机首先进入到开发者空间,之后点击工作台,开始配置云主机:配置相应的云主机:以上系统模拟我们开发生产环境的主要机器,之后我们来开始一步步搭建,首先进入到云开发空间里面,打开终端界面,输入curl -fsSL https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0035/install.sh | sudo bash2.下载ollama先下载ollama下载完毕之后我们可以借助 Ollama 工具来部署 Deepseek 大模型,部署 deepseek-r1:1.5b 版本,如果硬件支撑可以部署更高效的模型,执行命令:ollama run deepseek-r1:1.5b以上我们就部署完了,可以尝试输入prompt来测试效果:通过命令:sudo netstat -tunlp可以查看olloama开放的本地端口:3.CodeArt IDE for Python那么接下来我们可以打开CodeArt IDE for Python,对端口进行通信,完成这一步之后我们可以开始尝试构建智能体:我们知道ollama serve默认监听地址为 http://localhost:11434,首先下载requests库:pip install requests我们可以通过Python代码尝试通信:import requests def chat_with_ollama(prompt, model="deepseek-r1:1.5b"): url = "http://localhost:11434/api/generate" headers = { "Content-Type": "application/json" } data = { "model": model, "prompt": prompt, "stream": False # 关闭流式返回,适合简单测试 } try: response = requests.post(url, json=data, headers=headers) response.raise_for_status() result = response.json() print("模型回复:", result["response"]) except requests.exceptions.RequestException as e: print("❌ 请求出错:", e) except Exception as e: print("❌ 其他错误:", e) if __name__ == "__main__": test_prompt = "你好" chat_with_ollama(test_prompt) 如何能获取到大模型输出,说明我们之前的过程都没有问题:4.工作流搭建.那么我们下一步就可以开始全链路高效数据分析工作流搭建了:4.数据获取/清洗/提取首先我们可以思考数据获取层,这方面可以是企业存储数据和历史数据,也可以爬取互联网上相关信息数据,这方面不需要AI介入,而数据清洗和提取就可以通过大模型完美替代,而且清洗提取特别高效。我们可以将这个 Agent 封装为一个 Python 类,支持如下功能:功能说明clean_text(text)文本清洗:去除空格、标点符号、HTML、无用词等extract_fields(text, instruction)利用大模型提取指定结构信息(如姓名、地址、公司名等)batch_process(data_list)支持批量数据清洗和字段抽取custom_prompt(data, task)通过自定义任务 prompt 构造更复杂的清洗与抽取任务具体代码可以如下编写:import requests import re class DataCleaningAgent: def __init__(self, model_name="deepseek-r1:1.5b", host="http://localhost:11434"): self.model = model_name self.api_url = f"{host}/api/generate" def _call_model(self, prompt, stream=False): payload = { "model": self.model, "prompt": prompt, "stream": stream } try: response = requests.post(self.api_url, json=payload) response.raise_for_status() result = response.json() return result.get("response", "").strip() except Exception as e: print("调用失败:", e) return "" def clean_text(self, text): """ 基础清洗:去除HTML标签、特殊字符、重复空格等 """ text = re.sub(r"<.*?>", "", text) # 去HTML text = re.sub(r"\s+", " ", text) # 合并空格 text = re.sub(r"[^\w\s\u4e00-\u9fff]", "", text) # 去除特殊符号 return text.strip() def extract_fields(self, text, instruction="请从中提取所有公司名称和联系人"): """ 调用LLM进行字段提取 """ prompt = f"以下是原始数据:\n{text}\n\n{instruction}" return self._call_model(prompt) def batch_process(self, data_list, instruction): results = [] for i, text in enumerate(data_list): print(f"处理第{i+1}条数据...") cleaned = self.clean_text(text) extracted = self.extract_fields(cleaned, instruction) results.append({ "original": text, "cleaned": cleaned, "extracted": extracted }) return results # 示例调用 if __name__ == "__main__": agent = DataCleaningAgent() sample_data = [ "联系人:张三,联系电话:123456789,公司:江西省招标有限公司", "地址:南昌市东湖区,北京华为技术有限公司,联系人王五" ] instruction = "请提取所有公司名称和联系人姓名,返回JSON格式" results = agent.batch_process(sample_data, instruction) for res in results: print("\n原始:", res["original"]) print("清洗后:", res["cleaned"]) print("提取信息:", res["extracted"]) 大家可自行验证:4.2 数据库读取SQL清洗完毕之后我们将数据转入库中即可,那么这是建立在我们需要收集外部数据的情况下设置的数据清洗和提取智能体,大部分企业是有存储自己业务数据的,一般直接放置在数据库中。但是获取这部分数据需要比较繁琐的步骤,一般来说数据分析师通过编写SQL获取,但也有不是数据分析师的客户或者是企业管理者想直接拿到数据分析,为了降低数据分析的门槛,我们可以直接设定一个获取数据的智能体,返回给我们基础数据。简而言之就是构建一个自然语言 → 数据库查询 → 自动执行SQL → 返回结果的智能体系统,为企业管理者、运营、产品等非技术用户提供低门槛的数据访问能力。需要注意的是这对我们的Prompt以及知识库要求较高,这里需要我们根据企业业务数据库去制作一份对应的数据字典,也就是说这份数据字典是包含所有业务数据字段的解释和各个表模块的介绍。这里给出一部分的Prompt示例:请根据下方表结构,从表 `sales_data` 中查询 2024 年每个月的销售总额和增长率: 表结构: CREATE TABLE sales_data ( id INT, sale_date DATE, amount DECIMAL, region VARCHAR(50) ) 问题: 2024年每个月的销售额是多少?同比去年增长了多少? 我们可以先解决需要代码编写的部分,比如执行层Python 实现数据库访问和结果返回:from sqlalchemy import create_engine import pandas as pd def execute_sql(sql: str, db_url: str): engine = create_engine(db_url) with engine.connect() as conn: df = pd.read_sql_query(sql, conn) return df 组件含义sqlalchemy.create_engine创建数据库连接对象,支持多种数据库(如 MySQL、PostgreSQL、SQLite)db_url数据库连接字符串,格式示例: mysql+pymysql://user:password@host:port/dbnamepd.read_sql_query(sql, conn)使用 pandas 执行 SQL 语句并将结果返回为 DataFrameconn数据库连接上下文,自动管理连接释放返回值 df查询结果组成的 DataFrame,可用于打印、导出、图表分析等调用实例如下:sql = "SELECT region, SUM(amount) as total FROM sales_data GROUP BY region" db_url = "mysql+pymysql://root:123456@localhost:3306/mydb" df = execute_sql(sql, db_url) print(df) 之后我们可以封装DeepSeek大模型,封装成一个DataQueryAgent,示例:class DataQueryAgent: def __init__(self, db_url: str, model_host="http://localhost:11434", model="deepseek-r1:1.5b"): ... def _generate_sql(self, question: str, schema_hint: str = ""): ... def query(self, question: str, schema_hint: str = ""): ... 设定面向用户的“自然语言问数据库”的封装类,封装了SQL生成 + 执行 两个流程。__init__ 方法比较简单定义:def __init__(self, db_url: str, model_host="http://localhost:11434", model="deepseek-r1:1.5b"): self.db_url = db_url self.model_host = model_host self.model = model _generate_sql() 方法就是完成功能(自然语言 → SQL)def _generate_sql(self, question: str, schema_hint: str = ""): prompt = f"根据以下数据库结构:\n{schema_hint}\n请生成对应SQL语句来回答问题:{question}" response = requests.post(f"{self.model_host}/api/generate", json={ "model": self.model, "prompt": prompt, "stream": False }) return response.json().get("response", "") 用本地部署的 DeepSeek 模型,将自然语言问题 + 数据库结构作为 Prompt,发送请求后解析返回结果为 SQL。query() 方法完成整个工作流(完整工作流:问题 → SQL → 查询结果)def query(self, question: str, schema_hint: str = ""): sql = self._generate_sql(question, schema_hint) print("生成的SQL:", sql) try: engine = create_engine(self.db_url) with engine.connect() as conn: df = pd.read_sql_query(sql, conn) return df except Exception as e: return f"SQL 执行失败: {e}" 示例调用:agent = DataQueryAgent( db_url="mysql+pymysql://root:password@localhost:3306/mydb" ) schema_hint = """ CREATE TABLE orders ( id INT, customer_name VARCHAR(50), amount DECIMAL(10,2), order_date DATE, status VARCHAR(20) ); """ question = "查询今年每个月的订单总金额" df = agent.query(question, schema_hint) print(df) 这样我们就得到一个完整的dataframe,之后我们就可以很轻松对其进行数据可视化了。4.3 DataFrame 可视化智能体(Visualization Agent)也可以将DataFrame 交给大模型智能体,让它根据数据内容决定可视化方式,并自动生成图表代码(如用 matplotlib / plotly / seaborn)。这种做法本质上就是构建一个 DataFrame 可视化智能体(Visualization Agent),它能够结合数据结构、字段含义与任务需求,为用户自动设计图表并呈现。具体实现逻辑很简单:DataFrame → LLM → 图表自动生成。构建可视化智能体类:import requests import pandas as pd import contextlib import io import traceback class VisualizationAgent: def __init__(self, model_host="http://localhost:11434", model="deepseek-r1:1.5b"): self.model_host = model_host self.model = model def _generate_plot_code(self, df: pd.DataFrame, task_description: str): # 将 df 转为 CSV 方便 LLM 解析 csv_data = df.to_csv(index=False) prompt = f""" 你是一个数据分析专家,以下是CSV格式的数据,以及用户的可视化需求。请根据这些数据生成 Python 绘图代码,使用 matplotlib(优先)或 plotly。 用户需求:{task_description} CSV数据如下:{csv_data} 请返回完整可运行的 Python 绘图代码: """ response = requests.post(f"{self.model_host}/api/generate", json={ "model": self.model, "prompt": prompt, "stream": False }) return response.json().get("response", "") def _safe_exec(self, code: str, local_vars=None): """ 安全执行模型生成的代码 """ local_vars = local_vars or {} global_vars = {"__builtins__": __builtins__, "pd": pd} try: # 重定向输出,避免污染控制台 with contextlib.redirect_stdout(io.StringIO()) as f: exec(code, global_vars, local_vars) except Exception as e: print("⚠️ 代码执行错误:") traceback.print_exc() def visualize(self, df: pd.DataFrame, task_description: str = "绘制销售额柱状图", show_code: bool = True): code = self._generate_plot_code(df, task_description) if show_code: print("模型生成绘图代码:\n") print(code) print("\n正在执行绘图代码...") self._safe_exec(code, local_vars={"df": df}) 使用示例if __name__ == "__main__": df = pd.DataFrame({ "region": ["华东", "华南", "华北", "西南"], "sales": [120000, 95000, 78000, 67000] }) agent = VisualizationAgent() agent.visualize(df, task_description="请生成一个地区销售额柱状图") 当运行这段代码后,它将调用模型生成图表代码,并自动执行、展示图表。5.总结在本章中,我们把“想法”一步步落地成了一条 端到端的智能数据分析流水线:环境就绪——先在云开发空间上快速拉起一台高配云主机,借助 curl install.sh 一键初始化开发环境,再用 Ollama 把 Deepseek-r1:1.5b 模型部署好并通过 netstat 确认端口;模型打通——用最简洁的 requests 脚本验证模型能正常对话,确保后面所有智能体都能调用;数据获取 & 清洗——编写 DataCleaningAgent,让大模型接管繁琐的文本去噪、实体抽取,批量输出结构化 JSON;自然语言查库——通过 DataQueryAgent 把 “一句中文 → SQL → DataFrame” 自动串起来,让非技术同事也能秒查运营数据;智能可视化——把查询得到的 DataFrame 交给 VisualizationAgent,由大模型自动产出 Matplotlib/Plotly 代码并即时执行,图表立现;全链路闭环——至此,数据从 获取 → 清洗 → 入库 → 查询 → 展示 全程自动化完成,真正实现了“低门槛、高效率、可复用”的企业级数据分析工作流。关键收益零 SQL / 零绘图门槛:业务人员只需说人话,背后全部自动完成。高度可插拔:每个 Agent 都是独立模块,清洗、查询、可视化可按需组合或替换更强模型。私有化可控:全部部署在企业自己的云主机与数据库内,安全合规。企业实战案例分享基于以上我们全链路的数据分析工作流的搭建,我们已经有足够的能力来实践一套供应链周报自动生成系统。一句话目标:让供应链经理把“写周报”这件事,彻底交给代码和大模型——数据自己来、图表自己画、结论自己写,人只需要点头确认。1. 背景与痛点典型痛点传统做法带来的问题数据源多、格式乱手动从 ERP / WMS / OMS 导出 Excel粗糙拼表、易漏字段,费时费神维度多、指标杂人肉写 SQL 拉数据运营/采购不懂 SQL,严重依赖数据团队图表重复劳动“复制数据 → 贴进模板 → 调样式”一键回车变成一上午文字结论经理凭经验手写主观、易漏看趋势结果:一个 10 页左右的供应链周报,往往要 3-4 人、费时半天才能端出来。2. 解决思路 :全链路工作流上场3. 核心模块落地3.1 数据清洗 & 入库接入源:ERP(采购、到货)、WMS(库存)、OMS(销售订单)工具:DataCleaningAgent任务:消歧同品名、规格(“A4纸80g” = “A4-80g”)解析自然语言备注,提取 供应商投诉 字段输出标准化 CSV,按天入 supply_dw 数据仓库3.2 自然语言取数使用者:采购经理、供应链分析师典型问句“近 12 周每周的采购金额与去年同期对比”“本周供应商到货准时率前 5 & 后 5”流程DataQueryAgent 读取 数据字典(自动生成或手写)Deepseek 模型根据问句 + Schema → 生成 SQL执行后返回 DataFrame示例快速验证:question = "列出最近4周库存周转天数趋势" schema_hint = "TABLE inv_summary(id, item, turnover_days, stat_week)" df_turnover = agent.query(question, schema_hint) 3.3 自动可视化 + 结论生成VisualizationAgent:DataFrame → 图表代码 → 即时渲染支持多图联排、双轴折线、漏斗、热力地图结论生成:再次调用 Deepseek:prompt = f"下面是近12周库存周转天数表格,请用200字生成总结性分析:\n{df.to_markdown()}" summary = llm(prompt) 3.4 报告编排 & 交付ReportBot(Python):收集所有图 PNG + 文字结论用 python-pptx 拼成周报 Deck,或 WeasyPrint 导出 PDF调用企业 IM / 邮件 API:“Hi @Team,本周周报已生成 👉 链接/附件”调度:Crontab / Airflow 每周一早 8 点自动跑4.关键代码骨架一览def weekly_report(): # 1. 拉取核心指标 metrics = { "采购金额": query_agent.query("近4周采购金额趋势", sales_schema), "到货准时率": query_agent.query("近4周到货准时率", inbound_schema), "库存周转": query_agent.query("近12周库存周转天数", inv_schema) } # 2. 生成图表 charts = {} for k, df in metrics.items(): charts[k] = viz_agent.visualize(df, f"绘制{k}折线图", show_code=False) # 3. AI 书写摘要 summary = llm("请基于以上三张表和图,总结供应链本周主要问题及建议") # 4. 组装 PPT ppt = build_ppt(charts, summary) ppt.save("weekly_supply_report.pptx") # 5. 送达 send_mail("weekly_supply_report.pptx", to=["boss@corp.com"]) 5. 效果速览指标传统方式全链路自动化周报产出时长≈ 4 小时 / 人≤ 10 分钟 / 机器参与人数运营 + 数据 + 设计0(无人值守)可追溯性低(手改 Excel)高(SQL + Git + 日志)结论一致性人工主观AI 根据数据重算6. 实施要点 & 踩坑提示数据字典必须够详细字段含义、单位、取值范围,一定要让大模型“看得懂”。SQL 安全在执行层加白名单,只允许 SELECT。图表代码安全执行VisualizationAgent 内部要过滤 os, subprocess 等危险关键字。权限管理建议给每个调用者分配专属 API Key + 查询范围。缓存/增量机制周报通常是“滚动周”,可以把前 N-1 周的数据缓存,速度更快。7. 价值回顾“让系统写报告,人来做决策。”效率:周报自动产出,数据团队有更多时间做深度分析。准确:口径统一、自动核对,避免手抄表格出错。透明:从原始数据到图表代码全链路留痕,可追溯可复盘。可扩展:同样的框架可复制到财务、营销、客服,形成企业级“智能报告工厂”。下一步,如果你想把这套系统推广到其他业务线,只需要:补充新表的 Schema;编写对应的 KPI Prompt;在调度器里新增定时任务。实践建议与关键技术要点总结大模型优化方法众多(如剪枝、量化、算子融合等),但没有 “通用最优解”。选择优化策略时,需结合业务需求、硬件条件、成本等多维度因素,避免盲目追求技术先进性而忽视实际效果。1应用场景导向应用场景导向的核心逻辑是不同场景对模型性能的需求不同,优化目标需与场景匹配。实时交互场景(如聊天机器人、自动驾驶):需低延迟,优先选择模型量化、算子融合或模型蒸馏。批量处理场景(如离线数据分析、大规模预测):需高吞吐量,可采用模型并行或动态批处理。边缘部署场景(如手机、物联网设备):受限于算力和能耗,需模型压缩+ 轻量级架构设计。若部署一个需要实时响应的智能家居语音助手,即使模型精度略低,也应优先选择量化和剪枝,以确保推理速度。2成本与性能平衡成本与性能平衡的核心逻辑是不同硬件对优化方法的支持程度不同,需充分发挥硬件优势。GPU/TPU 等加速硬件适合算子融合、模型并行等需要高并行计算的优化方法。边缘设备则需模型轻量化(剪枝、量化)+ 轻量级推理框架(如 TensorFlow Lite),避免复杂计算。CPU 服务器可选择多线程优化或内存优化(如 onnxruntime 的 CPU 优化)。比如在 GPU 集群上部署大模型时,使用 TensorRT 进行算子融合和图优化,能显著提升推理速度;而在手机端部署时,使用量化后的模型和 MNN 框架更合适。3. 实际应用中的综合决策在实际部署中,需结合多个原则进行权衡。比如自动驾驶公司需在车载设备(边缘硬件)上部署实时目标检测模型:场景导向:选择低延迟优化,如模型剪枝和量化。硬件匹配:针对车载芯片的架构,使用专用优化工具(如 Nvidia 的 TensorRT 针对 GPU 优化)。成本平衡:通过蒸馏轻量化模型,降低对高端硬件的依赖,控制成本。扩展性:设计可动态调整的流水线,未来若更换传感器或算法,可快速适配。这四个原则为大模型优化提供了从场景需求到技术落地的完整思考路径:以场景为起点,结合硬件和成本约束,选择灵活可扩展的方案。通过这种系统性的决策,企业既能在当下实现高效部署,又能为未来的业务增长预留技术空间。智能体编排未来应用趋势随着大模型从“一个聪明的回答机”逐步进化为“面向任务的执行体”,多智能体编排(Agent Orchestration) 正成为新一轮 AI 应用变革的核心引擎。相比传统单模型调用逻辑,智能体编排更像是构建“具身智能系统”或“数字员工团队”,将感知、思考、决策与执行完整串联起来,实现从“回答你”到“替你做”的飞跃。在我们展示的数据分析系统中,其实已经具备“雏形智能体”的要素:如 DataCleaningAgent、DataQueryAgent、VisualizationAgent 等等。这些模块虽然是按功能划分,但本质上已经具备“接收任务 → 理解意图 → 执行操作 → 返回结果”的 Agent 行为模式。而在更复杂的未来业务中,一个任务往往无法由单个智能体完成,这时需要:多个 Agent 分工合作、传递信息、联合完成复杂任务,甚至具备自治能力。比如在一个“企业经营分析”智能系统中:角色智能体职责说明任务协调 Agent(Coordinator)理解高层命令,如“生成月度经营报告”,并拆解成子任务数据智能体(Query Agent)根据需求调用数据库并返回 DataFrame图表智能体(Viz Agent)生成图表代码并渲染结果洞察智能体(Insight Agent)结合数据输出摘要分析与趋势判断报告生成 Agent汇总图表与文字,输出 Markdown/PPT/邮件等格式监控反馈 Agent记录执行日志、收集用户反馈并优化流程每一个 Agent 都是可复用的能力单元,而智能体间的协作流转由Agent Framework 或 编排平台调度控制。要真正落地多智能体协同系统,以下几个能力将成为技术团队不可回避的核心能力:意图解析能力需要将用户自然语言转化为结构化任务链(如 AWEL DSL、JSON Graph 等);任务拆解与分发能力使用树状或 DAG 结构,支持任务自动拆解与并发执行;智能体能力注册与调度机制类似“插件系统”,支持注册各类智能体,并调度调用;记忆与上下文管理实现智能体在多轮协作中共享上下文、传递中间变量;异常处理与回滚机制构建面向业务场景的“容错能力”,支持失败重试、断点续跑;安全与权限机制管理智能体访问数据的边界,防止越权调用或数据泄漏;未来的 AI,不再只是一个“回答者”,而是一个主动工作的“数字合作者”。从数据分析到知识总结,从任务执行到流程协同,我们已经看到多智能体系统开始扮演团队中的新角色。“让系统成为员工的一部分,而不仅仅是工具。”这不仅是数据智能化的进化方向,更是企业迈向新一代智能生产力时代的起点。下一阶段,智能体将不再只是调用函数的代理,而是逐步演化为具备推理、感知、社交能力的数字个体,真正融入业务、参与决策、持续学习与成长。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
  • [云实验室] 实验存储配置
    按操作步骤,结果存储配置只有”云盘EVS"。没有默认位置下面是教程中的图片
  • [技术干货] 秒级创建鲲鹏工程进行原生开发
    案例介绍本案例将以场景化工程样例中的通用工程SHA256为例来学习如何通过鲲鹏开发框架工具完成工程的创建、编译和运行。案例内容1 概述1.1 背景介绍鲲鹏开发框架是一款使能用户在鲲鹏服务器上进行开发的工具。鲲鹏开发框架充分利用鲲鹏平台的各类型算力及性能更优的第三方组件,提供鲲鹏工程向导、启发式编程、代码亲和检查等能力,一键引入鲲鹏加速库、快速构建鲲鹏应用软件框架,帮助开发者更便捷地开发鲲鹏应用,使能开发者高效创新。鲲鹏原生开发基于鲲鹏平台的新软件和新功能特性开发,应用鲲鹏DevKit工具把鲲鹏架构亲和性能充分体现的开发场景。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计30分钟。1.4 案例流程说明:① 自动部署鲲鹏服务器;② 安装鲲鹏Devkit插件;③ 登录DevKit工具;④ 创建工程;⑤ 编译工程⑥ 运行工程。1.5 资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)云主机2vCPUs | 4GB RAM免费302 操作步骤2.1 自动部署鲲鹏服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password abcd1234@ --time 1800命令的参数说明:password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。在命令中申请的时间为30分钟,即1800秒。该命令会自动部署鲲鹏服务器。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署鲲鹏服务器公网IP,如截图中对应的就是:113.44.86.210。2.2 安装鲲鹏Devkit插件由于CodeArts IDE在线安装的鲲鹏DevKit工具版本过低,所以需要前往鲲鹏社区官网下载最新鲲鹏DevKit插件到云主机,下载地址为:CodeArts IDE插件市场(https://marketplace.visualstudio.com/items?itemName=kunpengfamily.kunpeng-dev-kit&ssr=false#version-history)。如下图所示,进入到下载页面后选择最新版本进行下载。在云主机桌面,打开CodeArts IDE for Python/Java开发环境,单击右侧“扩展”按钮,点击从本地安装,选择下载好的插件安装。在弹窗中选择“继续安装”。2.3 登录DevKit工具点击左侧“鲲鹏Devkit”按钮,在配置指引页面点击“开始使用”。填写自动部署的远端服务器信息,点击“确定”。首次登录需要创建管理员密码。2.4 创建工程工具登录成功后,选择“开发”,在应用开发下点击“创建”工程,在鲲鹏应用工程下选择“通用计算应用”。在通用计算应用中选择“加速库应用”。在加速库应用中工程类别选择“模板工程”下的“信息摘要”,工程名称和位置自定义即可,点击“下一步”。配置目标节点界面,部署服务器选择“暂不部署”,点击“创建工程”。工程创建成功后,点击“打开工程”。即在工程打开SHA256_Project工程代码。2.5 编译工程点击“编译”弹出配置运行界面。远程服务器配置,点击“添加目标服务器”。在目标服务器管理界面,点击“添加目标服务器”。在弹窗中填写目标服务器的信息,服务器IP地址填写自动部署拉起的服务器IP,免费公私钥对选择自动生成,输入SSH用户名和密码,点击“确定”。点击“登录”连接目标服务器执行安装cmake命令。命令如下:sudo yum install cmake再次点击“编译”按钮,在远程服务器配置中选择目标服务器,保持默认的编译命令,点击“开始编译”,编译命令如下:cd /root/workspace/h/src/sha256/; mkdir -p build && cd build && cmake .. && make编译成功。2.6 运行工程点击“开发”-“运行”弹出配置运行界面。在远程服务器配置中选择目标服务器,其中应用程序填入刚编译完成的二进制文件/root/workspace/SHA256_Project/src/sha256/build/sha256(其中SHA256_Project为项目名称,请按照实际操作路径填写),应用程序参数填入用于测试的数据文件,可以为任意文件,本例以/home/devkit/libssl/libcrypto.so为例。填写完成后,点击“开始运行”。从结果看出,对比汇编实现的sha256算法所用时间和C实现的时间,性能提升明显。至此,秒级创建鲲鹏工程进行原生开发全部内容完成。
  • [案例共创] 【案例共创】基于华为开发者空间使用 FastAPI 构建 MCP 天气查询服务
    基于华为开发者空间使用 FastAPI 构建 MCP 天气查询服务案例介绍本案例将指导您在华为云开发者空间中使用 FastAPI 框架构建一个功能完整的 MCP(Model Context Protocol)天气查询服务。通过本案例,您将学会如何将传统的 REST API 转换为 MCP 工具,让 AI 模型能够实时获取天气信息并与用户进行智能交互。技术栈后端框架: FastAPI协议标准: MCP (Model Context Protocol)天气数据: 和风天气 API认证方式: JWT (JSON Web Token)客户端: Cherry Studio部署环境: 华为云开发者空间学习目标掌握 MCP 协议的基本概念和实现方式实现 AI 模型与外部服务的实时数据交互体验华为云开发者空间的开发便利性以及 Maas DeepSeek 模型服务的无缝集成案例内容1. 概述1.1 案例背景在传统的 AI 对话系统中,模型只能基于训练数据回答问题,无法获取实时信息。MCP 协议的出现解决了这一痛点,它允许 AI 模型通过标准化的接口调用外部工具和服务,获取实时数据。本案例选择天气查询作为示例,因为:实时性强: 天气数据需要实时获取,体现 MCP 的价值应用广泛: 天气查询是用户常见需求技术完整: 涵盖 API 调用、数据处理、错误处理等完整流程易于扩展: 可以基于此案例扩展更多功能1.2 适用对象企业用户:关注业务自动化、提升开发效率、集成AI能力,适合希望快速构建智能工具、提升企业数字化水平的团队。个人开发者:具备一定Python基础(或能借助 AI 辅助编程),关注技术创新与个人成长,适合希望掌握MCP协议、API开发与AI集成的开发者。高校学生:有编程基础(或能借助 AI 辅助编程),关注AI应用实践与创新能力培养,适合希望参与AI+云平台项目实训、提升综合开发能力的学生群体。1.3 案例时间准备阶段: 30 分钟(环境配置、账号注册)开发阶段: 20 分钟(代码编写、调试)测试阶段: 10 分钟(功能验证、MCP 集成)总计时间: 约 60 分钟1.4 案例流程环境准备API 注册项目初始化依赖安装核心代码开发JWT 认证实现天气接口开发MCP 集成本地测试客户端配置端到端验证1.5 资源总览本案例预计花费0元。资源类型名称/说明免费额度/价格备注开发资源华为云开发者空间0元免费注册使用Maas DeepSeek 模型服务0元免费额度,按需扩展和风天气开发者账号0元免费额度,1000次/天Cherry Studio 客户端0元开源免费API 配额和风天气免费版0元1000次/天Maas DeepSeek 模型服务0元免费额度注意事项:本案例基于免费额度,如需更高配额请自行申请。API 可能存在调用次数限制,超出免费额度需付费或申请扩容。2. 环境配置2.1 开发者空间配置步骤 1: 登录华为云领取免费云主机访问 华为云官网,注册并登录华为云账号点击“开发者->开发者空间”,进入。如果没有领取过云主机可以点击"立即体验"进行开通。步骤 2: 配置云主机访问开发者空间工作台, 点击"配置云主机"配置基础资源: CPU架构为 ARM,规格为 4 vCPUs 8 GB,操作系统为 Ubuntu ,镜像为 Ubuntu 24.04 Server定制版等待环境初始化完成后点击"打开云主机-进入桌面",打开云主机桌面2.2 MaaS 领取 DeepSeek步骤 1: 访问华为云 MaaS 服务在华为云控制台搜索"MaaS",点击进入 Maas 控制台区域选择西南-贵阳一,在左侧菜单栏,选择在线推理 > 预置服务 > 免费服务,选择DeepSeek-R1-32K模型,点击领取额度,领取200万免费token。步骤 2: 获取API地址和模型名称领取后点击调用说明*,可以获取到对应的API地址、模型名称。步骤 3: 获取 API 密钥点击“API Key管理-创建API Key“”,自定义标签和描述,点击确定创建API Key。(⚠️注意:API Key仅会在新建后显示一次,请及时复制并妥善保存,若API Key丢失,请新建API Key。)至此,我们获取到了所需的 API 地址、模型名称和 API 密钥。2.3 安装 Cherry Studio下载安装:使用云主机中的Firefox访问 [Cherry Studio 官网] https://cherry-studio.com根据操作系统下载对应版本,如 **Cherry-Studio-1.3.12-arm64.AppImage给下载的文件添加执行权限chmod +x Cherry-Studio-1.3.12-arm64.AppImage安装运行相关依赖sudo apt update sudo apt install zlib1g zlib1g-dev sudo add-apt-repository universe sudo apt install libfuse2运行安装包./Cherry-Studio-1.3.12-arm64.AppImage --no-sandbox基础配置:配置 DeepSeek 模型连接测试模型连接是否正常2.4 和风天气 API 注册(可选)💡 提示: 教程代码中已包含测试用的 API 配置,如无法使用请自行注册注册流程:访问 和风天气开发者平台 https://id.qweather.com/注册开发者账号并完成邮箱验证进入开发服务控制台创建项目并获取必要的认证信息获取配置信息:PROJECT_ID: 项目标识符KEY_ID: JWT 密钥标识PRIVATE_KEY: JWT 签名私钥WEATHER_API_HOST: API 服务地址访问[https://id.qweather.com/] https://id.qweather.com/ 注册账号,初次使用需绑定手机号和邮箱。注册成功后,点击菜单中的 开发服务控制台,进入开发控制台。点击项目管理-创建项目,创建一个项目,如 fastapi, 创建之后此步骤获得PROJECT_ID。点击项目如fastapi,进入项目详情页并点击创建凭据开始创建 JWT 凭据,需先在本地生成公私钥对再创建,创建之后此步骤获得PRIVATE_KEY和KEY_ID。(PS: 虽然 APIKey 更简单,但推荐使用JSON Web Token (JWT)的认证方式获得更高等级的安全性以及不受限的API请求)点击设置, 从开发者信息中获取 API Host,也就是WEATHER_API_HOST至此,我们天气查询 MCP 中需要用到的配置信息已经全部获取。3. 项目搭建3.1 项目初始化使用CodeArts IDE for Python创建项目工程或者使用脚本创建项目目录:mkdir qweather-mcp cd qweather-mcp安装依赖包:pip install fastapi uvicorn fastapi-mcp pyjwt cryptography requests -i https://repo.huaweicloud.com/repository/pypi/simple创建项目结构:qweather-mcp/ ├── main.py # 主程序文件 ├── requirements.txt # 依赖列表 ├── config.py # 配置文件(可选) └── README.md # 项目说明3.2 核心代码实现详细的代码实现包括:FastAPI 应用初始化JWT 认证机制天气 API 封装MCP 协议集成错误处理机制3.3 关键功能模块JWT 认证模块: 实现安全的 API 访问控制天气查询模块: 封装和风天气 API 调用MCP 集成模块: 将 REST API 转换为 MCP 工具数据模型模块: 定义请求和响应的数据结构3.4 代码实现我们创建 main.py 文件,并编写代码。3.4.1 引入依赖from fastapi import FastAPI, HTTPException, Depends, Query, status from fastapi.security import HTTPBearer from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any import jwt import time import requests from datetime import datetime import base64 from cryptography.hazmat.primitives import serialization from cryptography.hazmat.backends import default_backend # 引入 fastapi_mcp from fastapi_mcp import FastApiMCP, AuthConfig3.4.2 配置天气服务 APIapp = FastAPI(title="天气查询API") # 配置项 - 在实际应用中应从环境变量或配置文件中读取 # PRIVATE_KEY = """YOUR_PRIVATE_KEY""" # PROJECT_ID = "YOUR_PROJECT_ID" # KEY_ID = "YOUR_KEY_ID" # WEATHER_API_HOST = "your_api_host" PRIVATE_KEY = "MC4CAQAwBQYDK2VwBCIEIG2wMZga50X1YDHmR8jkE5TGKNXpriFPXXCT/kgwZkcT" PROJECT_ID = "3MKPRE78RN" KEY_ID = "T8B7JMU7AY" WEATHER_API_HOST = "ky6mte27bb.re.qweatherapi.com" 3.4.3 定义响应 Model# 响应模型 class Location(BaseModel): name: str id: str lat: str lon: str adm2: str adm1: str country: str tz: str utcOffset: str isDst: str type: str rank: str fxLink: str class LocationResponse(BaseModel): code: str location: List[Location] class WeatherNow(BaseModel): obsTime: str temp: str feelsLike: str icon: str text: str wind360: str windDir: str windScale: str windSpeed: str humidity: str precip: str pressure: str vis: str cloud: str dew: str class ReferSources(BaseModel): sources: List[str] license: List[str] class WeatherResponse(BaseModel): code: str updateTime: str fxLink: str now: WeatherNow refer: ReferSources class JWTRequest(BaseModel): expiry_seconds: Optional[int] = 900 # 默认15分钟 custom_claims: Optional[dict] = None # 允许添加自定义声明 class WeatherQuery(BaseModel): city: str = Field(..., description="城市名,如:北京") 3.4.4 JWT 令牌生成# 解码并加载私钥 try: _der_key_bytes = base64.b64decode(PRIVATE_KEY) PRIVATE_KEY = serialization.load_der_private_key( _der_key_bytes, password=None, backend=default_backend() ) except Exception as e: print(f"关键错误:无法从配置加载EdDSA私钥。错误: {e}") PRIVATE_KEY = None if PRIVATE_KEY is None: raise RuntimeError(f"关键错误:EdDSA私钥加载失败,应用无法启动。错误: {e}") # 令牌缓存(简单实现,生产环境应使用Redis等缓存系统) token_cache = { "token": None, "expires_at": 0 } # Bearer Token 安全头 token_auth_scheme = HTTPBearer() EXPECTED_BEARER_TOKEN = "huaweicloud" # 定义期望的固定Token # Bearer Token 验证依赖 async def verify_bearer_token(token_payload = Depends(token_auth_scheme)): if token_payload.credentials != EXPECTED_BEARER_TOKEN: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据", headers={"WWW-Authenticate": "Bearer"}, ) return token_payload.credentials # 生成JWT令牌 def generate_jwt(expiry_seconds: int = 900): current_time = int(time.time()) # 构建标准JWT载荷 payload = { 'iat': current_time - 30, # 颁发时间(提前30秒,避免时钟偏差问题) 'exp': current_time + expiry_seconds, # 过期时间 'sub': PROJECT_ID # 主题(项目ID) } # JWT头部 headers = { 'kid': KEY_ID # 密钥ID } if PRIVATE_KEY is None: raise ValueError("JWT生成失败: 私钥未初始化或加载失败。") try: # 生成JWT encoded_jwt = jwt.encode(payload, PRIVATE_KEY, algorithm='EdDSA', headers=headers) # 更新缓存 token_cache["token"] = encoded_jwt token_cache["expires_at"] = current_time + expiry_seconds - 60 # 提前1分钟过期,确保安全 return encoded_jwt except Exception as e: raise ValueError(f"JWT生成失败: {str(e)}") # 获取有效的JWT令牌(如果缓存中有有效令牌则使用缓存,否则生成新令牌) def get_valid_token(): current_time = int(time.time()) # 检查缓存中的令牌是否有效 if token_cache["token"] and token_cache["expires_at"] > current_time: return token_cache["token"] # 生成新令牌 return generate_jwt() @app.post("/generate-jwt", operation_id="generate_jwt", tags=["JWT"]) async def create_jwt( request: JWTRequest = JWTRequest() ): """ 生成JWT令牌 - 使用EdDSA算法签名 - 默认有效期为15分钟 - 可以添加自定义声明 """ try: encoded_jwt = generate_jwt(request.expiry_seconds) current_time = int(time.time()) return { "jwt": encoded_jwt, "expires_at": datetime.fromtimestamp(current_time + request.expiry_seconds).isoformat(), "issued_at": datetime.fromtimestamp(current_time - 30).isoformat(), "valid_for_seconds": request.expiry_seconds } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) 3.4.5 天气查询接口# 发送HTTP请求到天气API,并处理gzip压缩 def fetch_weather_api(endpoint: str, params: Dict[str, Any]): # 获取有效的JWT令牌 token = get_valid_token() headers = { 'Authorization': f'Bearer {token}', 'Accept-Encoding': 'gzip' # 我们请求gzip压缩 } url = f"https://{WEATHER_API_HOST}/{endpoint}" try: response = requests.get(url, headers=headers, params=params) # 检查响应状态 if response.status_code != 200: # 如果是401或403,尝试刷新令牌并重试 if response.status_code in [401, 403]: # 强制生成新令牌 new_token = generate_jwt() # 更新请求头 headers['Authorization'] = f'Bearer {new_token}' # 重试请求 response = requests.get(url, headers=headers, params=params) # 如果还是失败,则抛出异常 if response.status_code != 200: raise HTTPException( status_code=response.status_code, detail=f"天气API请求失败: HTTP {response.status_code}" ) else: raise HTTPException( status_code=response.status_code, detail=f"天气API请求失败: HTTP {response.status_code}" ) # 依赖 requests 库自动处理Gzip解压缩,并直接解析JSON # 旧的Gzip处理逻辑已被移除 return response.json() except requests.exceptions.JSONDecodeError as e: # 如果响应不是有效的JSON(即使在解压缩后),则捕获此特定错误 raise HTTPException(status_code=500, detail=f"天气API响应解析失败: 无效的JSON内容 - {str(e)}") except HTTPException: # 重新抛出已捕获的HTTPException,以便FastAPI处理 raise except Exception as e: # 捕获其他潜在错误 raise HTTPException(status_code=500, detail=f"天气API请求时发生未知错误: {str(e)}") @app.get("/city/lookup", response_model=LocationResponse, operation_id="lookup_city", tags=["天气查询"]) async def lookup_city( location: str = Query(..., description="城市名称,如:北京") ): """ 根据城市名称查询位置ID - 返回城市的详细信息和位置ID - 位置ID用于后续天气查询 """ try: data = fetch_weather_api("geo/v2/city/lookup", {"location": location}) return data except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/weather/now", response_model=WeatherResponse, operation_id="get_weather_now", tags=["天气查询"]) async def get_weather_now( location: str = Query(..., description="位置ID,如:101010100") ): """ 获取指定位置的实时天气 - 需要提供位置ID - 返回当前天气详情 """ try: data = fetch_weather_api("v7/weather/now", {"location": location}) return data except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/weather/by-city", response_model=WeatherResponse, operation_id="get_weather_by_city", tags=["天气查询"]) async def get_weather_by_city( query: WeatherQuery ): """ 一站式查询城市天气 - 只需提供城市名 - 自动查询位置ID并获取天气 """ try: # 先查询城市ID location_data = fetch_weather_api("geo/v2/city/lookup", {"location": query.city}) # 检查是否找到城市 if location_data.get("code") != "200" or not location_data.get("location"): raise HTTPException(status_code=404, detail=f"找不到城市: {query.city}") # 获取第一个匹配城市的ID location_id = location_data["location"][0]["id"] # 查询天气 weather_data = fetch_weather_api("v7/weather/now", {"location": location_id}) return weather_data except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) 3.4.6 主程序及 MCP 集成@app.get("/") async def root(): """主页 - 提供API简介""" return { "message": "天气查询API", "endpoints": [ "/generate-jwt - 生成JWT令牌", "/city/lookup - 根据城市名查询位置ID", "/weather/now - 根据位置ID查询当前天气", "/weather/by-city - 一站式查询城市天气" ], "docs": "/docs 查看完整API文档" } # mcp 实现 mcp = FastApiMCP( app, name="My Weather MCP", description="天气查询API", include_operations=["get_weather_by_city"], # 只公开 get_weather_by_city 接口作为 MCP tool auth_config=AuthConfig(dependencies=[Depends(verify_bearer_token)]) # MCP 使用 Bearer Token 验证 ) mcp.mount() # 启动服务器的命令(在命令行中运行): # uvicorn main:app --reload if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8009) 4. 测试验证4.1 本地服务测试启动服务:python main.pyAPI 文档验证:访问 http://localhost:8009/docs测试各个接口功能验证数据格式正确性我们可以使用浏览器访问 http://localhost:8009/docs 来查看并测试API。4.2 MCP 客户端集成Cherry Studio 配置:服务名称: FastAPI 天气查询连接类型: 服务器发送事件(SSE)服务地址: http://localhost:8009/mcp认证头: Authorization=Bearer huaweicloud功能验证:配置 MCP 服务连接验证工具列表显示测试天气查询功能对比启用前后的效果在 Cherry Studio 中配置好的 MCP 服务,我们可以直接在 MCP 客户端中使用 get_weather_by_city 接口:名称:FastAPI 天气查询类型:服务器发送事件(SSE)URL:http://localhost:8009/mcp请求头:Authorization=Bearer zishu.co在工具中,我们可以看到get_weather_by_city接口已经添加到MCP服务中。新建一个话题,先不开启 MCP 服务器设置,直接输入北京天气怎么样,我们会发现大模型无法实时获取天气。接着我们启用 MCP 服务,并输入北京天气怎么样,我们会发现大模型可以实时获取天气。get_weather_by_city tool 被成功调用,并返回了天气信息。5. 总结5.1 技术收获通过本案例,您将掌握:MCP 协议: 理解 AI 模型与外部工具的交互机制FastAPI 开发: 快速构建高性能 Web APIJWT 认证: 实现安全的 API 访问控制第三方 API 集成: 学会封装和调用外部服务错误处理: 构建健壮的服务应用5.2 应用价值实时数据获取: AI 模型可以获取最新的天气信息用户体验提升: 提供准确、及时的天气查询服务技术架构: 为更复杂的 MCP 应用奠定基础可扩展性: 可以轻松添加更多天气相关功能如果想要拓展更多功能,您可以动手试试看!
  • [公告] 【产品公告】华为开发者空间于2025年9月30日正式停止云主机中X86架构的服务
           为提升开发者空间云主机使用体验,开发者空间将于2025年9月30日正式停止云主机中X86架构的服务,停止服务后,将无法继续使用X86云主机(可以选择使用ARM架构)。请于2025年9月30日前对X86云主机内的文件进行迁移,以免个人资料无法恢复,如在迁移或者使用中遇到问题,请提交开发者工单进行反馈。                                                                                                                                                                                                      
  • [技术干货] 鲲鹏DevKit之Python字符串拼接系统性能分析
    案例介绍本实践中使用鲲鹏DevKit系统性能分析工具对业务中使用Python进行字符串拼接接口执行系统全景分析,应用热点函数分析,找到性能瓶颈点,并根据分析结果进行优化修改,从而实现使用Python进行字符串拼接性能增强。案例内容1 概述1.1 实验介绍鲲鹏DevKit系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数,给出优化建议。该工具可以辅助用户快速定位和处理软件性能问题。本实验选择Python进行字符串拼接性能分析作为示例,并借助开发者空间云主机提供的鲲鹏沙箱资源进行安装、配置,直观地展示Devkit中系统性能分析能力在实际应用开发中为开发者带来的便利。1.2 实验对象企业个人开发者高校学生1.3 实验时间本次实验总时长预计40分钟。1.4 实验流程说明:自动部署鲲鹏云服务器;安装鲲鹏Devkit插件;通过浏览器访问,添加IP节点,以配置在线分析环境;安装Python3;使用Python3命令执行代码;在线分析,通过全景分析和进程分析查看CPU负载和使用率情况进行对比分析;修改执行命令,再次分析。1.5 实验资源本次实验预计花费总计0元资源名称规格单价(元)时长(h)云主机4vCPUs | 8GB |ARM | Ubuntu免费12 鲲鹏DevKit之Python字符串拼接系统性能分析2.1 自动部署鲲鹏云服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下,该命令会自动部署鲲鹏云服务器。hcd deploy --password abcd@1234 --time 3600–password 待部署项目所在ECS的root用户密码(至少8个字符),如果不修改部署命令,鲲鹏云服务器密码就是abcd@1234。–time 待部署资源的保留期(单位为秒,至少600秒,默认600秒)。当前实验预估需要40分钟,可以配置time为1小时保留期。看到“application is running, service addr: https://xxx.xxx.xxx.xxx:8084”表示部署成功,记录部署远端服务器公网IP,如截图中对应的就是:115.175.25.9 。自动部署的鲲鹏云务器已经预装了鲲鹏DevKit插件,该案例会用到DevKit的系统性能分析能力。2.2 添加IP节点在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。通过ssh连接云服务器,然后输入“密码”,出现“Welcome to XXX”代表连接成功。ssh root@云主机IP登录鲲鹏云服务器查询鲲鹏云服务器内网IP地址。ifconfig通过浏览器访问鲲鹏云服务器,添加目标节点,以配置在线分析环境。打开浏览器,输入“https://xxx.xxx.xxx.xxx:8086”(IP为2.1自动部署的鲲鹏云服务器IP),如果提示风险,点击接受并继续。首次登录需要设置密码,设置后登录。登录完成后添加节点:点击“调优”,选择通用分析下面的“新建”按钮,右边窗口选择“管理节点”。进入管理界面后,点击“添加节点”,勾选协议,弹窗节点IP输入上面ifconfig查询到的鲲鹏云服务器内网IP,输入“密码”,点击“确定”。选择“继续添加”。添加成功如下图所示,点击左上角“DevKit Tools”返回上一级菜单。上一级菜单如下图所示,可以看到节点添加成功。2.3 执行Python代码回到云主机桌面打开终端,创建concatenate_string.py文件。vim concatenate_string.py回车进入,点击“i”进入编辑模式。concatenate_string.py代码如下(concatenate_string.py 代码仓地址请至案例原文获取):import sysBASE_STRING = "Hello world"LOOP_TIMES = 100000000STRING_LIST = [BASE_STRING] * LOOP_TIMESdef string_plus(): new_string = '' for string in STRING_LIST: new_string += string print(len(new_string)) def string_join(): new_string = ''.join(STRING_LIST) print(len(new_string)) def main(): function_map = { 'string_plus': string_plus, 'string_join': string_join, } print(sys.argv) _, function = sys.argv if function in function_map: function_map[function]() else: print('function {} not exist'.format(function)) if __name__ == "__main__": main()代码复制完毕,键盘点击“esc”,然后输入“:wq”保存退出。执行以下指令,可以代码看到执行成功,该代码中使用“+”在for循环中拼接字符串,运行时间为10s。time python3 concatenate_string.py string_plus2.4 在线分析2.4.1 创建全景分析任务回到浏览器,可以看到2.2添加的节点界面。分析类型选择“全景分析”,采样类型全部勾选,采样时长设置为“20”,其他默认,点击“确定”,跳出弹窗点击“确定”。出现如下界面时,点击“开始分析”,等待分析进度条完成。采样完成后,点击“系统性能”,打开“CPU负载”,可以看到数据显示CPU负载值。2.4.2 创建进程线程分析任务回到执行Python终端,如连接超时重新连接即可。再次执行Python3命令。time python3 concatenate_string.py string_plus执行成功返回浏览器。点击左上角系统性能分析后的新建任务图标,选择“通用分析”。分析类型选择“进程分析”,采样类型全部勾选,采样时长设置为“20”,其他默认,点击“确定”,跳出弹窗点击“确定”出现如下界面时,点击“开始分析”。等待分析进度条完成。分析完成后查看进程性能数据,CPU使用率也比其他大部分进程高。2.5 修改执行命令并再次分析回到Python终端,将执行命令进行修改,使用join拼接字符串,执行如下命令,可以看到运行时间变为3s。time python3 concatenate_string.py string_join再次创建全景分析,参数与2.4.1保持一致,分析成功后查看结果。再次创建进程分析,参数与2.4.2保持一致,分析成功后查看结果。时间对比:字符串拼接方式运行时长使用“+”拼接10.850s使用“join”拼接3.112s总结使用鲲鹏DevKit系统性能分析工具查看性能数据,通过系统全景分析和进程分析的数据采集,可以分析出性能瓶颈点,Python中的string是不可变对象,循环中使用+进行大量字符串拼接时,会频繁的进行内存的申请、分配以及字符串的复制,导致性能低下。将代码进行修改,使用join拼接字符串,执行时间减少,性能明显提升。至此本次实验全部内容完成。更多案例戳→https://devstation.connect.huaweicloud.com/space/devportal/casecenter
  • [HCSD校园沙龙] 大模型时代“邮”你同行,华为云HCSD校园公开课走进北京邮电大学
    高校开发者作为数智产业发展的生力军,成为技术创新的核心驱动力。为进一步深化产教融合,助力未来开发者成长。近日,由华为云计算技术有限公司主办、北京邮电大学承办的“华为云HCSD校园公开课”在北京邮电大学成功举办。华为云开发者支持与运营部部长林华鼎、华为公司云计算招聘调配部部长刘红、华为云高校生态总监罗静带领技术专家团队走进校园,与北京邮电大学叶培大创新创业学院副院长高鹏、北京邮电大学叶培大创新创业学院主任韩康榕等学院领导及师生代表展开深入交流。活动聚焦就业、华为开发者空间实践、AI、仓颉等前沿领域,启迪创新思维,培养符合数智时代需求的高素质开发人才。  教育、科技、人才三位一体共创育人新路径  “华为云HCSD校园公开课进入北京邮电大学,体现了华为对北邮本科教育、创新创业教育的重视和支持。”北京邮电大学双创学院副院长高鹏在致辞中表示,长期以来,北邮和华为具有良好的合作基础,双方携手成立北邮-华为学院,建设“智能基座”基地,还以华为云HCSD公开课等形式推进产教融合。北邮是信息行业高端人才最大生源地,华为云是云领域的领军代表,双方合作有强大的内生动力,是彼此不可替代的重要合作伙伴。▲ 北京邮电大学叶培大创新创业学院副院长 高鹏“高校是开发者的源头,华为云致力于将先进技术和平台融入高校的教学和实践,鼓励高校师生在华为统一开发者平台上开展教学和实践开发。”华为云开发者支持与运营部部长林华鼎表示,近年来,华为云一直将AI作为战略核心,从云原生全面跃迁至AI原生,通过持续创新,引领产业发展。北京邮电大学作为国内外信息科技领域的人才培养重要基地,华为云将与校方深化合作,协力为学生创造更好的学习环境,为实现加快建设世界重要人才中心的目标贡献力量。▲ 华为云开发者支持与运营部部长 林华鼎随后,激动人心的校园大使授证仪式举行。北京邮电大学叶培大创新创业学院副院长高鹏、华为云开发者支持与运营部部长林华鼎、华为公司云计算招聘调配部部长刘红为校园大使蒋真雨、崔金硕、鲁奕文同学颁发证书。这些校园大使将成为华为云与学校之间的桥梁,促进技术交流与创新实践活动的开展。他们将积极参与华为云相关活动的组织与推广,带动更多同学了解和应用华为云技术。    ▲ 华为云HCSD校园大使授证一直以来,华为云积极推动产教融合,从学习、实践、成果化等方面打通数字人才培养全链条,致力于成为数字经济、人才培养的黑土地。活动中,华为公司云计算招聘调配部部长刘红分享了《云创未来,跨界成长》的主题演讲,介绍了华为云在智能时代的行业领先地位,列举了其在智能制造、金融、医药等领域的AI创新成果,盘古大模型的突破性应用,以及全球化的研发体系。还通过多位北邮校友在华为云的职业成长案例,展现华为云的人才培养机制,吸引优秀学子加入云计算创新行列,让最优秀的人培养更优秀的人。 ▲ 华为公司云计算招聘调配部部长 刘红从理论到实践校企联合编织人才“摇篮”  华为云AI算法工程师刘越展开了《大模型时代下,高校开发者如何学好AI》的主题演讲,从AI的发展历程和入门难点引入,讲解大模型的一般构建流程、低成本参与关键技术以及如何影响未来产业格局。一直以来,华为云持续推动昇腾云服务全面升级,为开发者提供全栈支持,可显著降低学习门槛,实现低成本、高性价比的AI实践。高校开发者可通过昇腾云资源,如免费算力、AI Gallery案例库,快速部署大模型,构建编程助手、知识库问答等应用,鼓励学生们抓住时代机遇,学好AI。▲ 华为云AI算法工程师 刘越仓颉编程语言于2019年在华为诞生,历经5年研发沉淀,2024年与全球开发者见面。华为仓颉语言生态发展经理许亦然在《面向全场景应用的新一代编程语言——仓颉》主题演讲中提到,仓颉编程语言主打“原生智能化、天生全场景、高性能,强安全”四大特性,旨在为鸿蒙生态及全场景应用提供高效、安全的开发工具。对高校生来说,仓颉编程语言更易上手,编码更加轻松,能够显著提升20%的研发效率。演讲中还介绍了诸多案例,无论是个人开发者还是企业用户,均可通过丰富的资源与案例快速上手,探索更多创新可能。▲ 华为仓颉语言生态发展经理 许亦然活动还特设技术实战环节,华为云高校生态运营布道师罗树国在《基于华为开发者空间部署和体验大模型》的案例中,详细介绍了华为开发者空间,手把手指导学生在云主机上部署了DeepSeek模型,学生们踊跃参与,氛围十分活跃,不少同学抓住机会与专家进行互动问答,切磋交流。这是以开发者为对象进行开发者关系关联和交流、学习、实践的生态运营平台和统一入口,具备开发桌面便捷访问、开发者工具合集开箱即用、沙箱调测资源灵活调用、成长数据云上保存等核心功能,助力高校师生开发实践、应用构建和开源共创。▲ 华为云高校生态运营布道师 罗树国华为云AI算法工程师刘越为同学们带来了《在ComfyUI中将人像转换为复古日漫风格》的案例,现场带领学生基于ComfyUI搭建工作流,最后将人像转换为日本漫画黄金时期的漫画大师风格。 ▲ 现场实操数字浪潮奔涌向前,构建产业生态、人才培育体系是高质量发展的关键。华为云将持续在人才培养、科学研究、产学研合作等方面发力,以体系化、常态化的校企合作关系,携手更多高校铸造人才蓄水池,为数字中国建设注入源源不断的创新动能。
  • [热门活动] 奖品已邮寄//【体验有礼】华为开发者空间HDC限时体验,打卡AI案例,领取华为耳机、HDC限定礼包等好礼
    获奖信息已公示,见此帖最新评论___________________________________________________________________________________________________ 一年一度的开发者盛会“华为开发者大会(HDC2025)”如约来袭,各位小伙伴已经准备好观看姿势了吗?不仅能深度体验HarmonyOS创新技术,更能带你实战最新AI应用开发,这次HDC2025,华为开发者空间不仅有单独的展区,还有专属的产品体验区,6月21-22日,我们在现场等你体验。不能如愿去现场感受的小伙伴,可以提前线上参与互动,小编准备了限定的HDC好礼,欢迎叫上小伙伴一起来实践打卡哦~ 【活动时间】即日起—6月30日 【活动流程】完成报名 → 选择活动方式 → 参与活动 → 获得激励 【活动方式】(以下活动均可参与,奖励可叠加)活动一【体验打卡】:体验打卡开发者空间功能,参与华为云开发者定制礼品抽奖参与方式:活动期间,进入开发者空间,体验空间各项能力,比如体验云主机、知识课程、体验案例、应用构建等,活动结束后将在参与活动报名并在活动期间登录名单中抽奖。奖项设置:华为手环9(NFC款)*2个,HDC定制挂脖风扇*10个中奖小妙招:小编会进行2轮抽奖,5月和6月都有体验开发者空间可以增加中奖概率哦~ 活动二【实践互动】:完成开发者空间AI案例,赢HDC定制礼包参与方式:活动期间在进入开发者空间 → 案例中心 → 技术标签选择“AI”,在云主机中完成AI标签下任意一个或多个案例,并在评论区分享案例截图,活动结束后,将在评论区用户中抽奖。奖项设置:华为FreeBuds 6i耳机*1个、HDC定制礼包*5个(内含双肩包、短袖T恤、帽子等),HDC定制挂脖风扇15个中奖小妙招:1、完成案例后,回帖说明和案例应用截图有HDC元素的,会额外增加中奖概率,比如完成DeepSeek部署案例,提问大模型HDC期间天气情况或者部署完高德地图后,规划去HDC的3天行程等2、完成多个案例,会增加中奖概率!完成后请在回帖中注明完成了几个案例,以及案例名称。小编会对案例完成情况进行复核,请大家真实完成哦!部分礼品示意 【活动规则】1、抽奖方式:活动结束后,我们将从参与活动的用户中(华为云新老用户均可参与),通过巨公平台或Excel 函数形式抽取获奖用户。获奖名单将在活动结束后的7个工作日内公布。2、活动二仅限于在“华为开发者空间”内体验相关案例项目,其他项目建议不参与此次活动,否则视为无效内容,具体参考案例中心内容。另外活动将根据有效评论数设置获奖人员数量,规则如下:有效评论数量获奖名额105201030以上213、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况。【活动说明】用户限制说明:1、参加本次社区活动的用户必须为华为云注册用户。同时为保证活动公平性,禁止用户以IAM账号身份参与活动,否则将视为无效。2、领取奖品的用户需为华为云实名用户,未完成实名认证的用户将不发放活动奖励。3、本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励。如在同一概率活动中,同一账号重复获奖,只发放首先获奖奖品。4、本次活动一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人,不予发放奖励。5、请开发者不要在活动期间随意修改社区昵称和华为云账号,由此产生的统计问题,如过了申诉期,小助手不再处理。(申诉期为活动结果公示3天内。)奖品发放说明:1、本活动结束之后10个工作日内公示获奖信息,获奖开发者用户需在截止时间在获奖信息收集表中填写获奖信息,获奖信息截止收集日过后10个工作日内,将统一发出奖品。华为云遵守《中华人民共和国个人信息保护法》规定,将以上个人信息仅用于礼品发放之目的,不会向任何第三方披露。若由于获奖开发者用户自身原因(包括但不限于联系方式有误、身份不符或超过截止登记日期等)造成奖品无法发送,视为获奖开发者用户放弃领奖。2、为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的开发者用户收回抽奖及奖励资格。3、若发放奖品时,出现库存不足,则优先发放等价值的其他实物奖品;HDC限定礼包为24/25年款随机发货;活动二中华为耳机需要在有效评论>40个开启。4、所有参加本活动的开发者用户,均视为认可并同意遵守《华为云开发者用户协议》,包括以援引方式纳入《华为云开发者用户协议》、《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。5、如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
总条数:361 到第
上滑加载中