IBM-人工智能机器人笔记-全-

IBM 人工智能机器人笔记(全)

001:人工智能简介 🧠

在本节课中,我们将要学习人工智能的基本定义、其学习方式、不同类型的划分以及它背后的多学科融合背景。


什么是人工智能?🤖

在IBM,我们将人工智能定义为任何能让机器行为更智能的技术。我们倾向于将AI视为增强智能。我们认为,人工智能不应试图取代人类专家,而应扩展人类的能力,并完成那些单靠人类或机器都无法独立完成的任务。

互联网让我们能更快地获取更多信息。分布式计算和物联网产生了海量数据,而社交网络促使其中大部分数据以非结构化形式存在。借助增强智能,我们将领域专家所需的信息置于他们指尖,并用证据支持,以便他们做出明智的决策。我们希望专家能扩展他们的能力,并让机器去处理耗时的工作。


如何定义智能?💡

人类拥有与生俱来的智能,这种智能支配着我们身体的每一项活动。正是这种智能,使得一颗小橡子能长成参天橡树,一个单细胞生物能发育成一头大象。

那么,人工智能如何学习呢?


人工智能如何学习?📚

机器唯一的“先天智能”是我们赋予它们的。我们赋予机器能力,使其能够检查示例,并根据输入和期望的输出创建机器学习模型

我们通过不同的方式实现这一点,例如:

  • 监督学习
  • 无监督学习
  • 强化学习

你将在后续课程中更详细地了解这些学习方式。


人工智能的类型 🗂️

根据其能力强度、广度及应用,人工智能可以以不同方式进行描述。

弱人工智能或狭义人工智能是指应用于特定领域的人工智能。例如:

  • 语言翻译器
  • 虚拟助手
  • 自动驾驶汽车
  • 人工智能驱动的网络搜索
  • 推荐引擎
  • 智能垃圾邮件过滤器

应用型人工智能可以执行特定任务,但无法学习新任务。它根据编程算法和训练数据做出决策。

强人工智能或通用人工智能是指能够交互并执行各种独立且不相关任务的人工智能。它可以学习新任务以解决新问题,并通过自我教授新策略来实现这一点。通用智能是多种AI策略的结合,这些策略能从经验中学习,并能达到人类水平的智能。

超级人工智能或意识人工智能是指具有人类意识水平的人工智能。这将要求它具有自我意识。由于我们尚无法充分定义意识是什么,在可预见的未来,我们不太可能创造出有意识的人工智能。


人工智能的多学科融合 🔗

人工智能是许多研究领域的融合。

  • 计算机科学和电气工程决定了人工智能如何在软件和硬件中实现。
  • 数学和统计学决定了可行的模型并衡量性能。
  • 由于人工智能是基于我们对大脑工作方式的理解而建模的,心理学和语言学在理解人工智能如何工作方面发挥着重要作用。
  • 哲学则为智能和伦理考量提供了指导。

虽然科幻版本的人工智能可能还很遥远,但我们已经看到越来越多的人工智能参与到我们日常的决策中。多年来,人工智能已被证明在不同领域都很有用,以有意义的方式影响着人们的生活和我们的社会。


总结 📝

本节课中,我们一起学习了人工智能的核心概念。我们了解到,IBM将AI视为增强人类能力的工具。我们探讨了智能的定义、AI通过机器学习模型进行学习的方式,并区分了弱AI、强AI和超级AI等不同类型。最后,我们认识到人工智能的实现离不开计算机科学、数学、心理学等多学科的交叉融合。人工智能已深入日常生活,并持续对社会产生积极影响。

004:生成式AI概述与用例 🧠

在本节课中,我们将要学习生成式人工智能(Generative AI)的基本定义、其重要性以及它在不同领域中的实际应用案例。通过本课,你将能够清晰地定义生成式AI,并理解它如何超越传统AI模型,创造出全新的数据与体验。


什么是生成式AI?🤖

上一节我们介绍了课程目标,本节中我们来看看生成式AI的核心定义。

人工智能(AI)被定义为一种增强智能,它使专家能够扩展其能力,同时让机器处理诸如语音识别、玩游戏和决策等耗时的任务。

另一方面,生成式人工智能(Gen AI)是一种能够创造全新且独特数据的AI技术,其生成范围涵盖图像、音乐、文本乃至整个虚拟世界。

与传统AI模型依赖预定义规则和模式不同,生成式AI模型使用深度学习技术,并依赖海量数据集来生成全新的数据,具有广泛的应用前景。


生成式AI与大语言模型(LLM)的关系 🔗

理解了基本定义后,我们进一步探讨生成式AI与当前热门的大语言模型之间的关系。

生成式AI模型也可以利用大语言模型(LLM)。LLM是一种基于深度学习技术的人工智能,旨在处理和生成自然语言。

例如,生成式AI可以开发出更新、更强大的LLM算法和架构,从而带来更准确或更高效的自然语言处理和生成能力。

或者,生成式AI可以将LLM设计和整合到一个更大、更先进的AI系统中,以执行各种高级任务,例如决策制定、问题解决和创造性工作。


生成式AI的优势 ✨

在了解了其技术基础后,我们来看看生成式AI为何被视为一项战略性技术,它主要具备以下六大优势:

以下是生成式AI的六大核心优势:

  1. 创造力与创新:能够生成前所未有的内容和解决方案。
  2. 成本与时间节约:自动化内容生成,减少人力与时间投入。
  3. 个性化:根据用户偏好和行为生成定制化内容或服务。
  4. 可扩展性:能够快速生成大量数据,满足大规模应用需求。
  5. 鲁棒性:在复杂或数据稀缺的情况下仍能有效工作。
  6. 探索新可能性:开辟传统方法无法触及的新领域和体验。

生成式AI的多样化用例 🌍

掌握了生成式AI的优势后,本节我们将通过具体案例,看看它如何在各行各业中发挥作用。

以下是生成式AI在不同领域的应用示例:

  1. 医疗保健与精准医疗:协助医生识别导致疾病的基因突变并提供定制化治疗方案;生成医学图像、模拟手术、预测新药特性以辅助医生练习和开发疗法。
  2. 农业:优化作物产量,并创造出能够抵御环境压力、害虫和疾病的更强健植物品种。
  3. 生物技术:通过识别潜在药物靶点、模拟药物相互作用和预测药效,帮助开发新疗法和药物。
  4. 法医学:通过分析DNA证据和识别嫌疑人来帮助破案。
  5. 环境保护:通过分析濒危物种的遗传数据并提出繁殖和保护策略,来支持保护工作。
  6. 创意领域:为广告和营销活动生成独特的数字艺术、音乐和视频内容;为电影或视频游戏生成配乐。
  7. 游戏:通过生成适应玩家行为的新关卡、角色和对象,来创造交互式游戏世界。
  8. 时尚:为客户设计和生成虚拟试穿体验,并根据客户行为和偏好推荐个性化时尚选择。
  9. 机器人技术:设计新的机器人动作并使其适应不断变化的环境,从而执行复杂任务。
  10. 教育:创建适应学生学习风格和进度的定制化学习材料和交互式学习环境。
  11. 数据增强:为机器学习模型生成新的训练数据,提高其准确性和性能。


总结 📝

本节课中,我们一起学习了生成式人工智能的核心概念。

我们了解到,生成式AI是一种能够创造全新且独特数据的技术。它在创造力、成本与时间节约、个性化、可扩展性、鲁棒性以及探索新可能性方面超越了传统AI模型。

生成式AI有潜力改变各行各业并改善人们的生活,生成以前不可能的数据和体验。它可以用于执行广泛的任务,其灵活性和适应性堪比人类智能。

005:AI的影响与示例 🤖

在本节课中,我们将探讨人工智能(AI)对全球经济、各行各业以及我们日常生活的深远影响,并通过具体示例了解AI在不同领域的应用。


人工智能将持续存在,并有望改变世界的运作方式。普华永道的一项研究预测,从现在到2030年,基于AI的技术将为全球GDP增加16万亿美元。这是前所未有的经济影响规模,且影响范围不仅限于IT行业,几乎触及了每个行业和我们生活的方方面面。

不同的人对AI有不同的理解。对视频游戏设计师而言,AI意味着编写影响游戏机器人行为以及环境如何对玩家做出反应的代码。对编剧而言,AI意味着塑造一个行为像人类、又混合了计算机特征的角色。对数据科学家而言,AI是一种探索和分类数据以实现特定目标的方法。

上一节我们了解了AI的广泛定义,本节中我们来看看AI如何通过具体技术改变人机交互。

自然语言处理的应用 🎤

通过示例学习的AI算法,是我们能够与Watson、Alexa、Siri、Cortana和Google Assistant等智能助手对话,并让它们回应我们的原因。AI的自然语言处理(NLP)和自然语言生成(NLG)能力,不仅使机器和人类能够相互理解和互动,还创造了新的商业机会和运营方式。

以下是基于自然语言处理的聊天机器人在几个关键领域的应用示例:

  • 医疗保健:用于询问患者病情并进行类似真实医生的基本诊断。
  • 教育:为学生提供易于学习的对话界面和按需在线辅导。
  • 客户服务:通过现场解决查询来改善客户体验,并释放客服人员的时间来处理更有价值的对话。

语音技术的进步 🗣️

AI驱动的语音转文本技术进步使得实时转录成为现实。语音合成技术的进步,则让公司能够使用AI语音来增强客户体验,并赋予其品牌独特的声音。

在医学领域,这项技术正在帮助患者,例如肌萎缩侧索硬化症患者,重新获得他们真实的声音,而不是使用计算机合成的声音。

计算机视觉的突破 👁️

正是由于AI的进步,计算机视觉领域才能够在与检测和标记物体相关的任务上超越人类。计算机视觉是汽车能够在街道和高速公路上行驶并避开障碍物的原因之一。

计算机视觉算法能够检测图像中的面部特征,并将其与面部特征数据库进行比较。这使得消费类设备能够通过面部识别来验证机主身份,社交媒体应用能够检测并标记用户,执法机构能够在视频流中识别罪犯。

计算机视觉算法正在帮助自动化诸如在皮肤图像中检测癌性痣、或在X光和MRI扫描中发现症状等任务。

AI的日常与深远影响 💡

AI正日益影响我们的生活质量。我们的Netflix推荐、导航应用、邮箱垃圾邮件过滤以及重要事件提醒中都有AI的身影。

AI在幕后监控我们的投资、检测欺诈交易、识别信用卡欺诈并预防金融犯罪。

AI正以显著的方式影响医疗保健,帮助医生做出更准确的初步诊断、解读医学影像、为患者寻找合适的临床试验。它不仅影响着患者的治疗结果,也使运营流程成本更低。

AI有潜力访问海量信息、模仿人类甚至特定个体、提出关于健康和财务的变革性建议、关联可能侵犯隐私的数据,以及实现更多功能。


本节课中,我们一起学习了人工智能带来的巨大经济影响,并深入探讨了其在自然语言处理、语音技术和计算机视觉等核心领域的具体应用。我们看到,AI已渗透到娱乐、医疗、金融、安防等众多行业,并持续改变着我们的日常生活与工作方式。理解这些影响和示例,是认识AI价值与潜力的重要一步。

007:人工智能的实际应用案例 🚀

在本节课中,我们将通过几个具体案例,了解人工智能技术在不同行业中的实际应用。这些案例展示了AI如何作为辅助工具,提升效率、安全性和决策能力。

上一节我们探讨了人工智能的基本概念,本节中我们来看看它在现实世界中的具体应用场景。


协作机器人在制造业的应用 🤖

我们拥有一个相当大规模的协作机器人项目。目前我们研究的协作机器人主要针对制造业应用。这些应用场景包括制造业、仓储和物流等领域。在这些场景中,通常由人完成的工作可能单调、危险。引入机器人支持或让机器人直接执行这些任务,可以大幅提升安全性、效率和整体效益。

我们致力于开发许多此类应用,特别是那些需要机器人直接与人交互的场景。例如,机器人可以帮助个人抬起沉重的容器,或在货架上移动物品以完成补货任务。

以下是协作机器人可能率先应用的领域:

  • 在工业环境中协助完成繁重、重复或危险的任务。
  • 未来有望进入家庭,帮助处理洗衣、洗碗等厨房事务。

AI在石油天然气行业的应用 🛢️

在石油天然气领域,阿布扎比国家石油公司提供了一个典型案例。石油公司面临的一个核心问题是:确定最佳的钻井位置。他们需要从数百个不同地点采集岩石样本。

从这些样本中,可能会产生数十万张岩石薄片。传统上,需要依靠训练有素的专家地质学家对这些薄片进行分类。但培养能准确分类的地质学家既困难、耗时,成本也高昂。

一种增强人类能力的方法是使用计算机视觉技术对这些岩石样本进行分类,从而识别出哪些地点最适合开采石油。这就是人工智能在石油天然气领域的应用。


机器学习在医疗协作中的价值 🏥

试想在此技术出现之前的情景。如果迪拜的一位医生遇到一例非常罕见的癌症,而新西兰出现了另一例,他们过去如何能意识到双方在处理同一个罕见病例并开展合作呢?这在过去是不可能的。

但现在,机器学习技术能够将来自众多不同来源的知识聚合到一个集中的云端。它能够理解这些信息,并以可访问、直观、内隐的方式提供。如今,那位新西兰医生可以运用这种机器学习技术发现:“就在几天前,有一位医生遇到了非常相似的病例”,即使不完全相同。


智能听诊器:AI辅助医疗诊断 🩺

我们与许多初创企业和大型企业合作,这里举几个例子。我想重点介绍一家位于加利福尼亚州名为Eko Devices的公司。他们的创新在于改造了一个简单的设备——听诊器。

他们首先通过剪断听诊器的软管并插入一个数字化转换器,将其改造成数字设备。这个转换器将模拟声音信号转化为数字信号,并在过程中进行放大,使得人们更容易听到心脏或肺部工作的声音。

更重要的是,数字化使我们能够通过蓝牙将信号发送到智能手机。在手机上,这些信号可以被绘制成图表,帮助医生不仅通过听觉,更能通过直观的图表来理解心脏的工作状态。

关键在于,这些信息一旦被数字化捕获,就可以发送给机器学习算法进行处理。这正是Eko所做的。机器学习算法可以从这些数据中学习,应用人类医生(心脏病专家)先前的经验知识,从而辅助使用该设备的医生进行当前诊断。

这绝非以任何形式取代医生,而是一种辅助技术。它汲取了前几代人类心脏病专家的经验,助力当前的诊断工作。在我看来,这是一个完美的“X + AI”案例。这里的“X”是听诊器,而加上AI后,他们为其起了一个巧妙的名字——他们称之为“心脏听诊智能监测”。


本节课中,我们一起学习了人工智能在工业制造、能源勘探、医疗协作及诊断辅助等领域的实际应用。这些案例表明,AI的核心价值在于增强人类能力、提升效率与安全性,而非取代人类。通过将传统工具或流程与AI结合,我们可以解决更复杂的问题,并开辟新的可能性。

008:AI实战案例解析 🚀

在本节课中,我们将通过几个真实案例,了解人工智能技术如何在企业中被实际应用。这些案例涵盖了从文档理解到计算机视觉,再到医疗康复的多个领域,展示了AI解决复杂问题的潜力。


AI在企业中的实际应用

上一节我们介绍了AI的基本概念,本节中我们来看看它在企业中的具体应用。以下是几个典型案例:

Woodside能源公司的文档智能系统

Woodside能源公司最初希望IBM构建一个能理解工程师研究报告的系统,让Watson(IBM的AI平台)学习这些非结构化文档内容,甚至替代部分工程师。

IBM成功开发了该应用,Watson确实能够理解这些非结构化内容。但最终结果并非替代工程师,而是公司雇佣了更多工程师。原因有两点:

  1. 每位工程师的入门门槛降低,因为Watson消化并整理了所有历史研究数据。
  2. 团队间的知识共享变得更高效。研究报告不再被归档后无人问津,而是被Watson获取、理解,并主动提供给可能需要它的人。

公共安全中的计算机视觉

在影视剧中,我们常看到安保人员为了寻找特定嫌疑人,需要以十倍速浏览成百上千小时的监控录像,直到在剧集末尾找到那辆黑色SUV或绿色汽车。

如果有一套计算机视觉算法持续分析这些视频流,就不再需要人力手动筛查海量 footage。算法可以自动识别和追踪目标车辆或人物。

神经康复医疗中的AI与机器人

我们的一个具体用例是触发大脑形成新的神经通路。人体功能与大脑功能之间的联系、大脑受损区域、未受损区域以及如何通过特定动作触发人体反应以形成新神经通路,这其中涉及海量信息。

我们创建了关于人体运动如何与大脑不同区域响应的大规模数据集。基于这些信息,我们能够通过机器人设备触发特定动作,进而促使大脑形成新的神经通路,最终帮助神经创伤患者恢复健康。


本节课中我们一起学习了AI在能源、公共安全和医疗康复等领域的实际应用案例。我们看到,AI的价值不仅在于自动化,更在于赋能人类,降低门槛、提升效率,并解决诸如神经康复等高度复杂的专业问题。

009:IBM的著名AI应用案例 🏆

在本节课中,我们将了解IBM Watson人工智能系统在几个真实世界中的著名应用。这些案例展示了AI如何分析复杂数据、理解人类语言与情感,并辅助专业决策。


Watson在《危险边缘》游戏中的胜利 🎮

上一节我们介绍了AI的基础概念,本节中我们来看看IBM Watson早期的一个里程碑式成就——在智力竞赛节目《危险边缘》中战胜人类冠军。

我记得那天早上去实验室时在想,这就是最后一场《危险边缘》比赛了。当音乐响起,约翰尼·吉尔伯特宣布“来自纽约约克敦高地的IBM研究院,这里是《危险边缘》”时,这一切对我而言变得无比真实。这一天是所有工作的 culmination。说实话,我当时很激动。

核心交互示例:

主持人提问: "这个1920年代的流行舞蹈以‘踢’动作为特征。"
Watson回答: "What is the Charleston?"
主持人: "正确。"

比赛过程并非一帆风顺。Watson一度取得领先,但也答错了一些问题。例如,它将“leg”和“1920s”作为答案,但都被判定为错误。然而,它最终成功答对了关键问题,例如“什么是禅宗?”,从而与人类选手布拉德战平,并最终赢得了比赛。

他们完全有理由为自己所做的事感到自豪。我曾以为这样的技术还需要多年才能实现,但它现在已经到来了。我认为我们今天看到了重要的一步。哇,等等,这是历史性的时刻。


AI赋能格莱美奖:时尚与情感分析 🎵

在见证了Watson的语言理解能力后,我们来看看它如何被应用于充满创意与情感的娱乐产业。

第60届格莱美奖由IBM Watson提供技术支持。在格莱美周日,我们需要处理海量的非结构化数据。我们与录音学院的合作,重点在于帮助他们优化数字内容生产的工作流程。

我的内容团队不仅负责接收所有原始素材,还要对其进行策展和发布。这包括长达五小时的红毯报道,涉及5,000名艺术家和超过100,000张照片。

以下是Watson在格莱美奖中的两项核心分析工作:

  1. 时尚趋势分析:Watson利用AI分析每一套经过红毯的服装的颜色、图案和轮廓。我们得以洞察所有主导风格,并将其与往届格莱美秀场进行对比。
  2. 歌词情感分析:Watson还分析了过去60年来格莱美提名歌曲的歌词情感。它能够识别音乐中的情感主题,并将其分类为喜悦、悲伤等不同类别。这非常酷。


ESPN梦幻足球:数据驱动的决策助手 🏈

从娱乐产业转向体育领域,AI同样能提供强大的决策支持。本节我们将探讨Watson如何帮助数百万体育迷进行更明智的抉择。

梦幻体育是我们服务体育迷的一种极其重要且有趣的方式。我们的梦幻游戏极大地促进了ESPN数字平台的流量,并拉动了赛事和演播室节目的收视率。

但我们的用户有很多方式可以消磨时间,因此我们必须持续改进游戏,以吸引他们选择与我们共度时光。今年,ESPN与IBM合作,为其梦幻足球平台增加了一项强大的新功能。

梦幻足球产生了海量的内容,包括文章、博客、视频、播客,我们称之为非结构化数据,即那些无法整齐放入电子表格或数据库的数据。而Watson正是为分析这类信息并将其转化为可用见解而构建的。

我们使用数百万篇梦幻足球故事、博客文章和视频来训练Watson。我们教会它:

  • 为数千名球员开发一个得分范围,评估他们的上升空间和下行风险。
  • 估算球员表现超过其上升空间或低于其下行风险的概率。
  • 甚至评估球员的媒体热度及其上场可能性。

核心价值公式:
玩家决策收益 = Watson数据洞察 + 专家分析意见 - 不确定性风险

这对于我们的梦幻足球玩家来说是一个巨大的胜利。它是帮助玩家决定每周让哪位跑卫或四分卫首发的又一个工具,并且是对球迷所信赖的获奖分析师们的绝佳补充。

与任何机器学习系统一样,该系统会变得越来越智能。这意味着洞察会更准确,用户能做出更好的决策,每周都有更好的机会赢得比赛。我们的梦幻玩家越成功,他们花在我们平台上的时间就越多。

ESPN与IBM的合作是一个绝佳的载体,向数百万人展示了企业级AI的强大能力。不难想象,同样的技术如何应用于现实生活。在商业场景中,有成千上万的场合需要评估价值和权衡取舍。这就是未来决策的模样:人与机器协同工作,评估风险与回报,共同处理艰难的决定。IBM正是运用同样的技术来帮助医生挖掘数百万页的医学研究,以及帮助投资银行发现影响市场的洞察。


总结

本节课中我们一起学习了IBM Watson人工智能系统的三个著名应用案例。我们看到,从在《危险边缘》中展示的深度语言理解,到格莱美奖中的视觉与情感分析,再到ESPN梦幻足球里的数据挖掘与预测,AI技术已经能够处理复杂的非结构化数据,将其转化为 actionable insights,并最终辅助人类在娱乐、体育乃至医疗、金融等专业领域做出更优的决策。这些案例清晰地揭示了“人机协同”的未来工作模式。

010:生成式AI应用 🚀

在本节课中,我们将学习生成式人工智能(Generative AI)的各种实际应用。通过了解这些应用,你将能够列举生成式AI在不同领域的使用案例,并探索每个应用的具体用途。

生成式AI已成为一项强大的技术,它使软件应用能够创造、生成和模拟新的内容,从而增强其能力并提供独特的体验。与传统软件遵循预定义规则和算法不同,生成式AI利用机器学习和深度学习技术来学习模式,并根据其在训练中获得的知识生成原创内容。

由于其能够创造前所未有的、个性化的新内容,生成式AI已被应用于多个领域,催生了许多引人入胜且广受欢迎的应用。

以下是生成式AI的一些流行应用:

  1. 生成式预训练变换模型(GPT):这是由OpenAI开发的一个大型语言模型家族,能够生成类人文本。GPT-3.5和GPT-4是该模型家族的迭代版本,更未来的模型正在开发中。其应用范围广泛,包括由GPT驱动的聊天机器人(如ChatGPT)、自动化新闻写作甚至创意写作。
    • 核心模型GPT-n(n代表版本号,如3.5, 4)

  1. ChatGPT:这是OpenAI开发的一款聊天机器人或对话式AI工具,允许用户与底层语言模型进行基于文本的对话。该模型在多样的互联网文本上进行训练,能生成类人回应,提供信息、回答问题、协助完成任务、进行创意写作并就各种主题提供建议。

  2. Bard:这是谷歌推出的AI写作助手,旨在帮助用户为电子邮件和社交媒体帖子等沟通文档生成高质量文本。Bard使用一个名为LaMDA(对话应用语言模型)的大型语言模型来生成文本,并能适应用户对风格和语调的偏好。

  1. Watson X:来自IBM,这是一个AI和数据平台,包含用于模型部署的Watson X.ai、用于可扩展分析的Watson X.data以及用于负责任AI工作流的Watson X.governance。它有助于大规模构建、部署和管理AI应用,提升AI在整个组织中的影响力。

  2. DeepDream:这是一种生成模型,可以从真实图像生成超现实和迷幻风格的图像。它已被用于艺术和娱乐领域,创造出一些独特且视觉震撼的图像。

  3. StyleGAN:这是一种能够生成现实中不存在的高质量人脸图像的生成模型。它已被用于多种应用,包括创建逼真的视频游戏头像以及为医学研究模拟人脸。

  1. AlphaFold:这是一种可以预测蛋白质结构的生成模型。它有可能改变药物发现领域,使开发更有效的疾病治疗方法成为可能。

  2. Magenta:这是谷歌的一个项目,利用生成式AI创作音乐和艺术。它已经产生了一些有趣且令人印象深刻的结果,例如由人类和AI生成的钢琴进行的二重奏。

  3. Google AI的PaLM 2:这是一个强大的大型语言模型,其训练数据量是前代的10倍。它在理解细微差别、生成连贯的文本和代码、翻译以及回答问题方面表现出色。其持续发展有望彻底改变人机交互,提高准确性、效率、创造力和沟通能力。

  1. GitHub Copilot:这是由OpenAI和GitHub联合开发的AI编程助手,旨在帮助开发者更高效地编写代码。它使用深度学习算法来分析代码,并为开发者生成建议,例如自动补全代码片段或根据代码上下文建议函数。
    • 核心功能:代码分析与智能建议。

上一节我们介绍了生成式AI的基本概念,本节中我们具体了解了它的多样化应用。可以看到,从文本生成到图像创作,从蛋白质结构预测到辅助编程,生成式AI正在深刻改变多个行业。

生成式AI是一个快速发展的领域,预计在未来几年将显著增长。然而,也需要关注其相关的伦理问题,包括AI生成内容的潜在滥用以及对知识产权和版权法的影响。

本节课中我们一起学习了生成式AI如何使应用能够创造、生成和模拟新内容。它利用机器学习和深度学习技术来学习模式并生成原创内容。我们还介绍了一些生成式AI的具体应用,包括GPT-4、ChatGPT、Bard、GitHub Copilot和PaLM 2等。理解这些应用是探索和利用生成式AI潜力的重要第一步。

011:感知、学习与推理 🤖

在本节课中,我们将要学习认知计算的核心概念。我们将了解它与传统计算的根本区别,以及它如何通过模仿人类的认知过程——感知、学习和推理——来处理海量、复杂的信息,从而创造新的价值。


概述:什么是认知计算?

人工智能正处于一个新时代——认知计算时代的前沿。

这是一种全新的计算模式,它与之前的可编程系统截然不同,其差异之大,就如同那些可编程系统与一个世纪前的制表机之间的区别。

上一节我们提到了人工智能的广阔前景,本节中我们来看看实现这一前景的一种关键技术:认知计算。


传统计算 vs. 认知计算

传统的计算解决方案基于20世纪40年代衍生的数学原理。它们依据规则和逻辑进行编程,旨在得出数学上精确的答案,通常遵循刚性决策树方法。

传统计算的核心可以概括为:

if (条件A) {
    执行操作X;
} else if (条件B) {
    执行操作Y;
}

然而,面对当今海量的大数据以及对更复杂的、基于证据的决策的需求,这种僵化的方法常常会失效,或者无法跟上可用信息的步伐。




认知计算则使人们能够创造一种深刻的新型价值,从海量数据中找出隐藏的答案和洞察。


认知计算的应用场景

无论是医生诊断病人、理财经理为客户提供退休投资组合建议,还是厨师创造新食谱,他们都需要新的方法来处理日常接触的大量信息,并将其置于具体情境中,从而从中获得价值。

这些过程旨在增强人类的专业知识。


模仿人类认知过程 🧠

认知计算模仿了人类专业知识的一些关键认知要素。这些系统能像人类一样对问题进行推理。

当我们人类试图理解某事并做出决定时,会经历四个关键步骤。以下是这些步骤的详细说明:

  1. 观察:我们观察可见的现象和证据体。
  2. 解读:我们运用已知知识来解读所见,生成关于其含义的假设。
  3. 评估:我们评估哪些假设是正确的或错误的。
  4. 决策:我们选择看似最佳的选项并采取相应行动。





正如人类通过观察、评估和决策的过程成为专家一样,认知系统使用类似的过程来推理它们所读取的信息,并且能够以极快的速度和巨大的规模做到这一点。


处理非结构化数据

与传统计算解决方案不同,认知计算解决方案能够理解非结构化数据

  • 传统计算:通常只能处理整齐组织的结构化数据(例如数据库中存储的数据)。
  • 认知计算:可以理解非结构化数据,这类数据占当今数据的80%,主要是人类为其他人类消费而产生的所有信息。

这包括从文学文章、研究报告到博客文章和推文的一切内容。







结构化数据由定义明确的字段(包含规范信息)管理,而认知系统依赖于自然语言,它受语法、上下文和文化规则的约束。

自然语言是隐含的、模糊的、复杂的,处理起来具有挑战性。

虽然所有人类语言都难以解析,但某些习语在英语中尤其具有挑战性。例如,我们可能会因为“下着倾盆大雨”而感到“忧郁”,同时还在填写别人要求我们填写的表格。



认知系统的三大核心能力

了解了认知系统处理的数据类型后,我们来看看它的三个核心运作方式。

1. 像人一样阅读与解释

认知系统像人一样阅读和解释文本。它们通过从语法、关系和结构上分解句子,从书面材料的语义中辨别含义来实现这一点。

2. 理解上下文

这与简单的语音识别非常不同。语音识别是计算机将人类语音转换为一组词语的过程。

而认知系统试图理解用户语言的真实意图,并利用这种理解,通过一系列广泛的语言模型和算法进行推理。

3. 持续学习与适应

认知系统会学习、适应并变得越来越智能。它们通过从与我们的互动中,以及从自身的成功和失败中学习来做到这一点,就像人类一样。



总结

本节课中,我们一起学习了认知计算的核心要义。我们了解到:

  • 认知计算是一种全新的计算范式,旨在处理大数据时代的复杂、非结构化信息。
  • 它通过模仿人类的观察、解读、评估、决策认知过程来进行推理。
  • 与传统计算相比,它能理解占数据总量80%的非结构化数据(如文本、图像)。
  • 认知系统具备三大关键能力:像人一样阅读解释理解上下文以及持续学习与适应

认知计算的目标不是取代人类,而是增强人类专家能力,帮助我们从海量信息中发现隐藏的价值和洞察。

012:人工智能核心术语与概念解析 🤖

在本节课中,我们将学习人工智能领域中几个紧密相关但含义不同的核心术语:人工智能机器学习深度学习神经网络以及数据科学。明确这些概念的区别,是深入理解AI工作原理及其应用的基础。

在深入探讨人工智能的工作原理、各种应用场景之前,我们首先需要区分几个紧密相关的术语和概念:人工智能、机器学习、深度学习和神经网络。这些术语有时会被混用,但它们所指的并非同一事物。

什么是人工智能?🧠

人工智能是计算机科学的一个分支,致力于模拟智能行为。AI系统通常会展现出与人类智能相关的行为,例如:

  • 规划
  • 学习
  • 推理
  • 解决问题
  • 知识表示
  • 感知
  • 运动与操控
  • 以及程度稍弱的社交智能创造力




什么是机器学习?📈

上一节我们介绍了人工智能的宽泛定义,本节中我们来看看它的一个重要子集。

机器学习是人工智能的一个子集,它使用计算机算法分析数据,并根据所学内容做出智能决策,而无需进行显式编程。机器学习算法使用大量数据集进行训练,它们从示例中学习,不遵循基于规则的算法。机器学习使机器能够自主解决问题,并利用提供的数据做出准确预测。

其核心思想可以概括为:让计算机从数据中学习规律,而非直接编写规则。公式可表示为:
模型 = 算法(数据)


什么是深度学习与神经网络?🔗

理解了机器学习后,我们进一步聚焦于其中一种强大的方法。

深度学习是机器学习的一个专门子集,它使用分层的神经网络来模拟人类决策。深度学习算法能够标记和分类信息,并识别模式。它使得AI系统能够在工作中持续学习,并通过判断决策是否正确来提高结果的质量和准确性。

人工神经网络(通常简称为神经网络)的灵感来源于生物神经网络,尽管其工作方式有很大不同。AI中的神经网络是由许多称为“神经元”的小计算单元组成的集合,这些神经元接收输入数据,并随着时间的推移学习做出决策。

神经网络通常是多层的、深度的,这也正是“深度学习”名称的由来。与数据量增加时可能达到性能瓶颈的其他机器学习算法不同,深度学习算法会随着数据集体积的增长而变得更高效。

以下是神经网络的一个简化结构示意:

# 伪代码示例:一个简单的神经网络层计算
输出 = 激活函数(权重 · 输入 + 偏置)





人工智能 vs. 数据科学 📊

现在你已经对几个关键AI概念的区别有了大致了解。还有一个重要的区分需要理解,那就是人工智能数据科学之间的关系。

数据科学是从大量异构数据中提取知识和洞察的过程与方法。它是一个跨学科领域,涉及数学、统计分析、数据可视化、机器学习等。数据科学使我们能够处理信息、发现模式、从海量数据中找到意义,并利用它做出推动业务的决策。

数据科学可以使用许多AI技术从数据中获取洞察。例如,它可以使用机器学习算法甚至深度学习模型从数据中提取意义并得出推论。人工智能和数据科学之间存在一些交叉,但两者并非子集关系。更准确地说,数据科学是一个广义术语,涵盖了整个数据处理方法论;而人工智能则包含了让计算机学习如何解决问题并做出智能决策的一切技术。两者都可能涉及使用大数据,即体量巨大的数据集。

在接下来的课程中,术语“机器学习”、“深度学习”和“神经网络”将被更详细地讨论。


本节课中我们一起学习了人工智能领域的核心术语。我们明确了人工智能是模拟智能行为的广阔领域;机器学习是其子集,让计算机从数据中学习;深度学习是机器学习的一种,依靠深层神经网络实现复杂模式识别;而数据科学是一个更广泛的数据处理方法论,与AI既有交叉又各自独立。理解这些概念的区别与联系,是进一步探索AI世界的重要基石。

013:机器学习核心概念 🧠

在本节课中,我们将要学习机器学习的基本概念,了解它与传统编程的区别,并认识三种主要的机器学习类型。


什么是机器学习?

机器学习是人工智能的一个子集。它使用计算机算法分析数据,并基于学习到的信息做出智能决策,而不是遵循基于规则的算法。机器学习通过构建模型来对数据进行分类和预测。

为了理解这个概念,我们可以探索一个可能用机器学习解决的问题。

假设我们想判断心脏是否会衰竭。这是否能用机器学习解决?答案是肯定的。假设我们拥有一些数据,例如每分钟心跳次数、身体质量指数、年龄、性别,以及结果——心脏是否衰竭。

利用机器学习,给定这些数据,我们能够学习并创建一个模型。该模型在给定输入后可以预测结果。


机器学习与传统编程的区别

那么,这与使用统计分析创建算法有何不同?

算法是一种数学技术。在传统编程中,我们获取数据规则,并用它们来开发一个能给出答案的算法。

在上一个例子中,如果使用传统算法,我们会获取如每分钟心跳次数和身体质量指数等数据,并用这些数据创建一个算法来判断心脏是否会衰竭。本质上,这将是一个 if-then-else 语句。当我们提交输入时,会根据我们确定的算法得到答案,而这个算法本身不会改变。

传统编程流程:
数据 + 规则 -> 算法 -> 答案

另一方面,机器学习则采用数据答案来创建算法。我们最终得到的不是答案,而是一组决定机器学习模型形态的规则。模型在获得输入时,会自行确定规则和 if-then-else 逻辑。

机器学习流程:
数据 + 答案 -> 算法(模型)

本质上,模型所做的是确定传统算法中的参数。我们不是武断地决定“每分钟心跳次数 + 身体质量指数 = 某个结果”,而是使用模型来确定逻辑是什么。与传统算法不同,这个模型可以持续训练,并在未来用于预测新值。

机器学习依赖于通过检查和比较大型数据集来发现共同模式,从而定义行为规则。


机器学习的三种主要类型

机器学习主要分为三种类型:监督学习、无监督学习和强化学习。

1. 监督学习 👁️

例如,我们可以向机器学习程序提供大量鸟类图片,并训练模型在提供鸟类图片时返回标签“鸟”。我们也可以为“猫”创建一个标签,并提供猫的图片进行训练。

当机器学习模型看到一张猫或鸟的图片时,它会以一定的置信度给图片贴上标签。这种类型的机器学习被称为监督学习,即算法在人类标记的数据上进行训练。

你为监督学习算法提供的样本越多,它在分类新数据时就变得越精确。

2. 无监督学习 🔍

另一种机器学习类型是无监督学习。它依赖于向算法提供未标记的数据,并让它自行发现模式。你提供输入,但不提供标签,让机器推断特征。

算法接收未标记的数据,进行推断并发现模式。这种学习对于数据聚类很有用,即根据数据与邻近数据的相似性以及与其他所有数据的差异性进行分组。

数据聚类后,可以使用不同的技术来探索这些数据并寻找模式。例如,你可以向机器学习算法提供持续的网络流量数据流,让它独立学习基线正常网络活动,以及网络上可能发生的异常和恶意行为。

3. 强化学习 🎮

第三种机器学习算法是强化学习。它依赖于向机器学习算法提供一组规则和约束,并让它学习如何实现目标。你定义状态、期望目标、允许的动作和约束。

算法通过尝试不同的允许动作组合来找出如何实现目标,并根据决策的好坏获得奖励或惩罚。算法在提供的约束范围内尽力最大化其奖励。你可以使用强化学习来教机器下国际象棋或穿越障碍路线。


总结

本节课中,我们一起学习了机器学习的核心概念。我们了解到机器学习是让计算机从数据中学习并做出决策,这与传统基于固定规则的编程有本质区别。我们重点探讨了三种主要的机器学习范式:

  • 监督学习:使用带标签的数据进行训练,用于分类和预测。
  • 无监督学习:使用未标记的数据自行发现模式和结构,如聚类。
  • 强化学习:通过与环境的交互和奖惩机制来学习达成目标的最佳策略。

机器学习模型就是用于发现数据中模式的算法,而无需程序员显式地编程这些模式。理解这些基础是进一步探索人工智能应用的重要一步。

014:机器学习技术与训练 🧠

在本节课中,我们将学习机器学习的基本分类、核心概念以及模型训练与评估的过程。我们将探讨监督学习、无监督学习和强化学习的区别,并深入了解分类、回归等具体任务。


机器学习是一个广泛的领域,我们可以将其分为三个不同的类别:监督学习、无监督学习和强化学习。我们可以用这些技术解决许多不同的任务。

监督学习指的是数据中包含类别标签,我们利用这些标签来构建分类模型。这意味着当我们接收数据时,数据带有说明其含义的标签。

在之前的例子中,我们有一个包含“年龄”或“性别”等标签的表格。

对于无监督学习,我们没有类别标签,必须从非结构化数据中发现类别标签。这可能涉及深度学习等技术,例如通过查看图片来训练模型。

这类任务通常通过一种称为“聚类”的方法来完成。

强化学习是另一个子集,它使用奖励函数来惩罚不良行为或奖励良好行为。


监督学习的细分 📊

上一节我们介绍了机器学习的三大类别,本节中我们来看看监督学习的具体细分。

监督学习可以进一步分为三个类别:回归、分类和神经网络。

回归模型通过观察特征 X 与结果 Y 之间的关系来构建,其中 Y 是一个连续变量。

本质上,回归用于估计连续值。

神经网络指的是模仿人脑结构的模型。


理解分类任务 🏷️

了解了回归之后,我们来看看分类任务。

分类则侧重于离散值。它根据许多输入特征 X 来分配离散的类别标签 Y

在之前的例子中,给定一组特征 X,如每分钟心跳次数、身体质量指数、年龄和性别,算法将输出 Y 分类为两个类别:真或假,以预测心脏是否会衰竭。

在其他分类模型中,我们可以将结果分为两个以上的类别。例如,预测一个食谱是属于印度菜、中国菜、日本菜还是泰国菜。

以下是几种常见的分类形式:

  • 决策树
  • 支持向量机
  • 逻辑回归
  • 随机森林


特征与训练过程 ⚙️

在分类中,我们可以从数据中提取特征。在这个例子中,特征就是每分钟心跳次数或年龄。

特征是输入模式的独特属性,有助于确定输出的类别。每一列是一个特征,每一行是一个数据点。

分类是预测给定数据点类别的过程。我们的分类器使用一些训练数据来理解给定的输入变量与该类别之间的关系。

那么“训练”具体指什么呢?训练指的是使用学习算法来确定和开发模型的参数。虽然有许多算法可以实现这一点,通俗地说,如果你正在训练一个模型来预测心脏是否会衰竭(即真或假值),你会向算法展示一些标记为“真”的真实数据,然后再向算法展示一些标记为“假”的数据,并重复这个过程,数据带有真或假值(即心脏是否真的衰竭了)。

算法会修改其内部值,直到学会从指示心脏衰竭(真)或未衰竭(假)的数据中进行区分。


数据集划分与模型评估 📈

在机器学习中,我们通常将一个数据集分成三个部分:训练集、验证集和测试集。

以下是每个部分的作用:

  • 训练子集:用于训练算法的数据。
  • 验证子集:用于验证我们的结果并微调算法的参数。
  • 测试数据:模型从未见过的数据,用于评估我们的模型有多好。

然后,我们可以使用准确率、精确率和召回率等术语来表明模型的好坏。


总结 ✨

本节课中,我们一起学习了机器学习的主要分类:监督学习、无监督学习和强化学习。我们深入探讨了监督学习下的回归与分类任务,理解了特征的含义以及模型训练的基本过程。最后,我们了解了如何将数据集划分为训练集、验证集和测试集,并利用测试集来评估模型的性能。掌握这些基础概念是构建有效AI模型的第一步。

015:深度学习 🧠

在本节课中,我们将要学习深度学习的核心概念、工作原理及其在人工智能领域的重要应用。深度学习是机器学习的一个专门子集,它通过模拟人脑的神经网络结构,使AI系统能够从非结构化数据中持续学习并提升性能。


什么是深度学习?

机器学习是人工智能的一个子集,而深度学习是机器学习的一个专门子集。

深度学习通过分层算法构建神经网络,这是一种对大脑结构和功能的人工模拟。这种结构使得AI系统能够在工作中持续学习,并提高结果的质量与准确性。

正是这种能力,使得系统能够从照片、视频和音频文件等非结构化数据中学习。


深度学习如何工作?

上一节我们介绍了深度学习的基本定义,本节中我们来看看它的工作原理。

深度学习算法并非直接将输入映射到输出。相反,它们依赖于多层处理单元。每一层将其输出传递给下一层,由下一层进行处理后再继续传递。正是由于存在许多层,它才被称为“深度”学习。

在创建深度学习算法时,开发者和工程师需要配置网络的层数以及连接各层输入与输出的函数类型。

其核心结构可以抽象为以下公式:
输出 = 层_n( ... 层_2( 层_1(输入) ) ... )

然后,他们通过提供大量带标注的示例来训练模型。例如,如果你给一个深度学习算法成千上万张图片以及对应每张图片内容的标签,该算法会将这些示例通过其分层的神经网络运行,并调整神经网络每一层中变量的权重,以便能够识别出具有相似标签的图片所共有的模式。

以下是深度学习训练过程的简要步骤:

  1. 准备数据:收集并标注大量数据。
  2. 构建网络:确定层数、每层的神经元数量及激活函数。
  3. 前向传播:输入数据通过网络层层传递,得到预测输出。
  4. 计算损失:比较预测输出与真实标签,计算误差(损失)。
  5. 反向传播:将误差从输出层向输入层反向传播,计算各层参数的梯度。
  6. 更新权重:使用优化算法(如梯度下降)根据梯度调整网络权重。

深度学习的优势

深度学习解决了一个存在于早期学习算法中的主要问题。当数据集增长时,传统机器学习算法的效率和性能会达到瓶颈,而深度学习算法随着被喂入更多数据,性能会持续提升。

这一点可以直观地理解为:更多的数据 → 更准确的模型


深度学习的应用

深度学习已被证明在各种任务中非常高效,其应用广泛。

以下是深度学习的一些主要应用领域:

  • 图像标注:自动为图片生成描述性文字。
  • 语音识别与转录:将语音转换为文本。
  • 人脸识别:识别和验证个人身份。
  • 医学影像分析:辅助诊断疾病(如分析X光片、MRI图像)。
  • 语言翻译:实现高质量、上下文相关的机器翻译。

此外,深度学习也是无人驾驶汽车的主要技术组件之一。


总结

本节课中我们一起学习了深度学习。我们了解到深度学习是机器学习的一个强大分支,它利用多层神经网络结构来模拟人脑的学习过程。这种结构使其能够处理复杂的非结构化数据,并随着数据量的增加而不断改进性能。从图像识别到自动驾驶,深度学习正在推动人工智能技术在许多领域取得突破性进展。

016:神经网络 🧠

在本节课中,我们将要学习人工智能的核心技术之一——神经网络。我们将了解它的基本构成、工作原理以及几种重要的网络类型。


什么是人工神经网络? 🎼

人工神经网络是由许多被称为“神经元”的小型计算单元组成的集合。这些神经元模仿人脑处理信息的方式进行建模。人工神经网络借鉴了生物大脑神经网络的一些思想,以近似实现其部分处理结果。

这些神经元像生物神经网络一样接收输入数据,并随着时间学习如何做出决策。


神经网络如何学习? 🔄

神经网络通过一个称为“反向传播”的过程进行学习。反向传播使用一组训练数据,这些数据将已知输入与期望输出相匹配。

以下是反向传播的基本步骤:

  1. 前向传播:首先,将输入数据输入网络,并确定输出。
  2. 计算误差:然后,一个误差函数会计算当前输出与期望输出之间的差距。
  3. 调整参数:最后,对网络内部的参数(如权重)进行调整,以减少误差。

这个过程会不断重复,直到网络的预测达到可接受的准确度。





神经网络的层结构 🏗️

上一节我们介绍了神经元如何工作,本节中我们来看看它们是如何组织起来的。

一组神经元被称为一个“层”。一个层接收输入并提供输出。任何神经网络都会有一个输入层和一个输出层。它还会有一个或多个“隐藏层”,这些隐藏层模拟了人脑中进行的活动类型。

隐藏层接收一组加权的输入,并通过一个“激活函数”产生输出。拥有多个隐藏层的神经网络被称为深度神经网络

以下是神经网络中不同层的功能:

  • 输入层:将输入值乘以权重并求和,然后将结果传递给下一层。
  • 隐藏层与输出层:接收来自其他节点的输入,并将输出传递给其他节点。它们具有一个称为“偏置”的属性,这是一种特殊的权重,在其他输入被考虑后应用于节点。
  • 激活函数:决定节点如何响应其输入。该函数对输入和偏置的总和进行计算,然后将结果作为输出转发。激活函数可以有不同的形式(如Sigmoid, ReLU),选择何种激活函数是神经网络成功的关键组成部分。


卷积神经网络(CNN) 🖼️

了解了基础的网络结构后,我们来看看一种专门用于处理图像等网格状数据的网络——卷积神经网络。

卷积神经网络(CNN)是一种多层神经网络,其灵感来源于动物的视觉皮层。CNN在图像处理、视频识别和自然语言处理等应用中非常有用。

“卷积”是一种数学运算,其中一个函数应用于另一个函数,结果是两个函数的混合。在卷积网络中,这个过程发生在一系列层上,每一层都对前一层的输出进行卷积操作。

CNN擅长从简单的结构中检测特征,并将这些简单特征组合起来构建更复杂的特征。


循环神经网络(RNN) ⏳

最后,我们来看一种用于处理序列数据的网络——循环神经网络。

循环神经网络(RNN)之所以是“循环”的,是因为它对序列中的每个元素执行相同的任务,并且将先前的输出作为后续阶段的输入。

在普通的神经网络中,输入通过若干层处理,然后产生输出,并假设两个连续的输入是彼此独立的。但在某些场景下,这种假设可能不成立。例如,当我们需要考虑一个单词被说出时的上下文时,就必须依赖之前的观察结果来产生输出。

RNN可以利用长序列中的信息。网络的每一层都代表了在某个特定时间的观察。



总结 📝

本节课中我们一起学习了神经网络的基础知识。我们首先了解了人工神经网络的基本单元——神经元,以及它通过反向传播进行学习的过程。接着,我们探讨了神经网络的层状结构,包括输入层、隐藏层和输出层,并介绍了激活函数的作用。最后,我们学习了两种重要的专门化网络:用于图像处理的卷积神经网络(CNN)和用于序列数据的循环神经网络(RNN)。理解这些概念是构建更复杂AI应用的基础。

017:🤖 AI中的关键应用领域

在本节课中,我们将探讨人工智能的几个主要应用领域。我们将从最复杂的自然语言处理开始,逐步了解计算机视觉、音频数据处理以及传统的结构化数据分析。这些领域共同构成了现代AI技术的基础。


上一节我们介绍了人工智能的广阔前景,本节中我们来看看AI具体在哪些关键领域发挥作用。虽然AI的应用范围非常广泛,但我们可以从宏观上将其归纳为几个主要类别。

📝 自然语言处理

我首先要从自然语言开始,因为我认为自然语言是机器学习需要处理的最复杂的数据类型。

如果你观察各种数据,无论是基因序列、音频还是图像,它们都存在某种可辨别的模式。例如,汽车的声音或人声都有其特定模式。然而,自然语言从根本上说是一项非常“人类”的任务,是一种非常“人类”的数据源。它是我们人类发明出来供人类理解的。

这里有一个关于自然语言复杂性的著名例子。假设有一本书,书名是:“这本书的标题里有两个错误”。实际上,这个标题里只有一个错误(“Therere”的语法错误)。人类大脑可能不会立刻意识到:第二个“错误”就是“实际上只有一个错误”这个事实本身。这体现了自然语言的内在复杂性。

人类并非从字面意义上理解语言,而是从概念上理解。例如,如果我写“a3”来代替字母“E”,你也能理解,因为我们不把“3”当作字面上的数字,而是将其视为代表“E”这个概念的符号。你能根据上下文推断出“3”指的是字母“E”而不是数字三。这些是计算机目前难以直接做到的事情。

因此,在机器学习领域,自然语言是我最感兴趣的首要领域。

👁️ 计算机视觉

其次,我认为最流行的领域是视觉数据理解,即计算机视觉。因为它使我们能够实现许多功能。作为人类,我们的主要感官是视觉。事实上,在任何时刻,你大脑的大部分处理能力都用于理解你所看到的事物,无论是人脸、电脑、文本还是其他任何东西。

🔊 音频数据处理

第三,我会说是基于音频的数据处理。因此,文本转语音和语音转文本是非常复杂的任务。

其复杂性在于它结合了许多挑战。首先,你必须支持多种语言,不能只支持英语就万事大吉。你必须支持其他语言和其他人群。

另一个挑战是,即使在同一种语言内部,人类表达语言的方式也几乎是无限的。每个人都会有不同口音,每个人对某些单词的发音方式都不同。不存在一个让每个人都完全一样地读出“ice cube”的标准方式。

此外,音频数据本身处理起来就非常困难。因为音频数据存在于自然界中。什么是音频?它是空气分子的振动,而这种振动非常快。音频通常以超过44千赫兹的频率被录制,这意味着每秒会产生大量数据点。

公式示例: 采样率 44 kHz = 每秒 44,000 个数据点。

一个低分辨率的图像通常也只有大约44,000个数据点。因此,在处理音频数据时,确实存在许多需要克服的挑战。但像IBM、谷歌、微软这样的公司已经设法应对了这些挑战,并致力于创建不同的服务来让开发者的工作变得更轻松。

📊 结构化数据分析

当然,还有传统的表格数据理解领域,这本质上是结构化数据的分析。


本节课中我们一起学习了人工智能的四个关键应用领域:自然语言处理计算机视觉音频数据处理以及结构化数据分析。每个领域都面临着独特的挑战,但也为AI技术的创新和应用提供了广阔的空间。理解这些领域是构建有效AI解决方案的第一步。

018:人工智能的三大应用领域 🧠

在本节课中,我们将学习人工智能最常见的三个应用领域:自然语言处理语音技术计算机视觉。我们将了解它们的基本概念、工作原理以及它们如何改变我们与数字世界的交互方式。


自然语言处理 📝

人工智能最常见的应用领域包括自然语言处理、语音和计算机视觉。现在,让我们逐一了解它们。

人类拥有最先进的交流方式,即自然语言。虽然人类可以使用计算机互相发送语音和文本消息,但计算机本身并不知道如何处理自然语言。

自然语言处理是人工智能的一个子集,它使计算机能够理解人类语言的含义。自然语言处理使用机器学习和深度学习算法来辨别词语的语义。

它通过语法、关系和结构上解构句子,并理解其使用语境来实现这一点。例如,根据对话的上下文,NLP可以判断“cloud”一词是指云计算,还是指天空中漂浮的大量凝结水蒸气。

NLP系统还可能理解意图和情感,例如判断你的提问是出于沮丧、困惑还是恼怒。为了理解用户语言的真实意图,NLP系统通过一系列广泛的语言学模型和算法进行推断。


语音技术 🎤

上一节我们介绍了自然语言处理,本节中我们来看看语音技术。自然语言处理被分解为许多与音频和视觉任务相关的子类别。

为了让计算机用自然语言交流,它们需要能够将语音转换为文本,从而使交流更自然、更容易处理。它们还需要能够将文本转换为语音,使用户无需盯着屏幕即可与计算机交互。

以下是语音转文本技术的发展历程:

  • 传统方法:早期的语音转文本技术需要程序员经历一个繁琐的过程,即发现并编码规则,以对语音样本进行分类并将其转换为文本。
  • 神经网络方法:使用神经网络时,无需编码规则。你只需提供语音样本及其对应的文本。神经网络会找出单词发音之间的共同模式,然后学习将新的语音录音映射到其对应的文本。

语音转文本技术的这些进步,是我们能够实现实时转录的原因。谷歌在其“来电筛选”功能中使用AI驱动的语音转文本技术来处理诈骗电话并向你显示通话内容文本。YouTube也使用此技术来提供自动字幕。

语音转文本的另一面是文本转语音,也称为语音合成。

以下是文本转语音技术的发展:

  • 过去:创建一个语音模型需要数百小时的编码工作。
  • 现在:在神经网络的帮助下,合成人声已成为可能。其过程通常涉及两个神经网络:
    1. 第一个神经网络(分类器)摄入一个人的大量语音样本,直到它能够判断一个新的语音样本是否属于同一个人。
    2. 第二个神经网络(生成器)生成音频数据,并将其通过第一个网络,以查看其是否验证该音频属于目标人物。如果不通过,生成器会修正其样本并再次通过分类器运行。

这两个网络重复此过程,直到生成听起来自然的样本。公司使用AI驱动的语音合成来增强客户体验,并赋予其品牌独特的声音。在医学领域,这项技术正在帮助肌萎缩侧索硬化症患者重获他们真实的声音,而不是使用计算机合成的声音。


计算机视觉 👁️

上一节我们探讨了语音技术,本节我们将聚焦于计算机视觉。

计算机视觉领域专注于复制人类视觉系统的部分复杂性,并使计算机能够像人类一样识别和处理图像及视频中的物体。计算机视觉是使数字世界能够与物理世界交互的技术之一。

近年来,由于深度学习和神经网络的进步,计算机视觉领域取得了巨大飞跃,在检测和标记物体等相关任务上甚至超越了人类。

这项技术使自动驾驶汽车能够理解周围环境。它在人脸识别应用中扮演着至关重要的角色,使计算机能够将人脸图像与其身份匹配。它也在增强现实和混合现实中发挥着关键作用,这项技术允许智能手机、平板电脑和智能眼镜等计算机设备在真实世界图像上叠加和嵌入虚拟物体。

像谷歌相册这样的在线照片库使用计算机视觉来检测物体,并根据其包含的内容类型对图像进行分类。


总结 📚

本节课中,我们一起学习了人工智能的三大核心应用领域。

  1. 自然语言处理:使计算机能够理解、解释和生成人类语言,关键在于理解语境和意图。
  2. 语音技术:包括语音转文本文本转语音,它们让人机交互更加自然便捷,其核心进步源于神经网络。
  3. 计算机视觉:赋予计算机“看”和理解视觉世界的能力,广泛应用于自动驾驶、人脸识别和增强现实等领域。

这些技术共同构成了现代AI应用的基础,正在深刻地改变我们的生活和工作方式。

020:探索当今的AI关注点 🔍

在本节课中,我们将探讨当前人工智能领域的热点话题。我们将了解可信AI的重要性,并考察AI在面部识别、招聘、社交媒体营销以及医疗保健等具体领域的应用与挑战。


可信AI:当今的核心议题

上一节我们介绍了课程概述,本节中我们来看看当前AI领域的核心议题。人们常问我AI的当前热点是什么,我的回答是,今天所说的内容很可能在下周甚至明天就会有所不同。AI世界极具活力,这是一件好事。它是一项新兴技术,拥有惊人的可能性,并有潜力以前所未有的速度解决众多问题。

然而,正如我们所见,在某些情况下,AI也可能产生有害后果。因此,我认为AI的热点议题是:我们如何负责任地运用它?IBM提出了五大支柱来应对这一问题,概括了负责任AI的理念,即可解释性、透明度、稳健性、隐私和公平性。我们可以更深入地探讨这些主题。

但我想在此强调两点:
第一,这不是一项一劳永逸的工作。如果你打算使用AI,如果我们打算将其应用于社会,这不是你仅在开始或结束时才需要处理的事情,而是必须在AI的整个生命周期中持续关注的问题。无论你是在规划阶段、设计AI、训练AI、部署AI,还是作为与AI交互的最终用户,都需要不断思考这五大支柱。

第二,我认为更重要的是,这是一项团队运动。我们都需要意识到AI带来的潜在好处和潜在危害,并鼓励每个人提出问题,为人们保持对AI工作原理及其行为的好奇心留出空间。只有这样,我们才能真正利用它来解决有益的问题,取得巨大成果,并减轻任何潜在的危害。所以,请保持好奇心。


AI在面部识别技术中的应用

在围绕人工智能设计解决方案时,面部识别已成为一个永久性的用例。目前设计和应用的模型与算法主要有三种典型类别。

以下是三种主要的面部识别类别:

  1. 面部检测:仅检测一个物体是否是人脸,而不是狗或猫等其他物体。这种识别不涉及唯一识别该面孔属于谁。
  2. 面部认证:你可能使用这种面部识别来解锁iPhone或安卓设备。在这种情况下,我们通过将面部图像特征与预先存储的单一图像进行比较,提供一对一的身份验证。这意味着你实际上只将图像与设备所有者的特定图像进行比较。
  3. 面部匹配:在这种情况下,我们将图像与其他图像或照片数据库进行比较。这与前一种类别的不同之处在于,模型试图在包含属于其他人的图像或照片的数据库中,确定与个体身份相匹配的面部。

面部识别有许多不同的例子,其中许多无疑是你日常活动中正在体验的。有些已被证明是有益的,而另一些则被证明不那么有益,甚至还有一些被证明具有犯罪性质,因为某些人群因这些系统的使用而受到伤害。

我们看到,AI系统中的面部识别技术和解决方案在诸如机场导航、通过安检线,或者我们之前讨论过的使用面部识别解锁iPhone、家门或汽车门等场景中提供了重要价值。这些都是面部识别技术的有益用途。

但是,也存在一些必须禁止的明确示例和用例。这些可能包括在未经本人明确许可的情况下在人群中识别个人,或对个人或群体进行大规模监控。这类技术使用方式,如果被错误的人以错误的方式使用,会引发严重的隐私、公民权利和人权问题。面部识别技术无疑可能被用来压制异议、侵犯少数群体权利,或者仅仅剥夺你对隐私的基本期望。


AI在招聘中的应用

AI正越来越多地被引入到劳动力发展的各个阶段,包括招聘、入职、职业发展(如晋升和奖励)以及处理人员流失等。以招聘为例,考虑一个收到成千上万份职位申请的组织,申请人应聘各种职位,包括前台、后台、季节性、永久性等。

AI可以帮助你对申请者进行排名和优先级排序,针对目标职位空缺,向招聘经理呈现一份顶级候选人名单。AI解决方案可以处理简历中的文本,并将其与其他结构化数据结合,以辅助决策。

现在,我们需要谨慎地设置防护措施。我们需要确保AI在招聘中的使用不会在性别、种族等敏感属性上产生偏见。即使这些属性没有被AI直接使用,也可能通过代理属性(如邮政编码或之前从事的工作类型)悄然渗入。


AI在社交媒体营销中的应用

当今AI的一个热点话题是其在社交媒体营销中的应用。它彻底改变了品牌在TikTok、LinkedIn、Twitter、Instagram、Facebook等社交媒体平台上与受众互动的方式。

以下是AI在社交媒体营销中的主要应用:

  • AI可以为你创建广告。
  • AI可以为你创建社交媒体帖子。
  • AI可以帮助你精准定位这些广告。
  • AI可以使用情感分析为你识别新的受众。

所有这些都为营销人员带来了惊人的效果,提高了营销活动的有效性,同时降低了运营这些活动的成本。

然而,AI为在社交媒体平台上进行营销所提供的技术和能力也引发了一些伦理问题。营销之所以成功,很大程度上归功于社交媒体平台从其用户那里收集的所有数据。表面上,收集这些数据是为了给终端用户提供更个性化的体验。但平台并不总是明确告知收集了哪些数据,以及你是否同意他们使用这些数据。

现在,那些对品牌营销活动非常有效的技术,同样可以用于生成错误信息、阴谋论,无论是政治上的还是科学上的错误信息。这对我们的整个社会产生了可怕的影
响。这就是为什么所有企业都必须遵守一些明确的原则,围绕透明度、可解释性、信任和隐私,来规范他们如何使用AI或将AI构建到他们的解决方案和平台中。


AI在医疗保健中的应用

AI的使用正在所有医疗保健领域(如医疗服务提供者、支付方、生命科学等)不断增加。支付方组织正在使用利用理赔数据的AI和机器学习解决方案,并经常将其与社会健康决定因素等其他数据集相结合。

一个顶级的用例是用于协调护理的疾病预测。例如,预测会员群体中谁可能在未来三个月内出现不良状况(如急诊就诊),然后提供正确的干预和预防形式。在这种情况下,公平护理变得非常重要。我们需要确保AI在年龄、性别、种族等所有敏感属性上没有偏见。

当然,在所有领域中,对话式AI(包括虚拟代理以及帮助人类更好地服务会员群体的系统)已成为标配。在医疗保健中所有这些AI用例中,我们看到了一些共同点:能够从组织拥有的丰富数据集中解锁洞察、改善会员或患者体验,以及设置防护措施以确保AI是可信的。


总结

本节课中,我们一起探索了当前人工智能领域的几个关键关注点。我们了解到,构建可信赖的AI(涵盖可解释性、透明度、稳健性、隐私和公平性)是贯穿AI生命周期的核心议题。我们具体考察了AI在面部识别招聘社交媒体营销医疗保健等领域的应用,认识到AI在带来效率提升和全新可能性的同时,也伴随着偏见、隐私和伦理等方面的挑战。负责任地开发和使用AI,需要持续的关注、团队的协作以及明确的原则与防护措施。

021:探索人工智能与伦理 🤖⚖️

在本节课中,我们将要学习人工智能伦理的概念、重要性以及如何在实践中应用它。我们将探讨为何AI伦理是一个社会技术挑战,以及组织如何通过原则、治理和具体操作来构建和使用合乎伦理的人工智能。


人工智能的普遍性与社会影响

人工智能在我们的生活中无处不在,即使我们常常没有意识到它。当我们使用信用卡在线购物、在网络上搜索信息、在社交平台上发布内容或关注他人,甚至是在使用基于AI的导航支持和驾驶辅助功能时,我们都在使用人工智能。

这种普遍性给我们的生活以及社会的结构和公平性带来了快速而重大的转变。正因如此,人工智能除了是一门技术和科学学科外,还具有非常重要的社会影响力。这引发了许多关于AI应如何被设计、开发、部署、使用和监管的伦理问题。


人工智能的社会技术维度与包容性

人工智能的社会技术维度要求我们努力识别所有利益相关者,这远远超出了技术专家的范畴,还包括社会学家、哲学家、经济学家、政策制定者以及受这项技术部署影响的所有社群。

在定义生态系统、在AI开发和部署的所有阶段、以及在AI对部署场景的影响中,包容性都是必要的。没有包容性,我们就有风险创造出只为少数人服务的AI,而将许多其他人抛在后面,使其处于不利地位。每个人都需要参与定义我们想要利用AI和其他技术(作为手段而非目的)构建的未来愿景。

为了实现这一愿景,需要适当的指导方针来引导AI的创造和使用朝着正确的方向发展。技术工具是必要且有用的,但它们应该辅以原则、保障措施、定义明确的流程和有效的治理。我们不应认为所有这些会减缓创新。


伦理作为创新的加速器

我们可以将AI伦理比作交通规则。交通信号灯、停车标志和速度限制看似让我们慢下来。然而,如果没有它们,我们并不会开得更快,反而会因为对其他车辆和行人的状态完全不确定而开得更慢。

AI伦理识别并解决了这项技术引发的社会技术问题,确保支持并促进正确的创新,从而使通往我们期望的未来的道路更加顺畅。

正如IBM首席执行官所言,信任是我们运营的许可证。我们通过我们的政策、计划、合作伙伴关系以及对技术负责任使用的倡导赢得了这种信任。一百多年来,IBM一直处于创新的前沿,为我们的客户和社会带来利益。

这种方法无疑适用于人工智能的开发、使用和部署。因此,伦理应嵌入到设计和开发流程的生命周期中。


构建伦理基础:原则与支柱

伦理决策不仅仅是一种技术问题解决方法。相反,应基于原则、价值观、标准、法律和对社会的益处,采取一种伦理、社会学、技术和以人为本的方法。因此,建立这个基础是重要且必要的,但从哪里开始呢?

一个很好的起点是一套指导原则。在IBM,我们将我们的原则称为“信任与透明原则”,共有三条:

  1. AI的目的是增强而非取代人类智能。
  2. 数据和洞察力属于其创造者。
  3. 包括AI系统在内的新技术必须是透明且可解释的。

最后一条原则建立在我们的五大支柱之上:

  • 透明:通过分享AI的用途和运作方式来增强信任。
  • 可解释:系统能够解释其决策过程。
  • 公平:当系统经过适当校准时,它应能协助做出更好的选择,并确保公平性。
  • 稳健:系统应该是安全的。
  • 隐私保护:保障隐私和权利。

我们知道,仅有原则和支柱是不够的。我们拥有一套广泛的工具和才华横溢的从业者,他们可以帮助诊断、监控、促进我们所有的支柱,并进行持续监控,以减轻风险和意外后果。


将AI伦理付诸实践的三步法

上一节我们介绍了AI伦理的原则与支柱,本节中我们来看看如何将它们付诸实践。将AI伦理付诸行动可以分为三个关键步骤。

第一步:建立理解与意识

将AI伦理付诸实践的第一步,与任何事情一样,是建立理解和意识。这意味着要让你的团队具备思考AI伦理的能力,并理解将其付诸实践意味着什么。

无论你正在构建和部署什么解决方案,都需要持续反思伦理问题。以下是一个思考示例,假设你正在公司内部构建和部署一个学习解决方案:

  • 这个解决方案是否以用户为中心进行设计?
  • 我们是否与用户共同创建了这个解决方案?
  • 它如何确保不同群体的所有员工都能平等地获得机会?

对AI伦理的深刻理解,并持续反思这些问题,是至关重要的基础。

第二步:建立治理结构

在建立了理解和意识,并且每个人都在反思这个主题之后,付诸实践的第二步骤是建立治理结构。这里的关键在于,这是一个旨在规模化推广AI伦理实践的治理结构,而不是在某个市场或业务单元中孤立地进行。

因此,我们讨论了作为基础的“理解与意识”,第二步是“治理”,这是领导者建立结构的责任。

第三步:实现规模化运营

一旦具备了前两个要素,第三步就是实现运营化。你如何确保在马来西亚或波兰的开发人员、数据科学家或供应商知道如何将AI伦理付诸实践,以及这对他们意味着什么?

在全球层面建立结构是一回事,但如何确保它在各个市场以及每个用户、每个数据科学家、每个开发人员那里都能规模化地运营,让他们知道自己需要做什么?

这完全取决于对可信AI支柱的清晰理解。对IBM而言,这些支柱是:透明、可解释、公平、稳健和隐私保护。回到我们的学习解决方案例子,每个数据科学家、开发人员和供应商都需要以非常具体、可操作的方式理解这些支柱的含义。


总结

本节课中,我们一起学习了人工智能伦理的核心概念。我们了解到AI的普遍性带来了重大的社会影响和伦理挑战,解决这些挑战需要包容性的社会技术方法。我们探讨了IBM的信任与透明原则及其五大支柱(透明、可解释、公平、稳健、隐私保护),并学习了将AI伦理付诸实践的三个步骤:建立理解与意识、建立治理结构以及实现规模化运营。记住,合乎伦理的AI不仅是技术需求,更是构建可信、可持续未来的基石。

022:定义AI伦理 🤖⚖️

在本节课中,我们将要学习人工智能伦理的定义及其重要性。我们将探讨为什么在构建和使用AI时,必须将伦理置于核心位置,并详细介绍构成AI伦理的五大支柱。

人类依赖文化上公认的道德和行为标准(即伦理)来指导其决策,尤其是那些影响他人的决策。

随着人工智能越来越多地被用于自动化和增强决策过程,将伦理置于AI构建的核心变得至关重要,以确保其结果符合人类的伦理和期望。


什么是AI伦理?🧐

上一节我们提到了伦理在AI中的核心地位,本节中我们来看看AI伦理的具体定义。

AI伦理是一个多学科领域,旨在研究如何最大化AI的积极影响,同时减少其风险和负面影响。它探讨诸如数据责任与隐私、包容性、道德能动性、价值对齐、问责制和技术滥用等问题,以理解如何以符合人类伦理和期望的方式构建和使用AI。


AI伦理的五大支柱 🏛️

了解了AI伦理的总体目标后,我们接下来深入探讨其具体构成。以下是构成AI伦理基础的五个核心支柱。

  1. 可解释性
    AI具有可解释性,是指它能够展示其如何以及为何得出特定结果或建议。你可以将可解释性理解为AI系统“展示其工作过程”。

  1. 公平性
    AI具有公平性,是指它能够公平地对待个人或群体。AI可以通过抵消人类偏见来帮助人类做出更公平的选择。但需注意,AI本身也可能存在偏见,因此必须采取措施来减轻这种偏见。

  2. 鲁棒性
    AI具有鲁棒性,是指它能够有效处理异常情况,例如异常输入或对抗性攻击。鲁棒的AI旨在能够抵御有意和无意的干扰。

  3. 透明度
    AI具有透明度,是指向人类适当地分享有关AI系统如何设计和开发的信息。透明度意味着人类能够获取相关信息,例如用于训练AI系统的数据是什么、系统如何收集和存储数据,以及谁有权访问系统收集的数据。

  1. 隐私
    由于AI会摄入大量数据,其设计必须优先考虑并保护人类的隐私和数据权利。为尊重隐私而构建的AI,仅收集和存储其运行所需的最少量数据,并且在未经用户同意等考虑下,收集的数据绝不应被用于其他目的。


总结 📝

本节课中,我们一起学习了AI伦理的定义及其重要性。我们了解到,AI伦理旨在确保AI的发展与人类价值观一致。具体而言,我们探讨了构成AI伦理基础的五大支柱:可解释性公平性鲁棒性透明度隐私。这五大支柱共同帮助我们更合乎伦理地设计、开发、部署和使用AI,并理解如何以符合人类伦理和期望的方式构建和使用AI。

023:🤖 了解AI中的偏见

在本节课中,我们将要学习人工智能中的偏见问题。你将了解到偏见如何在AI系统中产生,它如何影响AI的决策结果,以及如何开始着手减轻AI中潜在的偏见。


什么是AI中的偏见?

人工智能中的偏见,指的是在关键决策任务中,AI系统表现出的、对某些群体或个人造成系统性不利的、非预期的行为。这些任务可能涉及贷款审批、招聘,甚至刑事司法。

一个例子是,一个用于决定谁应获得额外预防性医疗保健的AI系统,分配给白人的机会多于黑人。另一个例子是招聘算法,AI系统让符合条件的男性获得面试的机会多于同等条件的女性。


偏见是如何产生的?

上一节我们介绍了AI偏见的概念,本节中我们来看看偏见产生的多种来源。AI或机器学习系统是基于人类决策者过去所做的历史决策进行训练的。

以下是偏见产生的主要途径:

  1. 历史数据中的偏见:过去的决策者可能自身就存在隐性的或显性的偏见,这些偏见会通过数据中的成见反映在训练数据中。

  2. 数据采样偏差:在特定数据集中,某些群体可能被过度代表或代表不足。

  3. 数据处理阶段的偏差:在数据科学项目的数据处理或准备阶段,即使进行特征工程也可能引入新的偏见。

    例如,在医疗保健的例子中,如果我将住院、门诊和急诊费用分开作为特征,那么对非裔美国人引入的偏见会少得多。而如果我将它们合并为一个单一特征,实际上会对非裔美国人产生更大的偏见。这可以用一个简单的选择来描述:
    特征 = 合并(住院费用, 门诊费用, 急诊费用) vs 特征集 = {住院费用, 门诊费用, 急诊费用}

  4. 问题定义本身的偏差:可能我们预测的目标本身就是错误的。例如,如果我试图预测“犯罪性”或“未来犯罪”,那么使用“逮捕记录”作为依据是不合适的。因为警察在某些社区更活跃,逮捕率更高,并且被逮捕不等于有罪


如何减轻AI中的偏见?

正如我们所讨论的,偏见有多种来源,因此我们需要采取行动来消除这些来源。

以下是一些关键的缓解方法:

  • 组建多元化团队:认识到偏见的存在是第一步。拥有具备不同生活经验的团队,有助于识别这些危害以及其他可能存在的偏见。

  • 寻找更少偏见的数据集:使用本身偏见较少的数据集,是抵消偏见的一种方式。

  • 采用技术方法:如果我们在有偏见的数据上训练机器学习模型,可以引入额外的约束或其他统计度量来减轻偏见。

    例如,IBM开发了多种此类算法,其中许多已在名为 AI Fairness 360 (AIF360) 的开源工具包中提供。其核心思想是为模型训练过程添加公平性约束。

我们的目标是确保技术对社会产生积极影响。


IBM的实践:将伦理融入AI

作为IBM AI伦理委员会的成员,我致力于通过“好技术”实现有意识的包容。我们的AI伦理委员会代表了多元化的IBM员工,致力于研究和消除偏见,并在此领域建立标准。

IBM在多个方面运用AI和数据技能来应对偏见:

  • 开发技术资产:利用我们的技术开发工具来应对偏见。
  • 推动包容性语言:围绕我们的“语言至关重要”倡议,解决技术术语中的包容性语言问题。
  • 加强解决方案测试:确保对我们的解决方案进行测试,以降低偏见出现的概率并最小化其潜在影响。

在多元化与包容性领域,我们使用AI、数据分析和洞察来为决策提供支持,同时应对并最小化偏见的潜在影响。

在人力资源领域,这意味着利用AI和数据洞察来增强决策支持,为薪酬、留任、招聘和晋升决策提供信息。这在协助我们满足全球合规要求并采取主动行动方面发挥着重要作用。


总结

本节课中,我们一起学习了人工智能中偏见的核心概念。我们了解到偏见表现为AI系统对特定群体的系统性不公,其来源包括历史数据偏差、采样问题、数据处理方式以及问题定义本身。为了应对这些挑战,我们可以通过组建多元化团队、选用更好的数据以及应用如AIF360这样的技术工具来减轻偏见。最后,我们也看到了IBM如何将伦理实践融入其AI开发和应用的各个环节。理解并积极管理AI中的偏见,对于构建负责任、可信赖的人工智能至关重要。

024:AI伦理与法规 📜⚖️

在本节课中,我们将要学习什么是人工智能法规,AI法规与AI伦理有何关联,以及为什么对于从事AI相关工作的人来说,理解AI法规至关重要。

上一节我们介绍了AI伦理的基本概念,本节中我们来看看与之紧密相关的AI法规。

什么是AI法规?

法规是由政府制定、具有法律强制执行力的规则。围绕人工智能的法规环境正在迅速发展。为了合法且合乎道德地设计、开发、部署和使用AI,理解关键的法规内容非常重要。

IBM的立场:精准监管

IBM的立场是呼吁对人工智能进行精准监管。我们支持有针对性的政策,以增加公司开发和运营可信赖AI的责任。

精准监管指的是基于风险、结合具体情境,并将责任分配给最接近风险一方的监管方式。这种责任方可能在AI生命周期的不同阶段发生变化。

IBM的精准监管框架

具体而言,IBM提出了一个精准监管框架,该框架为提供和/或使用AI系统的组织包含了五项政策要务。

以下是这五项核心要务:

  1. 指定AI伦理官员:任命一名负责确保符合可信赖AI标准的首席官员。
  2. 针对不同风险制定不同规则:即根据具体情境监管AI的应用,而非监管技术本身。
  3. 不要隐藏你的AI:使其透明化。
  4. 解释你的AI:换句话说,使其具有可解释性,而非一个“黑箱”决策。
  5. 测试你的AI是否存在偏见

本节课中,我们一起学习了AI法规的定义、IBM倡导的精准监管理念,以及一个包含五项要务的具体监管框架。理解这些内容,是负责任地开发和应用人工智能的重要基础。

025:AI伦理、治理与ESG 🧭

在本节课中,我们将学习人工智能治理(AI Governance)的概念及其目标,了解环境、社会和治理(ESG)框架的含义与作用,并探讨治理、ESG与AI伦理之间的紧密联系。


什么是AI治理?🎯

上一节我们概述了本课内容,本节中我们来看看AI治理的具体定义。治理是指组织通过其公司指令、员工、流程和系统进行管理的行动,旨在指导、评估、监控并在整个AI生命周期中采取纠正措施,以确保AI系统的运作符合组织的意图、利益相关者的期望以及相关法规的要求。

治理的目标是通过建立对问责制、责任和监督的要求,来提供值得信赖的AI。治理能带来诸多益处,以下是其主要优势:

  • 信任:当AI活动与价值观保持一致时,组织可以构建透明、公平且值得信赖的系统,从而提升客户满意度和品牌声誉。
  • 效率:当AI活动实现标准化和优化后,开发过程可以更高效地进行,从而加速产品上市时间。
  • 合规:当AI活动已得到管理和监控时,调整它们以符合新的及即将出台的行业法规和法律要求就会变得不那么繁琐。

一个成功的治理计划需要综合考虑人员、流程和工具。它明确定义了人员在构建和管理可信AI中的角色和职责,包括制定政策和建立问责制的领导者。它建立了用于构建、管理、监控和沟通AI的流程,并利用工具在整个AI生命周期中获得对AI系统性能更高的可见性和一致性。


理解ESG框架 🌱

了解了AI治理后,我们进一步探讨一个更广泛的框架——ESG。ESG代表环境(Environmental)、社会(Social)和治理(Governance),这些是用于衡量公司所有非财务风险和机遇的因素。

在IBM,这体现为“IBM影响力”(IBM Impact),即我们在ESG方面的战略和理念。IBM影响力由三大支柱构成,我们相信这些支柱将创造一个更可持续的未来:

  • 环境影响:致力于对环境产生积极影响。
  • 公平影响:致力于推动社会公平。
  • 道德影响:致力于坚持高标准的商业道德。

我们通过在世界、商业道德、环境以及我们工作和生活的社区中产生持久积极的影响来实现这些目标。


治理、ESG与AI伦理的联系 ⛓️

现在,我们已经分别了解了治理和ESG,本节我们将探讨它们如何与AI伦理相互关联。ESG中的治理方面涉及创建优先考虑道德、信任、透明,尤其是问责制的创新、政策和实践。

AI伦理是我们治理计划的重要组成部分。例如,在2022年,我们的目标是让1000个生态系统合作伙伴接受科技伦理培训。这个目标很重要,因为我们相信AI的益处应该惠及大众,而不仅仅是少数人,并且培养可信AI的文化必须无处不在,而不仅仅是在IBM内部。

我们正引领AI伦理的发展,致力于创造一个更加合乎道德的未来。


总结 📝

本节课中,我们一起学习了AI治理的核心定义及其在确保AI系统负责任运行中的关键作用。我们探讨了ESG框架的三大支柱及其对可持续未来的贡献。最后,我们明确了治理、ESG与AI伦理之间的深刻联系,认识到通过建立强有力的治理和伦理框架,是推动AI技术向善、实现广泛社会价值的基础。

026:AI的演变与未来 🚀

在本节课中,我们将探讨人工智能的发展历程、关键突破以及未来方向。我们将了解AI如何从解决规则明确的游戏问题,演进到处理现实世界中复杂、非结构化的挑战,特别是在医疗等关键领域的应用。


早期的AI研究者对游戏非常感兴趣。游戏虽然规则简单,但可能性极其复杂,存在大量的走位与得分可能。然而,游戏在某种程度上又是简单的,因为其移动规则和目标定义明确,因此无需一次性解决所有问题。

在IBM“深蓝”的国际象棋项目中,计算机展现出的能力是:利用巨大的计算资源进行更深度的搜索,探索比以往更多的棋步可能性。


上一节我们看到了AI在规则明确问题上的突破,本节中我们来看看AI在理解与推理上的跨越。

“沃森”在智力竞赛节目《危险边缘》中获胜,这是AI和认知计算发展史上的另一个交叉点。IBM能够回答的《危险边缘》问题,并非简单地从数据库中查找答案。

相反,它需要从大量不同的信息资源中进行信息检索,然后利用机器学习将这些信息结合起来,得出超越简单文本记录的答案。


如今,我们的技术已经更加先进,足以应对更具挑战性的问题,这些问题通常具有定义不明确或杂乱无章的特性。

从石油天然气到医疗保健,从媒体娱乐到零售,每个行业都正被非结构化数据的海啸所淹没。这些数据可能是多媒体、图像、视频或文本。

核心能力在于理解这些数据,这正变得至关重要。


认知计算最有价值的应用领域之一是在医疗健康领域。医疗服务提供者,如医生、护士和助理,面临着巨大的挑战:如何利用所有可用的信息。

以下是医疗领域面临的数据挑战:

  • 医学文献每年增加约70万篇文章,现有文献已达数百万篇。
  • 现代影像技术产生非常丰富的信息,一次特定的扫描可能包含5000张图像。

将图像分析与自然语言理解和文本分析相结合,利用医学文献和患者的病史,医生就能掌握更多的信息和知识,帮助他们做出尽可能准确的诊断。


显然,计算机的能力与人的能力在此交汇,产生了超越两者单独作用的效果。真正有趣的是,如何找到最佳方式,让它们实现真正的共生式互动,利用彼此的优势共同解决问题。

“沃森”探索了智能的另一个方面,也是更困难的方面——语言。它必须能够解读问题并得出正确答案,无论话题是什么。

因此,我认为现代世界中AI的理想场景,不是试图开发一个能完全自主处理问题所有方面的系统。

理想模式是:机器做它们最擅长的事,人做他们最擅长的事,双方协作。

我可以想象,这种组合的效果将优于任何一方单独行动。


我们始终在寻找下一个可以攻克的重大挑战性问题。它可能近在咫尺,也可能还需一年,但这需要多方共同努力。当我们成功时,我们将为世界创造有价值的东西。


本节课总结:我们一起回顾了AI从解决棋盘游戏到理解自然语言和复杂数据的演变过程。我们看到了“深蓝”和“沃森”等里程碑,并探讨了AI,特别是认知计算,在医疗等关键领域处理非结构化数据的巨大潜力。最后,我们明确了AI未来的发展方向并非完全取代人类,而是实现人机协作,各自发挥优势,共同解决更复杂的现实世界问题。

028:AI梯度——成功采用AI的旅程 🧗

在本节课中,我们将学习企业如何通过一个被称为“AI梯度”的规范性步骤,将采用人工智能的愿望转化为实际成果。我们将探讨从数据现代化到AI全面融合的完整旅程。

在剧烈的数字化转型世界中,企业正寻求人工智能来帮助塑造工作的未来。

人工智能可以预测并告知未来的结果,它使人们能够在企业中从事更高价值的工作,并构想新的商业模式。

它可以自动化决策、流程和体验,但人工智能并非魔法。

事实是,没有信息架构,就没有人工智能。

但许多组织无法开始,因为他们80%的数据被锁在孤岛中,且未达到业务就绪状态。

那么,如何将抱负转化为成果呢?

通过一套我们称之为“AI梯度”的规范性步骤。

它始于在可运行于任何云端的单一平台上,将所有数据现代化。

在梯度本身,包含四个步骤。

以下是实现AI价值的四个核心步骤:

  1. 收集数据,使其变得简单且易于访问。认真思考需要训练的模型。
  2. 组织数据,为那些AI模型创建一个业务就绪的分析基础。
  3. 分析数据,同时确保信任和透明度。因为如果无法解释结果、检测偏见或证明其准确性,应用和扩展人工智能就毫无用处。
  4. 融合。一旦真正信任你的数据和部署的AI,就可以在控制日常工作的应用程序和流程中实现其全部价值。换句话说,最后一步是融合。

或者可以说,你开始在整个业务中实现人工智能的运营化。

我们通过在这个AI和多云世界中释放其数据的价值,帮助成千上万的企业让人工智能发挥作用。

通过为员工提供合适的技能组合。

并通过在人工智能中建立信任和透明度。

这就是AI梯度的概要,让我们开始攀登吧。


本节课中,我们一起学习了“AI梯度”框架。该框架为企业成功采用人工智能提供了一个清晰的路径:首先在统一平台上实现数据现代化,然后依次完成收集组织分析融合四个步骤。这个过程强调以可信的数据为基础,最终将AI价值全面注入业务流程。

030:AI创新热点 🌍

在本节课中,我们将了解全球人工智能(AI)创新与机会的主要热点城市与地区。课程内容基于对当前AI领域机会分布的观察与分析。


根据我近期对AI顶尖城市的调研(主要通过分析我收件箱中的机会信息),AI机会实际上分布相当广泛。许多不同地区都存在大量机会。

以下是当前AI创新与机会较为集中的主要地区:

  • 美国旧金山湾区:这里持续是AI与机器人领域初创企业的温床,预计将继续发展。
  • 美国波士顿:同样拥有大量初创企业。
  • 美国西雅图:也是重要的AI中心之一。

上一节我们介绍了美国的主要AI热点,本节中我们来看看加拿大的发展情况。

在加拿大,多伦多和蒙特利尔在建设强大且繁荣的AI生态系统方面取得了显著成就。这个生态系统预计将继续发展和壮大,令人感到兴奋。

此外,在欧洲和亚洲的许多地区也存在机会。中国和印度当然也拥有一些机会。

总的来说,如果你身处这些地区中任何一处的主要城市中心附近,那么你便具备了开启AI职业生涯的有利条件。


多伦多的AI领域正在迅猛发展。能够见证并参与其中令人惊叹。我们拥有杰弗里·辛顿(Geoffrey Hinton)——他显然是因对深度学习的重大贡献而获得图灵奖的三位奠基人之一。围绕多伦多大学过去几十年取得的卓越进展,整个向量研究所(Vector Institute)及其生态系统已经建立起来。

因此,我们在该地区看到了优秀的孵化器和初创企业。它们正大力投资于AI技术与能力。我们看到大型公司在此设立研究实验室,并将其直接安置在大学附近。我们还看到,专门针对多伦多AI研究的大量资金正在涌入。

我认为,多伦多在与全球任何最佳AI学习和工作地点的竞争中都具有优势。


我认为加拿大实际上表现非常出色。总体而言,我们在集中一些真正杰出的AI人才方面做得非常出色。

以下是加拿大主要的AI中心:

  • 多伦多与蒙特利尔:这两个城市尤为突出。
  • 温哥华、埃德蒙顿等加拿大多个不同城市也已发展成为非常强大的AI中心,并且持续增长。

我们正在吸引大量优秀的AI人才。我相信这一趋势将持续下去。因此,加拿大正逐渐成为进行AI研究和从事AI工作的绝佳之地。


本节课中,我们一起学习了全球AI创新热点分布。主要内容包括:美国(如旧金山湾区、波士顿、西雅图)和加拿大(如多伦多、蒙特利尔)是当前的核心区域,欧洲与亚洲(如中国、印度)也存在发展机会。多伦多凭借其顶尖人才、研究机构与资金投入,已成为全球竞争力的AI中心之一。加拿大整体在汇聚AI人才与构建生态系统方面表现突出,是AI研究与工作的理想地点之一。

033:生成式AI专业化简介 🚀

在本节课中,我们将一起了解生成式AI专业化的整体概览。我们将探讨生成式AI的广泛应用、市场前景,并详细介绍一个由五门课程组成的专业化学习路径。通过本课程,你将了解如何从零开始,系统地掌握生成式AI的核心概念、工具和应用,为你的职业发展赋能。


你是否知道,全球的营销人员已经在使用生成式AI来创作内容、撰写文案、激发创意、分析市场数据以及生成图像?

根据彭博社的预测,生成式AI市场预计到2032年将达到1.3万亿美元。

在这种情况下,你肯定希望更好地了解生成式AI。

那么,生成式AI适合所有人吗?是的,它适合。

你可以利用它的潜力,为自己创造更好的职业和生活。

这个专业化课程适合任何对探索生成式AI力量充满热情的人,不需要具备先前的AI技术知识或背景

即使是初学者也能从这个专业化中受益,因为它提供了对生成式AI基本概念、模型、工具和应用的全面理解。

在本专业化课程结束时,你将能够:

  • 解释生成式AI的基本概念、能力、模型、工具、应用和平台。
  • 描述基础模型和提示工程,并应用强大的提示工程技术来编写有效的提示,从而从AI模型中生成期望的结果。
  • 讨论生成式AI的局限性,并解释其伦理关切和负责任使用的考量。
  • 认识到生成式AI在提升你职业生涯和帮助你在工作场所实施改进方面的能力。

该专业化包含五门自定进度的核心课程,每门课程需要3到5小时完成。


课程一:生成式AI导论与应用 🌐

上一节我们概述了整个专业化,本节中我们来看看第一门课程的具体内容。

课程一是你理解生成式AI能力的第一步,其能力涵盖文本、图像、音频、视频、虚拟世界、代码和数据等多个领域。

你将了解不同行业和领域如何应用常见的生成式AI模型和工具,例如:

  • GPT
  • DALL-E
  • Stable Diffusion
  • IBM Granite
  • Synthesia

课程二:提示工程的艺术与科学 🛠️

在了解了生成式AI的广泛应用后,本节我们将深入探讨与之交互的关键技能。

课程二介绍了提示工程的概念,以及它如何帮助你释放像ChatGPT这样的生成式AI工具的全部潜力。

你将探索开发有效提示的技术、方法和最佳实践,并学习使用常用工具,例如:

  • IBM Watsonx.ai
  • PromptLayer
  • Spellbook
  • Dust

课程三:生成式AI的核心概念与平台 🧠

掌握了提示工程后,我们需要理解这些强大工具背后的原理。

课程三专注于生成式AI的核心概念和构建模块,例如:

  • 深度学习
  • 基于Transformer架构的大语言模型
  • 扩散模型
  • 基础模型

你还将了解不同的生成式AI平台,如IBM Watsonx.aiHugging Face


课程四:生成式AI的伦理与局限 ⚖️

理解了技术原理,我们必须同时关注其带来的影响和挑战。

在课程四中,你将探讨与生成式AI相关的伦理考量。

它将如何影响数据隐私和安全、版权侵权、劳动力以及环境?

你还将描述其局限性,例如:

  • 数据偏见
  • 缺乏可解释性、透明度和可理解性

并识别生成式AI的常见滥用,例如深度伪造幻觉输出


课程五:生成式AI的未来与你 🚀

探讨了伦理挑战后,让我们展望未来,看看它如何塑造你的职业道路。

最后,课程五讨论了生成式AI的未来。你难道不想知道在那个未来里,你的职业机会是什么吗?

你将学习生成式AI如何影响和增强不同行业和领域的现有职能、技能和工作角色。

以及你如何能使用生成式AI来构建自己的应用程序,以创造新的商业机会。


学习方式与收获 📈

本专业化课程的内容旨在吸引并赋能你。

通过观看精选的概念视频、聆听AI专家分享他们的见解和技巧,以及在实践实验室和项目中练习技术,你将在日常生活中使用生成式AI工具和应用程序时感到更加自信。

目前,65%的生成式AI用户是千禧一代或Z世代,72%是在职人士。

通过这个专业化学习,你将准备好加入生成式AI变革者的行列。

生成式AI属于每个人。


本节课总结

在本节课中,我们一起学习了IBM生成式AI专业化课程的完整蓝图。我们从生成式AI的市场潜力开始,逐步深入了解了由五门课程构成的学习路径:从基础应用、提示工程、核心技术、伦理考量到未来展望。这个课程体系设计精良,无需技术背景,适合所有希望利用生成式AI提升职业能力和创造价值的初学者。现在,你已经准备好开启这段激动人心的学习旅程了。

034:生成式人工智能导论 🚀

在本节课中,我们将要学习生成式人工智能(Generative AI)的基本概念、核心能力及其在现实世界中的应用。我们将了解这门技术如何改变我们的工作与生活,并预览整个课程的结构与学习目标。


想象一个由人工智能驱动的世界,它能让我们工作更高效、寿命更长、能源更清洁。

这个世界已经到来。生成式人工智能对我们生活方式的各个方面都产生了巨大影响。

生成式人工智能模型能够模仿人类的思维和创造力,以生成新颖的内容并执行复杂的任务,就像你我一样。

组织可以利用生成式人工智能来提高生产力和盈利能力。个人可以使用生成式人工智能工具来提升效率、为工作增添实际价值、节省成本并最大化其品牌价值。

如果你尚未接触过这项技术,那么这门课程正适合你。我们邀请所有对快速发展的生成式人工智能领域抱有真诚兴趣的专业人士、爱好者、从业者和学生。无论你的背景或经验如何,这是一门面向所有人的课程。


课程目标 🎯

本课程旨在让你对生成式人工智能的能力、应用以及常见模型和工具有一个扎实的理解。

课程结束时,你将能够:

  • 描述生成式人工智能的能力及其在现实世界中的用例。
  • 识别生成式人工智能在不同领域和行业中的应用。
  • 探索常见的生成式人工智能模型和工具。

课程结构 📚

这是一门精炼的课程,包含三个模块。预计每个模块需要花费一到两小时完成。

模块一:核心概念与能力

在课程的第一个模块中,你将学习生成式人工智能的核心概念,了解其在不同领域的应用案例,并理解其在生成文本、图像、代码、音频和视频方面的能力。

模块二:行业应用与工具

在模块二中,你将探索信息技术、娱乐、教育、金融和医疗保健等不同行业如何利用生成式人工智能。此外,在本模块中,你将学习用于生成文本、图像、代码、音频和视频的常见模型和工具(例如 ChatGPTDALL-ESynthesia)的功能与特性。

模块三:实践与评估

模块三要求你参与一个最终项目,并完成一个计分测验,以检验你对课程概念的理解。你还可以访问课程术语表,并获得关于后续学习路径的指导。

学习方法与资源 💡

本课程融合了概念讲解视频和辅助阅读材料。观看所有视频以充分掌握学习材料的潜力。

你将享受到实践实验室和一个最终项目,这些内容展示了生成式人工智能在多个领域的常见用例。每节课后都有练习测验,帮助你巩固所学知识。课程结束时,你还需要完成一个计分测验。

课程还提供了讨论论坛,方便你与课程工作人员联系并与同伴交流互动。最有趣的是,通过专家观点视频,你将听到经验丰富的从业者分享他们对生成式人工智能不同方面的见解。


总结

本节课中,我们一起学习了生成式人工智能的初步介绍。我们了解到,这项技术已深刻影响着我们的社会,能够模仿人类创造力,为组织和个人带来巨大价值。本课程面向所有背景的学习者,旨在通过三个结构化的模块,带你从核心概念走到实际应用,最终通过项目和测验巩固知识。

当生成式人工智能正在全球范围内增强个人、组织和社区的创造力表达与专业能力时,你为何不加入进来?这门课程为你提供了一个创造新体验的绝佳机会。

035:生成式AI简介 🤖

在本节课中,我们将学习生成式人工智能的基本概念、其发展历程,以及它与判别式人工智能的区别。我们将探讨生成式AI的核心模型、基础模型的作用,并了解其广泛的应用前景。


什么是人工智能?🧠

人工智能(AI)已存在多年,它塑造了我们生活的方方面面,并彻底改变了我们的工作和生活方式。

从本质上讲,AI可以定义为机器对人类智能的模拟。AI模型从海量的现有数据中学习,这个过程被称为训练。AI有两种基本方法:判别式AI生成式AI


判别式AI 🎯

上一节我们介绍了AI的两种基本方法,本节中我们来看看第一种:判别式AI。

判别式AI是一种学习区分不同数据类别的方法。判别式AI模型会获得一组训练数据,其中每个数据点都标有其类别。然后,该模型通过判断新数据点落在决策边界的哪一侧来预测其类别。判别式AI模型使用高级算法来区分、分类、识别模式,并根据训练数据得出结论。

以下是判别式AI工作原理的一个例子:

  • 电子邮件垃圾邮件过滤器可以区分垃圾邮件和非垃圾邮件。

判别式AI模型最适合应用于分类任务。然而,它们无法理解上下文,也无法基于对训练数据的上下文理解来生成新内容。


生成式AI ✨

判别式AI有其局限性,而生成式人工智能(生成式AI)则弥补了这些不足。

生成式AI模型学习根据训练数据生成新的内容。它们能够捕捉训练数据的底层分布,并生成新颖的数据实例。

生成式AI从一个提示开始。这个提示可以是文本、图像、视频或模型可以处理的任何其他输入。作为输出,模型会生成新的内容,包括文本、图像、音频、视频、代码和数据。生成式AI可以生成与提示相同形式的输出(例如,文本到文本),也可以生成与提示不同形式的输出(例如,文本到图像或图像到视频)。

这里有一个简单的例子来理解判别式(传统)AI和生成式AI之间的区别:

  • 判别式AI最适合回答诸如“这张图片画的是鸟巢还是鸟?”这类问题。
  • 生成式AI则会响应诸如“画一幅有三个蛋的鸟巢图像”这样的提示。

如果说判别式AI模仿了我们的分析和预测能力,那么生成式AI则更进一步,模仿了我们的创造能力。正如《哈佛商业评论》的评论所暗示的:AI不仅可以提升我们的分析和决策能力,还能激发创造力。生成式模型可以利用所学知识,基于这些信息创造出全新的内容。


生成式AI的基石 🧱

上一节我们了解了生成式AI的基本概念,本节中我们将探讨其背后的技术基石。

判别式模型和生成式模型都是使用深度学习技术创建的。深度学习涉及训练人工神经网络从海量数据中学习。

人工神经网络是由称为神经元的较小计算单元组成的集合,其建模方式类似于人脑处理信息的方式。

生成式AI的创造能力来自于生成式AI模型,例如:

  • 生成对抗网络(GANs)
  • 变分自编码器(VAEs)
  • Transformer模型
  • 扩散模型

这些模型可以被视为生成式AI的构建模块。


生成式AI的演进历程 📜

生成式AI并非一个新概念。它的根源可以追溯到机器学习的起源。在20世纪50年代末,当科学家提出机器学习时,他们就探索了使用算法来创建新数据。到了20世纪90年代,神经网络的兴起进一步推动了生成式AI的发展。

在21世纪10年代初,得益于大数据集的可用性和增强的计算能力,深度学习进一步推动了生成式AI的发展。2014年,随着Ian Goodfellow及其同事引入GANs,生成式AI发生了变革。GANs以及其他模型如VAEs和Transformer为生成式AI的增长以及基础模型和工具的开发奠定了基础。


基础模型与大语言模型 📚

基础模型是具有广泛能力的AI模型,可以被调整以创建更专业的模型或针对特定用例的工具。

基础模型的一个特定类别称为大语言模型(LLMs),它们经过训练以理解人类语言,并能处理和生成文本。

2018年,OpenAI推出了一款基于Transformer的LLM,名为生成式预训练Transformer(GPT)。多年来,不同的LLM,如GPT系列中的GPT-3和GPT-4、Google的Pathways语言模型(PaLM)以及Meta的大语言模型Meta AI(Llama),都显著增强了生成式AI生成连贯且相关文本的能力。在其他用例的模型方面也有类似的发展,例如用于图像生成的Stable Diffusion和DALL-E模型。


生成式AI工具与应用 🌐

多种生成式模型的发展催生了针对不同用例的生成式AI工具市场的增长。

以下是不同领域的生成式AI工具示例:

  • 文本生成:ChatGPT和Bard
  • 图像生成:DALL-E 2和Midjourney
  • 视频生成:Synthesia
  • 代码生成:GitHub Copilot和Amazon CodeWhisperer

快速涌现的模型和工具为生成式AI在各个领域的应用开辟了广阔的前景。引用麦肯锡关于生成式AI经济潜力的报告:“生成式AI有潜力改变工作的结构,通过自动化部分个人活动来增强个体工作者的能力。”该报告还预测,生成式AI对生产力的影响可能为全球经济增加数万亿美元的价值。


总结 📝

本节课中我们一起学习了生成式人工智能的核心知识。

我们了解到,生成式AI模型可以根据其训练的数据生成新的内容。此外,我们还学习了生成式AI的创造能力建立在诸如GANs、VAEs、Transformer和扩散模型等模型之上。基础模型可以被调整以创建针对特定用例的专业模型或工具。

最后,我们认识到生成式AI模型和工具在不同领域和行业具有广泛的应用范围。

036:生成式AI的功能 🚀

在本节课中,我们将学习生成式人工智能(Generative AI)的核心功能。我们将探讨文本生成、图像生成、音频生成、视频生成、代码生成、数据生成与增强,以及虚拟世界创建等能力,并了解它们在现实世界中的应用。


文本生成能力 📝

上一节我们概述了生成式AI的多种能力,本节中我们来看看其文本生成功能。生成式AI能够生成清晰、流畅且与上下文相关的文本响应。其核心是先进的大型语言模型(LLMs),这些模型在大型数据集上训练,能够生成类人文本。

以下是LLMs能够执行的一些语言相关任务:

  • 文本补全:根据已有内容续写文本。
  • 摘要:将长文本内容浓缩为简短摘要。
  • 问答:根据给定信息回答问题。
  • 翻译:将文本从一种语言转换为另一种语言。
  • 代码生成:根据描述生成代码片段。
  • 图文配对:理解图像内容并生成描述性文本,或根据文本生成图像。

聊天机器人和虚拟助理的对话交互就是由LLMs驱动的。一些知名的LLMs包括OpenAI的生成式预训练变换器(GPT)和谷歌的Pathways语言模型(PaLM)。


图像生成能力 🎨

了解了文本生成后,我们转向视觉领域。生成式AI能够合成具有艺术感和真实感的图像,这些图像与真实照片非常相似。这主要依赖于生成对抗网络(GANs)和变分自编码器(VAEs)等深度学习技术。

生成的图像展现出逼真的纹理、自然的色彩和精细的细节,给人以真实拍摄的印象。例如:

  • StyleGAN 可以生成高质量、高分辨率的虚构人脸、动物或自然景观图像。
  • DeepArt 可以从简单的草图创建复杂的艺术作品。
  • DALL-E 可以根据用户的文字描述生成全新的图像。

除了艺术、设计、娱乐和游戏领域,生成的图像还可用于增强训练数据集,并辅助医学成像和科学可视化。


音频生成能力 🎵

从静态图像过渡到动态声音,生成式AI在音频领域同样强大。生成模型可以创作新的音乐作品,使用文本转语音(TTS)技术将文本转换为音频,并创建合成语音和自然的人声。

这些模型能够转换、修改、净化人声,降低噪音并提升音频质量。它们还能相当逼真地模仿人类声音。例如:

  • WaveGAN 可以生成新的、逼真的原始音频波形,包括语音、音乐和自然声音。
  • OpenAI的MuseNet 可以结合各种乐器、风格和流派来生成新颖的音乐作品。
  • Google的Tacotron 2Mozilla TTS 使用先进的TTS系统创建合成语音,模仿人类的语调、音高、发音、节奏和表达。

AI生成的音频在媒体创作、娱乐、培训、游戏、虚拟现实等多个领域有广泛应用。


视频生成能力 🎬

接下来,我们探索动态视觉内容。生成式AI模型可以创建动态、清晰的视频,从基本动画到复杂场景。这些模型能够将图像转化为动态视频,其关键在于融入了时间连贯性

在自然语言处理中,时间连贯性指的是意义或上下文随时间推移保持一致和连续。这使得模型能够在视频中呈现平滑的运动和合理的转场。

例如,流行的AI模型VideoGPT遵循用户提供的文本提示来生成新视频。用户可以指定期望的内容来指导视频生成过程,包括视频补全、编辑、合成、预测和风格迁移。

生成的视频可用于艺术、娱乐、教育、游戏、医学和研究等领域。


代码生成能力 💻

从创意内容转向实用工具,生成式AI也具备强大的代码生成能力。生成模型可以根据所需功能生成新的代码片段、函数或完整程序。

通过在现有代码库上进行训练,这些模型可以:

  • 补全或创建代码。
  • 合成或重构代码。
  • 识别并修复代码中的错误。
  • 测试软件。
  • 创建文档,包括注释、函数描述和使用示例。

例如,GitHub CopilotIBM Watson Code Assistant 都是基于AI的编程助手,可以帮助自动补全代码、处理复杂任务,并根据输入生成代码。

AI生成的代码可用于软件和Web开发、机器学习和自然语言处理、数据科学与分析、机器人技术与自动化、虚拟游戏和AR/VR环境开发,以及音视频和语音处理软件。开发人员可以利用代码生成功能来编写、调试和测试代码。


数据生成与增强能力 📊

在机器学习和数据分析中,数据至关重要。生成式模型可以生成新数据并增强现有数据集。生成合成数据集有助于增加数据的多样性和可变性,从而带来更稳健、更有效的模型性能。

这些模型可以为以下内容生成新样本并增强数据集:

  • 图像、文本、语音。
  • 表格数据和统计分布。
  • 时间序列数据、金融数据等。

生成式AI的数据生成与增强能力在医疗健康、游戏、教育与培训、艺术创作、自动驾驶汽车等众多领域有广泛应用。


虚拟世界创建能力 🌐

最后,我们探讨生成式AI一个引人入胜的能力:创建高度逼真和复杂的虚拟世界。你可以创建模拟真实行为、表情、对话甚至决策的虚拟化身(Avatars)

你也可以创建具有逼真纹理、声音和物体的复杂虚拟环境,这些环境遵循物理世界的规律。元宇宙(Metaverse) 平台使用生成模型为个体用户创造独特和个性化的体验。

生成式AI还能创建具有独特个性的虚拟身份,为虚拟化身赋予特定的性格特征,这些特征会体现在其行为和对话中。

生成式AI的虚拟世界创建能力在游戏、娱乐、教育、增强现实(AR)和虚拟现实(VR)、元宇宙平台,以及虚拟影响者和数字人格等领域有广泛应用。


总结 📚

本节课中,我们一起学习了生成式AI模型的各种功能及其在现实世界中的应用。

生成式AI能够:

  1. 创建连贯且与上下文相关的内容。
  2. 生成逼真的高质量图像、合成语音、新音频和动态视频。
  3. 生成和补全代码,并合成新数据以增强现有数据集。
  4. 创建高度逼真和复杂的虚拟世界,包括虚拟化身和数字人格。

本质上,人类思维能够构想出的任何事物,都是生成式AI潜在的应用场景。

037:生成式AI的应用 🚀

在本节课中,我们将学习生成式人工智能在不同领域的具体应用。我们将重点探讨生成式AI在信息技术与运维、娱乐、教育、银行与金融、医疗保健、人力资源以及日常工作等领域的实际应用案例。

概述

生成式AI能够创造新的内容、数据或解决方案,其应用正迅速扩展到各行各业。理解这些应用有助于我们认识AI技术如何改变工作方式并创造价值。


信息技术与运维 (IT & DevOps) 💻

上一节我们介绍了课程概述,本节中我们来看看生成式AI在IT与运维领域的应用。生成式AI有助于改进软件交付流程和基础设施管理。

以下是生成式AI在IT与DevOps中的主要应用:

  • 代码生成:生成式AI的代码生成能力减少了手动编码的工作量和在重复性任务上花费的时间。
  • 代码审查:由生成式AI驱动的代码审查工具(如 GitHub CopilotSynk DeepCode)检查代码库和编码标准,以提高代码质量和可维护性。
  • 自动化测试:生成模型可以生成模拟用户行为的合成测试用例和测试数据。多样化的测试用例影响软件的效率、可靠性和健壮性。ApplitoolsTestim 等工具通过增加数据集的深度和多样性来保证足够的测试覆盖率。
  • 监控与异常检测:为了监控和检测代码中的异常,IBM的Watson AIOpsMoogsoft AIOps 等工具会分析系统日志、指标和其他数据。这有助于进行主动维护和故障排除,减少停机时间并防止严重故障。
  • 持续集成与部署GitDuo 通过自动创建发布说明、变更日志以及更新部署模板和脚本来支持持续集成与部署(CI/CD)流程。
  • 其他应用:在IT和DevOps中的其他应用包括自然语言界面、自动化管理和预测性维护。

娱乐领域 🎬

了解了生成式AI如何助力IT运维后,我们转向娱乐产业。生成式AI工具可以生成各种合成内容。

以下是生成式AI在娱乐领域的主要应用:

  • 内容生成:生成式AI工具可以生成各种合成内容,例如音乐、剧本、故事、电影和视频游戏。
  • 内容本地化与个性化:它们还可以翻译、本地化和个性化内容。
  • 游戏开发SideFX公司的Houdini 等游戏开发工具利用生成式AI的力量来创建游戏、动画、增强和虚拟现实体验以及具有独特行为的角色。
  • 虚拟形象:最近,由生成式AI驱动的虚拟影响者和虚拟形象也流行起来,它们可以与用户互动,创造引人入胜的体验。

教育领域 📚

生成式AI的另一个重要应用领域是教育,从内容生成到个性化和自适应学习体验,再到模拟体验式学习,其影响巨大。

以下是生成式AI在教育领域的主要应用:

  • 语言翻译:凭借其语言能力,它们可以提供语言翻译,使内容能以不同语言访问。
  • 作业批改与反馈:它们可以批改作业以提供即时反馈。
  • 个性化学习路径:它们可以创建支持个体学习者节奏和优势的学习旅程和评估策略。
  • 学习分类生成:可以根据学习者的表现和偏好生成分类法。
  • 特殊需求检测:生成式算法可以检测特殊需求和学习障碍,以帮助学习者和教育者制定特定的课程计划。
  • 知识追踪:生成式算法也被用于追踪学习者随时间推移的进度,即知识追踪。这有助于为个人需求提供合适的节奏和内容。
  • 其他益处:辅导支持、虚拟和模拟环境以及包容性教育也从中受益。
  • 工具示例:例如,Nolej 在几分钟内提供AI生成的电子学习内容,包括针对目标主题的交互式视频、术语表、练习题和摘要。Duolingo 是一个语言学习平台,它使用GPT-3来纠正法语语法并为英语创建测试项目。


银行与金融领域 🏦

银行和金融机构极大地受益于生成式AI自动检测风险、生成见解和提供具备金融知识的建议的能力。

以下是生成式AI在银行与金融领域的主要应用:

  • 行业专用大语言模型K.AI G 是第一个银行业专用的大语言模型,它帮助银行应用程序提供类人的、具备金融知识的响应。
  • 风险评估:例如,在风险评估中,DataRobot 通过模拟潜在的欺诈场景来生成合成用例,以检测信用风险、欺诈风险和市场波动。
  • 信用评分PeritusAiolo.gic 利用生成模型来检测风险、确定利率和构建定制贷款。它们自动化评估客户信用度并设定信用额度或保险费率。
  • 市场情绪分析:由生成式AI驱动的工具,如 BloombergGPT,可以分析新闻文章、社交媒体和其他分类文本数据,以更有效地进行市场情绪分析和管理投资组合。
  • 客户服务:生成式AI工具增强了对话系统,并利用机器人顾问、聊天机器人和虚拟助手协助财务规划。
  • 其他受益领域:监管合规与报告、财务预测、投资组合优化、反洗钱和算法交易是一些极大受益的领域。

需要注意的是,其中一些应用和工具同时利用了生成式和判别式AI模型。


医疗保健领域 🏥

现在让我们讨论一些在医学和医疗保健研究、药物发现、诊断和患者护理方面的应用。

以下是生成式AI在医疗保健领域的主要应用:

  • 医学影像分析:凭借生成类似于患者数据的合成图像的能力,生成模型提高了用于医学影像分析的深度学习模型的健壮性。
  • 罕见病研究:这些模型可以为数据非常有限的罕见疾病合成数据。这有助于促进研究、训练AI模型并为罕见病例开发新的诊断工具。
  • 药物发现:在药物发现中,这些模型通过生成新分子、加速药物发现过程和降低开发成本来提供帮助。
  • 远程医疗:远程医疗和远程监护也受益于生成式AI驱动的对话工具。
  • 工具示例:例如,Rasa 可以与患者建立具备医学知识的对话,以提供即时医疗建议、健康相关支持和个性化治疗计划。
  • 其他领域:该领域的其他领域包括电子健康记录管理、健康欺诈检测以及医学模拟和培训。

人力资源领域 👥

让我们看看生成式AI如何赋能人力资源部门,使其自动化重复性任务、提供有价值的见解并简化人力资源流程。

以下是生成式AI在人力资源领域的主要应用:

  • 自动化HR任务:例如,Watson X Orchestrate 有助于自动化HR任务,例如创建职位需求、筛选和入围相关简历、安排面试、候选人入职等。
  • 人才获取Talenteria 专注于人才获取。
  • 员工互动Lina AI 使用对话式AI系统自动化HR任务和员工互动。
  • 绩效管理Mccorva 通过自动生成绩效文档和评估来专注于工作场所和绩效管理。
  • 其他应用:生成式AI在HR中的其他应用包括培训与发展、分析与决策以及合规与政策实施。

对工作的影响 ⚙️

虽然我们今天只谈到了几个领域,但人们最终相信生成式AI将对所有行业产生重大影响。另一个产生重大影响的领域是我们的工作方式。

根据麦肯锡关于生成式AI经济潜力的报告,当前的生成式AI和其他技术有潜力自动化如今占用员工60%至70%时间的工作活动。到2030年至2060年间,今天一半的工作活动可能会被自动化。生成式AI日益增长的理解自然语言的能力最终将影响甚至通常与高等教育和习得技能相关的知识型工作。


总结 📝

本节课中,我们一起学习了生成式AI在各个领域的流行应用。然而,重要的是要注意,生成式AI的潜在应用在所有行业和生活的各个方面几乎是无限的。

  • IT和DevOps中,应用包括代码生成、代码审查、自动化测试、监控和异常检测、自动化文档以及持续集成和部署流程。
  • 娱乐领域,生成式AI通过生成各种合成内容以及翻译、本地化和个性化内容,提供了令人兴奋的可能性。
  • 教育领域,生成式AI改变了教育的覆盖范围和质量,影响着学习者、教育者和教育技术。
  • 金融领域,应用领域包括风险评估、信用评分、情绪分析、投资组合管理、合规、预测、培训和客户关怀。
  • 医学和医疗保健领域,我们看到应用涉及医学研究、诊断、药物、医学培训和患者护理。
  • HR领域,应用涉及人才获取、员工互动、绩效管理、培训与发展、HR分析和政策实施。
  • 工作场所,生成式AI的应用正在改变我们的工作方式,使我们更高效、更成功。

038:文本生成工具 🧠

在本节课中,我们将学习生成式人工智能如何实现文本生成,并介绍几种主流的文本生成工具及其核心能力。


概述

文本生成是生成式人工智能的核心能力之一,其基础是大语言模型。本节将解释大语言模型的工作原理,并介绍两种流行的文本生成工具:ChatGPT 和 Bard。我们还将探讨其他工具及其特定用途。


大语言模型:文本生成的核心

上一节我们介绍了生成式人工智能的基本概念,本节中我们来看看其文本生成能力的核心——大语言模型。

大语言模型基于在训练期间学习到的模式和结构。它们通过解读上下文、语法和语义来生成连贯且符合语境的文本。通过分析词语和短语之间的统计关系,大语言模型能够适应任何给定语境下的创造性写作风格。

公式表示其核心思想
生成的文本 = 模型(输入提示 | 训练数据中的统计模式)

许多文本生成模型都基于大语言模型,例如生成式预训练变换器。


主流文本生成工具

这些模型已发展为多模态模型,提供多种能力。我们通过两个流行工具来了解这些模型的能力:ChatGPT 和 Bard。

ChatGPT:基于GPT模型

ChatGPT 基于 GPT 大语言模型,并使用了先进的自然语言处理技术。最初,ChatGPT 仅接受文本提示作为输入来生成新内容;而更新版本可以同时接受图像和文本输入。

ChatGPT 为文本生成提供了多样化的能力,能够进行流畅且基于上下文的对话。

以下是使用 ChatGPT 进行学习对话的示例步骤:

  1. 输入提示:“我听说过生成式人工智能,想了解更多。”
  2. ChatGPT 会根据上下文回复一些基本信息。
  3. 继续对话,提出更具体的问题来细化研究,例如:“我如何利用生成式人工智能来提高我的讲故事技巧?”
  4. ChatGPT 会根据你提供的上下文和问题给出相应回答。

你可以自由尝试并引导对话,ChatGPT 将构建出信息丰富且有趣的交流。

它也能协助完成各种创造性任务。例如,输入提示:“帮我创建幻灯片来展示一个学习平台的功能。” ChatGPT 会为特定幻灯片提供标题、内容和视觉元素的建议。

尽管 ChatGPT 最擅长英语,但它能理解并响应多种其他语言。例如,提示它用法语和西班牙语写“你好”,它就能生成所需的输出。ChatGPT 也可以是学习新语言或任何科目的有用工具。

Google Bard:基于PaLM模型

另一个流行的文本生成工具是 Google Bard。它基于谷歌的高级语言模型 PaLM。

PaLM 是变换器模型与谷歌 Pathways AI 平台的结合。Pathways AI 基于专门的“路径”模块,每个模块负责特定任务,如自然语言处理或机器翻译。

除了海量的文本和代码训练数据集,Bard 还会从互联网上的资源中提取信息来响应提示。

尝试使用不同的提示来探索 Bard 的能力:

  • 获取新闻摘要:提示“提供关于乌克兰战争的最新新闻摘要”。它会提供多个版本的回复草稿,你可以选择其一或重新生成。
  • 生成想法或解决问题:提示“为推广一个时尚品牌提供数字营销活动策略”。它会提供营销活动的分步方法。

其他能力与用例

ChatGPT 和 Bard 还为其他有价值的用例提供能力。例如:

  • 它们可以通过这些科目帮助你进行基础数学、统计和问题求解。
  • 它们也精通财务分析、投资研究、预算编制等。
  • 此外,ChatGPT 和 Bard 可以生成代码,并跨各种编程语言和框架执行与代码相关的任务。

在与 ChatGPT 和 Bard 互动后,你会注意到:

  • ChatGPT 在生成动态响应和维持对话流方面更有效。
  • 而 Bard 由于其通过谷歌搜索和谷歌学术访问网络资源,可能是研究某个主题的最新新闻或信息的更好选择。

需要认识到,包括 GPT 和 PaLM 在内的生成式 AI 模型正在不断发展,因此其他能力和特性可能会发生变化。


其他文本生成工具

除了 ChatGPT 和 Bard,还有其他文本生成器。以下是部分工具及其特点:

  • Jasper:生成任何长度的高质量营销内容,并可根据品牌声音进行定制。
  • Writesonic:为不同类型的文本(如文章、博客、广告和营销文案)提供特定模板。
  • Copy.ai:擅长为社交媒体、营销和产品描述创建内容。

还有一些工具可用于特定用例:

  • 摘要生成:例如 TLDR,通过提取关键思想或概念来生成文本摘要。
  • 文本分类:例如 UClassify,用于为文本片段分配一个或多个类别。
  • 情感分析:例如 Brand24 和 Repustate,用于理解并生成反映人类语言中所表达潜在情感的文本。
  • 多语言翻译:例如 Language Weaver 和 Yandex Translate。

隐私考量与开源替代方案

需要注意的是,许多开源的生成式 AI 工具会收集并审查与其共享的数据以改进其系统。在与这些工具互动时,为避免共享任何机密或敏感信息,这是一个重要的考虑因素。

那么,我们是否有开源的、保护隐私的替代方案?答案是肯定的。

例如,GPT4All 可以安装在你的机器上,作为一个具有隐私意识的聊天机器人运行,无需互联网或图形处理单元。

此外,像 H2O AIPrivateGPT 这样的聊天机器人旨在通过在没有互联网连接的本地机器上运行来保护用户隐私。

不仅如此,你还可以通过将这些工具链接到你组织的文档和数据库,为特定组织内部使用进行定制。


文本生成工具的优势

生成式 AI 文本生成工具提供了多项好处:

  • 学习辅助:提供分步解释,是良好的学习助手。
  • 提升效率:能够快速生成不同形式的文本,为作者和创作者提高效率。
  • 激发创意:增强创造力并激发新想法。
  • 虚拟助手:通过实现引人入胜的互动对话,可用作虚拟助手和聊天机器人。
  • 提高生产力:通过自动化重复性写作任务,可以提高组织生产力。
  • 支持多语言:通过多语言支持,便于全球受众的沟通和内容本地化。

总结

本节课中,我们一起学习了:

  1. 大语言模型通过解读上下文、语法和语义来生成连贯且符合语境的文本。
  2. 大语言模型是许多文本生成工具的基础。
  3. 两种流行的文本生成工具:OpenAI 的 ChatGPT(基于 GPT)和 Google Bard(基于 PaLM)。
  4. ChatGPT 和 Bard 都能生成不同类型的文本、翻译语言,并以互动和信息丰富的方式回答你的问题。
  5. 我们讨论的其他工具包括 Jasper、Copy.ai、Writesonic。
  6. 开源且保护隐私的文本生成器包括 GPT4All、H2O AI 和 PrivateGPT。

039:图像生成工具 🎨

在本节课中,我们将学习生成式AI模型在图像生成方面的基本能力,并解释常见图像生成模型和工具的核心功能。


生成式AI图像生成模型能够生成全新的图像,并能对真实或生成的图像进行定制,以输出符合期望的结果。例如,你可以生成一个手持书本的儿童图像,并进一步修改生成图像中书封的颜色。

上一节我们了解了图像生成的基本概念,本节中我们来看看如何实际操作一个免费的AI图像生成器。

以下是使用免费AI图像生成器FreePik生成新图像的步骤:

  1. 输入描述你希望创建图像的文本提示词。
  2. 例如,输入提示词:“夕阳下,一艘小船在宁静的湖泊上航行,周围是郁郁葱葱的绿植和安详的天空。”
  3. 记住,你描述图像的方式以及提示词中包含的词语,决定了生成图像的准确性和质量。
  4. 选择一种风格并生成图像。
  5. 生成多个图像后,你可以选择并下载其中一个,或者通过修改提示词来生成其他图像。

接下来,让我们进一步探索图像生成模型的更多可能性。

图像到图像转换是指在保留原始内容和风格的前提下,将图像从一个领域转换到另一个领域。例如:

  • 将草图转换为逼真图像。
  • 将卫星图像转换为地图。
  • 将安防摄像头图像转换为更高分辨率的图像。
  • 增强医学影像的细节。

风格迁移与融合涉及从一幅图像中提取风格,并将其应用到另一幅图像上,从而创建混合或融合图像。例如,将一幅绘画转换为照片。

修复是指重建图像中缺失或损坏的部分,使其变得完整。你可以将此技术用于:

  • 艺术品修复。
  • 取证分析。
  • 在保持连续性和上下文的前提下,移除图像中不需要的物体。
  • 将虚拟物体融入现实世界场景和增强现实中。

外绘涉及通过生成与原始图像风格一致的新部分来扩展原始图像。这可以用于:

  • 生成更大尺寸的图像。
  • 增强分辨率。
  • 创建全景视图。

生成模型和工具的图像生成与修改能力,随着其底层模型的演进而不断发展。

OpenAI的DALL-E基于GPT模型,并在大型图像及其文本描述数据集上进行了训练。DALL-E能够生成多种风格的高分辨率图像,包括逼真的照片和绘画。在新版本中,DALL-E已演进为能够通过修复和外绘等功能生成多种图像变体并进行图像转换。

Stable Diffusion是一个开源的文生图扩散模型。扩散模型是能够创建高分辨率图像的生成模型。Stable Diffusion主要用于基于文本提示生成图像,但也可用于图像到图像转换、修复和外绘。

NVIDIA的StyleGAN模型将图像内容和图像风格的建模分离开来,从而能够精确控制风格,以操控姿态或面部表情等特定特征。StyleGAN已演进到能够生成具有更逼真细节的更高分辨率图像。

你可以使用Crayon、FreePik和Pixlr等免费工具探索生成式AI的文生图能力。这些工具能以不同的形式和风格生成图像。

DeepArt.io是一个在线平台,可以将照片转化为不同风格的艺术作品。

MidJourney是一个支持图像生成者社区的平台,帮助艺术家和设计师使用AI创建图像,并探索彼此的作品。

许多生成式AI图像生成器也可以作为API集成,将其功能嵌入到不同的软件程序和工具中。一些提供API的流行图像生成器包括DALL-E、MidJourney和Crayon。

微软和Adobe等技术巨头也已涉足AI图像生成器领域。

微软Bing图像创建器基于DALL-E模型。你可以通过访问Bing.com/create或通过Microsoft Edge浏览器使用此工具。这使得Microsoft Edge成为首个集成AI图像生成器的浏览器。

Adobe Firefly是一系列生成式AI工具,旨在与Adobe Creative Cloud应用程序(如Photoshop和Illustrator)集成。Firefly在Adobe Stock图片、公开授权内容和公共领域内容上进行训练。Firefly可以接受超过100种语言的文本提示,并包含允许你操控颜色、色调、光照、构图、生成填充、文本效果、生成重新着色、3D转图像以及扩展图像等工具。


本节课中,我们一起学习了基于生成式AI的模型和工具能够通过文本和图像提示生成新图像。它们还提供图像到图像转换、风格迁移、修复或外绘等功能。一些著名的图像生成模型包括DALL-E、Stable Diffusion和StyleGAN。有多种图像生成工具可用,提供多样化的图像生成和转换能力。一些图像生成器也可以作为API集成。我们还了解到,Adobe Firefly是一系列旨在与Adobe Creative Cloud应用程序集成的生成式AI工具。

040:音频与视频生成工具 🎵🎬

在本节课中,我们将学习生成式人工智能在音频和视频内容创作领域的应用。你将了解这些工具如何运作,它们具备哪些关键能力,以及如何利用它们来创造有影响力的媒体内容,甚至重塑虚拟世界。

观看本视频后,你将能够:

  • 描述生成式AI音频和视频工具如何创造有影响力的媒体内容。
  • 解释生成式AI音频和视频工具的关键能力。
  • 探索生成式AI重塑虚拟世界的能力。

市场预测显示,生成式AI音乐市场在2022年价值2.29亿美元,预计将以28.6%的高复合年增长率增长,到2032年将达到26.6亿美元。生成式AI音乐正是利用生成式AI的音频能力创造的。近年来,这些能力正在帮助公司和个人(无论是新手还是专家)简化流程,将他们复杂的构想变为现实。

设想一下,假设你一直拖延着没有开始你的播客,或者想为你的混音添加一些音效。那么,你一定会喜欢生成式AI音频工具能为你做的事情。它们主要分为三类:语音生成工具音乐创作工具音频增强工具


语音生成工具 🗣️

上一节我们提到了生成式AI音频工具的三大类别,本节中我们首先来看看语音生成工具。

高质量的语音生成工具主要是文本转语音(TTS) 工具,它们能将文本转换为音频。虽然朗读技术并不新鲜,但生成式AI架构升级了这项技术的工作方式。深度学习算法在大量的人类语音数据集上反复训练,这使得它们能够分解并高效地复制发音、语速、情感和语调等声音特征。

因此,生成式AI TTS工具能创造出更准确、更自然的语音。这对于有视觉障碍、语言障碍或其他阅读困难的人群尤其有帮助。从趣味性来说,这些工具可以帮助你“听”论文、反馈和笔记,这可能比阅读它们更容易。它们也能帮助你更好地沟通。

如果你想以一种出众的方式为你的演示文稿配音,你可以登录Lovo、Synthesia、Murf AI或Listnr等平台,从庞大的AI语音库、语言或情感库中进行选择。你甚至可以创建一个独特的声音或克隆你自己的声音。

以下是语音生成工具的一些核心功能:

  • 文本转语音(TTS)text_input -> AI Model -> audio_output
  • 声音定制:提供多种语言、情感和音色的AI语音。
  • 语音克隆:允许用户创建或复制独特的声音。
  • 音轨编辑:可以编辑发音、语调和语速,以生成专业水准的最终产品。


音乐创作与音频增强工具 🎶

了解了语音生成后,我们来看看生成式AI在音乐创作和音频处理方面的应用。

假设在一个阳光明媚的下午,你内心的业余音乐家感到灵感迸发。你可以尝试Meta的AudioCraft,这是一个经过音效和2万小时Meta自有或授权音乐预训练的生成式AI工具。此外,还有Shutterstock的Amper Music、AIVA、Soundful、Google的Magenta以及G4驱动的Wave工具

这些工具让你可以从丰富的音乐库、不同的音乐流派、乐器风格和旋律中进行选择。你只需要输入一个基于需求的文本提示,工具就会根据你的请求创作简短的旋律、建议或添加乐器、创作一首新歌,或者为你的下一个YouTube或Instagram视频制作配乐。生成式AI还可以帮助你混音、母带处理,并将最终的音乐作品发布到流行的流媒体平台上。

你甚至可以使用音频增强工具。这些工具经过预训练,能够识别特定声音,可以为你的音频添加有趣的声音效果,或去除不需要的噪音。例如,Descript可以帮助你消除背景噪音、增强低质量录音并添加所需的音效。Auto AI可以清理文件中的杂音。许多音乐生成工具也具备音频编辑和增强能力。


视频生成工具 🎥

然而,有些项目需要的不仅仅是精选的音效。2022年,Runway AI就利用生成式AI制作了奥斯卡获奖电影《瞬息全宇宙》。即使你不制作大片,也可以在日常生活中使用生成式AI视频工具。

假设你正在制作一部关于你所在城市树木缺乏的纪录片。你可以登录Runway的Gen-1工具,它将现有的视频片段转换成不同的风格;或者使用Runway的Gen-2工具,通过文本、图像或视频输入来创建视频。作为替代,你可以使用Videoki或Synthesia应用

以下是视频生成工具的主要工作流程:

  1. 输入:上传现有照片/视频,或使用文本提示生成所需图像。
  2. 处理:AI模型根据输入内容生成或转换视频。
  3. 增强:录制旁白、增强音频、转换视频文件格式。
  4. 输出:发布最终视频。Synthesia甚至允许你创建自定义虚拟形象以增强品牌记忆点。

重塑虚拟世界 🌐

生成式AI不仅能处理音视频,还能提升你的虚拟世界体验。

你可以创造具有混合特征和异域风光的独特、富有想象力的虚拟世界。生成模型还可以实时响应,提高模拟的准确性。元宇宙应用生成式AI来创造更个性化、更具吸引力的用户体验。

在游戏元宇宙中,你可以快速生成3D物体,甚至创建配备特定人格特征的虚拟形象,这些特征会反映在他们的表情、行为、对话和决策中。例如,The Sandbox就是一个元宇宙,用户可以在其中即时构建、拥有并向全球推广自己的游戏。Scenario AI则帮助创建和连接定制化的移动游戏资产。


总结 📝

本节课中,我们一起学习了生成式AI音频和视频工具如何产生影响。通过一个简单的文本提示,你就可以:

  • 生成多种语言的人声级语音。
  • 录制歌曲、添加音效或去除 unwanted 噪音。
  • 发布专业的视频和动画。
  • 构建增强型的、充满异域风情的虚拟世界。

这些工具正在降低媒体创作的门槛,让每个人都能更轻松地将创意变为现实。

041:代码生成工具 🛠️

在本节课中,我们将学习生成式AI在代码生成领域的基本能力,探讨文本生成工具在代码生成方面的优势与局限,并解释常见代码生成模型和工具的核心功能。

代码生成工具概述

上一节我们介绍了AI的多种应用场景,本节中我们来看看它在代码生成方面的具体能力。基于深度学习和自然语言处理(NLP)的生成式AI模型,能够理解自然语言输入的上下文,并生成符合语境的代码。

以下是代码生成工具的主要能力:

  • 生成新代码:根据文本提示生成全新的代码片段或程序。
  • 代码补全:预测并补全部分代码片段。
  • 代码优化:生成现有代码的优化版本。
  • 代码转换:将代码从一种编程语言转换为另一种。
  • 生成文档:为代码生成摘要和注释,以改进文档。
  • 提供解决方案:描述您试图解决的问题,代码生成器会推荐算法、数据结构和合适的编程方法。

GPT的代码生成能力

接下来,我们具体了解一下GPT在代码生成方面的表现。OpenAI的GPT在类人文本生成方面表现出色,在代码创建方面也展示了令人印象深刻的能力。

以下是使用基于GPT的ChatGPT生成代码的示例:

  • 生成简单代码:输入提示“写一段Python代码来生成问候信息”,ChatGPT会生成相应的Python代码,并提供运行指南。
  • 调试代码:输入一段错误的代码,ChatGPT能提供修正后的代码并解释所做的更正。
  • 代码翻译:支持将代码从一种编程语言翻译到另一种。
  • 生成文档:能够生成代码文档和注释,以提高可读性。

基于GPT的模型和工具已经发展到可以生成更长、更准确的代码,这使得它们能够用于开发应用程序、网站和插件。此外,GPT的演进甚至使其能够根据图像生成代码,例如,输入课程大纲的图片来生成一个功能完整的应用程序代码。

Google Bard也提供了代码生成和调试能力,支持超过20种编程语言。

ChatGPT和Bard是学习新编程语言的宝贵工具,因为它们能提供逐步的详细解释,有助于更好地理解。

代码生成工具的局限与专用工具

尽管ChatGPT和Bard擅长生成具有基本逻辑和编程概念的代码,但它们也存在一些局限。它们可能无法从零开始生成大型或复杂的代码。虽然这些工具理解编程概念和语法,但可能不完全理解语义。因此,生成的代码可能在技术上是准确的,但功能上可能不符合要求。

需要注意的是,这些模型的知识受限于其训练数据。特定版本的GPT可能不了解其训练后发布的编程框架和库。例如,GPT-3.5的知识截止日期是2021年9月。

因此,如果您需要更专业的代码生成器,可以考虑使用专门为代码生成设计的模型和工具。

以下是几个主流的专用代码生成工具:

  • GitHub Copilot:由OpenAI Codex提供支持,这是一个生成式预训练语言模型。它可以根据各种编程语言和框架生成代码,帮助开发者生成基于解决方案的代码。Copilot可以集成到流行的代码编辑器(如Visual Studio)中,生成符合最佳实践和行业标准的代码片段。
  • Polycoder:一个开源的AI代码生成器,基于GPT模型,并在12种编程语言的GitHub仓库数据上进行了训练。它在编写C语言代码方面特别准确。Polycoder提供了丰富的预定义模板库,可作为各种用例代码生成的蓝图,帮助创建、审查和精确定制代码片段。
  • IBM Watson Code Assistant:基于IBM Watsonx.ai基础模型构建,适用于任何技能水平的开发者。它可以集成到代码编辑器中,通过实时推荐、自动补全和代码重构辅助,帮助开发者准确高效地编写代码。开发者还可以输入代码或项目文件进行分析,它会识别模式、提出改进建议并生成代码片段或模板。

此外,还有许多其他AI驱动的代码生成器和助手工具,例如Amazon CodeWhispererTabnine,它们都能集成到代码编辑器中并提供实时代码建议。Replit则是一个提供交互式编码、学习和协作空间的平台。

优势与注意事项

自动代码编写和优化能力,基于AI的代码生成器能帮助开发者提高生产力和代码质量。它们支持快速原型设计以迭代设计想法,并通过支持多语言代码翻译来帮助实现跨平台兼容和迁移。基于AI的代码生成器遵循一致的编码模式和标准,可以建议重构模式以遵循最佳实践。

然而,使用这些工具时需要谨慎,以确保AI生成的代码不会导致伦理问题,例如,基于训练数据可能产生的安全漏洞、恶意代码或数据偏见。

总结

本节课中我们一起学习了生成式AI模型和工具如何从文本和图像提示生成新代码、优化现有代码并生成基于解决方案的代码。ChatGPT和Bard适用于简单的代码生成、调试和学习编程。而GitHub Copilot、Polycoder和IBM Watson Code Assistant等主流代码生成器则提供了实时推荐、代码重构和解决方案模板等多样化功能。总体而言,代码生成器提高了生产力,加速了开发周期,促进了编码最佳实践并培养了统一的编码标准。

042:提示工程入门 🚀

在本节课中,我们将要学习提示工程的基础知识。提示工程是引导生成式人工智能模型产生精确、相关响应的关键技能。无论你是专业人士、爱好者、实践者还是学生,只要对学习如何编写有效提示感兴趣,这门课程都适合你。

概述

专家知道所有答案,前提是你提出了正确的问题。有趣的是,这正是我们为生成式人工智能模型设计提示时所遵循的原则。我们使用提示来查询和提问人工智能应用,例如聊天机器人、图像、音频或视频生成工具,甚至虚拟世界。提示能够优化生成式人工智能模型的响应,其力量在于你所提出的问题。了解如何编写有效且直接的提示,将使你能够生成更精确、更相关的内容。

完成本课程后,你将能够:

  • 解释提示工程在生成式人工智能模型中的概念和重要性。
  • 应用创建提示的最佳实践。
  • 评估常用的提示工程工具。
  • 应用常见的提示工程技术和方法来编写有效的提示。

这是一门精炼的课程,包含三个模块,每个模块需要一到两个小时完成。

课程模块详解

上一节我们介绍了课程的整体目标,本节中我们来看看课程的具体内容安排。

模块一:提示工程基础与工具

在课程的第一个模块中,你将学习提示工程的概念。从如何定义提示及其构成要素开始,你将学习应用编写有效提示的最佳实践,并评估常见的提示工程工具,例如 IBM Watson X Prompt Lab、Spellbook 和 Dust。

模块二:提示工程方法与技巧

在模块二中,你将学习各种提示工程方法,例如访谈模式思维链思维树。你将发现巧妙设计提示的技巧,例如零样本提示少样本提示,以产生精确且相关的响应。

模块三:实践项目与评估

模块三要求你参与一个最终项目,并提供一个分级测验来检验你对课程概念的理解。你还可以访问课程术语表,并获得关于后续学习路径的指导。

课程特色与学习建议

本课程融合了概念讲解视频和辅助阅读材料。观看所有视频以充分掌握学习材料的潜力。

以下是本课程的主要特色:

  • 实践实验室:在最终项目中,你将享受动手实践的乐趣,该项目演示了如何在 IBM 生成式人工智能教室中通过创建有效提示来优化结果。
  • 练习测验:课程包含练习测验,帮助你巩固所学知识。
  • 分级测验:课程结束时,你还需要完成一个分级测验。
  • 讨论论坛:课程提供讨论论坛,方便你与课程工作人员联系并与同伴交流。
  • 专家观点视频:最有趣的是,通过专家观点视频,你将听到经验丰富的从业者分享他们对提示工程中使用的工具、方法以及编写有效提示的艺术的见解。

总结

本节课中,我们一起学习了“提示工程入门”课程的概览。我们了解到,编写有效的提示是释放生成式人工智能全部潜力的关键。本课程专为初学者设计,通过三个模块的系统学习,结合视频、阅读、实践和评估,你将掌握提示工程的核心概念与实用技能。

你准备好学习关于编写提示的一切知识,以解锁生成式人工智能的全部潜力了吗?让我们开始吧。😊

043:什么是提示词?🤖

在本节课中,我们将学习提示词(Prompt)的基本概念及其构成要素。你将能够定义提示词,并解释编写有效提示词对于引导生成式AI模型产生预期结果的重要性。

生成式AI模型的一个重要能力是其输出与人类创作的内容高度相似:相关、有上下文、富有想象力、细致入微且语言准确。而生成这种输出的关键因素之一就是提示词。

那么,什么是提示词?提示词是你提供给生成式模型的任何输入,用以产生期望的输出。你可以将其视为给模型的指令。例如:

  • write a small paragraph describing your favorite holiday destination
  • write HTML code to generate a drop down selection of cities within an online form

这些都是用于产生特定输出的直接提示词。提示词也可以是一系列逐步细化输出的指令,以达到预期结果。例如:

  • write a short story about a scientist studying life on Mars
  • what were some of the challenges he faced during his research

通过这些例子可以清楚地看到,提示词包含问题、上下文文本、引导模式或示例,以及基于这些自然语言请求为模型提供的部分输入。生成式AI模型收集这些作为提示词提交的信息,进行推理,并提供创造性的解决方案。这些指令帮助模型基于提供的输入,产生相关且合乎逻辑的回应或输出。

为了帮助我们更好地理解这一点,让我们看更多例子。

假设你想让模型写一个关于农民在10年内成为成功商人的奋斗与成就的短篇故事。如果你的提示词是 rich man's story from a small town, his struggles and achievements,它会产生一个通用的输出,这就是我们所说的“朴素提示”。这意味着以最简单的方式向模型提问。

为了向模型传达你的意图,你可以进行简单的调整,从而显著改善结果。你的提示词必须包含上下文、恰当的结构,并且易于理解。

因此,你可以将提示词重写为:write a short story about the struggles and achievements of a farmer who became a rich and influential businessman in 10 years

让我们看另一个例子,你想让模型生成你想象中的日落风景图像。将提示词写为 sunset image between mountains 可能无法给出你期望的输出。这个提示词过于简短,缺乏对你脑海中图像的详细描述。

你可以将提示词重写为:generate an image depicting a calm sunset about a river valley that rests amidst the mountains

要掌握编写有效提示词的艺术,让我们逐一理解一个结构良好的提示词的构成要素。

以下是构成一个结构良好提示词的核心要素:

  1. 指令(Instruction):给模型关于你希望执行任务的明确指导。它引导生成式AI模型的行为,影响其回应的形成。例如:write an essay in 600 words, analyzing the effects of global warming on marine life

  1. 上下文(Context):帮助建立指令所处的环境背景,并为生成相关内容提供一个框架。为了理解这一点,让我们为上一个例子中的提示词添加一些上下文。In recent decades, global warming has undergone significant shifts, leading to rising sea levels, increased storm intensity and changing weather patterns. These changes have had a severe impact on marine life. Write an essay in 600 words analyzing the effects of global warming on marine life. 这个提示词将帮助模型生成与上下文一致的输出。

  1. 输入数据(Input Data):你作为提示词一部分提供的任何信息片段。这可以作为生成式模型的参考,以获得包含特定细节或想法的回应。为了提供输入数据,同一个提示词可以按以下方式重构:You have been provided with a data set containing temperature records and measurements of sea levels in the Pacific Ocean. Write an essay in 600 words analyzing the effects of global warming on marine life in the Pacific Ocean.

  2. 输出指示器(Output Indicator):为评估模型生成输出的属性提供基准。它可以概述你期望输出具备的语气、风格、长度和其他品质。在提示词 write an essay in 600 words, analyzing the effects of global warming on marine life 中,输出指示器指定生成的输出应为一篇600字的文章。它将根据分析的清晰度以及相关数据或案例研究的纳入情况进行评估。

这些要素中的每一个都在帮助生成式AI模型理解你的需求并给出期望的输出方面发挥着作用。

在本节课中,我们一起学习了提示词是你提供给生成式模型以产生期望输出的任何输入或一系列指令。这些指令有助于引导模型的创造力,并协助产生相关且合乎逻辑的回应。一个结构良好的提示词的构成要素包括指令上下文输入数据输出指示器。这些要素帮助模型理解我们的需求并生成相关的回应。

044:什么是提示工程?🤖

在本节课中,我们将学习提示工程的定义、重要性及其在生成式AI模型中的应用。我们将通过一个具体示例,了解如何通过系统化的步骤设计有效的提示,以引导模型生成更准确、更相关的回答。


概述

提示工程是指设计有效提示的过程,旨在引导生成式AI模型产生更优质、更符合预期的回答。尽管生成式AI模型能够辅助人类创造力,但如果提示不够精确,模型可能会产生不充分甚至错误、误导性的信息。因此,掌握提示工程对于充分利用AI模型至关重要。


提示工程的定义与重要性

提示工程是批判性分析、创造力和技术敏锐度的结合。它不仅仅是提出正确的问题,还包括在正确的语境中构建问题,提供恰当的信息,并明确期望的结果,以引导模型生成最合适的回答。

核心公式
有效回答 = 精确的提示 + 充分的上下文 + 明确的期望

如果未能提供精确的提示,模型可能产生不理想的结果。例如,简单询问“大西洋的天气预报”可能无法获得船长所需的特定时间和地点的详细预报。


示例:船长的天气预报需求

为了更好地理解提示工程,我们来看一个例子。一位船长计划在大西洋航行,需要了解特定时间和地点的天气预报。

如果只提供简单的提示,例如:

天气 forecast of the Atlantic Ocean

模型可能无法给出有针对性的回答。

通过提示工程,船长可以设计更精确的提示:

船长计划在大西洋进行战略航行。请提供2023年8月28日至9月1日期间,北纬20度至30度、西经40度至20度区域的详细天气预报,包括风速、浪高、降水概率、云量以及可能影响航行的风暴信息。

这样的提示能引导模型生成更准确、有用的回答。


提示工程的步骤

以下是创建有效提示的逐步过程,这是一个结构化的迭代流程。

1. 定义目标

首先,明确你希望模型生成什么内容。例如:

生成一份关于人工智能在汽车行业益处与风险的简要概述。

2. 创建初始提示

根据目标,构建初始提示。它可以是问题、指令或情境描述。例如:

撰写一篇文章,全面分析人工智能在汽车行业应用的益处与弊端。

3. 测试提示

将初始提示输入模型,测试其回答。例如,上述提示可能生成涵盖益处和弊端的文章,但可能未涉及伦理问题或正反影响的深入讨论。

4. 分析回答

仔细评估模型的回答是否与目标一致。记录不足之处。例如:

初始提示未能全面覆盖人工智能在汽车行业的所有潜在风险和益处。

5. 优化提示

根据测试和分析结果,修改提示。可以增加细节、补充上下文或调整措辞。例如,优化后的提示:

撰写一篇信息性文章,讨论人工智能如何变革汽车行业。涵盖自动驾驶、实时交通分析等具体领域,以及技术复杂性、网络安全问题等潜在挑战。

6. 迭代过程

重复步骤3至5,直到对回答满意为止。经过多次优化,最终提示可能如下:

撰写一篇文章,展示人工智能为汽车行业带来的变革。讨论其对自动驾驶和实时交通分析的积极影响,同时深入探讨技术复杂性、网络安全漏洞等担忧,这些漏洞可能导致关键车辆系统被控制,从而危及安全。

提示工程的重要性

提示工程在生成式AI模型中具有多方面的重要性:

  1. 优化模型效率
    通过设计智能提示,用户无需大量重新训练模型,即可充分发挥其能力。

  1. 提升特定任务性能
    提示工程使模型能够生成更细致、更具上下文感知的回答,从而在特定任务中表现更佳。

  2. 理解模型限制
    通过迭代优化提示并分析模型回答,我们可以了解模型的优势与弱点,为未来功能增强或模型开发提供指导。

  3. 增强模型安全性
    良好的提示工程可以避免因提示设计不当而导致有害内容的生成,从而提高模型的安全使用性。


总结

本节课中,我们一起学习了提示工程的定义及其在生成式AI模型中的重要性。我们通过一个船长的示例,了解了设计有效提示的步骤:定义目标、创建初始提示、测试提示、分析回答、优化提示并迭代过程。最后,我们探讨了提示工程在优化模型效率、提升任务性能、理解模型限制和增强安全性方面的关键作用。掌握提示工程,将帮助你更有效地利用生成式AI模型,获得更优质的回答。

045:提示创建的最佳实践 🎯

在本节课中,我们将学习如何应用最佳实践来创建有效的提示,并通过多个示例解释如何起草和优化提示。


概述

撰写有效的提示对于充分发挥生成式AI模型的潜力、获取相关且准确的回应至关重要。通过应用最佳实践,你可以监督输出内容的风格、语气和内容。创建有效提示的最佳实践主要围绕四个核心维度展开:清晰度上下文精确度以及角色扮演或人物设定模式


清晰度

清晰度要求你的提示易于理解且无歧义。以下是确保清晰度的关键点:

  • 使用简单直接的语言:简单的语言能轻松传达指令。
  • 避免专业术语:专业术语可能会让模型或用户感到困惑。
  • 明确描述任务:模糊的提示可能导致回应与你的意图不符。

让我们通过一个例子来理解。考虑以下提示:

“讨论在植物完全叶状托叶上借助阳光发生的烹饪过程。同时提及一个绿色物体,以及光、空气和水对植物地上部分的重要性。”

这个提示存在多处问题:它没有明确提及想要讨论的过程(光合作用),使用了复杂的术语,并且整体描述模糊,任务不清晰。

为了确保清晰度,我们可以将其重写为:

“解释植物光合作用的过程,详细说明叶绿素的作用,以及阳光、二氧化碳和水如何参与这一生物功能。”

修改后的提示使用了简单、清晰、简洁的语言,并明确声明了要讨论的主题。


上下文

上下文帮助模型理解情境或主题。这包括提供简短的背景介绍或解释回应所需的环境。

  • 提供背景信息:简要介绍情况。
  • 包含相关细节:如人物、地点、事件或概念等具体信息,能有效引导模型的理解。

例如,提示“写下1775年革命战争爆发时发生了什么”缺乏足够的背景和具体细节来引导模型。

为了建立正确的上下文并包含相关信息,可以将其重写为:

“描述导致美国革命战争的历史事件,重点关注波士顿倾茶事件、萨拉托加战役等关键事件。强调美洲殖民地与英国政府之间的紧张关系,并解释这些事件如何导致了1775年革命战争的爆发。”


精确度

精确度有助于勾勒出你的请求。如果你在寻找特定类型的回应,请清晰地表达出来。

  • 明确表达需求:清晰说明你想要的回应类型。
  • 提供示例:在提示中融入示例,可以帮助模型理解你期望的回应类型,并引导其思考过程。

例如,提示“谈谈经济学中的供需关系及其影响”没有精确地勾勒出特定的回应类型,也没有提供示例。

为了确保精确度,可以将其重写为:

“解释经济学中的供需概念。描述需求增加如何影响价格,并以智能手机市场为例进行说明。同样,通过类比石油生产中断等情况,解释供应减少对价格的影响。”

这个提示清晰地表达了希望通过示例来解释概念。


角色扮演或人物设定模式

从特定角色或人物视角撰写的提示,可以帮助模型生成与该视角一致的回应。

  • 设定角色:要求模型从特定视角(如历史人物、虚构角色或特定职业)进行回应。
  • 提供上下文细节:提供必要的背景细节,使模型能够有效地扮演特定角色。

请看这个例子:“写一篇日志,描述一个未知外星星球上奇特的动植物。”这个提示只会给出关于外星星球的科学细节,而不会从专业人士的视角解释其答案。

你可以将提示重写为:

“假设你是一名刚刚登陆未知外星星球的宇航员。写一篇日志,描述你遇到的奇特动植物,例如天空的颜色和回荡在异星景观中的陌生声音。在记录这段非凡旅程时,表达你的兴奋、好奇以及一丝忧虑。”

在这个例子中,你明确提供了上下文细节,并假设自己是一名宇航员。因此,这个提示将生成与宇航员视角一致的回应。


总结

本节课中,我们一起学习了为生成式AI模型撰写有效提示的重要性,它能帮助我们监督输出的风格、语气和内容。撰写有效提示的最佳实践可围绕四个维度实施:清晰度上下文精确度角色扮演

  • 清晰度包括使用简单、简洁的语言。
  • 上下文提供背景和所需细节。
  • 精确度意味着具体明确并提供示例。
  • 角色扮演可以通过设定人物角色和提供相关上下文来增强回应。

这些实践可以根据具体需求进行调整,以获得最佳结果。

046:常见的提示工程工具 🛠️

在本节课中,我们将学习常见的提示工程工具。你将能够描述这些工具的常见功能,并解释几种主流工具的核心能力。

提示工程是指设计精确且符合上下文的提示词,以便与生成式AI模型交互,从而获得相关且准确的输出。为了辅助这一过程,存在多种提示工程工具。这些工具提供丰富的功能和特性,旨在优化提示词的创建,以实现期望的结果。它们对于不精通自然语言处理技术,但又希望在使用生成式AI模型时达成特定目标的用户尤为有用。

常见功能概览

上一节我们了解了提示工程工具的作用,本节中我们来看看这些工具通常提供哪些核心功能。

以下是提示工程工具常见的几类功能:

  • 提示建议:许多工具能根据给定的输入或期望的输出,为用户提供提示词建议。
  • 结构优化:这些工具可以建议如何组织提示词结构,以实现更好的上下文沟通。它们帮助构建能为模型提供必要上下文、使其理解用户意图的提示词。
  • 迭代精炼:你可以根据工具的初始响应,迭代地优化提示词,以找到最有效的版本。
  • 偏见缓解:提示工程工具可能提供功能,帮助减轻生成式AI模型响应中的偏见。它们可以指导如何构建提示词,以降低产生偏见或不恰当输出的可能性。
  • 领域适配:这些工具能帮助创建针对特定领域(如法律、医疗或技术)的提示词。
  • 预设库:一些提示工程工具提供了针对各种用例的预定义提示词库,用户可以根据具体需求进行定制。

主流工具介绍

了解了核心功能后,接下来我们具体探索几种常见的提示工程工具。

1. IBM Watsonx.ai Prompt Lab

让我们从 IBM Watsonx.ai 开始。这是一个集成工具平台,用于轻松地训练、调优、部署和管理基础模型。该平台包含 Prompt Lab 工具,使用户能够基于不同的基础模型试验提示词,并根据自身需求构建提示词。

为了帮助用户入门,Prompt Lab 为不同用例提供了示例提示词,包括摘要生成、文本生成和信息提取。要创建符合特定需求的提示词,你可以通过添加指令和示例来训练模型,向模型展示应如何响应输入。

2. Spellbook (Scale AI)

接下来,我们了解一下 Spellbook。这是 Scale AI 提供的一个集成开发环境。通过 Spellbook,你可以基于语言模型构建应用程序,并为各种用例(包括文本生成、信息提取、分类、问答、自动补全和摘要)试验提示词。

对于提示工程,Spellbook 包含一个提示词编辑器,允许你编辑和测试提示词。你可以使用提示词模板来利用结构化提示生成文本,也可以访问预构建的提示词作为示例。

3. Dust

另一个提示工程工具是 Dust。它提供了一个用于编写提示词并将其链接在一起的 Web 用户界面。你可以管理链式提示词的不同版本。它还提供了一种自定义编码语言和一组标准模块,用于处理 LLM 提供的输出。Dust 也支持集成其他模型和服务。

4. PromptPerfect

用于高效提示工程的另一个工具是 PromptPerfect。它可用于为不同的 LLM 或文生图模型优化提示词。它支持常见的文本模型(如 GPT、Claude、Stable LM 和 LLaMA)以及图像模型(如 DALL-E 和 Stable Diffusion)。

要编写或优化提示词,首先需要选择你想要为其优化提示词的相关模型。不同的模型有不同的优化策略。你还可以选择与预览质量、语言和审核相关的选项。在编写提示词时,你可以尝试自动补全功能,它会在你输入时提供建议。你可以在此进一步优化已编写的提示词。

例如,一个示例展示了用户编写的原始提示词和由 PromptPerfect 生成的相应优化提示词。为了进一步优化,你可以在“流线模式”中逐步优化和精炼提示词:编写提示词、优化它、再次编辑、再优化,直到对输出满意为止。

其他资源与平台

除了上述专用工具,还有一些流行的平台和接口为提示工程提供资源或帮助你试验提示词。

  • GitHub:提供了大量关于提示工程和 LLM 的代码仓库。这些仓库中的指南、示例和工具有助于提升提示工程技能。
  • OpenAI Playground:一个基于 Web 的工具,帮助用户使用 OpenAI 的各种模型(如 GPT 系列)试验和测试提示词。
  • Playground AI:该平台帮助你试验文本提示词,以使用 Stable Diffusion 模型生成图像。
  • LangChain:一个 Python 库,为构建和链接提示词提供功能。
  • 提示词市场:有趣的是,提示词也可以进行买卖。PromptBase 就是一个提示词市场的例子。它支持针对流行生成式 AI 工具和模型的提示词,包括 Midjourney、ChatGPT、DALL-E、Stable Diffusion 和 LLaMA。通过 PromptBase,你可以购买针对特定需求和特定模型或工具的提示词。例如,你可以购买一个用于通过 Midjourney 生成漫画卡通角色的提示词。同样,如果你拥有出色的提示词构建技能,也可以通过 PromptBase 上传和出售提示词。该平台还支持直接在其平台上构建提示词并在其市场上出售。

总结

本节课中,我们一起学习了提示工程工具。我们了解到,这些工具提供多种特性和功能来优化提示词,包括提供提示建议、优化上下文理解、支持迭代精炼、缓解偏见、提供领域特定帮助以及提供预定义提示词库。常见的提示工程工具和平台包括 IBM Watsonx.ai Prompt LabSpellbookDustPromptPerfect。此外,GitHub、OpenAI Playground 等平台以及 PromptBase 这样的市场也为提示工程提供了丰富的资源和可能性。

047:文本到文本提示技术 📝

在本节课中,我们将学习如何通过文本到文本提示技术来提升大型语言模型的可靠性和输出质量。我们将探讨多种核心提示技巧,并了解有效使用文本提示所带来的好处。

概述

近年来,自然语言处理领域因大型语言模型的应用取得了显著进步。然而,随着LLM规模和复杂性的增加,关于其可靠性、安全性和潜在偏见的疑问也随之浮现。有效使用文本提示是解决这些问题的有效方案。文本提示是精心设计的指令,用于引导LLM的行为以生成期望的输出。生成输出的质量和相关性取决于提示的有效性和LLM的能力。

接下来,我们将探讨使文本提示有效并能提升LLM输出可靠性的具体技术。

核心提示技术

上一节我们介绍了文本提示的基本概念,本节中我们来看看几种核心的提示技术。

1. 任务明确化

文本提示应明确地向LLM指定目标,以提高回答的准确性。例如,提示“将这句英文翻译成法语”就是一个实现任务的清晰指令。

2. 上下文引导

这项技术通过文本提示为LLM提供具体指令,以生成相关的输出。例如,如果你想让模型生成一篇关于纽约市地标的短文:

  • 一个泛泛的提示如“写一段关于纽约市的短文”可能会得到一个笼统的回应。
  • 而一个更具体的提示,如“写一段关于纽约市的短文,重点介绍其标志性地标”,由于包含了上下文,将生成更合适的输出。

3. 领域专业知识

当需要LLM在专业领域(如医学、法律或工程学)生成内容时,文本提示可以使用领域特定术语以确保准确性和精确性。例如,如果你想获取关于甲状腺功能减退症的医学信息,你的提示可以这样写:
请解释甲状腺功能减退症的病因、症状和治疗方法,包括最新的研究和医学指南。

4. 偏见缓解

这项技术通过文本提示提供明确的指令,以生成中立的回应。例如,假设你担心模型在回应关于领导力特质的提示时存在性别偏见。你可以使用这样的文本提示来应对:
写一段100字的关于领导力特质的段落,不要偏向任何性别。提供所有性别的平等示例。

5. 框架设定

这项技术通过文本提示引导LLM在所需边界内生成回应。假设你想让模型总结一篇关于气候变化的冗长文章,你的文本提示可以是:
请用100字总结这篇关于气候变化的文章,重点关注其主要发现和建议。

高级提示方法

除了上述基础技术,还有一些高级方法可以帮助我们更好地与LLM互动。

零样本提示

你知道吗,如今经过海量数据训练并被调整以遵循指令的LLM,可以执行零样本提示任务。这是一种生成式AI模型无需针对特定提示进行预先训练,就能生成有意义回应的方
法。例如,提示可以是:
选出这个句子中的形容词。句子是:Anita bakes the best cakes in the neighborhood。
这里的输出将是“best”。然而,通常你无法通过一次提示就获得理想的回应,可能需要迭代。

用户反馈循环

这时就需要用到用户反馈循环技术。用户对文本提示提供反馈,并根据LLM生成的回应迭代地优化提示。这个循环允许用户逐步提高模型的输出质量,直到达到期望的状态。例如:

  1. 用户通过文本提示要求模型写一首诗。
  2. LLM生成一首诗。
  3. 用户说:“让它更幽默一些。”
  4. LLM调整诗歌以包含更多幽默元素。
  5. 用户认可修改后的诗歌。

少样本提示

同样地,对于复杂的任务,当你无法清晰描述需求时,可以使用一种称为少样本提示的技术。它支持上下文学习,即在提示中提供示范,以引导模型获得更好的性能。这些示范作为后续示例的条件,你希望模型对这些示例生成回应。

例如,假设模型的任务是生成简短的旅行推荐。作为少样本提示,你为模型提供以下引导性上下文:

  • 推荐一个以美丽海滩闻名的夏季旅行目的地。
  • 推荐一个以美丽秋叶闻名的秋季旅行目的地。

在使用这些少样本提示后,模型可以为其他类型的假期生成旅行推荐。例如,如果任务是“推荐一个值得探索的城市”,模型将生成答案:
考虑参观像巴黎这样充满活力的城市,以其丰富的历史、艺术和标志性地标而闻名。
这就是模型如何基于少样本提示中提供的最少训练数据,为不同类型的假期生成旅行推荐。

有效使用文本提示的好处

使用我们刚刚讨论的方法将文本提示与LLM结合,会带来诸多好处。以下是其中一些:

  • 增强LLM的可解释性:可解释性指的是用户能够理解和解释模型决策过程及其生成输出背后原因的程度。它帮助用户、开发者和利益相关者理解模型如何工作、为何做出某些预测或生成特定文本,以及是否可以在各种应用中信任它。
  • 解决伦理考量:可解释性对于解决与AI相关的伦理问题至关重要。它帮助所有利益相关者评估并确保LLM的行为符合特定领域的伦理准则和法律要求。
  • 建立用户信任:除了提高LLM的可靠性和可解释性,有效的文本提示还能在用户和LLM之间建立信任。当用户能够理解LLM的工作原理,并看到他们的指令对LLM行为的直接影响时,就会在用户和LLM之间带来透明且有意义的互动。

总结

本节课中,我们一起学习了多种可以通过文本提示提升LLM可靠性和质量的技术。具体来说,我们探讨了任务明确化上下文引导领域专业知识偏见缓解框架设定用户反馈循环。我们还学习了零样本少样本技术。最后,我们了解了有效使用文本提示与LLM的若干好处,例如增强LLM的可解释性、解决伦理考量以及建立用户信任。

048:面试模式方法 🎤

在本节课中,我们将学习提示工程中的“面试模式方法”。我们将了解其核心概念、工作原理,并通过一个具体示例掌握如何应用此方法来编写更有效的提示,从而让生成式AI模型产出更具体、更符合需求的回答。

概述:什么是面试模式方法?

面试模式方法是一种提示工程策略,其核心在于通过模拟对话或类似面试的互动方式来设计提示。这种方法旨在引导AI模型进行更动态、迭代的对话,以获取更精确的响应。

上一节我们介绍了提示工程的基础概念,本节中我们来看看如何通过结构化的“面试”来优化与模型的互动。

面试模式方法的工作原理

这种方法需要对提示进行细致的优化,以确保模型生成的响应能精确满足你的目标。其流程通常如下:

  1. 你向模型提供特定的提示指令。
  2. 模型根据指令,向用户提出必要的后续问题。
  3. 你回答这些后续问题。
  4. 模型根据收集到的相关信息进行处理,最终为用户提供一个经过优化的响应。

一个核心原则是:你提供的信息越多,得到的结果就越好

下面,我们通过一个例子来更好地理解这个过程。

实战示例:扮演旅行顾问

假设你希望模型扮演一名旅行顾问,为你规划假期旅行行程。你将如何提示模型?

你可以向模型提供如下提示指令:

你将扮演一位经验丰富的旅行专家。
你的目标是与我进行一次全面的旅行规划对话。
请首先提出一系列详细的问题(一次一个),以收集所有必要信息,从而根据我特定的偏好、兴趣和预算,制定出最量身定制且令人难忘的旅行行程。

在收到这个提示指令后,模型会开始提出所有必需的后续问题。以下是模型可能会问的问题示例:

  • 你最喜欢去哪种类型的旅行目的地?
  • 请描述一下你理想假期的活动和体验。
  • 你通常如何规划旅行?在选择目的地时,哪些因素对你最重要?
  • 在规划旅行目的地时,你是否对特定的文化或历史方面感兴趣?
  • 旅行时你偏好哪种住宿选择?为什么?
  • 你如何平衡预算考虑与获得难忘旅行体验的愿望?

在这个例子中,每个问题都建立在前一个问题的基础上,形成了一场关于旅行偏好的结构化、信息丰富的对话。根据你对这些问题的回答,模型将规划出一个符合你偏好和需求的、令人难忘的旅行行程。

面试模式方法的优势

通过这个视频的学习,我们了解到面试模式方法优于传统的单次提示方法。

传统的单次提示是提供单一的、静态的指令。而面试模式则涉及与模型进行来回的信息交换,这有助于实时澄清疑问并引导模型的响应方向,从而增强用户优化结果的能力。

总结

本节课中,我们一起学习了提示工程中的面试模式方法。我们掌握了其通过模拟对话来设计提示的核心思想,了解了它分步收集信息以优化响应的工作流程,并通过旅行顾问的示例实践了如何应用该方法。记住,采用这种互动式的方法,能让生成式AI模型更好地理解你的复杂需求,并给出更精准、个性化的答案。

049:思维链(Chain of Thought)方法 🧠

在本节课中,我们将要学习提示工程中的“思维链”方法。这是一种通过构建一系列提示或问题来引导生成式AI模型,使其产生更准确、更具逻辑性回答的技术。我们将了解其核心概念、工作原理,并通过一个具体示例来掌握如何应用此方法。


思维链是一种基于提示的学习方法,它通过构建一系列提示或问题来引导模型生成期望的回应。使用这种方法,可以展示生成式AI模型的认知能力,并更好地解释其推理过程。

其核心在于将一个复杂任务分解为一系列更小、更简单的子任务。每个后续的提示都建立在前一个的基础上,逐步引导模型走向预期的结果。

在直接向模型提出一个问题之前,你需要先为它提供一些相关的问题及其对应的解决方案。这一系列的提示能帮助模型思考问题,并学会运用相同的策略来正确回答更多类似问题。

简单来说,一个完整的思维链提示应包含:一个示例问题及其分步推理的准确答案,以此向模型提供所需的上下文和推理逻辑;然后,再提出一个需要运用相同逻辑来解答的新问题。


为了更好地理解,我们来看一个例子。

如果你直接向模型提出一个数学问题:“马修有6个鸡蛋。他又买了2盘鸡蛋,每盘有12个。他现在一共有多少个鸡蛋?”模型可能会在复杂逻辑上出错。

为了训练模型掌握解决此类问题所需的适当推理,你可以先构建这样一个示例:

示例问题:玛丽有8个萝卜。她用了5个萝卜做晚餐。第二天早上,她又买了10个萝卜。她现在有多少个萝卜?

解决方案(分步推理)

  1. 玛丽最初有8个萝卜。
  2. 她用掉了5个,所以剩下 8 - 5 = 3 个萝卜。
  3. 第二天她又买了10个,所以现在总共有 3 + 10 = 13 个萝卜。

这个示例帮助模型理解了其中涉及的逻辑(先减后加)。然后,你再提出最初的目标问题,模型就能运用相同的推理链来解答。

因此,你的最终提示应遵循以下结构:

  1. 提供一个相关示例:包含问题及其分步推理的解决方案。
  2. 提出目标问题:一个可以运用相同逻辑解答的新问题。

以下是一个符合思维链方法的提示模板:

问题:玛丽有8个萝卜。她用了5个萝卜做晚餐。第二天早上,她又买了10个萝卜。她现在有多少个萝卜?
解决方案:玛丽最初有8个萝卜。用掉5个后,剩下 8 - 5 = 3 个。又买了10个后,她现在有 3 + 10 = 13 个萝卜。

问题:马修有6个鸡蛋。他又买了2盘鸡蛋,每盘有12个。他现在一共有多少个鸡蛋?

本节课中,我们一起学习了思维链方法。这种方法通过为模型提供相关示例及其分步解决方案,来强化生成式AI模型的认知能力,并引导其进行逐步推理。其核心在于训练模型理解问题背后的解决逻辑,从而能够将相同的逻辑应用于解决更多类似的问题。掌握这种方法,能让你更有效地引导AI模型进行复杂思考。

050:思维树方法 🌳

在本节课中,我们将学习一种创新的提示工程方法——思维树方法。我们将了解其核心概念、工作原理,并通过一个具体示例学习如何应用它来生成更符合需求的AI响应。

思维树方法是一种创新的提示工程技术,它扩展了思维链方法的能力。该方法使生成式AI模型能够展现更高级的推理能力。它通过将提示或查询分层组织成类似树状的结构,来为模型指定所需的思考或推理路径。当您需要向模型提供明确的指令或约束,以确保其生成期望的输出时,这种方法尤其有用。此方法在解锁新解决方案和解决复杂问题方面具有巨大潜力。

上一节我们介绍了思维树方法的基本概念,本节中我们来看看它的具体工作原理。

思维树方法的工作原理是生成多条思考路径,类似于决策树,以探索不同的可能性和想法。与传统的线性方法不同,该技术允许模型同时评估和探索多条路径。每个想法会像树枝一样分叉,形成一个相互关联的思考树状结构。模型通过评估每条可能的路径,根据其对结果的预测分配数值,并剔除前景较小的思考路径,最终确定最优选择。

为了更好地理解,我们通过一个示例来说明。

假设您希望模型为一家电子商务企业设计吸引和留住熟练远程员工的招聘与保留策略,并要求模型使用思维树方法来完成此任务。

您可以向模型提供以下提示指令:

想象三位不同的专家正在回答这个问题。
所有专家都将写下他们思考的一个步骤,然后与小组分享。
然后,所有专家将继续进行下一步,依此类推。
如果有任何专家在任何时候意识到自己错了,那么他们将退出讨论。

除了提示指令,您还需要给出原始问题提示:

扮演人力资源专家的角色,为一家电子商务企业设计一个招聘与保留策略,重点在于吸引和留住熟练的远程员工。

构建这样的提示指令将使生成式AI模型能够考虑一个逐步的过程并进行逻辑思考。它还会让模型考虑中间想法,在此基础上进行构建,并探索可能导向不同结果的“分支”。这种做法将最大化模型的利用率和能力,从而产生更有用的结果。

在本节课中,我们一起学习了思维树方法。这是一种在思维链方法基础上发展起来的创新技术,它通过将提示分层组织成类似树状的结构,来指导模型的推理和输出生成。当需要明确的指令或约束来获得期望的输出时,这种方法尤其有价值。它使模型能够像决策树一样分叉,同时探索各种可能性和想法。

051:文本到图像提示技术 🎨

在本节课中,我们将学习文本到图像的提示技术。观看本视频后,你将能够解释用于提升图像质量和影响力的常见图像提示技术,并应用这些技术来编写更好的图像生成提示词。

图像是沟通的重要组成部分,广泛应用于市场营销、广告、教育、新闻等多个领域。然而,某些图像在传达情感方面比其他图像更为出色。图像提示词是你想要生成的图像的文本描述。它可以简单到一个单词或短语,也可以更详细地描述图像的构图、色彩和氛围。

为了增强通过生成式AI模型获得的图像的影响力,使其更具说服力和吸引力,你可以使用图像提示技术。这些技术旨在提升生成式AI模型所产生图像的质量、多样性和相关性。

有多种图像提示技术可用于改善图像效果。让我们逐一了解这些技术。

风格修饰词 🖌️

风格修饰词是用于影响生成式AI模型所产生图像的艺术风格或视觉属性的描述符。这些描述符可以帮助模型在遵循输入提示词结构和内容的同时,生成具有创新风格的图像。

你可以修改图像的各种视觉元素,如颜色、对比度、纹理、形状和大小,从而生成具有美学吸引力且视觉上令人愉悦的输出。你的提示词可以包含关于各种艺术风格、历史艺术时期、摄影技术、所用艺术材料类型,甚至是你希望模型模仿的知名品牌或艺术家特征的信息。所有这些信息都有助于生成模型理解输出图像所需的外观或风格。

以下是图像提示词中使用风格修饰词的一些例子。







在这些提示词中使用的风格修饰词已被高亮显示。

接下来,我们介绍下一个图像提示技术:质量增强词。

质量增强词 📈

与低质量图像相比,高质量的图像更具说服力和可靠性。低分辨率图像经常出现模糊和像素化问题,使观看者难以辨别其中的精细细节。另一方面,高分辨率图像保证了基本的可见性和可读性。使用高质量的图形设计可以提升图像的感知价值。

质量增强词是图像提示词中用于增强视觉吸引力、提高整体保真度和清晰度的术语。这些是特定的术语,可以指导生成式AI模型执行降噪、锐化、色彩校正和分辨率增强等步骤。

你可以在图像提示词中使用诸如 high resolutionhyper detailedsharpcomplementary colors 等术语作为质量增强词。它们可以增强图像的特定特征,从而产生更连贯的输出。

让我们看一些例子来理解如何在图像提示词中使用质量增强词。





在上述图像提示词中,诸如“突出纹理”、“4K分辨率”、“锐利”、“清晰细节”、“精细线条”、“互补色”、“模糊背景”和“突出”等术语就是使用的质量增强词。

第三个图像提示技术是重复。

重复技术 🔁

该技术利用迭代采样的力量来增强模型生成图像的多样性。重复涉及强调图像中的特定视觉元素,为模型创造一种熟悉感,使其能够专注于你想要突出的特定想法或概念。

这可以通过在图像提示词中重复相同的单词或相似的短语来实现。重复有助于强化通过图像传达的信息,并增加模型对特定概念的关注度。








模型并非仅根据一个提示生成一张图像,而是生成多张具有细微差别的图像,从而产生一组多样化的潜在输出。当生成模型面对抽象或模糊的提示词,且存在多种有效解释时,这种技术尤其有价值。

让我们看一些在图像提示词中使用重复单词的例子。

诸如“微小”、“密集”、“巨大”、“广阔”、“宁静”、“清澈”和“茂盛”等词语被重复多次,以聚焦于特定的想法。

第四个图像提示技术是加权术语。

加权术语 ⚖️

加权术语指的是使用具有强烈情感或心理影响的词语或短语。例如,“免费”、“限时优惠”和“保证”等词语常用于广告中,以引发紧迫感、安全感和信任感。同样,“奢华”、“高级”和“独家”等词语用于营造排他性和精致感。

生成式AI模型允许你为这类术语赋予正权重或负权重,以强调或弱化某种情感。在图像提示词中使用加权术语有助于创建令人难忘、有说服力的图像,并能引发观众的情感反应。

以下是一些在图像提示词中使用加权术语的例子。






如第一个例子所示,词语“温暖”被赋予了正10的权重,而“噼啪作响”的权重是正8。这意味着生成模型必须更多地关注“温暖”这个词,而对“噼啪作响”的关注稍少一些。

类似地,在第二个例子中,词语“闪烁”被赋予了正6的权重,“霓虹灯照亮”的权重是正8。因此,模型应该更多地关注“霓虹灯照亮”。

在最后一个例子中,词语“色彩”被赋予了负6的权重,而“异国情调”被赋予了正10的权重。这意味着模型必须强调“异国情调”这个词,并弱化“色彩”这个词。

第五个图像提示技术是修复畸形生成。

修复畸形生成 🛠️

该技术用于修改可能影响图像有效性的任何畸形或异常。图像中的畸形可能包括扭曲(特别是在人体部位如手或脚上)、像素化或其他会损害视觉吸引力和图像整体效果的图像质量问题。

通过使用良好的负面提示词,可以在一定程度上缓解这些问题。以下是一些在图像提示词中使用畸形生成修复技术的例子。




你可以看到,在所有这些例子中,都使用了良好的负面词语来缓解图像畸形的问题。

总结 📝

在本视频中,你了解到图像提示技术在提升生成式AI模型的图像生成能力方面起着至关重要的作用。

风格修饰词、质量增强词、重复技术、加权术语和修复畸形生成是五种可用于改善图像影响力的技术。通过结合这些技术,可以创建更令人难忘、更具吸引力和说服力的视觉效果,从而有效地传达预期信息。


052:欢迎来到无需编程的AI聊天机器人世界 🤖

在本节课中,我们将一起了解人工智能(AI)聊天机器人的基本概念、课程目标以及学习路径。我们将探讨AI的实际应用,特别是聊天机器人如何改变我们的日常生活,并概述如何在不编写代码的情况下构建它们。


大家好,我是Anton和Jano,我是IBM的一名软件开发者和AI布道者。

当我们谈论AI时,人们往往会联想到科幻场景。这些场景可能让你兴奋,也可能让你感到害怕。但有一点是确定的:我们距离所谓的“强人工智能”——即机器变得和人类一样智能——还有很长的路要走。不过,我们离能够服务于实际目的、并从根本上改变我们日常生活体验的人工智能并不遥远。

在本课程中,我们将聚焦于当今最流行的AI应用之一:聊天机器人,它是对话式AI的一个例子。聊天机器人正变得极其流行,以至于高德纳公司预测,到明年,将有四分之一的客户服务运营使用聊天机器人来协助客户。这为掌握构建安全聊天机器人技能的个人和公司提供了巨大的机会。这正是本课程的目标:教会你如何构建客户服务聊天机器人。


AI正变得越来越智能,也越来越容易获取。因此,我将能够教你如何创建聊天机器人,而无需编写任何一行代码。


课程结构概览

以下是本课程的主要模块内容:

  • 模块1:聊天机器人简介 - 我们将从介绍聊天机器人开始,讨论它们是什么,以及它们为何如此受欢迎。
  • 模块2与3:意图与实体 - 接下来,在模块2和3中,我们将介绍意图实体,这是任何聊天机器人的两个关键组成部分。
  • 模块4:对话设计 - 在模块4中,我们将处理对话本身,包括聊天机器人设计的考虑因素和最佳实践。
  • 模块5:部署聊天机器人 - 在模块5中,我们将把聊天机器人部署到一个实际为你生成的网站上。这意味着任何拥有你网站链接的人都可以试用你的聊天机器人。
  • 模块6与7:高级主题 - 最后,在模块6和7中,我们将探讨更高级的主题,这些主题能真正帮助你优化用户体验并创建更高级的聊天机器人。

实践课程与评估

请注意,这是一门实践性很强的课程。当我说我们将处理某个主题时,我是认真的。我会提供理解所需的理论背景,而你大部分时间将用于完成实验,这些实验旨在帮助你体验创建聊天机器人的实际过程。每个模块都有一系列计入最终成绩的优秀测验。

同样,课程结束时有一个考试,以确保你完全掌握了课程中呈现的概念。

我相信,一旦你完成本课程,你会发现使用Watson创建聊天机器人的过程既直观又有趣。我希望你喜欢这门课程,并希望它能帮助你开启AI领域的职业生涯。


在本节课中,我们一起了解了AI聊天机器人的现实意义、本课程无需编程的核心特点,以及从基础概念到高级部署的完整学习路径。我们明确了课程目标是帮助你掌握构建实用聊天机器人的技能。接下来,让我们正式开启构建之旅。

053:聊天机器人简介 🤖

在本节课中,我们将要学习聊天机器人的基本概念、它们为何重要,以及它们如何为各种规模的企业提供商业价值。我们还将了解构建一个实用聊天机器人的核心流程。

概述

聊天机器人是一种能够通过聊天界面与用户对话的软件代理。它们正成为解决客户服务可扩展性问题的关键工具。本节将介绍聊天机器人的定义、工作原理以及当前流行的原因。

什么是聊天机器人?

上一节我们介绍了课程目标,本节中我们来看看聊天机器人的具体定义。

聊天机器人是一种能够通过某种聊天界面与用户进行对话的软件代理。典型的交互流程如下:

  1. 机器人问候用户并邀请其采取行动(例如提问)。
  2. 用户回复后,机器人解析输入内容,理解用户意图。
  3. 最后,机器人以合乎逻辑的方式回应,或提供信息,或在最终回答问题前询问更多细节。

优秀的聊天机器人能在其设计范围内,以自然的方式进行这种来回对话,让用户感到被理解并获得帮助,同时无需伪装成人类。

最常见的聊天机器人是基于文本的,例如网站聊天弹窗或 Facebook Messenger、WhatsApp、Slack 等即时通讯应用中的机器人。此外,也存在通过语音交互的聊天机器人,例如苹果的 Siri 和亚马逊的 Alexa。

值得注意的是,“bot”一词有时可与“chatbot”互换使用,但“bot”含义更广,泛指能独立执行某些操作的软件程序(如自动交易机器人),而“聊天”元素才是聊天机器人的核心特征。

聊天机器人的价值

了解了聊天机器人的定义后,我们来看看它们为何能提供实际价值。

许多人在拨打公司客服热线时,都熟悉以下场景:“您的来电对我们非常重要,由于通话量异常之高,您的等待时间可能比平时更长。” 无论何时拨打,通话量似乎总是“异常之高”。经过漫长等待后,客服人员可能给出的建议是:“您试过关机再开机吗?” 无论这个简单建议是否能解决问题,漫长的等待过程本身已令人沮丧。

问题的核心在于,由人力驱动的客户服务难以扩展。业务增长意味着需要帮助的客户越来越多,从而需要雇佣和培训更多员工,成本高昂。聊天机器人并非要完全取代人类,但它们可以作为客服团队的第一道防线,高效处理大量简单的客户咨询。

以下是聊天机器人带来价值的几个实例:

  • 酒店业:一个能回答餐厅营业时间、退房时间、设置叫醒服务或连接 Wi-Fi 等常见问题的聊天机器人,可以显著减少前台接到的电话量,让员工有更多时间和精力处理更复杂的请求。
  • 在线教育:Cognitive Class 平台在拥有百万注册学员后,面临巨大的客服压力。他们创建了一个学生顾问聊天机器人,用于推荐课程和回答常见问题。这个简单的机器人将学生的支持请求数量减少了一半,并且能够提供 7x24 小时的服务。
  • 小型企业:Dollar Tea Club 的创始人 Alan 在引入聊天机器人之前,需要花费大量时间反复回答“是否运送到加拿大?”、“运费多少?”等简单问题。通过学习本课程,他构建的聊天机器人每周为他节省了大量时间,使他能更专注于业务增长。
  • 大型企业:新西兰航空的聊天机器人“Oscar”甚至在飞机上也能为用户提供有用的信息,例如解答关于蛋白粉的入境规定等问题,展示了其普遍实用性。

由此可见,聊天机器人无论对单人运营还是财富 500 强公司都普遍有用。它们能以低廉的成本扩展客户支持业务,并通过全天候即时响应常见咨询来提供更好的服务。

聊天机器人为何现在兴起?

我们已经看到了聊天机器人的实际应用,本节将探讨其近期兴起的两大关键原因。

聊天机器人并非新概念。第一个聊天机器人 Eliza 早在 20 世纪 60 年代末就已出现。然而,直到最近,两项关键发展才使其成为可行的商业工具和热门技能。

  1. 即时通讯应用的盛行:WhatsApp、微信、Facebook Messenger 和 Slack 等应用在全球拥有数十亿用户,其普及度甚至超过了社交媒体。这些平台为聊天机器人提供了天然的交互环境。当然,聊天机器人也出现在网站和移动应用中,其核心魅力在于对话式的交互界面,文本聊天深受用户喜爱。
  2. 人工智能(AI)的进步与普及:如果无法理解用户意图并做出相应回应,聊天机器人将毫无用处。近年来,机器学习、深度学习、自然语言处理(NLP)等人工智能技术发展迅速。例如,IBM Watson 曾在智力竞赛节目《危险边缘》中击败人类冠军,而最近的“Project Debater”则能就复杂话题与人类辩论。

这些成就背后的数学原理可能很复杂,但关键在于,AI 正变得不仅更智能,而且更易于获取。如今,像 IBM 这样的公司通过云服务提供了强大的 AI 能力。在本课程中,我们将使用 Watson Assistant 服务,它使我们能够开发具备自然语言处理(NLP)能力的聊天机器人,即一个能理解用户并在我们定义的范围内提供有用答案的聊天机器人。

你的第一个任务

在了解了背景知识后,是时候开始动手了。以下是你的第一个实践任务。

在下一节中,你将找到一个实验指导,要求你注册一个免费的 IBM Cloud 账户并创建一项 Watson Assistant 服务。请按照我提供的分步说明进行操作,这个过程不会花费太多时间或精力。

总结

本节课中我们一起学习了聊天机器人的基本概念。我们明确了聊天机器人是一种通过对话界面与用户交互的软件代理,探讨了它如何通过处理简单、重复的咨询来帮助企业高效扩展客户服务。我们还分析了聊天机器人近期兴起的两个主要原因:即时通讯平台的流行以及人工智能技术的成熟与普及。最后,我们为你设置了第一个实践任务,为后续的动手构建做好准备。

054:理解与使用意图 🎯

在本节课中,我们将学习聊天机器人的核心组件之一:意图。我们将探讨意图的概念、作用,以及如何在IBM Watson Assistant中创建和训练意图,使机器人能够理解用户的目标。


聊天机器人的工作原理 🤖

上一节我们介绍了聊天机器人的整体概念,本节中我们来看看其内部如何工作。

从概念上讲,聊天机器人的工作流程如下:用户输入一些文本,聊天机器人进行“思考”,然后向用户发出响应。这是一个非常宏观的描述,接下来让我们深入了解其背后的机制。

聊天机器人主要使用三个组件来确定如何解释用户输入并作出响应:

  1. 意图(本模块的主题)
  2. 实体(我们将在下一个模块中介绍)
  3. 对话(将在第4模块中介绍)

在Watson Assistant中创建聊天机器人时,首先要创建一个包含这三个组件的对话技能。其中,意图是最重要的组件,因为它试图确定用户想要什么。


什么是意图? 🎯

意图旨在捕捉用户的意图或目标。换句话说,它试图回答“用户在问什么?”这个问题。

例如,我们可以定义一个“问候”意图,并用一些问候语的例子来训练Watson。以下是训练示例:

  • hello
  • hey
  • hi
  • good morning
  • Kiora(来自新西兰朋友的问候)

为了充分训练Watson理解一个意图,最佳实践是为每个意图提供至少五个示例,当然,示例越多越好。一旦Watson在我们定义的意图上完成训练,它就会查看用户输入,并尝试判断是否有任何意图与用户的请求匹配。

例如,如果用户说“Aloha”,Watson会识别出这是一种问候,类似于我们训练过的示例。请注意,“Aloha”并不是我们提供的例子之一。这正是Watson人工智能能力的体现:我们提供一些示例,Watson就能够识别用户话语中的意图,即使用户的表达方式与我们提供的示例大不相同。


特定领域的意图示例 🌸

正如上一模块提到的,在本课程中,我们将为一个虚构的花店连锁品牌创建一个简单的聊天机器人。因此,让我们考虑一个特定领域的意图,而不是简单的闲聊意图。

用户可能想了解我们的营业时间,因此我们可以定义一个 #hours_info 意图(注意:意图名称不能包含空格,所以我们用下划线代替)。

以下是我们可以提供来训练Watson理解 #hours_info 意图的一些示例:

  • What time are you open until?
  • What are your hours of operation?
  • Are you open on Saturdays?

这些都是用户表达“询问营业时间”这一相同请求的现实方式。用现实的例子训练Watson非常重要,甚至应该保留你在输入示例时可能不小心打出的错别字。毕竟,如果你会犯这种错误,你的用户也可能犯。

现在,当用户问“When is your Toronto store open?”时,Watson将识别出我们的 #hours_info 意图。再次强调,这种特定的措辞并不是我们示例的一部分,但Watson足够智能,能够推断出用户想要什么,因为它已经理解了 #hours_info 所代表的含义。


创建与导入意图 📥

在Watson Assistant中,意图示例可以手动输入,也可以从CSV文件导入。这简化了协作流程。例如,你可以从客户关怀团队的同事那里接收示例,即使他们对构建聊天机器人一无所知,也能帮助你。

Watson Assistant还附带一个内容目录,提供了与银行、保险、电子商务等各种行业相关的意图集合。这并非一个现成的聊天机器人,但你可以将其作为起点进行构建。

值得注意的是,本课程我们将用英语构建聊天机器人,但Watson Assistant也支持多种其他语言。如果你想用意大利语或日语创建聊天机器人,只需用该语言创建一个对话技能,然后用同一语言的相关示例训练Watson即可。


总结与后续 🚀

以上就是关于意图的理论部分。在本节课中,我们一起学习了:

  • 意图是聊天机器人理解用户目标的核心组件。
  • 通过提供多样化的现实示例来训练意图,Watson能够智能地识别出未在示例中出现的用户表达。
  • 意图可以通过手动或导入CSV文件的方式创建,并可以利用行业内容目录作为起点。
  • Watson Assistant支持多语言意图训练。

在接下来的实践环节,你将通过实验指导,完成创建、导入和测试意图的全过程。

055:3_使用实体 🧠

在本节课中,我们将学习聊天机器人构建的第三个核心概念:实体。实体是对话技能的关键组成部分,用于从用户的话语中提取具体的、结构化的信息。

上一节我们介绍了意图,它帮助我们理解用户的目标。本节中我们来看看实体,它使我们能够捕获用户话语中的具体细节,从而使机器人的回应更加精准和个性化。

什么是实体?

实体允许我们从用户的话语中捕获特定的值。

您可能还记得上一模块中的这个例子。用户询问“你们的多伦多店什么时候开门?”和“你们的温哥华店什么时候开门?”。您会注意到,聊天机器人正确地检测到了意图(询问营业时间),但完全忽略了问题的具体细节。

换句话说,对于我们的聊天机器人来说,“你们的多伦多店什么时候开门”和“你们的温哥华店什么时候开门”是完全相同的。这是因为我们尚未定义一个实体来捕获那个特定的信息位,即商店的位置。

如何定义实体?

我们可以创建一个位置实体来解决这个问题。

请注意,我们使用 @ 符号而不是 # 符号来标识实体。然后,我们可以为实体定义多个值,例如 Toronto、Montreal、Vancouver 等,每个值对应我们拥有的一个商店位置。

您会注意到,我们还可以为给定的实体值定义同义词。这些可以是字典中的同义词,但更多时候是指用户可能以那种方式指代该实体值。

例如,假设我们的多伦多店位于 Warden Avenue。人们可能会询问我们多伦多店的营业时间,或者他们可能会表述为“你们 Warden Avenue 店的营业时间是几点?”。这两种表述都应该引导我们的聊天机器人检测到相同的实体值。同义词是可选的,但这是一个有用的功能,在适用时值得定义。

实体的语法细节

定义了位置实体后,我们现在可以同时检测意图和具体位置。有了这两条信息,我们就可以为用户提供恰当且具体的答案。

请注意,虽然实体值本身可以包含空格,但如果实体值中包含空格,我们需要一种特殊的语法来表示它。我们只需将其用括号 () 括起来,以便在后续定义对话规则时引用它。

实体的创建与管理

与意图类似,我们也可以从 CSV 文件导入实体。事实上,在本模块的实验中,您将以这种方式导入它们,并学习如何将它们导出到 CSV。

除了在 Watson Assistant 中手动输入和从 CSV 导入之外,还有第三种方法可以为聊天机器人添加实体。

实际上,有一些预定义的系统实体,如果您的聊天机器人需要,可以启用它们。正如您所见,有相当多的选项。

以下是几个关键的系统实体:

  • @sys-currency:允许我们检测用户输入中提及的货币。
  • @sys-date:检测日期提及。例如,用户可能用“下周一”来回答问题,@sys-date 将允许我们将该信息捕获为实际的特定日期。
  • @sys-person:允许我们检测常见姓名,这是收集人名以使聊天机器人更具个性化的一种简单方法,您将在课程后面看到。

系统实体非常方便,并且正在不断改进。在直接开始实现自己的实体之前,请务必检查您的对话技能中可用的系统实体。

实践与总结

好了,现在轮到您了。到现在为止,您应该熟悉流程了。在本模块的其余部分,您将找到一系列指导练习,教您如何使用实体。您还会发现一些分级测验。

在下一个模块中,我们将看到如何将我们定义的意图和实体很好地利用起来,为用户提供准确和具体的回应。

本节课中我们一起学习了实体的概念、创建方法(包括自定义实体和系统实体)以及其在构建精准对话机器人中的关键作用。实体使我们能够从用户输入中提取具体信息,是实现个性化交互的基础。

056:4_把它们结合在一起 🧩

在本节课中,我们将学习对话技能的第三个核心组件——对话本身。我们将了解如何基于用户的意图和通过实体捕获的具体信息,来构建一个能够给出恰当回复的对话系统。


对话组件的作用

上一节我们介绍了意图和实体,它们帮助聊天机器人理解和分类用户输入。然而,仅仅理解是不够的,我们必须能够根据正确的分类采取行动,向用户发出适当的回应。

对话组件使我们能够基于用户的意图及其请求的具体细节(通过我们定义的实体捕获)来向用户发出响应。

  • 当用户问候我们时,我们可能希望回复:“你好,有什么可以帮您?”
  • 对于更复杂的查询也是如此。我们必须能够利用意图和实体提供的精细分类,向用户提供恰当且准确的回复。例如,用户询问多伦多门店的营业时间,回复应反映这一点并包含用户寻找的信息。


对话的结构:节点树

一个对话本质上是一个由节点组成的树结构。每个节点通常处理一个特定的场景。

以下是三个基本节点的示例:

  1. Welcome(欢迎)节点:处理聊天机器人的初始提示,即用户首次进入时的问候语。
  2. Greetings(问候)节点:用于响应用户的问候。
  3. Fallback(默认回复)节点:当聊天机器人不太确定用户询问内容时,通知用户。

WelcomeAnything else(即Fallback节点)是首次创建聊天机器人对话时,系统为你创建的两个默认节点。你定义的所有其他节点都将位于这两个节点之间。


节点的构成

让我们快速了解一下一个节点的构成。每个节点通常包含几个关键部分。

1. 节点名称
你需要为每个节点命名。Watson本身不关心节点名称,但这对于我们聊天机器人设计者来说非常有用,可以更轻松地组织和管理节点。

2. 条件
条件决定了节点何时应被执行。例如,如果在用户输入中检测到 #greetings 意图,则该节点将被执行。
条件可以像这样简单,也可以是复杂的逻辑表达式。在大多数情况下,它将测试意图、实体或它们的组合。

条件示例:

#greetings

#store_info && @location:Toronto

3. 响应块
在这里,我们最终决定回复给用户什么内容。例如,一个简单的“你好,有什么可以帮您?”就足够了。
响应块有很多选项。事实上,响应甚至不必是文本,可以是图像或供用户选择的选项。我们可以提供多个响应变体,然后决定它们是按出现顺序每次执行,还是从我们提供的列表中随机选择。
我们甚至可以在同一个节点内设置多个响应,并为每个单独的响应附加条件。这是一个很棒的功能,在本课程的实验环节中我们肯定会利用它。

4. 后续动作
最后,我们可以指定发出响应后发生什么。通常,我们只是等待用户说些别的,这就是默认操作。然而,还有其他选项可用,包括跳转到对话中的其他节点。这个功能在更复杂的聊天机器人中很有用,但如果滥用,可能会导致聊天机器人难以理解。


节点的执行流程

对话的执行是从上到下评估的。当用户提交话语时,将评估第一个节点是否执行。

执行流程如下:

  1. 如果条件不满足,则向下移动到第二个节点。
  2. 如果第二个节点也不符合条件,则考虑第三个节点,依此类推。
  3. 本质上,只要这些节点的条件为假,我们就继续按它们出现的顺序评估节点。
  4. 我们在第一个条件与用户输入匹配的节点处停止。

这就是为什么在最底部拥有那个 Anything else 后备节点很重要。该节点有一个特殊的条件,当其上方的所有节点都未能执行时,它总是为真。它确保我们总有一个回复给用户,即使只是一个简单的“我不太明白,你能换个说法试试吗?”

同样,这也是为什么我们在最顶部有欢迎节点向用户打招呼。该节点有一个特殊的欢迎条件,仅在与用户对话开始时为真。通过将其放在顶部,我们确保它在任何其他节点被考虑之前执行。该条件仅一次为真,这确保了我们不会在每次评估用户输入时都不断问候用户。


子节点

节点也可以有子节点。在复杂的聊天机器人场景中,使用此功能可以让我们创建更细致的聊天机器人。

子节点只有在父节点执行后才会被考虑执行(除非对话中的其他节点明确跳转到给定的子节点)。然后,子节点也是从上到下执行,我们在第一个满足条件的子节点处停止执行。

Watson Assistant 引入了许多很酷的新功能,实际上让我们可以减少对子节点的依赖,从而大大简化了对话设计。到本课程结束时,你将熟悉子节点以及在许多场景中通常可以使用的更简单的替代方案。


总结

本节课中,我们一起学习了对话技能的第三个核心组件——对话管理。我们了解了对话如何由节点树构成,每个节点包含名称、条件、响应和后续动作。我们掌握了节点从上到下的执行流程,以及欢迎节点和后备节点的特殊作用。最后,我们简要了解了子节点的概念及其在现代对话设计中的替代方案。现在,你已经掌握了构建一个能够理解并回应用户的聊天机器人的基本框架。

057:构建用户友好的聊天机器人 🤖

在本节课中,我们将学习如何设计一个用户友好的聊天机器人。我们将探讨聊天机器人的语气、个性、初始问候语的设计原则,以及三条重要的设计规则,以确保机器人能提供清晰、准确且富有同理心的交互体验。


概述

上一节我们介绍了聊天机器人的基本组件。本节中,我们将重点探讨如何提升聊天机器人的用户体验,使其更友好、更有效。

设计聊天机器人的语气与个性

设计聊天机器人时,应考虑其语气和个性。

考虑聊天机器人的目标受众和使用目的,并据此调整其特性。

如果目标用户是年轻人,使用简单的笑话和表情符号可能是合适的。

如果聊天机器人是为殡仪馆设计的,则应避免使用笑话和俚语。这类似于培训人类客服代表。

需要确保聊天机器人根据情境(无论是正式还是非正式的语气)给出恰当的回答。

优化初始问候语

考虑默认的聊天机器人问候语:“你好,我能为你做什么?”。这是我们首次创建对话时的默认值,因此设计上必须通用,但这并不理想。这是我在聊天机器人中首先想要修改的内容。

让我们看看如何改进它。

在我们的案例中,可以将其改为:“你好,我叫弗洛伦斯,我是一个聊天机器人,在这里帮助你解答关于营业时间、门店位置和鲜花推荐的问题。” 这对用户来说是一个更友好的提示。

让我们看看原因。首先,我们通过给机器人起名赋予其个性。它不再是虚无缥缈的随机软件,而是弗洛伦斯。其次,我们坦诚地表明自己是聊天机器人。

这很重要,因为它为用户设定了正确的期望。

我们希望聊天机器人像人一样。

但我们不希望虚假地假装它是真人,因为这会导致用户失望。

最后,我们通过引导用户了解他们可以询问的内容来定义聊天机器人的范围。

聊天机器人最糟糕的回应是开放式的“我能为你做什么?”。

在对话后期,在你已经声明了聊天机器人范围之后,这样的回复是可以接受的。

但一开始就说“你好,我能为你做什么?”是在邀请用户询问任何问题,这不可避免地会导致失望。

无论我们如何完善聊天机器人,都无法让它能够回答收到的每一个问题。

即使我们培训人类客服代表,也无法做出这样的承诺。

对于聊天机器人来说更是如此。

聊天机器人设计的三条重要规则

除了到目前为止讨论的注意事项,我还想为你留下三条重要的聊天机器人设计规则。

第一条规则是,应避免在回答中包含“是”和“否”。

如果包含它们,很容易给用户错误的答案,或者显得不如我们希望的那样人性化。

例如,考虑这个问题。我们可能有一个“免费送货”的意图,当问题这样表述时,我们可能会想用“是的,它是”来回答,这个回复是有效的。

然而,如果用户以不同的方式表述问题。

相同的意图将被检测到。

并且会给出回复。但这一次,“是的,它是”对于“我需要为送货付费吗?”这个问题来说是一个非常糟糕的答案。

一个更好的答案是避免直接回答“是”或“否”。例如,通过回应“送货是免费的”,我们正确地回应了表达对送货价格信息请求的问题,无论它如何表述。

与第一条规则相关,只要可能,尝试在回应中融入用户问题的一部分。

用户会感觉更被理解,聊天机器人也因此会被认为更智能。

例如,用户可能会问我们在某个城市是否有门店。

“我们在多伦多、蒙特利尔、卡尔加里和温哥华有门店”是一个可以接受的回答,因为它回答了问题。

然而,我们可以通过在回应中融入一些同理心和用户提供的信息来改进它。

如果我们回复:“很遗憾,我们在西雅图没有门店 😔。目前我们在多伦多、蒙特利尔、卡尔加里和温哥华有门店。”

我们仍然传达了相同的信息,但这次我们显得对用户更有同理心,而我们所做的只是在回应中融入了部分用户输入。

除了确保我们提供给用户的答案是正确的,我们还应该考虑其长度。

没有人喜欢阅读大段的文字。

相反,人们更喜欢阅读最多一两个短段落的答案。

如果你需要在回复中传达大量信息,最好链接到你网站上的一个页面,用户可以在那里了解更多关于该主题的信息。

想象一个金融聊天机器人试图在聊天中直接向用户回复信用卡申请的整个条款和条件。

这将是可笑的。链接到正确的页面会更合适。

由于我们可以在回复中嵌入 HTML,我们可以使这些链接可点击,为最终用户提供更多便利。

总结

本节课中,我们一起学习了构建用户友好聊天机器人的关键原则。我们探讨了如何设定机器人的语气与个性,如何设计一个清晰、有范围且坦诚的初始问候语,并掌握了三条核心设计规则:避免使用“是/否”直接回答在回应中融入用户问题以及保持回答简洁并善用链接

现在轮到你了。通过本模块的学习,你应该能更好地理解意图、实体和对话如何协同工作,使聊天机器人能够为最终用户提供有用的答案。

在下一个模块中,我们将讨论部署。最后,在最后两个模块中,我们将研究更高级的功能,使我们能够创建更智能、更有用的聊天机器人。

058:部署WordPress站点 🚀

在本节课中,我们将学习如何将已创建的聊天机器人部署到一个公开可访问的平台上,特别是WordPress网站。我们将了解“助手”的概念,并学习如何通过一个便捷的插件,无需编写代码即可将机器人集成到网站中。


在之前的模块中,我们创建了一个基础但功能完整的对话技能。目前的问题是,这个聊天机器人只能在你登录后的“试用”面板中使用。如果你希望与朋友或最终用户分享,目前还无法实现,除非你提供登录信息,但这绝不是一个好做法。我们需要做的是将聊天机器人部署到一个公开可访问的地方。

上一节我们介绍了对话技能的开发,本节中我们来看看如何将其包装并发布。

当你在开发对话技能时,可能已经注意到,在“技能”标签旁边还有一个“助手”标签。一个助手就是一个聊天机器人,它可以包含一个或多个技能。我们已经开发了一个对话技能,使聊天机器人能够理解并回复用户。现在,我们需要创建实际的助手,并将我们的对话技能链接到它。这样做将使我们的聊天机器人能够通过各种渠道部署,包括WordPress网站、Facebook Messenger、Intercom、Slack以及你自己的应用程序等。

以下是创建和部署助手的关键步骤:

  1. 创建助手:在Watson Assistant界面中,创建一个新的助手。
  2. 关联技能:将之前开发的对话技能添加到这个助手中。
  3. 获取凭证:助手创建后,你需要获取其唯一的身份凭证(如assistant_idapi_key)。
  4. 配置部署渠道:选择你希望机器人出现的渠道,例如“预览链接”或“WordPress”。

对于更高级的部署(如集成到你自己的Web或移动应用程序),需要一些编程技能。但幸运的是,在本课程中,我们将无需编写任何代码即可完成部署。如果你是程序员,Watson Assistant的API文档完善,并提供了JavaScript和Python的示例代码。

// 示例:使用Watson Assistant API发送消息
const assistant = new WatsonAssistantV2({
  version: '2021-06-14',
  authenticator: new IamAuthenticator({ apikey: '<your_api_key>' }),
  serviceUrl: '<your_service_url>'
});


创建助手时,系统会提供启用“预览链接”的选项。启用它是一个好主意,因为它会生成一个页面,任何拥有该链接的人都可以试用你的聊天机器人。这是让同事、朋友甚至客户在网页上测试机器人的绝佳方式。这个小部件的工作原理是:将用户输入发送到你创建的Watson Assistant服务,获取对话技能的回复,并将其呈现给用户。

上一节我们了解了助手的概念,本节中我们来看看如何利用预览链接进行快速分享。


如果你的网站由开源版WordPress驱动,那么借助我们开发的一个插件,你可以极大地简化聊天机器人的部署过程。你只需一键安装插件,从助手中复制凭证,你的聊天机器人就会神奇地出现在你的网站上。WordPress极其流行,约占全球网站的三分之一。能够在WordPress上部署聊天机器人,极大地简化了向广大公众提供聊天机器人的过程。

以下是该插件的主要优势:

  • 一键安装:简化部署流程。
  • 高度可定制:允许你自定义聊天机器人窗口的外观和感觉。
  • 功能强大:包含许多强大功能,例如对对话评分、限制聊天机器人可进行的对话数量(以免超出每月的免费额度)。
  • 防止滥用:可以防止滥用用户通过垃圾信息耗尽你的配额。
  • 人工接管:能够将请求升级给真人处理。
  • 对话记录:记录对话内容等。

安装插件后,花些时间研究其功能是值得的。


在本模块的实验环节,你将生成一个测试用的WordPress站点,因此你不需要拥有自己的WordPress网站。另外请注意,WordPress.com是位于WordPress.org的开源WordPress软件的商业版本。因此,他们实际上会收取相当高的费用才允许用户安装插件,所以我不建议你创建WordPress.com账户并尝试在那里安装我们的Watson Assistant插件。相反,至少在你学习期间,应该使用实验中提供给你的站点。

一旦生成了WordPress测试站点,你的任务将是激活并配置插件,使其能够与你将创建的助手进行通信。这个助手将反过来链接到你目前一直在开发的对话技能。

当聊天机器人部署到你的WordPress测试站点后,你将能够直接在Watson Assistant中对聊天机器人进行更改,这些更改和改进将自动反映在部署在你站点上的聊天机器人中。


本节课中我们一起学习了如何将Watson Assistant聊天机器人部署到公开平台。我们首先理解了“助手”作为机器人容器的角色,然后探索了通过“预览链接”快速分享机器人的方法。最后,我们重点介绍了如何利用专用插件,将机器人无缝集成到WordPress网站中,从而实现无需编码的便捷部署。这使得你的AI机器人能够真正服务于更广泛的用户群体。

059:使用上下文变量与插槽 🧠

在本节课中,我们将学习如何通过上下文变量插槽来提升聊天机器人的智能水平,使其能够记住对话中的关键信息,从而提供更连贯、更个性化的回复。


概述

上一节我们介绍了聊天机器人的基础构建与部署。本节中,我们将探讨两个高级功能:上下文变量插槽。它们能让你的机器人记住用户提供的信息,并在后续对话中灵活运用,从而显著提升用户体验。


理解问题:缺乏记忆的对话

考虑以下交互场景:

用户:多伦多分店的营业时间是?
聊天机器人:多伦多分店的营业时间是早9点到晚9点。
用户:它的地址是什么?
聊天机器人:这是我们所有分店的地址列表:[通用列表]。

人类客服会从上下文中理解,用户询问的是刚才提到的“多伦多”分店的地址。然而,我们当前的聊天机器人却做不到这一点。

原因在于,实体(如“多伦多”)仅在当前用户输入时被捕获,一旦用户提出新问题,这些信息就被“遗忘”了。因此,当用户询问地址时,机器人无法回忆起之前提到的“多伦多”。

唯一的解决方式是用户再次明确提及地点,例如:“多伦多分店的地址是什么?”。但我们无法控制用户的表达方式,在对话上下文明确时,要求用户重复信息并不现实。


解决方案:上下文变量

上下文变量正是为了解决这个问题而设计的。它允许我们在对话的任何节点,存储从用户那里收集到的值,并在整个对话期间随时调用。与实体不同,上下文变量在用户会话期间持续有效。

例如,我们可以在处理“营业时间”的节点中,将捕获的@location实体值存储到一个名为$city的上下文变量中。

{
  "context": {
    "city": "@location"
  }
}

随后,当对话进入“查询地址”的节点时,我们可以检查$city变量是否已被赋值。如果已设置,就能用它来提供特定地址,而不是通用列表。


实现工具:插槽

设置上下文变量有多种方法,其中最便捷的方式之一是使用插槽

插槽可以添加到对话节点中,用于检查和存储特定的实体信息。例如,我们可以在“营业时间”节点添加一个可选插槽来检查@location实体。

  • 如果用户输入中包含地点:该值将被自动存储到$city上下文变量中。
  • 如果用户输入中未指定地点:由于插槽是可选的,对话会继续,不会强制用户提供。

我们也可以将插槽设置为必填。只需在插槽设置中添加一个提示问题(例如:“请问您想查询哪个城市?”)。当用户未提供地点时,机器人会主动询问,直到获得有效回答为止。

插槽的核心价值在于可以收集多个信息。以下是使用多个插槽的典型场景:

假设有一个餐厅预订机器人。在一个预订节点内,可以设置多个插槽来依次询问并存储信息:

  1. 第一个插槽:询问并存储$guest_count(用餐人数)。
  2. 第二个插槽:询问并存储$reservation_date(预订日期)。
  3. 第三个插槽:询问并存储$reservation_time(预订时间)。
  4. 第四个插槽:询问并存储$customer_name(预订姓名)。

所有信息收集并存入上下文后,餐厅就能获得预订所需的全部数据。这些数据可以用于人工查看日志,或通过编程方式(例如调用API)自动录入到餐厅的订座系统中。


总结

本节课我们一起学习了上下文变量插槽这两个核心概念。

  • 上下文变量(如$city)为聊天机器人提供了“记忆”能力,使其能在整个对话中记住关键信息。
  • 插槽是实现信息收集和存储到上下文的高效工具,尤其擅长通过多轮问答获取多个必要信息。

掌握这些概念是构建智能、流畅对话机器人的关键。理论理解是基础,但真正的掌握离不开实践。接下来的实验环节将引导你运用这些技术来改进自己的聊天机器人。

060:了解话题转移(Digressions)💬

在本节课中,我们将要学习如何让聊天机器人更智能地处理用户的“跑题”问题。我们将探讨如何配置槽位(Slot)的“已找到”和“未找到”响应,并引入“话题转移”这一强大功能,使对话流程更加自然和人性化。


当前面临的交互问题

上一节我们介绍了上下文变量和槽位的作用。然而,我们仍然面临一个尚未解决的问题。

考虑以下交互场景:用户向聊天机器人询问鲜花推荐。

槽位会询问用户是为何种场合需要鲜花。

用户没有回答场合,而是决定询问营业时间。

此时,槽位会继续纠缠用户,反复询问场合,并忽略用户提出的其他问题,即使聊天机器人技术上知道如何回答这些问题。

问题的核心在于:必需的槽位在收到可接受的答案并存入上下文变量之前,不会停止提问。


初步优化:配置槽位的“未找到”响应

为了使交互不那么令人反感,我们有一个选择:配置槽位的“未找到”部分。

“已找到”和“未找到”部分允许我们分别指定,当最终用户回复可接受的答案和未回复可接受的答案时,槽位将向用户说什么。

通常,您会使用“已找到”部分来感谢用户回答问题,或者像默认设置一样留空。
然而,更有趣的是,我们可以使用“未找到”部分让再次提问显得不那么尴尬。
换句话说,我们可以通过为不得不再次提问而道歉,来缓和忽略用户第二个问题所带来的生硬感。

以下是配置槽位“未找到”部分如何使交互更顺畅的一个实际例子。

您会注意到,当用户在槽位询问具体场合时提出了一个不相关的问题,我们不会逐字重复问题。
在这种情况下,我们会说:“抱歉再次询问,但您想要为哪种场合推荐鲜花呢?”

这样显得更有同理心,不那么机械,尽管技术上我们仍在问同一个问题。

这是一个改进,但如果能够先回答用户提出的附带问题,然后再回到原来的问题,岂不是更好?


引入话题转移(Digressions)

这正是人类客服在大多数情况下会做的事情。

事实证明,这可以通过话题转移来实现。
我们可以允许一个槽位在提出强制性问题后,跳转到另一个节点。
我们还可以指定其他节点在回答用户的附带问题后,能够返回到发起转移的原始槽位。

让我们看一个实际例子,了解这是如何工作的。

当用户忽略我们对具体场合的请求,转而询问我们的聊天机器人营业时间时,话题转移允许我们跳转到处理营业时间的节点。
由于该节点也有一个槽位,该槽位会询问其自己的问题:“您想查询哪个城市的营业时间?”

一旦用户回复“多伦多”,该节点将向用户提供信息,并返回到原始节点,在那里槽位将再次询问场合。
这是一个运行良好的工作流程,使我们的聊天机器人显得更聪明、更友好。

在某些情况下,您可能不希望返回,而是希望从跳转到的节点继续对话。
通过话题转移,您将有机会指定所需的行为,包括:

  • 哪些槽位可以转移到其他节点。
  • 哪些节点可以接受转移。
  • 是否需要返回。

这是一个强大且真正有用的功能。


配置位置与高级特性说明

那么,我们究竟在哪里指定槽位的“已找到”和“未找到”文本?又在哪里配置话题转移呢?

正如您可能猜到的,具体的细节在本模块的实验部分。您将有机会使用这些新功能,使我们简单的聊天机器人更有用、更用户友好。

请记住,这些功能有些高级。我认识很多人,他们在不理解或不依赖这些功能的情况下也构建了出色的聊天机器人。
尽管如此,对本章和前一章中介绍的高级概念有一个初步的了解,一旦您开始为自己、公司或付费客户构建自己的聊天机器人时,将会带来真正的回报。


总结

本节课中我们一起学习了如何提升聊天机器人的对话流畅度。我们首先分析了强制槽位在交互中可能造成的僵化问题,然后通过配置“未找到”响应进行了初步优化。最后,我们引入了话题转移这一核心功能,它允许聊天机器人智能地处理用户的附带问题,并在回答后优雅地返回原对话流程,从而创造出更自然、更人性化的交互体验。

061:IBM应用人工智能(从0开始搭建AI机器人)|课程总结 🎯

在本节课中,我们将对本课程的核心内容进行回顾与总结,并为你提供后续学习的建议与资源。


恭喜你完成本课程的学习。希望你享受了学习过程。最重要的是,希望你对自己创建聊天机器人的能力更有信心。

现在,你应该对聊天机器人以及如何利用 Watson Assistant 来创建、测试、部署和改进聊天机器人(无需编写任何代码)更加熟悉了。


后续学习步骤 🚀

上一节我们回顾了课程的核心收获,本节中我们来看看你接下来可以采取哪些行动。

你可能会思考接下来该做什么,以下是一些可能的后续步骤:

  • 完成课程评估:如果你尚未完成课程测验和考试,请务必完成。
  • 继续学习路径:如果你将此课程作为某个学习路径或专业认证的一部分,可以考虑学习其他基于 Watson 的课程,以深化你在本课程中掌握的基础知识。

深入学习资源 📚

除了完成课程,主动探索官方文档和社区资源是提升技能的关键。

以下是推荐的深入学习资源:

  • 查阅官方文档:我建议你查看并阅读 Watson Assistant 的官方文档。它包含了丰富的知识,能让你了解本课程未涵盖的一些细节。这对于学习了本课程的程序员尤其重要,因为文档涵盖了一些需要编程经验或愿意尝试编程才能使用的高级功能。
  • 探索代码示例:如果你是程序员,可以访问 IBM Code Patterns 网站。在那里,你可以找到与聊天机器人和人工智能等相关的示例代码。许多模式都利用 Watson Assistant 以及其他 Watson 服务来创建智能且实用的聊天机器人。


扩展应用:语音代理 ☎️

理论学习之后,将知识应用于实际场景能带来更大的价值。其中一个强大的应用是语音交互。

有一种服务实际上对所有人都可用,即使你没有编程技能。我指的是 IBM Voice Agent with Watson。这是一个即插即用的服务,可以连接到你的 Watson Assistant 聊天机器人,使其能够通过电话提供服务——同一个聊天机器人,只是通过音频而非文本进行交互。你的企业或客户可能会对此非常感兴趣,值得在 IBM Cloud 目录中查看。


实践出真知 💡

在我作为在线学习爱好者的经验中,像这样的课程非常适合概述可能实现的目标以及如何完成特定任务。可以说,我已经为你描绘了蓝图。但除非你花时间亲自创建一些东西,否则你无法真正掌握这些概念。人类倾向于通过实践来学习。

因此,请根据需要反复观看这些视频,适时参考 Watson Assistant 文档,查看代码模式示例。但请尝试构思你自己的聊天机器人项目,以磨练和提升你作为聊天机器人构建者的技能。


交流与分享 🤝

在创建自己的聊天机器人过程中,如果你有任何问题,欢迎在本课程的讨论论坛中提出。

最后,我邀请你保持联系。你可以在 Twitter 上关注并与我互动,我的用户名是 @ACAnGiano。此外,如果你在学完课程后构建了一些很酷的东西,也欢迎在那里与我分享。如果你不使用 Twitter 或希望有更私密的交流环境,也可以通过电子邮件 canggiiano.ca.ibm.com 联系我,向我展示你的成果。我们非常乐意展示那些善用我们人工智能技术的人,所以这可能是让你的项目或公司在 IBM 网站上获得展示的机会。

我期待看到你的作品。祝你一切顺利,好运!


课程总结 📝

本节课中我们一起学习了如何回顾课程核心知识,并规划了后续的学习路径。我们强调了查阅 Watson Assistant 官方文档、探索 IBM Code Patterns 以及尝试 IBM Voice Agent 等实践的重要性。最重要的是,我们认识到实践是掌握技能的关键,鼓励你动手构建自己的聊天机器人项目,并在社区中交流与分享。

062:欢迎使用Watson Assistant 🤖

在本节课中,我们将学习如何开始使用IBM Watson Assistant。我们将了解其核心概念,并动手创建你的第一个虚拟助手“动作”,最后学习如何与团队分享并进行测试。


概述

Watson Assistant 允许任何人在无需编写代码的情况下,构建、发布并改进一个虚拟助手。本节视频结束后,你将掌握如何创建助手的第一个“动作”,并使用一组基础功能以及一些实用技巧与你的团队分享它。


创建你的第一个“动作” 🛠️

我们将通过创建你的第一个“动作”来开启学习之旅。

简单来说,一个动作就是你的客户希望助手为其解决的问题或任务。当用户与你的助手互动时,助手会根据他们提出的问题或陈述,将他们引导至相应的动作。

这与人类之间的对话类似。


理解“步骤”与对话流程

一旦一个动作开始,对话就会被组织成一个个步骤。在设计动作时,你需要按照对话顺序从上到下排列这些步骤。

你可以通过拖放每个步骤来重新调整它们的顺序。步骤是每次互动的基础构建块。一个设计良好的对话会流畅地进行,直到满足客户需求或将对话转交给人工客服。这是因为Watson Assistant能够理解客户请求的意图,而不拘泥于具体的措辞。

在整个助手与客户的互动过程中,助手会根据用户的输入收集信息,并主动读取和记住用户告诉它的内容。


训练助手理解用户意图

作为构建第一个动作的一部分,你需要添加多个用户可能用来触发该动作的示例短语。

通过添加同一请求的不同表达版本,你可以训练助手理解人类如何使用不同的短语来表达相同的需求。你为助手训练的示例短语越多,助手就越容易解读用户的请求,并将其引导至正确的动作。

以下是添加示例短语的步骤:

  1. 在动作编辑器中,找到“客户可能输入的内容”区域。
  2. 输入一个示例用户短语,例如“我想开一个新账户”。
  3. 点击“添加示例”或按回车键,继续添加同义短语,如“如何开户?”、“申请账户”。

丰富对话:使用响应类型

除了按正确顺序排列步骤以引导用户完成动作外,你还可以通过添加响应类型来丰富对话。

响应类型包括文本、按钮、时间、货币等。当用户选择一个选项时,该数据会被存储起来,以便在后续对话中使用。

根据客户的响应,你的助手会选择对话的进行方向。它可以将用户进一步引导至对话的结束步骤,将用户路由到另一个不同的动作,或者将对话转交给人工客服。


预览与测试你的助手

在构建第一个动作时,你可以在“预览”面板中与助手对话,以预览其引导用户的能力。

预览面板允许你持续测试助手的表现。这为你提供了一个实时快照,展示了它与用户互动时的表现。

在你预览了第一个动作以及助手引导用户完成对话的能力之后,就可以与你的团队分享你的助手了。


分享与迭代改进

分享你的助手是获取内容反馈并提高其引导用户成功完成动作能力的最佳方式。

在你测试并与助手互动的过程中,可以根据每个动作的完成成功率来编辑你的步骤。

一旦你完成了第一个动作,你的入门之旅将在Watson Assistant仪表板中继续。


探索Watson Assistant仪表板 📊

仪表板包含一个任务跟踪器,概述了构建过程。该跟踪器是一个理想的导航图,指导你从在测试渠道上初始部署助手,到最终在实时渠道上发布。

这只是我们提供的众多资源之一,旨在帮助并赋能你构建第一个助手。

一个菜单提供了对你所有已保存动作的快速访问。从那里,你可以打开动作编辑器,修改现有动作或添加新动作。

仪表板还提供了快速链接,指向草稿环境、发布页面、实时环境、分析数据和集成选项。


集成与定制

一些集成功能是开箱即用的。点击“网络聊天”选项卡,开始定制你的助手,以反映你组织的语调、风格和设计元素,然后你就可以开始使用了。


总结

在本节课中,我们一起学习了构建和分享你的第一个助手所需的基本概念和工具。但这只是冰山一角。在本系列课程中,我们将更深入地探讨各项功能,使你能够扩展助手的能力,并使其成为客户成功的关键力量。

063:创建Watson操作 🛠️

在本节课中,我们将学习如何在IBM Watson Assistant中创建“操作”。我们将了解操作和步骤的基本概念,并通过一个账单支付的实例,一步步构建一个完整的对话流程。课程结束时,你将能够解释操作的结构、构建并测试你的第一个操作。


什么是操作与步骤? 🤔

上一节我们介绍了课程目标,本节中我们来看看操作和步骤的核心定义。

一个操作是你的客户希望解决的某个问题或任务。例如,支付账单、获取发票或询问天气,都可以成为你助手中的一个操作。

一个步骤仅仅是你的助手与客户之间的一次来回交互。简单来说,步骤代表了操作中的澄清问题、最终答案或转接人工客服的节点。

步骤运行所需的其他信息,例如流程逻辑、响应选项或用户响应的存储,都包含在操作自身的结构中。你无需像在对话技能中那样,创建单独的实体和意图。


创建你的第一个助手 🚀

当你首次启动新体验时,系统会提示你创建第一个助手。你需要输入一个代表你希望它处理主题领域的助手名称。

例如,如果你正在构建一个处理账单部门支持问题的助手,可以将其命名为“账单助手”。


构建对话流程:账单支付示例 💳

现在,让我们使用一个账单支付的例子来构建一个对话流程。

对于互联网或电话账单,客户将被引导至在线账单门户。而对于有线电视账单,我们虚构公司的政策规定将由人工客服接收付款。在这种情况下,助手需要获取客户的账号,以加快与人工客服的交易速度。

以下是构建此流程的步骤:

  1. 创建第一个操作
    首先创建你的第一个操作。记住,操作代表你的助手可以处理的主题,例如“支付账单”。你需要通过提供一些示例句子来训练助手的主题识别人工智能。可以从第一个示例开始,例如:“我想支付我的有线电视账单,谢谢。”

  1. 创建第一个步骤
    现在是时候在账单支付交互中创建第一个步骤了。我们将从围绕客户账户类型的澄清问题开始。
    • 第一步已为你创建,移动到该步骤,在“助手说”文本框中添加澄清问题,例如:“我们这里说的是哪种类型的账户?”
    • 然后,选择助手应等待的客户响应类型。在这种情况下,“选项”是最佳选择。添加“有线电视”、“互联网”和“电话”三个选项,并应用你的更改。

  1. 添加第二个步骤
    接下来,添加询问账号的澄清问题。例如,输入“你的账号是多少?”。然后,你需要从“响应”下拉列表中定义客户响应,选择“数字”。

  1. 为步骤添加流程逻辑
    根据逻辑流程,账号应仅在有线电视账单的情况下被收集。为了处理这个场景,你需要为你的步骤添加一个条件。为此,将步骤更改为“有条件执行”而非“无条件执行”。
    • 条件是步骤被触发必须满足的要求。在这种情况下,你希望将条件设置为第一步的响应等于“有线电视”,而不是“互联网”或“电话”。确保条件设置为 step1 等于 cable

  1. 添加第三步和第四步
    干得不错!你几乎已经完成了这个操作的构建。现在只需要添加第三步和第四步,它们各自为用户提供一个结果。
    • 第三步:在第二步下方添加一些文本,内容关于将用户转接给客服以支付账单。你可以添加:“让我为你转接一位可以帮你支付有线电视账单的客服。”
    • 最后,在客服转接步骤中,你不需要从用户那里收集任何信息,因此可以将“定义客户响应”部分留空。但是,你应该设置助手将此对话路由给人工客服。为此,在“然后”设置下选择“连接到客服”,这也会在转接时结束该操作。
    • 第四步:你需要将用户引导至在线门户支付账单。
      • 在“助手说”下添加类似这样的内容:“要支付你的 {bill_type} 账单,你可以前往我们的在线门户。” 并附上门户链接。要插入一个变量,如正在支付的账单类型,请点击文本框顶部的变量插入按钮。
      • 现在,确保此步骤仅针对互联网或电话账单触发。为此,创建一个条件 step1 等于 internet,然后添加另一个条件 step1 等于 phone。添加条件后,在下拉菜单中选择“任一”。这样,任何一个条件为真即可,而不是所有条件都必须为真。
      • 要结束此操作,点击“然后”设置,更改为“结束操作”。


测试与预览你的操作 ✅

在最后,你应该测试操作以确保其按预期工作。你的步骤现在应该如屏幕上所示那样完整。

尝试几种你直接说明账单类型的场景。注意助手是如何跳过那个问题并立即进入下一步的。

要查看你的助手在某个渠道上的工作效果,请打开预览页面。此页面是你正在进行中的草稿工作的一个展示。它有一个内联预览供你测试。你还可以通过一个可共享的URL与团队中的其他人快速分享你的工作。只需点击按钮将URL复制到剪贴板,然后将其粘贴到任何消息服务中,即可与团队成员分享你的草稿。默认情况下,为你包含了可嵌入的网页聊天集成。你也可以前往集成目录,为你的助手添加任何其他渠道,例如电话集成。


总结 📝

本节课中我们一起学习了:

  • 一个操作是你的客户希望解决的某个问题或任务。
  • 一个步骤仅仅是你的助手与客户之间的一次来回交互。
  • 步骤运行所需的其他信息,例如流程逻辑、响应选项或用户响应的存储,都包含在操作自身的结构中。
  • 你需要通过提供一些示例句子来训练助手的主题识别人工智能。

064:将对话技能迁移到Watson操作 🚀

在本节课中,我们将学习如何将经典的Watson Assistant对话技能迁移到新版Watson Assistant中,并了解如何将对话技能转换为操作技能。课程分为两部分:第一部分介绍如何从经典版切换到新版;第二部分详细讲解如何迁移对话技能。

从经典版迁移到新版Watson Assistant

首先,让我们学习如何从经典版Watson Assistant迁移到新版。

要从经典版Watson Assistant迁移到新版,请点击右上角的用户图标。你可以在经典体验和新体验之间进行切换。

在新版中激活并使用对话功能

要使用现有的对话技能,你需要在你的助手(Assistant)中激活对话功能,然后才能上传你现有的技能。

要在新体验中激活对话功能,请创建或打开一个你希望使用对话作为与用户主要交互方式的助手,然后点击“助手设置”。

接下来,点击“激活对话”,系统会显示确认对话框,再次点击“激活对话”。一旦你激活了对话功能,它将优先于操作(Actions)功能。

你可以使用操作来补充基于对话的会话,然而,对话将主导与用户的交流以满足他们的请求。

迁移现有对话技能

对话功能激活后,你可以开始一个新的对话会话,或将现有的对话迁移到新版Watson Assistant中。

要迁移现有的对话技能,请使用经典体验将你的对话技能以JSON格式下载。在新版Watson Assistant中,打开对话页面,在选项中选择“上传/下载”,在“上传”标签页中,上传你的对话技能的JSON文件。

现在,在新版Watson Assistant中,你可以在主要对话会话中使用操作。对话功能优先于操作。一个对话节点可以调用一个操作来执行任务,然后返回到对话。

从对话节点调用操作

从一个对话节点,你可以调用一个操作来执行一个独立且自包含的任务,然后返回到对话以准备处理任何新的用户请求。在操作处理期间从用户收集的数据必须存储为会话变量,以便传递给对话。

或者,如果你想发送请求到Web服务以完成任务并返回一个可供此对话后续使用的响应,则可以调用Web钩子。

以下是可能需要从对话中调用操作的几种场景。

以下是几种调用操作的场景:

  • 从多个对话分支调用同一操作:例如,你想询问客户对服务的满意度。你可以定义一个检查客户满意度的单一操作,并从多个分支结束的对话节点中调用它。在此场景中,你不需要定义意图(如#check_satisfaction),操作会被自动调用,替代跳转到另一个对话节点的响应。
  • 测试操作功能:在此场景中,你可以为操作选择一个意图来处理。如果你计划仅从对话中调用该操作,你可以将时间花在定义触发该对话节点的意图的用户示例上。当你定义操作时,可以只添加一个客户示例,从而减少构建操作所需的时间。

如何从对话节点调用操作

要从对话节点调用操作,请点击该对话节点的“自定义”选项。将“调用Web钩子/操作”设置为“开启”。现在,选择“调用操作”。当你添加对操作的调用时,系统会自动为该对话节点启用多个条件响应。点击“应用”,然后在对话节点中选择你想要调用的操作。

在“然后调用我的操作”部分,选择其中一个操作标题。请注意,你需要先有一个操作,才能选择调用它。

点击“添加参数”以添加随调用一起发送的关键参数。

构建或迁移对话技能为操作

接下来,让我们看看如何将对话技能构建或迁移为操作。

你可以将意图和实体从经典版Watson Assistant体验迁移到新版Watson Assistant体验。

你可以将意图下载为CSV文件,然后在新版Watson Assistant体验中将其作为操作或示例短语上传和重用。

以下是迁移意图和实体的步骤:

  • 下载意图:转到意图页面。选择你想要下载的意图,然后点击下载图标。下载的示例将保存在一个CSV文件中。
  • 下载实体:转到实体页面,选择实体,然后点击下载图标。指定CSV文件的名称和保存位置,然后点击“保存”。
  • 上传意图作为操作:现在,转到新版Watson Assistant的操作表。点击上传图标。选择包含来自对话的意图的CSV文件。系统将为每个意图创建一个新的操作,并为每个意图添加示例。
  • 上传示例短语到操作:操作创建后将是空的,需要编辑。现在,转到新版Watson Assistant的操作表,选择一个操作,点击上传图标,选择包含示例短语的CSV文件,操作将填充这些示例。
  • 上传实体作为保存的响应:现在转到新版Watson Assistant的“保存的响应”表,点击上传图标,选择包含所需实体的CSV文件。该表将用实体作为保存的响应进行填充。

迁移注意事项

如果你计划使用下载的意图文件为特定操作上传示例短语,请在新体验中仅下载单个意图。每个操作只能上传一个意图。

指定要存储生成的CSV文件的名称和位置,然后点击“保存”。

你现在可以执行以下任务将信息迁移到新版Watson Assistant:将意图作为操作上传,并将单个意图中的示例作为特定操作的示例短语上传。

课程总结

本节课中,我们一起学习了如何将对话技能迁移到Watson操作。你了解到,要使用现有的对话技能,你需要在助手中激活对话功能。一旦激活对话功能,它将优先于操作。你可以将意图和实体从经典版Watson Assistant体验迁移到新版Watson Assistant体验。一个对话节点可以调用一个操作来执行任务,然后返回到对话。

065:最终建议与后续学习路径 🎯

在本节课中,我们将回顾整个课程的核心内容,并提供明确的后续学习建议,帮助你从入门迈向进阶。


恭喜你完成了这门关于无需编程构建聊天机器人的课程。现在,你应该对聊天机器人的重要性、它们带来的商业机会以及如何创建它们有了更清晰的认识。本课程为你奠定了基础,展示了如何利用 Watson Assistant 创建简单但实用的聊天机器人。

既然你已经掌握了基础知识,你可能会想知道接下来该做什么。

我的建议是你开始构建自己的聊天机器人。

以下是你可以立即着手的方向:

  • 为你的个人主页创建一个私人聊天机器人。
  • 开发一个服务于特定业务需求的聊天机器人。

真实的实践是无法替代的。除此之外,我建议你继续深化聊天机器人的学习。

你可以学习我的另一门名为 《使用 Watson API 构建 AI 应用》 的课程。这是一门逻辑上的进阶课程,它教你如何通过将 Watson Assistant 与其他 AI 服务(如 Discovery 和 Speech API)集成,来创建更高级的 AI 应用和聊天机器人。这门课程能让你运用新获得的聊天机器人构建技能,并通过引入一些编码知识将其提升到新的水平。

事实上,如果你喜欢这门课程并看到了 AI 的潜力,我建议你通过注册 Coursera 上 IBM 提供的 AI 专项课程或专业证书 来使自己脱颖而出。

我期待看到你取得成功。


本节课中,我们一起回顾了课程成就,并规划了从实践构建到学习集成开发、直至获取专业认证的清晰进阶路径。持续学习和动手实践是掌握 AI 应用开发的关键。

066:Python 数据类型详解 🧱

在本节课中,我们将要学习 Python 编程语言中的核心概念之一:数据类型。理解数据类型是编写有效代码的基础,它决定了数据在计算机中的存储方式和可执行的操作。

概述

数据类型是 Python 用来表示不同种类数据的方式。Python 支持多种数据类型,例如整数、浮点数和字符串。掌握这些基本类型及其转换方法,是进行后续复杂编程的第一步。

什么是数据类型?

数据类型定义了数据的性质以及可以对数据执行的操作。在 Python 中,不同类型的数据有不同的表示和处理方法。

以下是 Python 中三种最基础的数据类型:

  • 整数:表示没有小数部分的数字,可以是正数或负数,例如 11
  • 浮点数:表示实数,包含小数部分,例如 21.213
  • 字符串:表示文本,是一个字符序列,例如 "Hello"

使用 type() 命令

我们可以使用 Python 内置的 type() 命令来查看任何数据或变量的具体类型。

type(11)    # 输出:<class 'int'>
type(21.213) # 输出:<class 'float'>
type("Hello") # 输出:<class 'str'>

整数类型

整数可以是正数或负数。虽然计算机中整数的表示范围是有限的,但这个范围通常足够大,能满足大多数应用场景。

# 整数示例
positive_int = 42
negative_int = -7

浮点数类型

浮点数用于表示实数,它不仅包括整数,还包括整数之间的所有小数。例如,在 0 和 1 之间存在无数个浮点数,如 0.5。我们还可以在 0.5 和 0.6 之间找到更多浮点数,这个过程可以无限进行下去,尽管计算机的精度是有限的。

# 浮点数示例
pi = 3.14159
small_number = 0.00001

类型转换

在 Python 中,你可以改变一个值的数据类型,这个过程称为类型转换类型铸造

整数与浮点数互转

你可以将一个整数转换为浮点数。

float(2)  # 结果是 2.0

将浮点数转换为整数时需谨慎,因为转换会直接舍弃小数部分,可能导致信息丢失。

int(1.1)  # 结果是 1
int(1.9)  # 结果也是 1,并非四舍五入

字符串与其他类型互转

如果字符串的内容是一个有效的整数,可以将其转换为 int 类型。

int("123")  # 结果是整数 123

如果字符串的内容不是有效的整数值,转换会引发错误。

int("123.4")  # 这会引发 ValueError

同样,可以将整数或浮点数转换为字符串。

str(456)     # 结果是字符串 "456"
str(78.9)    # 结果是字符串 "78.9"

布尔类型

布尔类型是 Python 中另一个重要的数据类型,它只有两个可能的值:TrueFalse(注意首字母大写)。

is_active = True
is_finished = False
type(True)  # 输出:<class 'bool'>

布尔类型与数字类型之间可以相互转换:

  • True 转换为整数或浮点数,会得到 1
  • False 转换为整数或浮点数,会得到 0
  • 将数字 1 转换为布尔值,会得到 True
  • 将数字 0 转换为布尔值,会得到 False

int(True)   # 结果是 1
float(False) # 结果是 0.0
bool(1)     # 结果是 True
bool(0)     # 结果是 False
bool(3)     # 结果是 True(任何非零数字转换为布尔值均为 True)

总结

本节课我们一起学习了 Python 中的基本数据类型。我们了解了整数浮点数字符串布尔值这四种核心类型,并掌握了如何使用 type() 函数来检查类型。更重要的是,我们学习了如何在不同的数据类型之间进行安全的转换,例如将整数转为浮点数,或将字符串转为数字。理解这些概念是构建更复杂程序逻辑的基石。建议你通过实践练习来巩固这些知识,并可以访问 Python 官方文档以探索更多数据类型。

067:表达式与变量 📝

在本节课中,我们将学习Python编程中的两个基础概念:表达式和变量。表达式用于描述计算机执行的操作,而变量则用于存储数据值。理解这两者是编写有效Python代码的第一步。

什么是表达式? ➕➖✖️➗

表达式描述了计算机执行的一类操作。在Python中,表达式就是Python执行的操作。

例如,基本的算术运算,如将多个数字相加:

40 + 50 + 70

在这个例子中,结果是160。我们称这些数字为操作数,而数学符号(本例中是加号)则称为运算符

我们可以使用减号执行减法操作:

25 - 60

结果是-35。

我们可以使用星号执行乘法操作:

-5 * -5

结果是25。这里的操作数是-5,运算符是星号。

我们也可以使用正斜杠执行除法:

25 / 5
25 / 6

25除以5的结果是5.0,25除以6的结果大约是4.167。在本课程使用的Python 3版本中,这两个操作的结果都是浮点数。

我们可以使用双斜杠进行整数除法,结果会被取整:

25 // 5
25 // 6

需要注意的是,在某些情况下,整数除法的结果与常规除法不同。Python在执行数学表达式时遵循数学惯例。

以下操作顺序不同:

2 + 3 * 5 + 5
(2 + 3) * (5 + 5)

在这两种情况下,Python都会先执行乘法,然后再执行加法以获得最终结果。

Python可以执行的操作还有很多。请查看实验部分以获取更多示例。我们也会在本课程中涵盖更复杂的操作。

括号内的表达式会优先执行:

(40 + 50 + 70) * 60

我们先计算括号内的和,然后将结果乘以60,最终结果是1920。

什么是变量? 📦

上一节我们介绍了表达式,本节中我们来看看变量。我们可以使用变量来存储值。

例如,我们使用赋值运算符(即等号)将值1赋给变量my_variable

my_variable = 1

然后,我们可以在代码的其他地方通过输入变量的确切名称来使用这个值。我们将使用冒号来表示变量的值。

我们可以使用赋值运算符为my_variable赋予一个新值,例如赋值10。现在这个变量的值就是10,旧值不再重要。

我们可以存储表达式的结果。例如,我们将几个值相加并将结果赋给X

X = 40 + 50 + 70

现在X存储了结果。我们也可以对X执行操作,并将结果赋给一个新变量Y

Y = X / 60

现在Y的值是2.666。我们也可以对X执行操作并将值重新赋给X

X = X / 60

变量X现在的值是2.666。和之前一样,X的旧值不再重要。

我们也可以在变量上使用type命令。使用有意义的变量名称是一种良好的实践,这样你就不必一直跟踪变量在做什么。

假设我们想将以下音乐数据集中高亮示例的分钟数转换为小时数。我们称包含总分钟数的变量为total_min。通常使用下划线来表示新单词的开头,你也可以使用大写字母。

我们称包含总小时数的变量为total_hour。我们可以通过将total_min除以60来获得总小时数:

total_hour = total_min / 60

结果大约是2.367小时。如果我们修改第一个变量的值,变量的值会改变,最终结果值也会相应改变,但我们不需要修改代码的其余部分。

总结 🎯

本节课中我们一起学习了Python中的表达式和变量。表达式是Python执行的操作,由操作数和运算符组成。变量则是用于存储数据值的容器,可以存储数字、表达式结果等。理解如何创建和使用表达式与变量,是构建更复杂程序的基础。记住,使用描述性的变量名能让你的代码更易读、更易维护。

068:Python 字符串操作入门教程 🧵

在本节课中,我们将要学习 Python 中字符串的基本概念和操作方法。字符串是编程中最常用的数据类型之一,理解如何操作字符串是构建任何应用程序的基础。


什么是字符串?🔤

在 Python 中,字符串是一个字符序列。一个字符串被包含在两个引号内。

my_string = "Hello World"

你也可以使用单引号。

my_string = 'Hello World'

一个字符串可以包含空格或数字。

my_string = "123 Main Street"

字符串也可以包含特殊字符。

my_string = "Hello! @#$%"

我们可以将一个字符串绑定或赋值给另一个变量。

name = "Michael Jackson"
artist = name

将字符串视为一个有序序列是很有帮助的。序列中的每个元素都可以使用一个由数字数组表示的索引来访问。


字符串索引与切片 🗂️

上一节我们介绍了字符串的基本概念,本节中我们来看看如何访问字符串中的特定字符。

第一个索引可以按如下方式访问。

name = "Michael Jackson"
first_char = name[0] # 结果为 'M'

我们可以访问索引 6。

sixth_char = name[6] # 结果为 'l' (注意:索引从0开始)

此外,我们还可以访问第 13 个索引。

thirteenth_char = name[13] # 结果为 'o'

我们也可以对字符串使用负索引。最后一个元素由索引 -1 给出。

last_char = name[-1] # 结果为 'n'

第一个元素可以通过索引 -15 获得,依此类推。

first_char_negative = name[-15] # 结果为 'M'

我们可以将字符串视为列表或元组。我们可以将字符串作为序列处理并执行序列操作。

我们还可以按如下方式输入步长值。数字 2 表示我们每两个字符选择一个。

every_second = name[::2] # 结果为 'McalJcsn'

我们也可以结合切片。在这种情况下,我们返回直到索引 4 之前的每第二个值。

slice_example = name[:4:2] # 结果为 'Mc'

我们可以使用 len 命令来获取字符串的长度。

length = len(name) # 结果为 15


字符串的运算 ➕✖️

了解了如何访问字符串后,现在我们来学习如何组合和复制字符串。

我们可以连接或组合字符串。我们使用加号符号。

greeting = "Hello" + " " + "World" # 结果为 "Hello World"

结果是一个结合了双方的新字符串。

我们可以复制字符串的值。我们只需将字符串乘以我们希望复制的次数。

repeated = "Ha" * 3 # 结果为 "HaHaHa"

在这种情况下,数字是 3。结果是一个新字符串。这个新字符串由原始字符串的三个副本组成。


字符串的不可变性与转义序列 🔒

字符串是不可变的。这意味着你不能改变字符串的值,但你可以创建一个新的字符串。

例如,你可以通过将其设置为原始变量并与一个新字符串连接来创建一个新字符串。

name = "Michael Jackson"
new_name = name + " is the best" # 结果为 "Michael Jackson is the best"

反斜杠表示转义序列的开始。转义序列表示可能难以直接输入的字符串。

例如,\n 代表一个换行符。

print("Hello\nWorld")
# 输出:
# Hello
# World

当遇到 \n 后,输出会换行。

类似地,\t 代表一个制表符。

print("Name:\tJohn")
# 输出: Name:    John

输出在反斜杠 T 出现的地方会有一个制表符。

如果你想在字符串中放置一个反斜杠,请使用双反斜杠。

path = "C:\\Users\\Name" # 结果为 "C:\Users\Name"

转义序列后的结果是一个反斜杠。

我们也可以在字符串前面放一个 r 来创建原始字符串,忽略转义序列。

raw_string = r"Hello\nWorld" # 结果为 "Hello\\nWorld",\n不会被转义

字符串方法 📚

字符串是序列,因此具有适用于列表和元组的方法。此外,字符串还有第二套专门用于字符串的方法。

当我们对字符串 A 应用一个方法时,我们会得到一个与 A 不同的新字符串 B。

让我们看一些例子。让我们尝试 upper 方法。这个方法将小写字符转换为大写字符。

在这个例子中,我们将变量 A 设置为以下值。

A = "Thriller is the seventh studio album"

我们应用 upper 方法并将其赋值给 B。

B = A.upper() # 结果为 "THRILLER IS THE SEVENTH STUDIO ALBUM"

B 的值与 A 相似,但所有字符都是大写的。

replace 方法将字符串的一个片段(即子字符串)替换为一个新字符串。我们输入想要更改的字符串部分。

new_string = A.replace("seventh", "sixth")
# 结果为 "Thriller is the sixth studio album"

第二个参数是我们想要用来交换该片段的内容。结果是一个片段被更改的新字符串。

find 方法用于查找子字符串。参数是您想要查找的子字符串。输出是该子序列第一次出现的索引。

index = A.find("studio") # 结果为 25

我们可以查找子字符串 “jack”。

index = A.find("jack") # 结果为 -1,因为未找到

如果子字符串不在字符串中,则输出为 -1。请查看实验部分以获取更多示例。


总结 📝

本节课中我们一起学习了 Python 字符串的核心操作。我们首先了解了字符串的定义和基本特性,然后学习了如何使用索引和切片来访问字符串的特定部分。接着,我们探索了字符串的连接、复制运算,并理解了字符串不可变性的概念。我们还介绍了转义序列的用法。最后,我们学习了几种常用的字符串方法,如 upper()replace()find(),它们能帮助我们有效地处理和转换字符串数据。掌握这些基础知识是进行更复杂文本处理的第一步。

069:Python列表与元组

在本节课中,我们将学习Python中的两种复合数据类型:列表(List)元组(Tuple)。它们是Python中关键的数据结构,用于存储有序的元素序列。我们将从定义、创建、访问元素开始,逐步深入到它们的特性、操作以及核心区别。


📦 元组(Tuples)

元组是一种有序的序列。它使用圆括号 () 表示,其中的元素用逗号分隔。元组可以包含不同类型的数据,如字符串、整数、浮点数等,但其自身的类型始终是 tuple

以下是一个元组的例子:

ratings = (1, 2, 3, 4, 5)

访问元组元素

每个元组元素可以通过索引进行访问。索引从 0 开始。

以下是索引与元素的对应关系示例:

索引 元素
0 1
1 2
2 3
3 4
4 5

访问第一个元素:

ratings[0]  # 返回 1

访问第二个元素:

ratings[1]  # 返回 2

Python也支持负索引,从末尾开始计数(-1表示最后一个元素):

ratings[-1]  # 返回 5

元组操作

我们可以通过加法来拼接两个元组:

tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
result = tuple1 + tuple2  # 结果为 (1, 2, 3, 4, 5, 6)

如果我们想获取元组的一部分,可以使用切片。切片时,结束索引是不包含的。

获取前三个元素:

ratings[0:3]  # 返回 (1, 2, 3)

获取最后两个元素:

ratings[3:5]  # 返回 (4, 5)
# 或使用负索引
ratings[-2:]  # 返回 (4, 5)

使用 len() 函数获取元组长度:

len(ratings)  # 返回 5

元组的不可变性

元组是不可变的。这意味着一旦创建,就不能修改其内容。这个特性很重要,它保证了数据的稳定性。

例如,尝试修改元组元素会导致错误:

ratings[0] = 10  # 会引发 TypeError

如果我们将一个元组变量赋值给另一个变量,它们会引用同一个元组对象,而不是创建副本。因此,修改其中一个变量(通过重新赋值)不会影响另一个变量引用的原始元组。

ratings1 = ratings
# ratings1 和 ratings 指向同一个元组对象

如果我们想对元组进行排序等操作,必须创建一个新的元组

sorted_ratings = sorted(ratings)  # 返回一个新的排序后的列表

嵌套元组

元组可以包含其他元组或复杂数据类型,这称为嵌套。我们可以使用多层索引来访问嵌套元素。

N_T = (1, 2, ("a", "b"), (3, 4))

访问嵌套在索引2处的元组中的第一个元素:

N_T[2][0]  # 返回 "a"

我们可以将嵌套结构想象成一棵树,通过逐层索引来访问深层数据。


上一节我们介绍了元组的基本概念和操作,本节中我们来看看另一种重要的数据结构——列表。

📝 列表(Lists)

列表也是一种有序的序列,但它使用方括号 [] 表示。列表在许多方面与元组相似,但一个关键区别是列表是可变的。列表可以包含字符串、浮点数、整数,并且可以嵌套其他列表、元组等数据结构。

以下是一个列表的例子:

L = ["Michael Jackson", 10.1, 1982]

访问列表元素

与元组类似,列表元素也可以通过索引访问,索引规则完全相同。

访问第一个元素:

L[0]  # 返回 "Michael Jackson"

使用负索引访问最后一个元素:

L[-1]  # 返回 1982

列表操作

列表同样支持切片操作:

L[-2:]  # 返回 [10.1, 1982]

我们可以通过加法来拼接两个列表:

L1 = L + ["pop", 10.5]
# L1 变为 ["Michael Jackson", 10.1, 1982, "pop", 10.5]

列表的可变性

由于列表是可变的,我们可以直接修改其内容。以下是修改列表的几种方法:

使用 extend() 方法添加多个元素(会修改原列表):

L.extend(["new", 2])
# L 变为 ["Michael Jackson", 10.1, 1982, "new", 2]

使用 append() 方法添加单个元素:

L.append("A")
# L 变为 ["Michael Jackson", 10.1, 1982, "new", 2, "A"]

直接通过索引修改元素:

L[0] = "hard rock"
# L 变为 ["hard rock", 10.1, 1982, "new", 2, "A"]

使用 del 命令删除元素:

del(L[0])
# L 变为 [10.1, 1982, "new", 2, "A"]

字符串与列表的转换

使用 split() 方法可以将字符串按特定分隔符(默认为空格)分割成列表:

"A,B,C,D".split(",")  # 返回 ["A", "B", "C", "D"]

别名与克隆

当我们将一个列表赋值给另一个变量时,两个变量会引用同一个列表对象,这称为别名。修改其中一个变量会影响另一个。

A = ["hard rock", 10, 1.2]
B = A
A[0] = "banana"
print(B[0])  # 输出 "banana"

为了避免这种副作用,我们可以创建列表的克隆(副本):

B = A[:]  # 或 B = A.copy()
A[0] = "hard rock"
print(B[0])  # 仍然输出 "banana"

获取帮助信息

我们可以使用 help() 函数获取关于列表、元组或其他Python对象的详细信息:

help(list)
help(tuple)

🎯 总结

本节课中我们一起学习了Python中两种核心的复合数据类型:元组列表

我们了解到:

  • 元组使用 () 定义,是不可变的,适用于存储不应被修改的数据序列。
  • 列表使用 [] 定义,是可变的,提供了丰富的方法来修改、扩展和操作数据。
  • 两者都支持索引切片拼接嵌套
  • 理解可变性的区别以及别名克隆的概念,对于避免程序中的意外错误至关重要。

掌握列表和元组是有效使用Python进行数据处理和人工智能应用开发的基础。在后续的课程中,我们将继续利用这些数据结构来构建更复杂的程序。

070:Python字典详解 📚

在本节课中,我们将要学习Python中一个非常重要的数据结构——字典。我们将了解字典的基本概念、如何创建和操作字典,以及它与列表等其他数据结构的区别。


字典是什么?🔑

上一节我们介绍了列表,它是一种使用整数索引的集合。本节中我们来看看字典。

字典是Python中的一种集合类型。与列表不同,字典使用来存储数据。你可以把键想象成地址,但它不必是整数,通常是字符串。值则类似于列表中的元素,用于存储具体信息。

一个简单的类比是:列表像一排有编号的储物柜,而字典像一本通讯录,你通过人名(键)来查找电话号码(值)。


创建字典

要创建一个字典,我们使用花括号 {}

以下是创建字典的规则和语法:

  • 是第一个元素,必须是不可变唯一的。
  • 每个键后面跟着一个冒号 :,然后是
  • 值可以是任何类型的数据,可以是不可变的、可变的,并且允许重复。
  • 每个键值对之间用逗号 , 分隔。

考虑以下这个以专辑名为键、发行年份为值的字典例子:

# 创建一个字典并赋值给变量 album_dict
album_dict = {
    "Back in Black": 1980,
    "The Dark Side of the Moon": 1973,
    "The Bodyguard": 1992,
    "Thriller": 1982
}

我们可以用一个表格来可视化这个字典,第一列代表键,第二列代表值。

键 (Key) 值 (Value)
“Back in Black” 1980
“The Dark Side of the Moon” 1973
“The Bodyguard” 1992
“Thriller” 1982


访问和修改字典

访问值

我们使用方括号 [] 并通过来查找对应的值。

# 使用键“Back in Black”来访问值
print(album_dict["Back in Black"])  # 输出:1980
print(album_dict["The Dark Side of the Moon"])  # 输出:1973

添加新条目

我们可以直接为一个新的键赋值,从而在字典中添加新的键值对。

# 添加一个新条目,键为“Graduation”,值为2007
album_dict["Graduation"] = 2007

删除条目

使用 del 语句可以删除字典中指定的键及其对应的值。

# 删除键为“Thriller”的条目
del album_dict["Thriller"]


检查键是否存在

我们可以使用 in 命令来检查一个键是否存在于字典中。这个命令只检查键,不检查值。

# 检查“Back in Black”是否在字典的键中
print("Back in Black" in album_dict)  # 输出:True

# 检查一个不存在的键
print("Nevermind" in album_dict)  # 输出:False

获取所有键和值

为了查看字典中的所有键,我们可以使用 .keys() 方法。它会返回一个类似列表的对象,包含所有键。

# 获取字典的所有键
keys = album_dict.keys()
print(keys)  # 输出类似:dict_keys(['Back in Black', 'The Dark Side of the Moon', ...])

同样地,我们可以使用 .values() 方法来获取字典中的所有值。

# 获取字典的所有值
values = album_dict.values()
print(values)  # 输出类似:dict_values([1980, 1973, ...])

总结

本节课中我们一起学习了Python字典的核心知识。我们了解到字典是一种通过键-值对存储数据的集合,键必须是唯一且不可变的。我们掌握了如何创建字典、通过键访问修改值、添加删除条目,以及如何检查键是否存在和获取所有

字典是构建复杂数据结构和处理映射关系(如ID对应信息、单词对应翻译)的利器,请务必在实验练习中多加运用以巩固理解。

071:Python集合详解 📚

在本节课中,我们将要学习Python中的另一种数据结构——集合。我们将了解集合的定义、特性、创建方法以及如何对集合进行各种操作,例如添加、删除元素以及执行数学集合运算。


什么是集合? 🧩

集合也是一种集合类型。这意味着,像列表和元组一样,你可以向其中放入不同的Python数据类型。

与列表和元组不同,集合是无序的。这意味着集合不记录元素的位置。

集合中的元素是唯一的。这意味着在同一个集合中,一个特定的元素只会出现一次。


如何创建集合? ➕

要定义一个集合,你需要使用花括号 {}。你将集合的元素放在花括号内。

你可能会注意到列表中有重复项。当实际的集合被创建时,重复项将不会出现。

# 定义一个集合
my_set = {1, 2, 3, 3, 4}
print(my_set)  # 输出: {1, 2, 3, 4}

你可以使用 set() 函数将一个列表转换为集合。这被称为类型转换。

你只需将列表作为 set() 函数的输入参数。结果将是一个由列表转换而来的集合。

# 将列表转换为集合
my_list = [1, 2, 2, 3, 4]
converted_set = set(my_list)
print(converted_set)  # 输出: {1, 2, 3, 4}

让我们看一个例子。我们从一个列表开始。我们将这个列表输入到 set() 函数中。set() 函数返回一个集合。请注意,结果中没有重复的元素。


集合的基本操作 🔧

上一节我们介绍了如何创建集合,本节中我们来看看如何修改集合。这些操作可以用来改变集合。

考虑一个集合A。如果你熟悉集合论,可以用一个圆圈来表示这个集合,这可以是维恩图的一部分。

维恩图是一种使用形状(通常是圆形)来表示集合的工具。

添加元素

我们可以使用 add 方法向集合中添加一个项目。我们只需在集合名称后加上一个点 .,然后是 add 方法。参数是我们想要添加到集合中的新元素。

# 向集合添加元素
set_a = {1, 2, 3}
set_a.add(4)
print(set_a)  # 输出: {1, 2, 3, 4}

如果我们尝试添加相同的元素两次,什么也不会发生,因为集合中不能有重复项。

删除元素

假设我们想从集合A中移除元素4。

我们可以使用 remove 方法从集合中移除一个项目。我们只需在集合名称后加上一个点 .,然后是 remove 方法。参数是我们想要从集合中移除的元素。

# 从集合中移除元素
set_a.remove(4)
print(set_a)  # 输出: {1, 2, 3}

remove 方法应用于集合后,集合A就不再包含该元素。你可以对集合中的任何元素使用此方法。

检查元素是否存在

我们可以使用 in 命令来验证一个元素是否在集合中,如下所示。该命令检查项目(例如 2)是否在集合中。如果项目在集合中,则返回 True

# 检查元素是否在集合中
print(2 in set_a)  # 输出: True
print(5 in set_a)  # 输出: False

如果我们寻找一个不在集合中的项目(例如 5),由于该项目不在集合中,我们将得到 False


集合的数学运算 ➗

这些是数学集合运算的类型。我们还可以进行其他操作。

我们可以在集合之间进行许多有用的数学运算。

让我们定义集合 album_set1。我们可以用一个红色的圆圈或维恩图来表示它。

album_set1 = {"AC/DC", "Back in Black", "Thriller"}

同样,我们可以定义集合 album_set2。我们也可以用一个蓝色的圆圈或维恩图来表示它。

album_set2 = {"AC/DC", "Back in Black", "The Dark Side of the Moon"}

交集

两个集合的交集是一个新的集合,包含同时存在于这两个集合中的元素。使用维恩图会很有帮助。代表两个集合的圆圈结合在一起,重叠部分代表新的集合。由于重叠部分由红色圆圈和蓝色圆圈共同构成,我们用“与”的关系来定义交集。

在Python中,我们使用 & 符号来求两个集合的交集。

# 求两个集合的交集
album_set3 = album_set1 & album_set2
print(album_set3)  # 输出: {'AC/DC', 'Back in Black'}

如果我们把集合的值覆盖在圆圈上,将公共元素放在重叠区域,在执行交集操作后,我们看到所有不同时存在于两个集合中的项目都消失了。

并集

两个集合的并集是一个新的集合,包含两个集合中的所有项目。我们可以如下找到集合 album_set1album_set2 的并集。

在Python中,我们使用 | 符号或 union() 方法来求并集。

# 求两个集合的并集
album_set_union = album_set1 | album_set2
# 或者使用 union() 方法
# album_set_union = album_set1.union(album_set2)
print(album_set_union)  # 输出: {'AC/DC', 'Back in Black', 'Thriller', 'The Dark Side of the Moon'}

结果是一个包含 album_set1album_set2 所有元素的新集合。

子集

考虑新的集合 album_set3。该集合包含元素 AC/DCBack in Black。我们可以用维恩图来表示它,因为 album_set3 中的所有元素都在 album_set1 中。

代表 album_set1 的圆圈包裹着代表 album_set3 的圆圈。

我们可以使用 issubset 方法检查一个集合是否是另一个集合的子集。

# 检查子集关系
print(album_set3.issubset(album_set1))  # 输出: True

由于 album_set3album_set1 的子集,结果为 True


总结 ✨

本节课中我们一起学习了Python集合。我们了解了集合是一种无序且元素唯一的数据结构。我们学习了如何创建集合、添加和删除元素、检查元素是否存在,以及执行重要的数学集合运算,如求交集、并集和判断子集关系。

关于集合还有很多可以探索的内容,建议通过实践练习来巩固这些知识。

072:条件与分支 🧠

在本节课中,我们将要学习编程中的条件分支。它们是让程序能够根据不同的情况做出不同决策的核心概念。通过学习比较操作、布尔值以及 ifelseelif 等语句,你将能够编写出更加智能和灵活的程序。

比较操作

上一节我们介绍了课程概述,本节中我们来看看比较操作。比较操作会对两个值进行比较,然后根据比较结果产生一个布尔值(TrueFalse)。

例如,我们给变量 a 赋值为 6:

a = 6

我们可以使用双等号 == 这个相等运算符来判断两个值是否相等:

a == 7

由于 6 不等于 7,所以这个表达式的结果是 False

如果我们判断 a 是否等于 6:

a == 6

因为两个值相等,所以结果是 True

除了相等,我们还可以进行大小比较。考虑以下使用大于运算符 > 的例子:

i > 5

如果左边操作数(变量 i)的值大于右边操作数(5),条件就为 True,否则为 False

我们可以用数轴来可视化这个过程。当 i 的值大于 5 时,在数轴上标记为绿色(真);否则标记为红色(假)。

如果我们设置 i = 6,可以看到 6 大于 5,因此结果为 True。这些操作同样适用于浮点数。

我们也可以使用“大于或等于”运算符 >=

i >= 5

此时,条件在 i 大于或等于 5 时为真。在数轴上,数字 5 本身也会被包含在绿色区域中。

如果 i = 5,运算符产生 True。如果 i = 2,因为 2 小于 5,所以结果为 False

同理,还有小于运算符 <

i < 6

如果左边操作数 i 的值小于右边操作数 6,则条件为真。

“不等于”运算符使用感叹号加等号表示 !=。如果两个操作数不相等,则条件为真。

i != 6

字符串也可以进行比较。例如,比较字符串 “AC/DC” 和 “Michael Jackson” 是否相等:

"AC/DC" == "Michael Jackson"  # 结果为 False

使用不等于测试:

"AC/DC" != "Michael Jackson"  # 结果为 True

因为字符串不同。

分支:if 语句

理解了比较操作后,我们来看看如何利用其结果来控制程序流程,这就是分支。分支允许我们为不同的输入运行不同的语句。

可以把 if 语句想象成一个上锁的房间。如果条件语句为 True,你就能进入房间,程序执行预定义的任务。如果条件为 False,你的程序就会跳过这个任务。

举个例子,想象一个代表 AC/DC 演唱会的蓝色矩形。规则是:如果个人年龄大于或等于 18 岁,他可以进入演唱会;如果小于 18 岁,则不能进入。

  • 如果一个人年龄是 17 岁,条件为假,他无法进入演唱会,只能离开。
  • 如果一个人年龄是 19 岁,条件为真,他可以进入演唱会,然后离开。

if 语句的语法如下:

if condition:
    # 如果条件为 True 则执行的表达式

condition 是一个可以评估为真或假的表达式。括号不是必须的,但冒号 : 和缩进是必需的。无论 if 条件真假,if 语句块之后的代码都会继续执行。

以下是具体案例:

当年龄为 17 时:

age = 17
if age >= 18:
    print(“你可以进入”)
print(“继续前进”)

程序检查 if 语句,条件为 False,因此不会执行打印“你可以进入”的语句,只会打印“继续前进”。

当年龄为 19 时:

age = 19
if age >= 18:
    print(“你可以进入”)
print(“继续前进”)

if 语句条件为 True,因此程序会执行打印“你可以进入”,然后打印“继续前进”。

else 语句

else 语句允许我们在条件为 False 时运行另一段代码块。

继续使用演唱会类比:如果用户 17 岁,他不能去 AC/DC 演唱会,但可以去 Meatloaf 演唱会(用紫色方块代表)。如果用户 19 岁,条件为真,他可以进入 AC/DC 演唱会,然后离开。

else 语句的语法很简单,只需在 if 语句后添加 else: 和相应的缩进代码块。

以下是具体案例:

当年龄为 17 时:

age = 17
if age >= 18:
    print(“你可以进入 AC/DC 演唱会”)
else:
    print(“去看 Meatloaf 演唱会吧”)
print(“继续前进”)

if 语句条件为 False,因此程序执行 else 语句块,打印“去看 Meatloaf 演唱会吧”,然后继续执行后续代码。

当年龄为 19 时:

age = 19
if age >= 18:
    print(“你可以进入 AC/DC 演唱会”)
else:
    print(“去看 Meatloaf 演唱会吧”)
print(“继续前进”)

if 语句条件为 True,程序执行打印“你可以进入 AC/DC 演唱会”,跳过 else 块,然后打印“继续前进”。

elif 语句

elifelse if 的缩写,它允许我们在前面的条件为 False 时,检查额外的条件。如果 elif 的条件为 True,则执行其对应的代码块。

考虑演唱会例子:如果一个人刚好 18 岁,他既不能看 AC/DC(要求大于18岁),也不该去看 Meatloaf(else 默认选项),而是应该去看 Pink Floyd 演唱会。

一个 18 岁的人进入:他不超过 19 岁,所以不能看 AC/DC。但因为他是 18 岁,所以去看 Pink Floyd。看完后离开。

elif 语句的语法如下:

if condition1:
    # 执行语句1
elif condition2:
    # 执行语句2
else:
    # 执行语句3

以下是具体案例:

对于一个 18 岁的人:

age = 18
if age > 18:
    print(“你可以进入”)
elif age == 18:
    print(“去看 Pink Floyd 吧”)
else:
    print(“去看 Meatloaf 吧”)
print(“继续前进”)

第一个条件 age > 18False,因此检查 elif 条件 age == 18,结果为 True,所以打印“去看 Pink Floyd 吧”,然后继续执行。

如果 age 是 17,则会执行 else 块,打印“去看 Meatloaf 吧”。如果 age 大于 18,则会执行 if 块,打印“你可以进入”。

逻辑运算符

除了简单的比较,我们还可以使用逻辑运算符将多个布尔值组合起来,产生新的布尔值。首先是 not 运算符。

not 运算符会反转布尔值:

  • 如果输入是 True,结果是 False
  • 如果输入是 False,结果是 True

or 运算符

or 运算符接受两个布尔值,并产生一个新的布尔值。我们可以用真值表来表示:

A B A or B
True True True
True False True
False True True
False False False

可以看到,or 运算符只有在所有布尔值都为 False 时,才产生 False

以下代码会在专辑年份不在 80 年代(即小于1980或大于1989)时,打印信息:

album_year = 1990
if album_year < 1980 or album_year > 1989:
    print(“这张专辑制作于70年代或90年代。”)
else:
    print(“这张专辑制作于80年代。”)

让我们看看当 album_year 设为 1990 时的情况。使用彩色数轴,绿色表示条件为真,红色表示假。

第一个条件 album_year < 1980(1990 < 1980)为假(红)。
第二个条件 album_year > 1989(1990 > 1989)为真(绿)。

在最终的数轴上,绿色区域表示至少有一个语句为真的区域。1990 落在这个区域,因此条件为真,执行 print 语句。

and 运算符

and 运算符也接受两个布尔值,并产生一个新的布尔值。其真值表如下:

A B A and B
True True True
True False False
False True False
False False False

可以看到,and 运算符只有在所有布尔值都为 True 时,才产生 True

以下代码会在专辑年份在 1980 到 1989 年之间(含)时,打印信息:

album_year = 1983
if album_year >= 1980 and album_year <= 1989:
    print(“这张专辑制作于80年代。”)
else:
    print(“这张专辑不是制作于80年代。”)

让我们看看当 album_year 设为 1983 时的情况。

第一个条件 album_year >= 1980(1983 >= 1980)为真(绿)。
第二个条件 album_year <= 1989(1983 <= 1989)为真(绿)。

在最终的数轴上,绿色区域表示两个语句都为真的区域。1983 落在这个区域,因此条件为真,执行 print 语句。

总结

本节课中我们一起学习了编程中至关重要的条件与分支

我们首先学习了如何使用比较运算符(如 ==><>=<=!=)来比较数值和字符串,并产生布尔值结果。

接着,我们深入探讨了如何利用这些布尔值通过 ifelseelif 语句来实现分支逻辑,让程序能够根据不同的条件执行不同的代码路径。

最后,我们介绍了逻辑运算符 notorand,它们允许我们组合多个条件,构建出更复杂的判断逻辑。

掌握这些概念是编写动态、响应式程序的基础,它们使得程序能够像我们一样进行“思考”和“决策”。

073:循环 🔄

在本节课中,我们将学习循环,特别是 for 循环和 while 循环。我们将通过直观的例子来理解它们的工作原理,并了解如何使用 range 函数来生成序列。


概述 📋

循环是编程中用于重复执行特定任务的结构。本节课将介绍两种主要的循环类型:for 循环和 while 循环。我们将从 range 函数开始,它是创建数字序列的有用工具,然后深入探讨每种循环的语法和应用场景。


range 函数

在讨论循环之前,我们先来了解 range 函数。range 函数输出一个有序序列。

如果输入是一个正整数,输出是一个序列。该序列包含的元素数量与输入相同,但从 0 开始计数。

例如,如果输入是 3,输出序列是 0, 1, 2。

如果 range 函数有两个输入,且第一个输入小于第二个输入,输出序列从第一个输入值开始,迭代到但不包括第二个数字。

对于输入 10 和 15,我们得到以下序列:10, 11, 12, 13, 14。

更多 range 函数的功能请参见实验部分。请注意,如果您使用 Python 3,range 函数不会像 Python 2 那样显式生成列表。


for 循环

上一节我们介绍了 range 函数,本节中我们来看看 for 循环。我们将重点放在列表上,但许多过程也可以用于元组。

循环反复执行一项任务。考虑一组彩色方块。

假设我们想将每个彩色方块替换为白色方块。

为了简化,我们给每个方块编号,并将所有方块组称为 squares

如果我们想告诉某人将方块 0 替换为白色方块,我们会说:squares[0] = "white"

类似地,对于下一个方块,我们可以说:squares[1] = "white"

对于再下一个方块,我们可以说:squares[2] = "white"

我们对每个方块重复此过程。唯一变化的是我们引用的方块的索引。

如果要在 Python 中执行类似任务,我们不能使用实际的方块。因此,让我们使用一个列表来表示这些盒子。列表中的每个元素都是一个表示颜色的字符串。

我们想将每个元素中的颜色名称更改为白色。列表中的每个元素都有以下索引。

这是在 Python 中执行循环的语法。注意缩进。

range 函数生成一个列表。代码将简单地重复缩进内的所有内容五次。

如果您将值更改为 6,它将执行六次。但是,每次 i 的值都会增加 1。

在这个片段中,我们将列表的第 i 个元素更改为字符串 "white"i 的值设置为 0。

循环的每次迭代从缩进的开头开始。然后我们运行缩进内的所有内容。列表的第一个元素被设置为 "white"

然后我们回到缩进的开头。我们逐行向下执行。当我们到达更改列表值的那一行时,我们将索引 1 的值设置为 "white"i 的值增加 1。

我们对索引 2 重复此过程。该过程继续到下一个索引,直到我们到达最后一个元素。

我们也可以在 Python 中直接遍历列表或元组。我们甚至不需要使用索引。

以下是列表 squares。列表的每次迭代,我们将列表 squares 的一个元素传递给变量 square

让我们在本节中显示变量 square 的值。对于第一次迭代,square 的值是 "red"

然后我们开始第二次迭代。对于第二次迭代,square 的值是 "yellow"

然后我们开始第三次迭代,即最后一次迭代。square 的值是 "green"

一个用于迭代数据的有用函数是 enumerate。它可以用于获取列表中元素的索引和元素本身。

让我们使用带有数字的盒子类比,数字代表每个方块的索引。

这是遍历列表并提供每个元素索引的语法。

我们使用列表 squares,并使用颜色名称来表示彩色方块。函数 enumerate 的参数是列表,在本例中是 squares

变量 i 是索引,变量 square 是列表中对应的元素。

让我们使用屏幕左侧来显示循环不同迭代中变量 squarei 的不同值。

对于第一次迭代,变量的值是 "red",对应于第 0 个索引,i 的值是 0。

对于第二次迭代,变量 square 的值是 "yellow"i 的值对应于其索引,即 1。

我们对最后一个索引重复此过程。


while 循环

while 循环与 for 循环类似,但不是执行固定次数的语句,while 循环只有在满足条件时才会运行。

假设我们想将列表 squares 中的所有橙色方块复制到列表 new_squares 中,但如果我们遇到非橙色方块,我们希望停止。

我们事先不知道方块的值。只要方块是橙色的,我们就继续这个过程,或者检查方块是否等于橙色。如果不是,我们就停止。

对于第一个例子,我们检查方块是否为橙色。它满足条件,所以我们复制方块。

我们对第二个方块重复此过程。条件满足,所以我们复制方块。


在下一次迭代中,我们遇到一个紫色方块。条件不满足,所以我们停止过程。

这基本上就是 while 循环的作用。让我们使用左侧的图来表示代码。

我们将使用带有颜色名称的列表来表示不同的方块。我们创建一个空列表 new_squares。实际上,列表的大小是不确定的。

我们将索引 i 从 0 开始。while 语句将重复执行缩进内的语句,直到括号内的条件为假。

我们将列表 squares 的第一个元素的值附加到列表 new_squares 中。我们将 i 的值增加 1。

我们将列表 squares 的第二个元素的值附加到列表 new_squares 中。我们增加 i 的值。

现在,数组 squares 中的值是 "purple"。因此,while 语句的条件为假,我们退出循环。

请查看实验部分以获取更多循环示例,其中许多涉及真实数据。


总结 🎯

本节课中我们一起学习了循环。我们首先介绍了 range 函数,它可以生成数字序列。然后,我们深入探讨了 for 循环,它用于遍历序列(如列表或元组)中的每个元素。我们还学习了 while 循环,它在满足特定条件时重复执行代码块。理解这些循环结构对于编写高效和动态的 Python 程序至关重要。

074:Python函数 🧩

在本节课中,我们将要学习Python中的函数。你将了解如何使用Python的一些内置函数,以及如何构建自己的函数。


什么是函数?🤔

函数接收一些输入,然后产生一些输出或引发一些改变。函数本质上是一段可以重复使用的代码。你可以实现自己的函数,但在许多情况下,你会使用他人编写的函数。这时,你只需要知道函数如何工作,以及在某些情况下如何导入函数。

上一节我们介绍了函数的基本概念,本节中我们来看看函数如何简化代码。

函数如何简化代码

假设橙色和黄色的方块代表相似的代码块。我们可以运行这些代码,传入一些输入并获得输出。如果我们定义一个函数来执行这个任务,我们只需要调用这个函数。让小的方块代表用于调用函数的代码行。

我们可以通过多次调用函数来替换这些冗长的代码行。现在,我们只需调用函数,代码就变得简短得多,但执行的任务完全相同。

函数的工作流程

你可以将这个过程想象成这样:当我们调用函数 F1 时,我们将一个输入传递给函数。这些值被传递给你编写的所有代码行。函数返回一个值,你可以使用这个值。例如,你可以将这个值输入到一个新函数 F2 中。当我们调用这个新函数 F2 时,该值被传递到另一组代码行。函数返回一个值。这个过程不断重复,将值传递给你调用的函数。你可以保存这些函数并重复使用,或者使用他人的函数。


Python内置函数

Python有许多内置函数。你不需要知道这些函数内部如何工作,只需要知道它们执行什么任务。

以下是几个常用内置函数的例子:

len() 函数

len() 函数接收一个序列类型(如字符串或列表)或集合类型(如字典或集合)的输入,并返回该序列或集合的长度。

考虑以下列表:

album_ratings = [10.0, 8.5, 9.5, 7.0, 7.0, 9.5, 9.0, 9.5]

len() 函数将此列表作为参数,我们将结果赋值给变量 L。函数确定列表中有8个项目,然后返回列表的长度,即 8

sum() 函数

sum() 函数接收一个可迭代对象(如元组或列表),并返回所有元素的总和。

考虑以下列表:

ratings_sum = sum(album_ratings)

我们将列表传入 sum() 函数,并将结果赋值给变量 S。函数确定所有元素的总和,然后返回它。在这个例子中,值是 70


列表排序的两种方法

有两种方法可以对列表进行排序。第一种是使用 sorted() 函数,第二种是使用列表的 sort() 方法。方法与函数类似。

让我们用一个例子来说明它们的区别。

使用 sorted() 函数

sorted() 函数返回一个新的已排序列表或元组。考虑列表 album_ratings

sorted_album_ratings = sorted(album_ratings)

我们可以对列表 album_ratings 应用 sorted() 函数,得到一个新的列表 sorted_album_rating。结果是一个新的已排序列表。如果我们查看原始列表 album_ratings,它没有改变。

通常,函数接收一个输入(这里是一个列表),并产生一个新的输出(这里是一个已排序的列表)。

使用 sort() 方法

如果我们使用 sort() 方法,列表 album_ratings 本身会改变,并且不会创建新的列表。

album_ratings.sort()

让我们用图表来帮助说明这个过程。在这个例子中,矩形代表列表 album_ratings。当我们对列表应用 sort() 方法时,列表 album_ratings 发生了变化。

与之前的情况不同,我们看到列表 album_ratings 已经改变。在这种情况下,没有创建新的列表。


构建自己的函数

现在我们已经介绍了如何在Python中使用函数,让我们看看如何构建自己的函数。

我们将引导你开始在Python中构建自己的函数。

一个简单的函数示例

这是一个Python函数的例子,它返回输入值加一的结果。要定义一个函数,我们以关键字 def 开始。

函数名应描述其功能。我们在括号内有函数的形式参数 a,后面跟着一个冒号。

def add_one(a):
    b = a + 1
    return b

我们有一个带缩进的代码块。在这个例子中,我们将 a 加一,并将结果赋值给 b。然后我们返回或输出 b 的值。

定义函数后,我们可以调用它。

result = add_one(5)
# result 现在是 6

函数会将1加到5上,并返回6。我们可以再次调用这个函数,这次将其赋值给变量 c

c = add_one(10)
# c 现在是 11

函数调用过程详解

让我们详细了解一下调用函数时的过程。需要注意的是,这是Python的一个简化模型,Python底层的工作方式并非完全如此。

我们调用函数,并给它输入 5。可以认为值 5 被传递给了函数。现在,执行一系列命令。a 的值是 5b 将被赋值为 6。然后我们返回 b 的值。在这种情况下,由于 b 被赋值为 6,函数返回 6

如果我们再次调用该函数,过程会重新开始。我们传入一个 8,执行后续操作。上一次调用中发生的一切都会再次发生,只是 a 的值不同。函数返回一个值,这里是 9。再次强调,这只是一个有帮助的类比。

添加函数文档

让我们尝试让这个函数更复杂一些。习惯上,在函数的前几行编写文档。这告诉任何使用该函数的人它的作用。这个文档用三引号包围。

你可以使用 help 命令在函数上显示文档,如下所示:

def add_one(a):
    """
    此函数接收一个数字,并返回该数字加一的结果。
    """
    b = a + 1
    return b

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/3e4ef8a1321e6c93b0f0a23a230797dc_31.png)

help(add_one)

这将打印出函数名和文档。在其余示例中,我们将不包含文档。

具有多个参数的函数

一个函数可以有多个参数。函数 mult 将两个数字相乘,换句话说,它找到它们的乘积。

def mult(a, b):
    c = a * b
    return c

如果我们传入整数 23,结果是一个新的整数 6。如果我们传入整数 10 和浮点数 3.14,结果是一个浮点数 31.4

如果我们传入整数 2 和字符串 "Michael Jackson",字符串 "Michael Jackson" 会被重复两次。这是因为乘法符号也可以表示重复一个序列。

如果你不小心用一个整数乘以一个字符串,而不是两个整数相乘,你不会得到错误。相反,你会得到一个字符串,你的程序可能会继续运行,但之后可能会失败,因为你在期望整数的地方得到了一个字符串。

这个特性会使编码更简单,但你必须更彻底地测试你的代码。


没有返回语句的函数

在许多情况下,函数没有 return 语句。在这些情况下,Python将返回特殊的 None 对象。实际上,如果你的函数没有 return 语句,你可以将其视为函数根本不返回任何内容。

函数 MJ 只是打印名字 "Michael Jackson"。我们调用该函数,函数打印出 "Michael Jackson"

def MJ():
    print("Michael Jackson")

MJ()

让我们定义一个函数 no_work,它不执行任何任务。Python不允许函数有空的主体,所以我们可以使用关键字 pass,它不做任何事情,但满足非空主体的要求。

def no_work():
    pass

print(no_work())

如果我们调用这个函数并打印它,函数返回 None。在后台,如果没有调用 return 语句,Python会自动返回 None

将函数 no_work 视为具有以下 return 语句是有帮助的:

def no_work():
    return None

通常,函数执行多个任务。这个函数打印一条语句,然后返回一个值。

def print_and_return(a):
    b = a + 1
    print(f"输入是 {a},输出是 {b}")
    return b

让我们用这个表格来表示函数被调用时的不同值。我们以输入 2 调用函数。我们找到 b 的值。函数打印带有 ab 值的语句。最后,函数返回 b 的值,在这个例子中是 3


在函数中使用循环

这个函数打印出列表或元组的值和索引。我们以列表 album_ratings 作为输入调用该函数。

def print_ratings(ratings):
    for i, s in enumerate(ratings):
        print(f"索引 {i}: 评分 {s}")

album_ratings = [10.0, 8.5, 9.5, 7.0, 7.0, 9.5, 9.0, 9.5]
print_ratings(album_ratings)

让我们在右侧显示列表及其对应的索引。st 用作函数 enumerate 的输入。这个操作会将索引传递给 i,将列表中的值传递给 s

函数将开始遍历循环。函数将打印第一个索引和列表中的第一个值。我们继续遍历循环。is 的值被更新。到达 print 语句。类似地,打印列表和索引的下一个值。重复这个过程,直到打印出列表中的最终值。


可变参数

可变参数允许我们输入可变数量的元素。考虑以下函数。该函数在参数名 names 前有一个星号。

def print_names(*names):
    for name in names:
        print(name)

print_names("Michael", "Janet", "Tito")

当我们调用该函数时,三个参数被打包到元组 names 中。然后我们遍历循环,相应地打印出值。

如果我们用仅两个参数作为输入调用同一个函数,变量 names 只包含两个元素。结果是只打印出两个值。


变量的作用域

变量的作用域是程序中该变量可被访问的部分。在任何函数外部定义的变量被称为在全局作用域内,这意味着在它们定义之后,可以在任何地方访问它们。

这里我们有一个函数,它将字符串 "DC" 添加到参数 x 中。当我们到达将 x 的值设置为 "AC" 的部分时,这是在全局作用域内,意味着 x 在定义后可以在任何地方访问。

在全局作用域内定义的变量称为全局变量。当我们调用函数时,我们进入一个新的作用域,即 add_DC 的作用域。我们传递一个参数给 add_DC 函数,在这个例子中是 "AC"。在函数的作用域内,x 的值被设置为 "ACDC"。函数返回值并赋值给 z。在全局作用域内,z 的值被设置为 "A, DC"。返回值后,函数的作用域被删除。

局部变量只存在于函数的作用域内。考虑函数 thriller。局部变量 date 被设置为 1982。当我们调用该函数时,我们创建了一个新的作用域。在那个函数的作用域内,date 的值被设置为 1982date 的值在全局作用域内不存在。

全局作用域内的变量可以与局部作用域内的变量同名,而不会发生冲突。考虑函数 thriller。局部变量 date 被设置为 1982。全局变量 date 被设置为 2017。当我们调用该函数时,我们创建了一个新的作用域。在那个作用域内,date 的值被设置为 1982。如果我们调用该函数,它返回局部作用域内 date 的值,即 1982。当我们在全局作用域内打印时,我们使用全局变量的值。全局变量的值是 2017,因此该值被设置为 2017

如果变量在函数内没有定义,Python将检查全局作用域。考虑函数 ACDC。该函数有一个变量 rating,但没有赋值。如果我们在全局作用域内定义变量 rating,然后调用该函数,Python会看到变量 rating 没有值。因此,Python会离开作用域,并检查变量 ratings 是否存在于全局作用域中。它将在 ACDC 的作用域内使用全局作用域中 ratings 的值。

在函数内部将打印出 9。全局作用域中 z 的值将是 10,因为我们加了一。rating 的值在全局作用域内将保持不变。

考虑函数 pink_Floyd。如果我们用关键字 global 定义变量 claimed_sales,该变量将是一个全局变量。我们调用函数 pink_Floyd。变量 claimed_sales 在全局作用域中被设置为字符串 "45 million"。当我们打印该变量时,我们得到的值是 "45 million"


总结

本节课中我们一起学习了Python函数的核心概念。我们了解了函数如何接收输入并产生输出,从而简化代码。我们探讨了Python的内置函数,如 len()sum(),以及列表排序的两种方法。更重要的是,我们学习了如何定义自己的函数,包括添加参数、编写文档以及理解变量的作用域。函数是构建复杂程序的基础模块,掌握它们对于后续的AI和机器人编程至关重要。

关于函数,你还可以做更多事情,请查看实验部分以获取更多示例。

075:异常处理 🛡️

在本节课中,我们将要学习异常处理。异常处理是编程中用于管理程序运行时错误的重要机制。通过本课,你将能够解释异常处理的概念,演示其使用方法,并理解其基本原理。

概述

你是否曾经在应该输入文本的输入框中误输入了数字?大多数人都有过这样的经历,无论是出于错误还是测试程序。但你是否想过,为什么程序会显示错误信息而不是正常完成并终止?这是因为在后台触发了一个事件。该事件被激活是因为程序尝试对输入的名字进行计算,并发现输入包含数字而非字母。通过将这段代码包裹在异常处理器中,程序知道如何处理这类错误,并能输出错误信息以继续执行程序。这只是请求用户输入时可能发生的众多错误之一。

异常处理的工作原理

上一节我们介绍了异常处理的基本概念,本节中我们来看看异常处理的具体工作机制。我们将首先探索 try-except 语句。

这种语句首先会尝试执行 try 代码块中的代码。但如果发生错误,它将跳出并开始搜索匹配该错误的 except 语句。一旦找到正确的异常来处理错误,它就会执行该行代码。

例如,假设你正在编写一个程序来打开并写入文件。程序启动后,由于数据无法读取而发生了错误。因此,程序跳过了 try 语句下的代码行,直接转到 except 行。由于此错误符合 IOError 的范畴,它向控制台打印了“无法打开或读取文件中的数据”。

处理多种异常

在编写简单程序时,有时我们可能只使用一个 except 语句。但如果发生另一个未被 IOError 捕获的错误呢?如果发生这种情况,我们需要为此添加另一个 except 语句。

以下是需要注意的要点:

  • 对于这个 except 语句,你会注意到没有指定要捕获的错误类型。虽然这看似合理,能让程序捕获所有错误而不终止,但这并非最佳实践。
  • 例如,也许我们的小程序只是一个超过一千行代码的大型程序的一部分。我们的任务是调试程序,因为它不断抛出错误,给用户造成困扰。在调查程序时,你发现这个错误不断出现。但由于这个错误没有详细信息,你最终花费数小时试图定位和修复它。

添加 Else 和 Finally 语句

到目前为止,在我们的程序中,我们已经定义了如果发生错误应打印错误信息,但我们没有收到任何程序成功执行的消息。这时我们可以添加一个 else 语句来提供该通知。

通过添加这个 else 语句,它将向控制台提供一个通知,表明文件已成功写入。

现在我们已经定义了程序正常执行或发生错误时会发生什么,对于这个例子,还需要添加最后一个语句。

我们正在打开一个文件,最后需要做的是关闭文件。通过添加一个 finally 语句,它将告诉程序无论最终结果如何都要关闭文件,并向控制台打印“文件现已关闭”。

总结

本节课中我们一起学习了如何编写 try-except 语句,为什么在创建异常时始终定义错误很重要,以及如何添加 elsefinally 语句。异常处理是构建健壮、用户友好程序的关键技能。

076:Python中的对象与类 🧱

在本节课中,我们将要学习Python编程中两个核心概念:对象。我们将了解什么是对象,什么是类,以及如何创建和使用它们来构建更复杂、更有组织的程序。


概述:什么是对象?

Python中有许多不同的数据类型,例如整数、浮点数、字符串、列表和字典。在Python中,每一种数据类型都是一个对象

每个对象都包含以下内容:

  • 类型:标识对象的种类。
  • 内部表示:对象内部如何存储数据。
  • 方法:一组用于与对象数据交互的函数。

一个对象是某个特定类型的实例。例如,我们可以有“类型1”和“类型2”。可以有多个“类型1”的实例(对象),每个都是“类型1”的一个具体体现。


对象的实例

让我们看一些不那么抽象的例子。

整数对象

每次创建一个整数时,我们都在创建一个整数类型的实例,或者说一个整数对象。例如,510-3 等都是整数对象。

x = 5  # 创建一个整数对象

列表对象

同样,每次创建一个列表时,我们都在创建一个列表类型的实例,或者说一个列表对象。

my_list = [1, 2, 3]  # 创建一个列表对象


使用 type() 命令

我们可以使用 type() 命令来查看一个对象的类型。

print(type([1, 2, 3]))   # 输出:<class 'list'>
print(type(5))           # 输出:<class 'int'>
print(type("hello"))     # 输出:<class 'str'>
print(type({"a": 1}))    # 输出:<class 'dict'>

什么是方法?

上一节我们介绍了对象的基本概念,本节中我们来看看如何与对象交互。方法是类或类型提供的函数,是该类所有实例都可以使用的功能。我们一直在使用方法。

例如,列表有一个 sort() 方法,它可以与列表对象中的数据交互。

考虑一个列表 ratings,其数据是包含在列表中的一系列数字。sort() 方法会改变对象内部的数据(即改变对象的状态)。

我们通过在对象名称后加一个点 .,然后跟上方法名和括号 () 来调用方法。

ratings = [2, 5, 3, 1, 4]
ratings.sort()  # 调用 sort 方法,改变列表内部顺序
print(ratings)  # 输出:[1, 2, 3, 4, 5]

我们还可以调用 reverse() 方法,再次改变列表。

在许多情况下,你不需要了解类及其方法的内部工作原理,只需要知道如何使用它们。


创建自定义类

接下来,我们将介绍如何构建你自己的类。你可以在Python中创建自己的类型或类。

在这一节,你将学习:

  • 创建一个类。
  • 为类定义数据属性
  • 为类定义方法
  • 然后创建该类的实例(即对象)。

定义类的数据属性

类的数据属性定义了类的构成。让我们创建两个类:Circle(圆形)和 Rectangle(矩形)。

对于圆形:观察图像,我们只需要一个半径来定义一个圆。我们还可以添加颜色属性,以便后期更容易区分类的不同实例。
因此,Circle 类的数据属性是:radius(半径)和 color(颜色)。

对于矩形:为了定义一个矩形,我们需要高度宽度。同样,我们添加颜色属性以便区分。
因此,Rectangle 类的数据属性是:color(颜色)、height(高度)和 width(宽度)。

编写类定义

要创建 Circle 类,你需要包含类定义。这告诉Python你正在创建自己的类。

class Circle(object):
    # 类的内容将在这里定义

对于 Rectangle 类,我们改变类名,但结构相同。

class Rectangle(object):
    # 类的内容将在这里定义

类是一个蓝图,我们需要设置属性来创建对象。


初始化对象:构造函数

让我们继续在Python中构建 Circle 类。我们定义类,然后使用类构造函数 __init__ 来初始化每个类的实例。

__init__ 函数是一个构造函数,它是一个特殊函数,告诉Python你正在创建一个新类。

class Circle(object):
    def __init__(self, radius, color):
        self.radius = radius
        self.color = color

  • self 参数指的是新创建的类实例。
  • radiuscolor 参数用于初始化类实例的 radiuscolor 数据属性。

类似地,我们可以定义 Rectangle 类:

class Rectangle(object):
    def __init__(self, color, height, width):
        self.color = color
        self.height = height
        self.width = width


创建对象实例

创建类之后,为了创建一个 Circle 类的对象,我们引入一个变量作为对象名,然后使用对象构造函数。

对象构造函数由类名和参数(即数据属性)组成。

# 创建一个 Circle 对象
RedCircle = Circle(10, "red")

当我们创建一个圆对象时,我们像调用函数一样调用代码。传递给 Circle 构造函数的参数用于初始化新创建的圆实例的数据属性。

可以将 self 想象成一个包含对象所有数据属性的盒子。


访问和修改属性

输入对象名,后跟一个点 . 和数据属性名,可以获取数据属性的值。

print(RedCircle.radius)  # 输出:10
print(RedCircle.color)   # 输出:'red'

在Python中,我们也可以直接设置或更改数据属性。

RedCircle.color = "blue"  # 直接修改颜色属性
print(RedCircle.color)    # 输出:'blue'

通常,为了改变对象中的数据,我们在类中定义方法。让我们来讨论方法。


为类添加方法

我们已经看到数据属性如何构成定义对象的数据。方法是与数据属性交互并改变它们的函数。

假设我们想改变一个圆的大小,这涉及到改变 radius 属性。我们给 Circle 类添加一个 add_radius 方法。

class Circle(object):
    def __init__(self, radius, color):
        self.radius = radius
        self.color = color

    def add_radius(self, r):
        self.radius = self.radius + r

该方法是一个函数,需要 self 参数以及其他参数(这里是 r)。它将 r 的值加到数据属性 radius 上。

让我们看看这部分代码在创建对象和调用 add_radius 方法时如何工作。

# 创建对象
RedCircle = Circle(2, "red")

# 调用方法
RedCircle.add_radius(8)
print(RedCircle.radius)  # 输出:10

我们通过添加点 . 后跟方法名和括号来调用方法。调用方法时,我们不需要担心 self 参数,Python会为我们处理。


实践示例与总结

在实验环节,我们还会创建一个名为 draw_circle 的方法(具体实现见实验)。我们可以创建新的 Circle 类型对象,访问其数据属性,并使用方法。

以下是创建和使用对象的总结步骤:

  1. 创建 Circle 对象
    RedCircle = Circle(3, "red")
    BlueCircle = Circle(10, "blue")
    

  1. 访问数据属性
    print(RedCircle.radius)  # 输出:3
    print(BlueCircle.color)  # 输出:'blue'
    

  1. 调用方法
    RedCircle.draw_circle()  # 绘制圆形
    

对于 Rectangle 类也是类似的,我们可以创建对象,访问 heightwidthcolor 属性,并调用 draw_rectangle 方法。


使用 dir() 函数

dir() 函数对于获取与类相关的数据属性和方法列表非常有用。将你感兴趣的对象作为参数传递,返回值是该对象的数据属性和方法列表。

print(dir(RedCircle))

被下划线包围的属性(如 __init__)是内部使用的,通常不需要担心。那些看起来常规的属性才是你应该关注的,它们是对象的方法和数据属性。


总结

在本节课中,我们一起学习了:

  • 对象是Python中数据的具体实例,拥有类型、内部数据和方法。
  • 是创建对象的蓝图或模板,定义了对象将拥有哪些数据属性和方法。
  • 如何使用 __init__ 构造函数来初始化新对象。
  • 如何定义和调用方法来与对象的数据进行交互。
  • 如何创建类的多个实例(对象)。
  • 使用 dir() 函数来探索对象的属性和方法。

掌握对象和类是进行面向对象编程的基础,它能帮助你构建更模块化、可重用和易于维护的代码。Python官方文档是获取更多信息的绝佳资源。

077:使用 open() 函数读取文件 📂

在本节课中,我们将学习如何使用 Python 内置的 open() 函数来创建文件对象,并从 TXT 文件中获取数据。

我们将使用 Python 的 open() 函数来获取一个文件对象。然后,我们可以对该对象应用方法来读取文件中的数据。例如,我们可以按如下方式打开文件 example1.txt

使用 open() 函数

我们使用 open() 函数。它的第一个参数是文件路径,由文件名和文件目录组成。第二个参数是模式,常用的值包括 'r' 表示读取,'w' 表示写入,'a' 表示追加。在本节中,我们将使用 'r' 模式进行读取。最终,我们会得到一个文件对象。

file1 = open('example1.txt', 'r')

现在,我们可以使用这个文件对象来获取文件的信息。我们可以使用数据属性 .name 来获取文件名,结果是一个包含文件名的字符串。我们还可以使用数据属性 .mode 来查看对象的模式,这里会显示 'r' 表示读取。

你应该始终使用方法 .close() 来关闭文件对象。但有时这可能会很繁琐,因此让我们使用 with 语句。

使用 with 语句

使用 with 语句打开文件是更好的做法,因为它会自动关闭文件。

with open('example1.txt', 'r') as file1:
    # 在此缩进块内执行操作

这段代码将运行缩进块内的所有内容,然后自动关闭文件。此代码读取文件 example1.txt。我们可以在缩进块内使用文件对象 file1 执行所有操作,在缩进块结束时,文件会自动关闭。

读取文件内容

方法 .read() 将文件的值作为一个字符串存储在变量中。

with open('example1.txt', 'r') as file1:
    file_stuff = file1.read()
    print(file_stuff)

你可以打印文件内容。你可以检查文件是否已关闭,但你不能在缩进块外读取它。不过,你仍然可以在缩进块外打印文件内容。

当我们检查原始字符串时,会看到 \n。这是 Python 用来表示换行的方式。

逐行读取文件

我们可以使用方法 .readlines() 将每一行输出为列表中的一个元素。第一行对应列表的第一个元素,第二行对应第二个元素,依此类推。

with open('example1.txt', 'r') as file1:
    file_stuff = file1.readlines()
    print(file_stuff)

我们可以使用方法 .readline() 来读取文件的第一行。如果我们运行此命令,它会将第一行存储在变量 file_stuff 中,然后打印第一行。

with open('example1.txt', 'r') as file1:
    file_stuff = file1.readline()
    print(file_stuff)

我们可以两次使用 .readline() 方法。第一次调用时,它会将第一行保存在变量 file_stuff 中,然后打印第一行。第二次调用时,它会将第二行保存在变量 file_stuff 中,然后打印第二行。

我们可以使用循环来单独打印每一行,如下所示。

with open('example1.txt', 'r') as file1:
    for line in file1:
        print(line)

读取指定数量的字符

我们可以将字符串中的每个字符想象成一个网格。我们可以通过向 .read() 方法传递一个参数,来指定要从字符串中读取的字符数量。

with open('example1.txt', 'r') as file1:
    print(file1.read(4))

当我们在 .read() 方法中使用参数 4 时,会打印出文件中的前四个字符。

每次调用该方法,我们都会在文本中前进。如果我们使用参数 16 调用该方法,会打印出前 16 个字符,然后是换行符。如果我们第二次调用该方法,会打印出接下来的五个字符。最后,如果我们最后一次调用该方法,参数为 9,则会打印出最后 9 个字符。

请查看实验部分,以获取更多关于方法和其他文件类型的示例。


本节课中,我们一起学习了如何使用 Python 的 open() 函数读取文件,包括使用 with 语句自动管理文件、读取全部内容、逐行读取以及读取指定数量的字符。这些是处理文件数据的基础操作。

078:使用open函数写入文件 📝

在本节课中,我们将学习如何使用Python的open函数向文件写入数据。我们将涵盖创建新文件、写入文本、追加内容以及复制文件等基本操作。


使用open函数写入文件

我们同样可以使用open函数来写入文件。

我们将使用Python的open函数获取一个文件对象,以创建一个文本文件。我们可以应用write方法将数据写入该文件。最终,文本将被写入文件中。

以下是创建文件example2.txt的步骤。我们使用open函数,第一个参数是文件路径,它由文件名组成。如果该文件已存在于您的目录中,它将被覆盖。我们将模式参数设置为"w"以表示写入。最后,我们获得文件对象。

与之前一样,我们使用with语句。代码将运行缩进块中的所有内容,然后关闭文件。我们创建文件对象file1

我们使用open函数。这将在您的目录中创建一个名为example2.txt的文件。我们使用write方法将数据写入文件。

该方法的参数是我们希望输入到文件中的文本。

如果我们连续使用write方法,每次调用时它都会写入文件。第一次调用时,我们将写入"this is line A\n",其中\n表示新的一行。第二次调用该方法时,它将写入"this is line B"。然后文件将被关闭。


将列表内容写入文件

我们可以将列表中的每个元素写入文件。

与之前一样,我们使用with命令和open函数来创建一个文件。列表lines包含三个文本元素。我们使用for循环读取列表lines的每个元素,并将其传递给变量line

循环的第一次迭代将列表的第一个元素写入文件example2。第二次迭代写入列表的第二个元素,依此类推。循环结束时,文件将被关闭。


追加模式

我们可以将模式设置为使用小写字母"a"的追加模式。这不会创建新文件,而是使用现有文件。如果我们调用write方法,它只会写入现有文件,然后添加"this is line C",最后关闭文件。


复制文件

我们可以按以下方式将一个文件复制到新文件。首先,我们读取文件example1并通过文件对象read_file与其交互。然后,我们创建一个新文件example3,并使用文件对象write_file与其交互。

for循环从文件对象read_file中读取一行,并使用文件对象write_file将其存储到文件example3中。第一次迭代复制第一行。第二次迭代复制第二行,直到文件结束。然后两个文件都将被关闭。


总结

在本节课中,我们一起学习了如何使用Python的open函数进行文件写入操作。我们掌握了创建新文件、写入文本、追加内容以及复制文件的基本方法。请查看实验部分以获取更多示例。

079:使用Pandas加载数据 📊

在本节课中,我们将要学习如何使用Python的Pandas库来加载和处理数据。Pandas是一个强大的数据分析库,它提供了简单易用的数据结构和数据分析工具,是进行数据科学和人工智能项目的基础。

概述:什么是依赖库?

依赖库或库是预先编写好的代码,用于帮助解决特定问题。在数据分析领域,Pandas是一个非常流行的库。

导入Pandas库

要使用Pandas,我们首先需要将其导入到Python环境中。我们使用import命令,后跟库的名称。

import pandas

执行此命令后,我们就可以访问Pandas中大量预构建的类和函数。这假设该库已经安装在我们的环境中。在本课程的实验环境中,所有必要的库都已预先安装。

为了简化代码,我们通常使用as语句为库创建一个简短的别名。对于Pandas,标准的别名是pd

import pandas as pd

现在,我们可以使用pd来调用Pandas的所有功能,这比每次都输入pandas要方便得多。

加载CSV文件

CSV(逗号分隔值)是一种常用于存储数据的文件格式。Pandas提供了read_csv()函数来读取这种文件。

以下是加载CSV文件的基本步骤:

  1. 指定CSV文件的路径。
  2. 使用pd.read_csv()函数读取文件。
  3. 将读取的结果存储在一个变量中,这个变量通常被称为数据框

path = ‘file.csv‘
df = pd.read_csv(path)

在上面的代码中:

  • path变量存储了CSV文件的路径。
  • pd.read_csv(path)是调用读取CSV文件的函数。
  • df是存储结果的变量,它是“data frame”(数据框)的缩写。

现在,数据已经加载到名为df的数据框中,我们可以开始对其进行操作。例如,使用.head()方法可以查看数据框的前五行。

df.head()

加载Excel文件

加载Excel文件的过程与加载CSV文件类似。我们使用read_excel()函数,并传入Excel文件的路径。

path = ‘file.xlsx‘
df_excel = pd.read_excel(path)

同样,结果df_excel也是一个Pandas数据框。

理解数据框

数据框是Pandas的核心数据结构,它由行和列组成,类似于一个电子表格或SQL表。

我们不仅可以从文件创建数据框,还可以直接从Python字典创建。在字典中,键(keys)对应数据框的列标签,值(values)是对应行的数据列表。

# 创建一个字典
data = {
    ‘Name‘: [‘Alice‘, ‘Bob‘, ‘Charlie‘],
    ‘Age‘: [25, 30, 35],
    ‘City‘: [‘New York‘, ‘London‘, ‘Tokyo‘]
}

# 将字典转换为数据框
df_from_dict = pd.DataFrame(data)

创建的数据框df_from_dict将直接反映字典的结构:键成为列标题,列表成为行数据。

从数据框中选择列

创建或加载数据框后,我们经常需要从中选择特定的列进行分析。

以下是选择单列的方法。我们使用数据框的名称,后跟用双括号括起来的列名。

single_column_df = df[[‘Column_Name‘]]

结果single_column_df是一个新的数据框,只包含原始数据框中的指定列。

同样,我们可以选择多列。只需在双括号内列出所有需要的列名。

multiple_columns_df = df[[‘Column1‘, ‘Column2‘, ‘Column3‘]]

结果multiple_columns_df是一个由指定列组成的新数据框。

总结

本节课中我们一起学习了Pandas库的基础知识。我们了解了如何导入Pandas库并使用别名pd,掌握了使用read_csv()read_excel()函数从文件加载数据到数据框的方法。我们还学习了数据框的基本概念,如何从字典创建数据框,以及如何从已有的数据框中选择单列或多列数据。这些是使用Pandas进行数据处理和分析的第一步。

080:Pandas数据处理与保存 📊

在本节课中,我们将学习如何使用Pandas库处理和保存数据。我们将重点介绍如何从数据框中提取唯一值、基于条件筛选数据,以及如何将处理后的结果保存到文件中。


上一节我们介绍了数据框的基本概念。本节中,我们来看看如何对数据框中的数据进行具体操作。

当我们拥有一个数据框时,我们可以处理其中的数据,并将结果保存为其他格式。

考虑一堆由13个不同颜色方块组成的积木。我们可以看到其中包含三种独特的颜色。

假设你想找出数据框某一列中有多少个唯一元素。当数据量从13个元素增加到数百万个时,这项任务会变得困难得多。

Pandas提供了 unique 方法来确定数据框某一列中的唯一元素。

假设我们想确定数据集中专辑发行年份的唯一值。我们输入数据框的名称,然后在方括号内输入列名 released。接着,我们应用 unique 方法。结果就是 released 列中的所有唯一元素。

以下是获取唯一值的代码示例:

unique_years = df['released'].unique()

假设我们想创建一个由1980年代歌曲组成的新数据库。我们可以先查看 released 列中发行年份晚于1979年的歌曲,然后选择对应的行。

我们可以在Pandas中用一行代码完成这个操作,但让我们先分解步骤。

我们可以在Pandas中对整个数据框使用不等式运算符。结果是一个布尔值序列。在我们的例子中,我们只需指定 released 列以及“晚于1979年”的不等式条件。结果是一个布尔值序列,当条件为真时结果为 True,否则为 False

以下是创建布尔掩码的代码示例:

mask = df['released'] > 1979

我们可以在一行代码中选择指定的列。我们只需使用数据框的名称,并在方括号中放入前面提到的不等式条件,然后将其赋值给变量 DF1。现在,我们得到了一个新的数据框,其中每张专辑的发行年份都晚于1979年。

以下是筛选数据的代码示例:

DF1 = df[df['released'] > 1979]

我们可以使用 to_csv 方法保存新的数据框。参数是CSV文件的名称。请确保包含 .csv 扩展名。还有其他函数可以将数据框保存为其他格式。

以下是保存数据框的代码示例:

DF1.to_csv('songs_after_1979.csv')

本节课中,我们一起学习了如何使用Pandas的 unique 方法查找列中的唯一值,如何通过布尔索引基于条件筛选数据行,以及如何使用 to_csv 方法将处理后的数据框保存为CSV文件。这些是数据清洗和预处理中的基础且重要的操作。

081:一维NumPy入门 🧮

在本节课中,我们将学习NumPy库的基础知识,特别是关于一维数组(1D Numpy Arrays)的内容。NumPy是科学计算的核心库,也是Pandas等高级工具的基础。我们将从数组创建开始,逐步学习索引、切片以及各种数组操作。


概述 📋

NumPy是一个用于科学计算的Python库。它提供了高性能的多维数组对象,以及用于处理这些数组的工具。与原生Python列表相比,NumPy数组在速度和内存效率上具有显著优势,是数据科学和人工智能领域的基石。


创建NumPy数组

上一节我们介绍了NumPy的重要性,本节中我们来看看如何创建一个NumPy数组。

Python列表是一种可以存储和访问数据的容器。每个元素都与一个索引相关联。

# Python列表示例
a = [0, 1, 2, 3, 4]

我们可以使用方括号来访问每个元素。

NumPy数组(或ND数组)与列表类似,但通常大小固定,且每个元素都是相同的数据类型(例如,都是整数)。

我们可以通过首先导入NumPy库,然后将列表转换为NumPy数组。

import numpy as np
# 将列表转换为NumPy数组
a = np.array([0, 1, 2, 3, 4])

我们可以通过索引访问数据,就像列表一样。

数组 a 在内存中的存储形式如下。如果我们检查数组的类型,会得到 numpy.ndarray

type(a) # 输出:numpy.ndarray

由于NumPy数组包含相同类型的数据,我们可以使用属性 dtype 来获取数组元素的数据类型。

a.dtype # 输出:dtype('int64')

在这个例子中,数据类型是64位整数。


数组属性

让我们使用数组 a 来回顾一些基本的数组属性。

属性 size 表示数组中元素的数量。因为有五个元素,所以结果是5。

a.size # 输出:5

当我们学习更高维度时,下面两个属性的意义会更明显,但让我们先了解一下。
属性 ndim 表示数组的维数或秩(rank),在这个一维数组的例子中,结果是1。

a.ndim # 输出:1

属性 shape 是一个整数元组,表示数组在每个维度上的大小。

a.shape # 输出:(5,)

我们可以创建包含实数的NumPy数组。当我们检查数组类型时,同样得到 numpy.ndarray

b = np.array([3.1, 11.02, 6.2, 213.2, 5.2])

如果我们检查属性 dtype,会看到 float64,因为元素不是整数。

NumPy还有许多其他属性,可以访问 numpy.org 查看更多信息。


索引与切片

现在,我们来看看一些索引和切片的方法。

我们可以如下更改数组的第一个元素为100。

a[0] = 100

数组的第一个值现在是100。我们也可以更改数组的第五个元素。

a[4] = 0

与列表和元组类似,我们可以对NumPy数组进行切片。数组的元素对应以下索引。

我们可以选择索引1到3的元素,并将其赋值给一个新的NumPy数组 c

c = a[1:4]

这些元素确实对应于索引1、2、3。和列表一样,切片不包含结束索引对应的元素。

我们可以为相应的索引分配新值,如下所示。数组 c 现在有了新的值。

c[0:2] = 300, 400

更多关于NumPy索引和切片的例子,可以参考实验或 numpy.org


数组的基本运算

NumPy使得数据科学中常见的许多操作变得更加容易。与常规Python相比,这些相同的操作在NumPy中通常计算速度更快,且需要的内存更少。

让我们回顾一下一维数组上的一些操作。为了使内容更有趣,我们将在欧几里得向量(Euclidean Vectors)的背景下探讨许多运算。

向量加法

向量加法是数据科学中广泛使用的操作。考虑具有两个元素的向量 u。同样,考虑具有两个分量的向量 v。在向量加法中,我们创建一个新向量 z

向量 z 的第一个分量是向量 uv 的第一个分量之和。类似地,第二个分量是 uv 的第二个分量之和。这个新向量 z 现在是向量 uv 的线性组合。

使用NumPy,我们可以用一行代码执行向量加法。

u = np.array([1, 0])
v = np.array([0, 1])
z = u + v # 输出:array([1, 1])

如果使用Python列表,则需要多行代码,并且NumPy代码运行速度会快得多,这在处理大量数据时非常重要。

向量减法

我们也可以通过将加号改为减号来执行向量减法。

z = u - v # 输出:array([ 1, -1])

在Python列表上执行向量减法需要多行代码。

标量乘法

向量与标量的乘法是另一个常用操作。考虑向量 y。我们只需将向量乘以一个标量值,例如2。向量的每个分量都乘以2。

使用NumPy,标量乘法只需要一行代码。

y = np.array([1, 2])
z = 2 * y # 输出:array([2, 4])

如果使用Python列表执行相同任务,则需要多行代码,而且操作速度也会慢得多。

哈达玛积(逐元素乘积)

哈达玛积(Hadamard Product)是数据科学中另一个广泛使用的操作。考虑两个向量 uv,它们的哈达玛积是一个新向量 zz 的第一个分量是 uv 的第一个元素的乘积。类似地,第二个分量是第二个元素的乘积。

我们也可以用NumPy的一行代码执行哈达玛积。

u = np.array([1, 2])
v = np.array([3, 2])
z = u * v # 输出:array([3, 4])

在两个列表上执行哈达玛积需要多行代码。

点积

点积是数据科学中另一个广泛使用的操作。考虑向量 uv。点积是一个由以下项给出的单个数字,表示两个向量的相似程度。

我们也可以使用NumPy的函数 dot 来执行点积。

result = np.dot(u, v) # 输出:7


通用函数与广播

考虑数组 u。如果我们在数组上加一个标量值,NumPy会将该值加到每个元素上。这个特性被称为广播(Broadcasting)。

u = np.array([1, 2, 3, -1])
z = u + 1 # 输出:array([2, 3, 4, 0])

通用函数(Universal Function)是一种对ND数组进行操作的函数。

我们可以将通用函数应用于NumPy数组。考虑数组 a,我们可以使用方法 mean 计算所有元素的平均值。

a = np.array([1, -1, 1, -1])
mean_a = a.mean() # 输出:0.0

这对应于所有元素的平均值。在这个例子中,结果是0。

还有许多其他函数。例如,考虑NumPy数组 b,我们可以使用方法 max 找到最大值。

b = np.array([1, 2, 3, 4, 5])
max_b = b.max() # 输出:5

我们看到最大值是5,因此 max 方法返回5。


使用NumPy进行数学计算与绘图

我们可以使用NumPy创建将NumPy数组映射到新NumPy数组的函数。

我们可以在NumPy中按如下方式访问π的值。我们可以创建以下以弧度为单位的NumPy数组。

x = np.array([0, np.pi/2, np.pi])

这个数组对应一个向量。我们可以将函数 sin 应用于数组 x,并将值赋给数组 y。这会将正弦函数应用于数组中的每个元素。

结果是一个新的数组 y,其中每个值对应于对数组 x 中每个元素应用正弦函数的结果。

用于绘制数学函数的一个有用函数是 linspacelinspace 在指定区间内返回均匀间隔的数字。

我们指定序列的起点、终点。参数 num 表示要生成的样本数量。

# 生成5个从-2到2的均匀间隔数字
np.linspace(-2, 2, num=5)
# 生成9个从-2到2的均匀间隔数字
np.linspace(-2, 2, num=9)

我们可以使用 linspace 函数从区间0到2π生成100个均匀间隔的样本。

x = np.linspace(0, 2*np.pi, num=100)

我们可以使用NumPy函数 sin 将数组 x 映射到一个新数组 y

y = np.sin(x)

我们可以导入库 matplotlib.pyplot 来帮助我们绘制函数。

import matplotlib.pyplot as plt
# 在Jupyter Notebook中使用的命令
%matplotlib inline
plt.plot(x, y)

第一个输入对应于水平轴(X轴)的值,第二个输入对应于垂直轴(Y轴)的值。

关于NumPy,你还可以做更多事情。可以查看 numpy.org 上的实验或文档以获取更多信息。


总结 🎯

在本节课中,我们一起学习了NumPy一维数组的基础知识。我们从如何创建和转换数组开始,了解了数组的基本属性(如 sizeshapedtype)。接着,我们探索了索引、切片以及如何修改数组元素。

然后,我们深入学习了NumPy强大的数组运算能力,包括向量加法、减法、标量乘法、哈达玛积和点积,并理解了NumPy在效率和简洁性上的优势。我们还介绍了广播机制和通用函数,它们使得对数组的整体操作变得非常简单。

最后,我们了解了如何使用 linspace 生成数值序列,并结合 matplotlib 进行简单的函数绘图,展示了NumPy在科学计算和可视化中的实际应用。

掌握一维NumPy数组是理解更高维数据和进行复杂数据操作的第一步,它为后续学习更高级的数据分析工具(如Pandas)奠定了坚实的基础。

082:二维NumPy数组 🧮

在本节课中,我们将学习如何创建和使用二维NumPy数组。我们将涵盖二维数组的基础知识、创建方法、索引与切片技术以及基本运算操作。

概述

我们可以创建多维的NumPy数组。本节将重点介绍二维数组,但NumPy同样可以构建更高维度的数组。

二维数组的创建与可视化

考虑列表 A。该列表包含三个嵌套列表,每个列表大小相等。为了简化,每个列表用不同颜色标记。我们可以将此列表转换为NumPy数组,如下所示:

import numpy as np
A = [[11, 12, 13], [21, 22, 23], [31, 32, 33]]
A = np.array(A)

将NumPy数组可视化为矩形阵列很有帮助。每个嵌套列表对应矩阵中的一行。

数组属性:维度、形状与大小

我们可以使用属性 ndim 来获取数组的轴数或维度数,这被称为秩(rank)。这里的“秩”并非指矩阵中线性无关列的数量,而是指嵌套列表的层数。第一个列表代表第一个维度,它内部包含的另一组列表则代表第二个维度或轴。

与一维数组类似,属性 shape 返回一个元组。使用矩形表示法有助于理解:元组的第一个元素对应原始列表中嵌套列表的数量(即矩形表示中的行数),第二个元素对应每个嵌套列表的大小(即矩形阵列中的列数)。例如,对于上述数组 AA.shape 返回 (3, 3)

我们还可以使用属性 size 获取数组的总元素数。行数与列数相乘即可得到总元素数,本例中为 9

建议在实验环节尝试不同形状的数组并查看其他属性。

二维数组的索引

我们可以使用方括号访问数组的不同元素。下图展示了列表式表示法与索引约定之间的关系:

第一个括号内的索引对应不同颜色的嵌套列表(即行),第二个括号内的索引对应嵌套列表内特定元素的位置(即列)。

使用矩形表示法时,第一个索引对应行索引,第二个索引对应列索引。

我们也可以使用单个括号进行访问,但通常使用两个索引更清晰。

示例1: 语法 A[1, 2]。索引 1 对应第二行,索引 2 对应第三列,其值为 23

示例2: 语法 A[0][0]。第一个索引 0 对应第一行,第二个索引 0 对应第一列,其值为 11

二维数组的切片

我们也可以在NumPy数组中使用切片。

示例1: A[0, 0:2]

  • 第一个索引 0 对应第一行。
  • 第二个索引 0:2 访问前两列。

示例2: A[0:2, 2]

  • 第一个索引 0:2 对应前两行。
  • 第二个索引 2 访问最后一列。

二维数组的基本运算

上一节我们介绍了如何访问数组元素,本节中我们来看看对数组进行的基本数学运算。

数组加法

数组相加的过程与矩阵加法相同。考虑矩阵 X 和矩阵 Y,每个元素用不同颜色标记。矩阵相加即是将相同位置(相同颜色框)的元素相加。结果是一个与 XY 大小相同的新矩阵,其中每个元素是 XY 中对应元素的和。

在NumPy中,我们定义数组 XY,然后直接相加:

X = np.array([[1, 0], [0, 1]])
Y = np.array([[2, 1], [1, 2]])
Z = X + Y  # 结果与矩阵加法相同

数组与标量的乘法

将NumPy数组乘以标量与将矩阵乘以标量相同。考虑矩阵 Y,将其乘以标量 2,即简单地将矩阵中的每个元素乘以 2。结果是一个大小相同的新矩阵,其中每个元素都变为原来的两倍。

在NumPy中:

Y = np.array([[2, 1], [1, 2]])
Z = 2 * Y  # 或 Y * 2

数组的逐元素乘法(哈达玛积)

两个数组的乘法对应逐元素乘积,即哈达玛积(Hadamard Product)。考虑数组 XY,哈达玛积即是将相同位置(相同颜色框)的元素相乘。结果是一个与 XY 大小相同的新矩阵,其中每个元素是 XY 中对应元素的乘积。

在NumPy中,我们可以用一行代码计算两个数组 XY 的乘积:

X = np.array([[1, 0], [0, 1]])
Y = np.array([[2, 1], [1, 2]])
Z = X * Y  # 结果与哈达玛积相同

矩阵乘法

我们也可以使用NumPy数组执行矩阵乘法。矩阵乘法稍微复杂一些,以下是基本概述。

考虑矩阵 A(每行用不同颜色标记)和矩阵 B(每列用不同颜色标记)。在线性代数中,在将矩阵 A 乘以矩阵 B 之前,必须确保矩阵 A 的列数(本例中为3)等于矩阵 B 的行数(本例中为3)。

为了得到新矩阵的第 i 行、第 j 列元素,我们取 A 的第 i 行与 B 的第 j 列的点积。

计算过程示例:

  • 对于新矩阵的第一行第一列:取 A 的第一行与 B 的第一列的点积,结果为 0
  • 对于新矩阵的第一行第二列:取 A 的第一行与 B 的第二列的点积,结果为 2
  • 对于新矩阵的第二行第一列:取 A 的第二行与 B 的第一列的点积,结果为 0
  • 对于新矩阵的第二行第二列:取 A 的第二行与 B 的第二列的点积,结果为 2

在NumPy中,我们可以定义数组 AB,然后执行矩阵乘法:

A = np.array([[0, 1, 1], [1, 0, 1]])
B = np.array([[1, 1], [1, 1], [-1, 1]])
C = np.dot(A, B)  # 或使用 A @ B
# 结果数组 C 对应数组 A 和 B 的矩阵乘法结果

总结

本节课中我们一起学习了二维NumPy数组的核心知识。我们了解了如何从嵌套列表创建二维数组,并掌握了其维度(ndim)、形状(shape)和大小(size)等关键属性。我们深入探讨了如何使用行索引和列索引来访问或切片数组中的特定元素。最后,我们学习了二维数组的基本运算,包括类似矩阵的加法、与标量的乘法、逐元素乘法(哈达玛积)以及真正的矩阵乘法。NumPy的功能远不止于此,建议访问 numpy.org 探索更多内容。

083:简单API 第1部分 🚀

在本节课中,我们将学习应用程序接口,简称API。我们将探讨API是什么、API库、REST API(包括请求和响应),并通过一个使用Pycoin Gecko的实例来加深理解。

什么是API?🤔

API让两个软件组件能够相互通信。例如,你有一个程序、一些数据以及其他软件组件。你可以通过API,利用输入和输出来与其他软件通信。这就像一个函数,你无需了解API的内部工作原理,只需知道其输入和输出即可。

Pandas库实际上就是一组软件组件,其中许多甚至不是用Python编写的。你有一些数据和一组软件组件,通过Pandas API与其他软件组件通信来处理数据。

API库示例:Pandas 📊

让我们通过一个图表来理清概念。当你创建一个字典,然后使用DataFrame构造函数创建一个Pandas对象时,这在API术语中称为一个实例。字典中的数据被传递给Pandas API。然后,你使用这个DataFrame对象与API通信。

以下是使用Pandas API的典型步骤:

  1. 创建数据字典并实例化DataFrame。
  2. 调用head方法时,DataFrame与API通信,显示数据的前几行。
  3. 调用mean方法时,API会计算平均值并返回结果。
import pandas as pd

# 1. 创建数据字典并实例化DataFrame
data = {'列A': [1, 2, 3], '列B': [4, 5, 6]}
df = pd.DataFrame(data)  # 这是一个API实例

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/f75816e32539b63ac59bf25994edd58d_11.png)

# 2. 使用head方法
print(df.head())

# 3. 使用mean方法
print(df.mean())

理解REST API 🌐

上一节我们介绍了通用的API概念,本节中我们来看看另一种流行的API类型:REST API。REST API允许你通过互联网进行通信,从而利用远程资源,如存储空间、更多数据、人工智能算法等。

REST代表表征状态转移。在REST API中,你的程序被称为客户端。API通过互联网与你调用的Web服务进行通信。通信遵循一套关于输入(即请求)和输出(即响应)的规则。

以下是REST API中的一些常见术语:

  • 客户端:指你或你的代码。
  • 资源:指Web服务。
  • 端点:客户端通过端点找到服务(我们将在下一节详细讨论)。
  • 请求:客户端发送给资源的信息。
  • 响应:资源返回给客户端的信息。

HTTP方法与请求响应 🔄

我们通过发送请求来告诉REST API要执行什么操作。请求通常通过HTTP消息传输,该消息通常包含一个JSON文件,其中包含我们希望服务执行的操作指令。这个操作通过互联网传输到Web服务,服务执行操作。

类似地,Web服务通过HTTP消息返回响应,信息通常以JSON文件形式返回,并传输回客户端。

实践:使用Pycoin Gecko API获取加密货币数据 💹

加密货币数据非常适合用于API实践,因为它不断更新且对交易至关重要。我们将使用Pycoin Gecko(CoinGecko API的Python客户端或封装器)来获取数据,该数据由CoinGecko每分钟更新。

我们使用这个封装器是因为它易于使用,让你可以专注于数据收集任务。我们还将介绍Pandas的时间序列函数来处理时间序列数据。

使用Pycoin Gecko收集数据很简单,只需三个步骤:

  1. 安装并导入库。
  2. 创建一个客户端对象。
  3. 使用函数请求数据。

在下面的函数调用中,我们获取比特币过去30天以美元计价的数据。响应是一个JSON文件,在Python中表示为嵌套列表的字典,包含价格、市值和总交易量等数据,其中包含Unix时间戳和对应时间点的价格。

# 示例代码结构
from pycoingecko import CoinGeckoAPI
import pandas as pd

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/f75816e32539b63ac59bf25994edd58d_23.png)

# 1. 创建客户端实例
cg = CoinGeckoAPI()

# 2. 请求数据
bitcoin_data = cg.get_coin_market_chart_by_id(id='bitcoin', vs_currency='usd', days=30)
# bitcoin_data 是一个包含‘prices’等键的字典

我们只关注价格数据,因此使用键'prices'来选取。为了简化操作,我们可以将嵌套列表转换为具有timestampprice两列的DataFrame。

时间戳列不易阅读,我们将使用Pandas的to_datetime函数将其转换为更可读的格式。通过此函数,我们创建可读的时间数据,输入是时间戳列,时间单位设置为毫秒。我们将输出附加到新的date列。

为了绘制K线图,我们需要获取每日的K线数据。我们将按日期分组,找出每日的最低、最高、开盘(首笔)和收盘(末笔)价格。

最后,我们将使用Plotly库创建K线图并进行绘制。现在,我们可以通过打开生成的HTML文件并在浏览器标签页左上方点击“信任HTML”来查看K线图。

总结 📝

本节课我们一起学习了API的核心概念。我们首先了解了API如何作为软件组件间的通信桥梁,然后以Pandas为例探讨了API库的使用。接着,我们深入介绍了允许通过互联网进行通信的REST API,包括其客户端-服务器模型以及请求与响应的过程。最后,我们通过一个实际的Pycoin Gecko API案例,演示了如何获取、处理加密货币数据并绘制K线图,将理论应用于实践。

084:简单API 第2部分 🎤➡️📝➡️🌍

在本节课中,我们将学习如何使用集成人工智能的应用程序接口。具体来说,我们将通过两个IBM Watson服务来实践:首先,使用语音转文本API将音频文件转录为文字;然后,使用语言翻译API将转录出的文本翻译成另一种语言。


理解API调用流程 🔄

上一节我们介绍了API的基本概念,本节中我们来看看一个结合了AI服务的具体API调用流程。

整个过程涉及两次API调用:

  1. 将音频文件发送给语音转文本API进行转录。
  2. 将得到的文本发送给语言翻译API进行翻译。

以下是这个流程的详细步骤:

  • 第一步:发送音频文件。你向语音转文本API发送一份音频文件的副本。这种发送数据的请求通常被称为 POST请求




  • 第二步:接收转录文本。API在后台处理音频,并将说话内容的文本转录结果返回给你。这个返回数据的请求可以理解为 GET请求

  • 第三步:发送文本进行翻译。你将希望翻译的文本发送给第二个API,即语言翻译API。

  • 第四步:接收翻译结果。API翻译文本,并将翻译后的内容返回给你。在本例中,我们实现的是英语到西班牙语的翻译。


API密钥与端点概述 🔑

在开始动手实验之前,我们需要理解两个关键概念:API密钥和端点。它们是访问Watson语音转文本和翻译服务的前提。

  • API密钥:这是访问API的凭证。它是一串独特的字符,API用它来识别和授权你的身份。通常,你的第一次API调用就需要包含这个密钥。由于许多API会按调用次数收费,因此API密钥应像密码一样妥善保管,避免泄露。




  • 端点:这指的是服务的位置,用于在互联网上找到该API,就像一个网址。

实践:使用Watson语音转文本API转录音频 🎧➡️📄

现在,我们来看看如何使用Watson语音转文本API来转录一个音频文件。

开始实验前,你需要先注册获取API密钥。我们会将一个音频文件下载到你的工作目录中。

以下是实现转录的步骤:

  1. 导入库并设置认证。首先,从ibm_watson库导入SpeechToTextV1模块。服务端点根据服务实例的位置而定,你需要将其存储在变量中(例如url_s2t)。查看服务凭证即可找到应使用的URL。同样,你也需要获取并设置你的API密钥。

    from ibm_watson import SpeechToTextV1
    url_s2t = “你的服务端点URL”
    iam_apikey_s2t = “你的API密钥”
    
  2. 创建服务对象。使用端点和API密钥作为参数,创建一个语音转文本适配器对象。你将通过这个对象与Watson语音转文本服务进行通信。

    speech_to_text = SpeechToTextV1(iam_apikey=iam_apikey_s2t, url=url_s2t)
    
  3. 读取音频文件。指定要转换的WAV文件路径。使用open()函数以二进制读取模式(‘rb’)创建文件对象,这使我们可以访问包含音频的WAV文件。

    with open(‘audio_file.wav’, ‘rb’) as wav_file:
        audio_data = wav_file.read()
    

  1. 调用API并获取结果。使用适配器对象的recognize()方法,这会将音频文件发送给Watson服务。参数包括音频数据(audio)和音频文件格式(content_type)。服务返回的响应存储在response对象中。

    response = speech_to_text.recognize(audio=audio_data, content_type=‘audio/wav’).get_result()
    
  2. 提取转录文本。响应结果(response)是一个Python字典。其‘results’键对应的值是一个列表,列表中包含字典。我们关注其中的‘transcript’键。可以将其赋值给一个变量,例如recognized_text,这个变量现在包含了转录后的文本字符串。

    recognized_text = response[‘results’][0][‘alternatives’][0][‘transcript’]
    

实践:使用Watson语言翻译API翻译文本 📝➡️🗣️

接下来,我们学习如何用Watson语言翻译器来翻译上一步得到的文本。

  1. 导入库并设置认证。首先,从ibm_watson库导入LanguageTranslatorV3。将服务端点赋值给变量(如url_lt),并获取对应的API密钥。此API请求还需要指定版本日期,请参考文档。

    from ibm_watson import LanguageTranslatorV3
    url_lt = “你的翻译服务端点URL”
    apikey_lt = “你的翻译API密钥”
    version_lt = ‘2018-05-01’
    
  2. 创建翻译器对象。使用上述信息创建语言翻译器对象。

    language_translator = LanguageTranslatorV3(iam_apikey=apikey_lt, url=url_lt, version=version_lt)
    
  3. 获取可识别语言列表(可选)。你可以获取服务支持的语言列表,方法返回语言代码。例如,英语的代码是‘en’,西班牙语是‘es’

    languages = language_translator.list_identifiable_languages().get_result()
    
  4. 执行翻译。使用translate()方法翻译文本。结果是一个详细的响应对象。参数text是要翻译的文本,model_id指定使用的翻译模型。例如,设为‘en-es’表示从英语翻译到西班牙语。

    translation_response = language_translator.translate(text=recognized_text, model_id=‘en-es’).get_result()
    
  5. 提取翻译结果。响应结果是一个字典,包含翻译文本、字数、字符数等信息。我们可以获取翻译文本并赋值给变量,例如spanish_translation

    spanish_translation = translation_response[‘translations’][0][‘translation’]
    
  6. 进行其他翻译。利用得到的变量,我们可以轻松地将文本翻译回英语,或者翻译成其他语言,比如法语。

    # 翻译回英语
    translation_back = language_translator.translate(text=spanish_translation, model_id=‘es-en’).get_result()
    english_back = translation_back[‘translations’][0][‘translation’]
    
    # 翻译成法语
    translation_french = language_translator.translate(text=recognized_text, model_id=‘en-fr’).get_result()
    french_text = translation_french[‘translations’][0][‘translation’]
    


总结 📚

本节课中,我们一起学习了如何串联使用两个AI服务的API来完成一个实际任务。我们首先了解了API调用的基本流程,包括POST请求和GET请求。然后,我们掌握了访问API的两个关键要素:API密钥和端点。最后,我们通过实践,逐步实现了使用IBM Watson的语音转文本API将音频转录为文字,再使用语言翻译API将文字翻译成其他语言的过程。通过本课,你应该对如何调用和组合不同的云AI服务有了更直观的认识。

085:REST API与HTTP请求详解(第一部分)🌐

在本节课中,我们将深入探讨HTTP协议,特别是统一资源定位符(URL)以及HTTP请求与响应的基本结构。这是理解REST API如何工作的基础。

上一节我们简要介绍了REST API。HTTP协议可以被视为在网络上传输信息的通用协议,它承载了包括REST API在内的多种网络通信。回想一下,REST API的工作原理是发送一个请求,而这个请求是通过HTTP消息进行通信的,该消息通常包含一个JSON文件。

HTTP请求与响应流程 🔄

当你(客户端)访问一个网页时,你的浏览器会向托管该网页的服务器发送一个HTTP请求。服务器会尝试查找所请求的资源(默认是index.html)。如果请求成功,服务器会在HTTP响应中将目标对象发送回客户端。响应中包含了资源类型、资源长度等信息。

下图中的表格代表了Web服务器上存储的资源列表,例如一个HTML文件、一个PNG图像和一个文本文件。当请求信息时,Web服务器会发送所请求的文件。

理解URL 🧭

统一资源定位符(URL)是在网络上定位资源最常用的方式。我们可以将URL分解为三个部分:

  • 协议:这是使用的协议。在本实验中,它始终是 http://
  • 网络地址或基础URL:用于定位服务器。例如 www.ibm.comwww.gitlab.com
  • 路径:资源在Web服务器上的具体位置。例如 /images/IBM_logo.png

剖析HTTP消息 📦

让我们回顾一下请求和响应的过程。以下是一个使用GET请求方法的请求消息示例(还有其他HTTP方法可用)。

请求消息示例:

GET /index.html HTTP/1.1
Host: www.example.com
  • 起始行:包含GET方法(一种HTTP方法),请求的文件/index.html,以及协议版本HTTP/1.1
  • 请求头:传递HTTP请求的附加信息。在GET方法中,请求头可能为空。某些请求会包含请求体,我们稍后会举例。
  • 请求体:在GET请求中通常为空。

响应消息示例:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<!DOCTYPE html><html>...</html>
  • 响应起始行:包含版本号HTTP/1.1,后跟状态码200(表示成功)和描述短语OK
  • 响应头:包含元信息,例如Content-TypeContent-Length
  • 响应体:包含实际的资源文件,在本例中是一个HTML文档。

HTTP状态码分类 📊

让我们看看其他的状态码。状态码前缀表明了其类别:

  • 1xx(信息响应):例如100,表示一切正常,请求正在继续处理。
  • 2xx(成功响应):例如200,表示请求已成功。
  • 4xx(客户端错误):表示请求有问题。例如401表示请求未授权。
  • 5xx(服务器错误):表示服务器处理请求时出错。例如501表示功能未实现。

HTTP方法概述 ⚙️

当发起一个HTTP请求时,会发送一个HTTP方法,它告诉服务器要执行什么操作。以下是几种常见的HTTP方法:

  • GET:从服务器检索数据。
  • POST:向服务器发送数据。
  • PUT:更新服务器上的资源。
  • DELETE:删除服务器上的资源。

在下一个视频中,我们将使用Python来实践GET方法(从服务器检索数据)和POST方法(向服务器发送数据)。

总结 📝

本节课我们一起学习了HTTP协议的基础知识。我们了解了URL的构成、HTTP请求与响应的完整结构(包括起始行、头部和主体),熟悉了不同类别的HTTP状态码所代表的含义,并认识了主要的HTTP方法(如GET和POST)。这些概念是理解和使用REST API的基石,在接下来的实践中,我们将运用这些知识通过代码与API进行交互。

086:REST API HTTP请求 第2部分 🚀

在本节课中,我们将学习如何使用Python的Requests库来处理HTTP协议。我们将重点介绍GET请求和POST请求,并通过实际例子展示如何发送请求、处理响应以及理解请求与响应的关键组成部分。


概述:Python Requests库

上一节我们介绍了HTTP协议的基础知识。本节中,我们来看看如何在Python中实际使用HTTP协议,特别是通过一个名为requests的流行库。

requests是Python中一个用于发送HTTP/1.1请求的库,它比标准库中的httpliburllib等更易于使用。

以下是导入该库并发送一个简单GET请求的方法:

import requests

r = requests.get('https://www.ibm.com')

变量r是一个响应对象,它包含了关于此次请求的所有信息,例如请求的状态。


解析HTTP响应

发送请求后,我们需要理解服务器返回的响应。响应对象提供了多种属性来访问这些信息。

我们可以查看状态码,状态码200通常表示请求成功:

print(r.status_code)  # 输出:200

我们可以查看响应头,它包含了服务器返回的元数据:

print(r.headers)

响应头是一个Python字典。例如,我们可以获取服务器发送响应的日期:

print(r.headers['date'])

对于GET请求,通常没有请求体,因此r.request.body的值为None

print(r.request.body)  # 输出:None

如果响应内容是文本或HTML,我们可以使用.text属性来查看:

print(r.text[:100])  # 打印前100个字符


使用GET请求发送查询参数

GET请求常用于从服务器检索数据,我们可以在URL中添加查询参数来过滤或指定所需的数据。

查询字符串是URL的一部分,以问号?开始,后面跟着一系列参数=值对,每对之间用&符号分隔。

例如,以下URL包含两个参数:
https://httpbin.org/get?name=Joseph&id=123

在Python中,我们可以使用字典来构建查询参数,并将其传递给get方法的params参数:

import requests

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/321dfcc24456f2c479328def63705ddb_34.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/321dfcc24456f2c479328def63705ddb_35.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/321dfcc24456f2c479328def63705ddb_36.png)

url_get = 'https://httpbin.org/get'
payload = {'name': 'Joseph', 'id': '123'}

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/321dfcc24456f2c479328def63705ddb_38.png)

r = requests.get(url_get, params=payload)

我们可以打印出最终构造的URL,以确认参数已正确添加:

print(r.url)  # 输出:https://httpbin.org/get?name=Joseph&id=123

由于信息是通过URL发送的,GET请求的请求体仍然是None。我们可以检查状态码并查看JSON格式的响应内容:

print(r.status_code)  # 输出:200
print(r.json())  # 将响应内容解析为Python字典

在返回的JSON字典中,args键对应的值就是我们发送的查询参数字典。


使用POST请求发送数据

与GET请求不同,POST请求通常用于向服务器提交数据,数据被放置在请求体中,而不是URL里。

为了发送POST请求,我们需要将端点路径改为/post,并将数据字典传递给post方法的data参数。

以下是发送POST请求的示例:

import requests

url_post = 'https://httpbin.org/post'
payload = {'name': 'Joseph', 'id': '123'}

r_post = requests.post(url_post, data=payload)

比较GET与POST请求

理解GET和POST请求的区别至关重要。让我们比较一下它们的URL和请求体。

比较URL:POST请求的URL中不包含查询参数。

print("GET请求URL:", r.url)      # 包含参数
print("POST请求URL:", r_post.url) # 不包含参数

比较请求体:只有POST请求拥有非空的请求体。

print("GET请求体:", r.request.body)      # 输出:None
print("POST请求体:", r_post.request.body) # 输出:name=Joseph&id=123

在POST请求的JSON响应中,我们可以通过form键来获取我们发送的数据:

print(r_post.json()['form'])  # 输出:{'name': 'Joseph', 'id': '123'}


总结

本节课中我们一起学习了如何使用Python的requests库进行HTTP通信。我们掌握了如何发送基本的GET请求来获取网页内容,以及如何通过查询字符串向GET请求添加参数。我们还学习了如何使用POST请求向服务器提交数据,并理解了GET与POST在数据传递位置(URL vs 请求体)上的核心区别。这些是构建与Web API交互的应用程序的基础技能。

087:网络抓取的可选HTML基础 📄

在本节课中,我们将学习超文本标记语言(HTML)的基础知识,这是进行网络抓取的关键。理解HTML的结构能帮助我们使用Python等工具从网页中提取有用信息,例如房地产价格或编程问题的解决方案。

概述

本节课将回顾HTML的基本构成。我们将分析一个基础网页的HTML结构,了解HTML标签的组成、HTML文档树的概念,并学习如何识别HTML表格。掌握这些知识是后续使用自动化工具提取网页数据的前提。

网页的HTML构成

假设我们需要从一个国家篮球联盟的网页中找出球员的姓名和薪水。该网页由HTML代码构成。HTML由一系列被尖括号包围的蓝色文本元素(称为标签)以及标签内的文本组成。标签告诉浏览器如何显示内容,而我们所需的数据就包含在这些文本中。

代码的第一部分包含文档类型声明 <!DOCTYPE html>,它声明此文档是一个HTML文档。<html> 元素是HTML页面的根元素。<head> 元素包含关于HTML页面的元信息。接下来是 <body>,这是在网页上显示的内容,通常也是我们感兴趣的数据所在。

我们看到带有 <h3> 标签的元素,这表示三级标题,会使文本变大加粗。这些标签内包含了球员的姓名。请注意,数据被包裹在元素中,它以 <h3> 开始,以 </h3> 结束。

还有一个不同的标签 <p>,表示段落。<p> 标签包含球员的薪水。

HTML标签的组成

上一节我们看到了HTML标签如何包裹数据,本节我们来仔细看看一个HTML标签的具体构成。以下是一个HTML锚点标签的例子:

<a href="https://www.ibm.com">IBM</a>

它将在页面上显示“IBM”,当你点击它时,会跳转到 ibm.com

  • 标签名称:在这个例子中是 a。这个标签定义了一个超链接,用于从一个页面链接到另一个页面。将每个标签名称想象成Python中的一个类,而每个单独的标签则是该类的一个实例,会很有帮助。
  • 开始标签与结束标签:我们有开始标签 <a> 和结束标签 </a>。结束标签在标签名称前有一个斜杠 /。这些标签包含了要显示在网页上的内容,本例中是“IBM”。
  • 属性:属性由属性名和属性值组成。本例中是 href="https://www.ibm.com",它是目标网页的URL。

真实的网页更为复杂。根据你使用的浏览器,你可以选择HTML元素并点击“检查”,结果将使你能够查看该元素的HTML代码。网页中还有其他类型的内容,如CSS和JavaScript,本课程将不涉及。

HTML文档树

实际的HTML文档可以被称为文档树。让我们看一个简单的例子。标签可以包含字符串和其他标签,这些元素就是该标签的子元素。我们可以将其表示为一棵家族树,每个嵌套的标签都是树中的一个层级。

考虑以下简单HTML结构:

<html>
  <head>
    <title>页面标题</title>
  </head>
  <body>
    <h1>这是一个<b>标题</b></h1>
    <p>这是一个段落。</p>
  </body>
</html>

其树状结构可理解如下:

  • <html> 标签包含了 <head><body> 标签。
  • <head><body> 标签是 <html> 标签的后代。具体来说,它们是 <html> 标签的子元素<html> 标签是它们的父元素
  • <head><body> 标签是兄弟元素,因为它们处于同一层级。
  • <title> 标签是 <head> 标签的子元素,其父元素<head> 标签。<title> 标签是 <html> 标签的后代,但不是其子元素
  • 标题 <h1> 和段落 <p> 标签是 <body> 标签的子元素,并且因为它们都是 <body> 标签的子元素,所以彼此是兄弟元素
  • 加粗 <b> 标签是标题 <h1> 标签的子元素

标签的内容也是树的一部分,但画出来会显得繁琐。

HTML表格

理解了文档的树状结构后,我们来看看一种常见的数据呈现形式:表格。接下来,让我们学习HTML表格。要定义一个HTML表格,我们使用 <table> 标签。

以下是定义一个简单表格的HTML结构示例:

<table>
  <tr>
    <th>姓名</th>
    <th>薪水</th>
  </tr>
  <tr>
    <td>张三</td>
    <td>$100,000</td>
  </tr>
  <tr>
    <td>李四</td>
    <td>$120,000</td>
  </tr>
</table>

以下是表格的关键组成部分:

  • <table> 标签:定义整个表格。
  • <tr> 标签:定义表格中的一行。
  • <th> 标签:通常用于第一行,定义表头单元格。
  • <td> 标签:定义表格中的标准数据单元格。

对于第一行,第一个单元格我们使用 <th> 标签定义“姓名”,第二个单元格定义“薪水”。对于第二行,第一个单元格 <td> 是“张三”,第二个单元格是“$100,000”,依此类推。

总结

本节课我们一起学习了HTML的基础知识,这是进行网络抓取的重要第一步。我们回顾了网页的HTML构成,分析了标签的组成部分(标签名、开始/结束标签、属性),理解了HTML文档的树状结构(父元素、子元素、兄弟元素),并认识了用于组织数据的HTML表格(<table>, <tr>, <th>, <td>)。现在,我们已经具备了从网页中提取数据所需的基本HTML知识。

088:网络抓取 🕸️

在本节课中,我们将要学习网络抓取。通过本课,你将能够定义网络抓取,理解Beautiful Soup对象的作用,应用find_all方法,并最终从网站上抓取数据。

概述

如果你想分析数百个数据点来找出一个运动队的最佳球员,你会怎么做?你会开始从不同网站手动复制粘贴信息到电子表格,花费数小时寻找正确的数据,最终因为任务过于繁重而放弃吗?这正是网络抓取可以发挥作用的地方。网络抓取是一个可用于自动从网站提取信息的过程,可以在几分钟内轻松完成,而不是数小时。

开始使用

要开始使用,我们只需要一点Python代码以及两个名为requestsbeautifulsoup4的模块的帮助。

假设你被要求从以下网页中找出一个国家篮球联赛球员的姓名和薪水。

首先,我们导入Beautiful Soup。我们可以将网页HTML作为字符串存储在变量html中。要解析文档,将其传递给Beautiful Soup构造函数。我们得到Beautiful Soup对象soup,它将文档表示为嵌套的数据结构。

Beautiful Soup将HTML表示为一组树状对象,并提供了用于解析HTML的方法。

我们将使用创建的Beautiful Soup对象soup来回顾其功能。

Beautiful Soup对象

Tag对象对应于原始文档中的一个HTML标签。例如,title标签。

考虑h3标签。如果有多个具有相同名称的标签,则选择第一个具有该标签的元素。在本例中,是“Lebron James”。我们看到姓名被包裹在粗体属性<b>中。要提取它,需要使用树状表示法。

让我们使用树状表示法。变量tag_object位于此处。

我们可以访问标签的子元素,或者沿着分支向下导航,如下所示:

tag_object.contents

你可以通过使用parent属性向上导航树。变量tag_child位于此处,我们可以访问其父元素。这就是原始的tag_object

我们还可以找到tag_object的兄弟节点。我们只需使用next_sibling属性。

我们可以找到sibling1的兄弟节点。我们只需使用next_sibling属性。

考虑tag_child对象。你可以像字典中的键值对一样访问属性名和值,如下所示:

tag_child.attrs

你可以将内容作为NavigableString返回。这类似于支持Beautiful Soup功能的Python字符串。

find_all方法

现在,让我们回顾一下find_all方法。这是一个过滤器。

你可以使用过滤器基于标签名称、其属性、字符串的文本或这些条件的组合进行过滤。

考虑披萨店的列表。像之前一样,创建一个Beautiful Soup对象,但这次将其命名为table

find_all方法会遍历标签的后代,并检索所有与你的过滤器匹配的后代。

将其应用于带有tr标签的table。结果是一个Python可迭代对象,就像一个列表。

每个元素都是trTag对象。这对应于列表中的每一行,包括表头。

每个元素都是一个Tag对象。因此,考虑第一行。例如,我们可以提取第一个表格单元格。

我们也可以遍历每个表格单元格。首先,我们通过变量row遍历列表table_rows。每个元素对应于表中的一行。

我们可以应用find_all方法来查找所有的表格单元格。然后,我们可以为每一行遍历变量cells。在每次迭代中,变量cell对应于该特定行中表格的一个元素,我们继续遍历每个元素,并为每一行重复此过程。

应用于网页抓取

让我们看看如何将Beautiful Soup应用于网页以进行抓取。

我们还需要requests库。第一步是导入所需的模块。

使用requests库中的get方法来下载网页。输入是URL。

使用text属性获取文本,并将其分配给变量page,然后从变量page创建一个Beautiful Soup对象soup。这将允许你解析HTML页面,现在你可以抓取该页面了。请查看实验部分以获取更多信息。

总结

本节课中,我们一起学习了网络抓取的基本概念和步骤。我们了解了如何使用requests库获取网页内容,以及如何使用Beautiful Soup库解析HTML文档并提取所需信息。通过掌握find_all方法和树状导航,你现在可以开始从网站上自动提取数据,从而高效地完成数据分析任务。

089:使用不同的文件格式(CSV, XML, JSON, XLSX)📁

在本节课中,我们将学习如何识别和处理几种常见的数据文件格式,包括CSV、JSON和XML。我们将使用Python库来读取这些文件,并学习如何组织和输出其中的数据。

认识不同的文件格式

当收集数据时,你会发现存在多种不同的文件格式。为了完成数据驱动的分析,我们需要读取这些文件。Python通过其预定义的库,可以使这个过程变得简单。但在探索Python之前,让我们先了解一些常见的文件格式。

通过观察文件名,你会注意到标题末尾有一个扩展名。这些扩展名让你知道文件的类型以及打开它需要什么工具。例如,如果你看到一个标题如 file_example.csv,你就会知道这是一个CSV文件。但这只是众多文件类型中的一个例子,还有更多类型,例如JSON或XML。

使用Python库读取数据

当遇到这些不同的文件格式并试图访问其中的数据时,我们需要利用Python库来简化这个过程。首先要熟悉的Python库是 Pandas。通过在代码开头导入这个库,我们就能轻松读取不同类型的文件。

以下是导入Pandas库的代码:

import pandas as pd

既然我们已经导入了Pandas库,让我们用它来读取第一个CSV文件。在这个例子中,我们遇到了 file_example.csv 文件。第一步是将文件赋值给一个变量,然后借助Pandas库创建另一个变量来读取文件。接着,我们可以调用 read_csv 函数将数据输出到屏幕上。

以下是读取CSV文件的代码示例:

file_path = 'file_example.csv'
df = pd.read_csv(file_path)
print(df)

在这个例子中,数据没有表头,所以程序将第一行数据作为了表头。由于我们不希望第一行数据成为表头,接下来让我们看看如何纠正这个问题。

组织数据输出

上一节我们学习了如何读取和输出CSV文件的数据,现在让我们使其看起来更有条理。

在上一个例子中,我们能够打印出数据,但因为文件没有表头,它将第一行数据打印成了表头。我们通过添加一个数据框属性轻松解决了这个问题。我们使用变量 df 来调用文件,然后通过添加 columns 属性来指定列名。通过将这一行代码添加到程序中,我们可以将数据输出整齐地组织到每个指定的列标题下。

以下是添加自定义列名的代码:

df.columns = ['Column1', 'Column2', 'Column3']
print(df)

处理JSON文件格式

接下来我们将探索的文件格式是JSON。在这种类型的文件中,文本以独立于语言的数据格式编写,类似于Python字典。读取此类文件的第一步是导入 json 库。

以下是导入JSON库的代码:

import json

导入JSON后,我们可以添加一行代码来打开文件,调用JSON的 load 属性开始读取文件,最后打印文件内容。

以下是读取JSON文件的代码示例:

with open('data.json', 'r') as file:
    data = json.load(file)
print(data)

处理XML文件格式

下一个文件格式类型是XML,即可扩展标记语言。虽然Pandas库没有直接读取此类文件的属性,但让我们探索如何解析这种类型的文件。

读取此类文件的第一步是导入 xml.etree.ElementTree 库。通过导入这个库,我们可以使用 ElementTree 属性来解析XML文件。然后我们添加列标题并将它们分配给数据框。

以下是解析XML文件的代码示例:

import xml.etree.ElementTree as ET

tree = ET.parse('data.xml')
root = tree.getroot()

然后创建一个循环来遍历文档,收集必要的数据,并将数据附加到数据框中。

以下是遍历XML数据并创建DataFrame的代码示例:

data = []
for elem in root.findall('.//record'):
    row = {}
    for child in elem:
        row[child.tag] = child.text
    data.append(row)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/395a0c3f39469e7de34177510e90fc29_49.png)

df = pd.DataFrame(data)
print(df)

课程总结

本节课中,我们一起学习了如何识别不同的文件类型,如何使用Python库提取数据,以及在收集数据时如何使用数据框。掌握这些技能是进行有效数据分析的重要基础。

090:IBM应用人工智能课程简介 🚀

在本节课中,我们将要学习《IBM应用人工智能》课程的整体介绍。课程将指导你如何从零开始,使用Python和Flask框架来构建集成人工智能的Web应用程序。我们将了解课程目标、适用人群以及三个核心模块的主要内容。

概述

欢迎来到这门关于使用Python和Flask开发人工智能应用程序的课程。

Python是全球使用最广泛的十大编程语言之一,这一结论源自Stack Overflow的调查报告。

Flask是一个Python微框架,它对外部库的依赖极少甚至没有。

使用Python和Flask,程序员可以开发简洁的应用程序,即使是在企业级的AI组件中,也能轻松成为可扩展解决方案的一部分。

完成本课程后,你将能够描述创建应用程序所涉及的步骤和流程,创建Python模块,运行单元测试,以及打包应用程序。

你将能够使用Flask框架在Web上部署应用程序,并使用IBM Watson AI库和Flask创建并部署一个基于AI的应用程序到Web服务器。

本课程面向所有具备基本编程知识、对Python有初步了解,并且有兴趣构建集成AI的可复用Web应用程序的学习者。

课程模块介绍

上一节我们了解了课程的整体目标,本节中我们来看看课程的具体内容安排。课程主要分为三个模块。

以下是三个核心模块的简要说明:

  1. 模块一:应用开发基础
    • 本模块将向你介绍应用程序开发的基础知识,包括生命周期和编码最佳实践。
    • 你将有机会创建模块、运行单元测试并打包应用程序。
    • 你将学习Python的理想编码实践,并了解如何运行静态代码分析。

  1. 模块二:Flask框架入门

    • 在模块二中,你将首先学习Flask的简介。
    • 接着,你将了解部署相关的概念,包括路由、请求和响应对象、错误处理以及装饰器。
    • 你将能够使用Flask创建并部署一个应用程序。
  2. 模块三:开发AI应用

    • 最后,在模块三中,你将有机会运用之前模块学到的所有知识,使用Watson嵌入式AI库开发功能性的Web应用程序和基于AI的Web应用程序。

课程项目与学习建议

在了解了课程结构后,我们来看看如何通过实践来巩固所学知识。课程包含实践项目来帮助你掌握技能。

通过一个练习项目和一个计分项目,你将能够展示自己使用Flask创建和部署应用程序的熟练程度。

你必须将计分项目的作业提交给同伴进行互评。

课程内容非常丰富。为了从本课程中获得最大收益,请确保观看每一个视频,通过每个测验检查学习效果,并完成所有动手实验。

如果你对任何课程材料有疑问,请随时在讨论区联系我们。

感谢你加入我们的课程,欢迎你的到来。

总结

本节课中我们一起学习了《IBM应用人工智能》课程的简介。我们了解到本课程旨在教授使用Python和Flask构建AI驱动的Web应用,涵盖了从开发基础、Flask框架到集成IBM Watson AI的三个核心阶段,并通过实践项目来巩固学习成果。

091:应用程序开发生命周期 🚀

在本节课中,我们将学习应用程序开发生命周期的完整流程。你将能够列举其步骤,描述各个阶段,并理解将代码编写在多个文件中的重要性。


概述

想象一下,一位客户要求你构建一个应用程序,以帮助其员工追踪每日任务。

现在,考虑另一个场景:客户希望你构建一个网络应用,用于管理从创建到客户退房的酒店预订。

在上述任一场景中,当客户提出请求时,你能否立即开始构建应用程序?实际上不能。在应用程序为用户准备好之前,你需要执行一些活动,例如分析需求、规划和编码。

无论应用程序类型如何,每个应用程序都会经历不同的阶段,这被称为应用程序开发生命周期。


生命周期的七个阶段

你可以将应用程序开发生命周期分为七个阶段。

以下是这七个阶段:

  1. 需求收集
  2. 分析
  3. 设计
  4. 编码与测试
  5. 用户与系统测试
  6. 生产
  7. 维护

各阶段详解

接下来,让我们详细看看应用程序开发的每个阶段。

1. 需求收集

需求收集是应用程序开发流程的第一阶段。在此阶段,你需要捕获应用程序所有方面的需求,包括用户需求、业务需求和技术需求。

以酒店预订应用为例。对于此应用,一个用户需求可能是:用户必须能够查看不同的房间和可用设施。

为不同房间和设施确定合适的价格可能是一项业务需求。

一项技术需求可能是:该应用必须在所有浏览器和移动设备上运行。

目标应是尽可能多地捕获需求,即使某些需求看起来冗余或微不足道。你还必须识别任何设计约束和商业模式的可行性。

例如,对于酒店预订应用,一个约束是服务器需要始终保持房间可用状态的更新,这会产生相关成本。因此,为了保持业务可行性,会在最终付款中添加一笔小额便利费。

2. 分析与设计

在收集了需求和约束之后,你必须对其进行分析,为应用程序的设计创建可能的解决方案。

在分析和设计过程中,可能会进行多轮验证和修订,以创建一个满足所有指定需求的模型解决方案。

在应用程序开发的分析和设计阶段,你必须维护适当的文档,记录设计中的所有更新。

文档应清晰简洁,以便在编码与测试阶段使用。

最终提出的设计和指定的需求会传递到编码与测试阶段。

3. 编码与测试

在编码与测试阶段,团队使用设计文档中指定的编程需求来编码、测试、修订并再次测试应用程序程序,直到代码满足所有文档记录的需求。

让我们回顾一下测试阶段。你对单元代码进行的测试称为单元测试

在编程级别进行单元测试,以确保满足所有必需的规范。

4. 用户与系统测试

单元测试之后,你可以生成一个可接受的应用程序版本。然后,这个新版本的应用程序会经过一系列用户和系统级别的测试。

用户测试从用户的角度验证功能。此外,你还需要执行多个系统级别的测试,包括集成测试和性能测试。

集成测试验证所有相关程序在集成后是否继续按预期运行。集成测试还验证应用程序在更大框架内的功能。

性能测试有助于根据不同的工作负载评估应用程序的速度、可扩展性和稳定性。

5. 生产

测试之后,你可以生成一个新的应用程序版本并将其发送到生产环境。

一旦进入生产环境,最终用户就可以访问和使用它。你必须确保应用程序功能准确且对用户可用。

当应用程序处于生产阶段时,它必须保持稳定状态。在稳定状态下,你不应对应用程序进行任何更改。然而,这并非总是可能。例如,在出现错误时,你可能需要对应用程序进行更改。

这些更改在实施到生产环境之前受到严格控制并经过充分测试。

6. 维护

应用程序开发生命周期的最后一个阶段是维护。

应用程序可能需要升级,或者你可能需要添加新功能。在这种情况下,新功能在集成到生产环境中部署的应用程序版本之前,必须经历之前的所有阶段。


代码组织的最佳实践

让我们简要回顾一下为什么为不同功能在多个文件中编码是一种最佳实践。

每个应用程序通常都有多个功能,每个功能的需求可能各不相同。

最佳实践是在单独的文件中为每个功能编码。

然后,你可以创建一个中心程序来运行应用程序,并调用各个文件来执行特定功能。

这种组织代码的方法使代码维护高效且容易。

拥有多个文件在你需要向现有应用程序添加新功能时也很有帮助。当你将新功能的代码写在单独的文件中时,只有该文件会在集成到运行中的应用程序之前,经历整个设计和验证过程。


总结

本节课中,我们一起学习了应用程序开发生命周期的七个阶段,包括:

  • 需求收集:收集应用程序的用户、业务和技术需求。
  • 分析:分析需求。
  • 设计:设计完整的解决方案。
  • 编码与测试:构建和测试应用程序的不同组件。
  • 用户与系统测试:用户测试应用程序的可用性,你执行系统集成测试和性能测试。
  • 生产:应用程序对所有最终用户可用。
  • 维护:升级或修复任何用户或系统问题。

为了高效编码,应始终使用一个主程序来调用执行不同操作的各个文件和函数。

092:Web应用程序和API简介 🌐

在本节课中,我们将要学习Web应用程序应用程序编程接口的基本概念。我们将了解它们的定义、工作原理、优势以及它们之间的区别与联系。


什么是Web应用程序? 💻

上一节我们介绍了课程概述,本节中我们来看看Web应用程序。

一个Web应用程序是存储在远程服务器上并通过互联网交付的程序。用户通过浏览器与应用程序进行交互。电子商务网站、网页邮件等服务都是Web应用程序。虽然某些应用程序可能依赖于所使用的浏览器类型,但大多数Web应用程序可以在所有现代Web浏览器上运行。

一个Web应用程序需要三个组件来处理客户端请求:

  • Web服务器:用于管理接收到的请求。
  • 应用服务器:用于执行请求的任务。
  • 数据库:用于存储完成任务所需的信息。

在编写Web应用程序时,您将使用JavaScript、HTML或CSS用户端(即前端)编写代码。同时,您也将使用Python、Java或Ruby等语言为服务器端(即后端)编写代码。

与严格在用户本地系统上运行的应用程序相比,使用Web应用程序有几个优势。以下是其主要优势:

  • 开发者可以向多个用户同时提供相同版本的应用程序。
  • 用户可以从他们选择的平台(如台式机、笔记本电脑或移动设备)灵活地使用该应用程序。
  • 用户可以通过他们选择的浏览器访问该应用程序。
  • 用户无需在本地系统上安装该应用程序。


什么是应用程序编程接口? 🔌

上一节我们了解了Web应用程序,本节中我们来看看应用程序编程接口。

一个API是一个软件组件,它使得两个彼此未连接的应用程序能够进行通信。API为程序员创造了更大的灵活性,使他们能够从原本封闭的应用程序中请求数据。

因此,API具有标准化的规则和功能,用于确定可以在应用程序内获取或修改哪些数据以及该过程如何发生。例如,您手机上的应用程序需要您授予权限以访问手机的不同功能,如位置、摄像头、音频和录音器。

一个使用API的应用程序例子是天气应用程序。您的天气应用程序本身并不生成天气数据。相反,它只是向一个天气API请求信息。该API将收集和存储天气数据的软件与您移动设备上的应用程序连接起来。设备随后为您提供第二天的详细天气预报。

软件开发人员遵循几种架构来创建API,但最流行的是表述性状态传递REST,以及简单对象访问协议SOAP。这些架构将在另一个视频中讨论。

API在许多方面都有益处,包括:

  • 它提高了应用程序之间的连接性。
  • 它支持传统的创建、读取、更新、删除操作,即CRUD
  • 它适用于HTTP动词,包括PUT、POST、DELETE和GET
  • 它基于HTTP,使其具有可定制性。


Web应用程序与API的比较与联系 🔄

上一节我们分别介绍了Web应用程序和API,本节中我们来比较和联系它们。

API是一个更通用的术语,指代在系统任何两个部分之间创建链接的所有形式的应用程序。Web应用程序是API的一种形式,它在前端后端之间进行通信。

为了阐明Web应用程序和API之间的区别,让我们考虑一个电子商务购物服务的例子。

当您从浏览器访问电子商务购物服务时,浏览器充当API,将您连接到Web应用程序。当您选择一个产品时,Web应用程序会检查产品的可用性,如果可用,则显示其价格。

如果您尝试使用移动设备访问电子商务购物服务,您设备上的应用程序会访问连接到电子商务购物服务的API。

所有Web应用程序的本质都是与其他应用程序共享数据。本质上,所有Web应用程序都可以被视为API。然而,API是一个通用术语,包括在线(基于Web)和离线应用程序。总而言之,所有Web应用程序都是API,但并非所有API都是Web应用程序


总结 📝

本节课中我们一起学习了以下核心内容:

  • Web应用程序是存储在远程服务器上并通过互联网通过浏览器交付的程序。您可以在不同的平台和浏览器上运行Web应用程序,而无需安装新软件。
  • 应用程序编程接口API是一个软件组件,它使得两个未连接的应用程序能够进行通信。
  • Web应用程序是API,但并非所有API都是Web应用程序。两者都在应用程序之间共享数据,但并非所有API都像Web应用程序那样需要网络。

093:使用IBM Cloud IDE进行开发 🚀

在本节课中,我们将学习如何使用IBM Skills Network团队提供的Cloud IDE(集成开发环境)。这是一个基于浏览器的编程环境,无需在个人设备上安装任何软件,即可编写、运行、调试和执行代码。


认识Cloud IDE界面

上一节我们介绍了Cloud IDE的基本概念,本节中我们来看看它的具体界面布局。

打开Cloud IDE后,会显示两个主要窗格。

左侧窗格称为教学窗格,它显示完成项目所需遵循的说明。

右侧窗格显示编程界面,您可以在此编写和执行代码。

请注意,右侧窗格与流行的代码管理IDE——VS Code界面相似。

您可以调整教学窗格和代码窗格的大小。例如,通过从边缘向左拖动来缩小教学窗格,或向右拖动来增大它。

您还可以根据个人偏好修改字体和字号。

如果教学窗格包含多个页面,您会看到“下一页”和“上一页”按钮。这些按钮使您能够在页面间导航。您也可以预览教学页面。

注意教学窗格左上角的“目录”按钮。使用此按钮可在说明的不同部分之间导航。


使用AI教学助手Chatbot

接下来,让我们看看Cloud IDE上可用的一个AI驱动的聊天机器人。

IBM Skills Network团队为您提供了一个名为“TI”的AI教学助手聊天机器人,它可帮助您使用实验环境完成编码作业。TI的图标位于教学窗格的左侧。

要访问聊天机器人,只需单击该图标。

让我们尝试提问,例如:“请为我提供一个简单的Python代码。” 如您所见,代码会显示出来。您可以复制或执行该代码。


编程界面的核心组件

上一节我们体验了AI助手,本节中我们来深入了解编程界面的主要组成部分。

编程界面包含多个组件,但您将频繁使用的两个选项卡包括:

  • 编辑器选项卡:用于编写代码。
  • 终端选项卡:用于执行代码。

在编程窗格中,还有一个Skills Network工具箱,它使您能够使用各种数据库管理环境、大数据工具、云工具、嵌入式AI库,并启动您构建的应用程序。

在开始编写代码之前,您需要在这个基于云的环境中安装所需的Python库或包。您需要在终端选项卡中执行此任务。

要打开新终端,请单击“终端”菜单,然后选择“新建终端”。

为了演示,让我们从教学窗格复制代码块并将其粘贴到终端中。

然后,按回车键执行命令。注意,numpy库已成功安装。现在,您可以将此库导入到您的代码中。


创建并运行您的第一个程序

了解了界面和准备工作后,现在让我们在编程窗格中创建一个基本的Python程序。

单击“文件”,然后选择“新建文件”。

新文件将在编辑器选项卡中打开。在开始添加代码之前保存文件是一个最佳实践。

由于我们编写的是Python代码,请使用.py扩展名保存文件。从文件菜单中,单击“保存”或使用快捷键 Ctrl + S。出现提示时,提供文件名。对于此示例,让我们将文件保存为 hello.py

下一步是添加代码。您可以在编辑器选项卡中手动键入代码,或者如果教学窗格中有可用代码,也可以复制并粘贴到您的文件中。

为了本次演示,让我们从教学窗格复制代码并粘贴到文件中。别忘了保存文件

是时候执行代码了。让我们导航回终端选项卡。

确保您位于存储程序文件的文件夹中,可以通过键入 python3 后跟文件名来执行文件。对于此示例,命令是:

python3 hello.py

注意,输出已显示且没有任何错误。


课程总结

本节课中我们一起学习了IBM Cloud IDE的使用。

Cloud IDE是IBM Skills Network提供的一个类似于VS Code的编程环境,用于学习和培养实践技能。

Cloud IDE有两个窗格:教学窗格和编程窗格。您可以使用教学窗格上的“目录”按钮在说明页面间导航。

编程窗格提供编辑器选项卡来编写代码,以及终端选项卡来执行代码。您需要通过终端安装所需的库。

在实验的任何阶段,您都可以从教学窗格复制代码块,并将其粘贴到编辑器或终端选项卡中。

094:Python风格指南与编码实践 📝

在本节课中,我们将学习如何编写易于阅读和维护的Python代码。我们将重点介绍Python官方的PEP 8风格指南,了解关键的编码惯例,并探讨如何使用静态代码分析工具来确保代码质量。


编写可读代码的重要性

当你编写代码时,需要确保团队成员能够轻松阅读和理解它。这项任务需要遵循一定的编码标准和惯例。

PEP 8:Python风格指南

Python.org发布了一份名为“Python增强提案第8号”(PEP 8)的文档。该文档提供了惯例和指南,旨在使你的Python代码具有可读性并保持一致的格式。

提升代码可读性的关键指南

上一节我们介绍了PEP 8的基本概念,本节中我们来看看提升代码可读性的具体指南。

缩进:使用空格而非制表符

PEP 8建议使用空格而非制表符进行缩进。

不同的文本编辑器和集成开发环境(IDE)对制表符所代表空格数的解释可能不同。例如,一个编辑器可能将制表符解释为三个空格,而另一个可能解释为四个。

使用制表符缩进可能导致代码格式不统一,从而引发格式错误。例如,在编辑器1中为if条件下的语句1按下Tab键,与在编辑器2中为if条件下的语句1预留的空格相比,间距可能不同。

为了避免此类错误,你应在缩进代码时使用一致数量的空格。为了统一性,指南建议在代码的每个缩进级别使用四个空格。四个空格足以保证适当的可读性。

请注意,以下示例中的四个点用于表示四个空格:

if condition:
....statement1
....statement2

使用空行分隔代码块

PEP 8还建议使用空行来分隔代码中的函数和类。

空行有助于界定代码不同部分的开始和结束。例如,在不遵循PEP 8指南的左侧代码块中,函数1结束处与类UserClass之间没有空行。而右侧则展示了在类定义前留有空格(即空行)的正确表示。

运算符与逗号周围的空格

为了提高代码可读性,应在运算符周围和逗号后使用空格。使用空格会使命令看起来更宽松、更清晰,从而提升命令的可读性。

以下是使用空格前后的对比示例:

  • 不使用空格a=b+c 可能令人困惑。
  • 使用空格a = b + c 可读性更好。

保持代码一致性与可管理性的编码惯例

上一节我们探讨了提升可读性的格式指南,本节中我们来看看一些保持代码一致性和可管理性的编码惯例。

以下是几个关键的编码惯例:

为大型代码块创建独立函数

一个关键的编码惯例是为包含较大代码块的功能创建独立的函数,然后从主程序中调用这些函数。

例如,在代码中,if-else语法没有封装成函数,每次需要该功能时都必须重写。然而,如果你注意到函数function_1(定义为def function_1(a, b)),它可以被轻松调用,例如 c = function_1(a, b)。这提高了代码的执行速度,并以更方便的方式支持代码块的重用。

函数与文件的命名:小写字母加下划线

另一个编码惯例是使用小写字母和下划线来命名函数和文件。

Python本身使用这种命名约定,并且许多内置库和预定义函数都遵循这一通用命名惯例。因此,建议使用小写函数名(最好带下划线)以使函数具有独特性。

例如,不要将函数名写为 CompSurfaceRadiation(),而应写为 comp_surface_radiation()

此规则的一个例外是Python包的命名标准,通常不鼓励使用下划线。例如,不要写 my_package,而应写 mypackage

类的命名:使用驼峰命名法

使用驼峰命名法命名类也是一个编码惯例。

驼峰命名法(或“大写字母开头”命名法)是编码社区广泛接受的类命名约定。驼峰命名法还有助于区分代码中的类和函数。

例如,不要将类写为 class la_sirrel_c,最佳实践是将类命名为 LaSirrelC(首字母L、S和C大写)。

常量的命名:全大写字母加下划线

使用全大写字母并用下划线分隔单词的命名惯例,以保持一致性。

名称通常表明常量的用途,例如 MAX_FILE_UPLOAD_SIZE

静态代码分析

我们讨论了编码惯例和指南,软件开发人员通常使用静态代码分析来管理对这些风格指南的遵从性。

静态代码分析是一种在不执行代码的情况下,根据预定义的风格和标准评估代码的方法。

静态分析有助于发现诸如编程错误、违反编码标准、未定义的值、语法违规和安全漏洞等问题。

你可以使用 pylint 库来检查你的Python代码是否符合PEP 8指南。


总结

本节课中我们一起学习了以下内容:

  • 编写一致的代码有助于所有团队成员轻松阅读和理解代码。
  • PEP 8指南 为了更好的代码可读性,包括:
    1. 使用四个空格进行缩进。
    2. 使用空行分隔函数和类。
    3. 运算符周围逗号后使用空格。
  • 编码惯例 为了代码的一致性和可管理性,包括:
    1. 将较大的代码块放在函数内部。
    2. 使用小写字母加下划线命名函数和文件。
    3. 使用驼峰命名法命名类。
    4. 使用全大写字母加下划线命名常量。
  • 使用静态代码分析方法来评估你的代码是否符合预定义的风格和标准,而无需执行代码。

095:单元测试 🧪

在本节课中,我们将学习单元测试的概念、流程以及如何构建和执行单元测试。单元测试是验证代码单元是否按预期工作的重要方法,有助于确保代码质量。

概述

单元测试是一种验证代码单元是否按设计运行的方法。一个“单元”是应用程序中较小且可测试的部分。通过单元测试,开发者可以在代码开发早期发现并修复问题。

什么是单元测试?

单元测试用于验证代码单元是否按设计运行。一个“单元”是应用程序中较小且可测试的部分。

以下是一个单元示例,它包含两个函数:squaredoubler,位于 my_module.py 文件中。

square 函数的代码为:

def square(number):
    return number ** 2

doubler 函数的代码为:

def doubler(number):
    return number * 2

单元测试流程

为了开发单元测试,你将使用 unittest 库。这是一个已安装的 Python 模块,提供了一个包含测试功能的框架。

让我们简要回顾从单元测试到发布到生产代码库的端到端测试流程。

在代码开发过程中,你将测试每个单元。测试分为两个阶段进行。

第一阶段:本地系统测试

在第一阶段,你将在本地系统上测试单元。如果测试失败,你需要确定失败原因并修复问题。然后,你将再次测试该单元。

第二阶段:服务器环境测试

单元测试通过后,你需要在服务器环境中测试该单元,例如持续集成/持续交付(CI/CD)测试服务器。

如果单元未通过服务器测试,你将收到失败详情。

你需要确定并修复问题。

一旦单元通过服务器测试,该单元将被集成到最终代码库中。

如何构建单元测试

在概述了单元测试流程后,让我们回顾一些测试函数,以了解如何构建单元测试。

注意单元和单元测试的代码,观察单元文件名为 my_module.py

单元测试文件在名称前或后附加了“test”。这是一个良好的命名约定,因为它有助于清晰区分单元文件和单元测试文件。

让我们看看创建单元测试文件的步骤。

步骤一:导入 unittest 库

第一步是导入 unittest Python 库,输入:

import unittest

步骤二:导入要测试的函数

接下来,导入要测试的函数。例如,要从 my_module 单元导入 squaredoubler 函数进行单元测试,输入:

from my_module import square, doubler

步骤三:构建单元测试类

然后,构建单元测试类,以便从单个类对象调用单元测试。例如,创建一个名为 TestMyModule 的类,输入:

class TestMyModule(unittest.TestCase):

注意类名如何以“Test”为前缀,后跟单元名称。在示例中,这是一个良好的命名约定,将“test”作为类名前缀,有助于区分单元类和单元测试类。

接下来,让该类继承 unittest 库的 TestCase 类。例如,TestCaseunittest 库的测试用例类。继承该类允许你利用 TestCase 类中的现有方法。

步骤四:创建测试函数

然后在单元测试类中创建与每个需要测试的函数相对应的函数。例如,在 TestMyModule 类中,两个函数 test_squaretest_doubler 对应于 my_module 单元中的 squaredoubler 函数。

注意,请确保在单元测试模块中,函数名以“test”开头,因为只有以“test”开头的函数才会运行。

步骤五:创建测试用例

最后,你可以创建测试用例。

创建测试用例时,添加一个或多个断言方法,以确保满足单元测试条件。

一个断言函数是 assertEqual。注意,在代码中,该方法已添加到 TestCase 类中。

assertEqual 函数比较两个值或实体,并判断它们是否相等。

该方法用于检查函数是否返回正确的值。

assertEqual 函数接受的参数之一是实际值。对于实际值,你将调用要测试的函数。

第二个参数是期望值,你将在其中添加函数预期返回的内容。

在示例中,第一个测试是针对 square 函数,使用数字 2。如果函数正确执行,应返回值 4。

作为测试的一部分,首先评估函数。然后比较两个值,看它们是否相等。

根据比较的输出,测试通过或失败。

执行与输出

运行测试文件后,会生成输出。输出显示测试结果以及一些额外细节。例如,如果输出显示在 0 秒内运行了两个测试,“OK”表示测试通过,两个函数已正确实现。

但如果函数未正确实现会发生什么?

考虑 square 函数,你编写了计算数字立方而非平方的代码。函数失败,并生成输出。

让我们回顾一个失败单元测试的示例输出。输出清晰地显示单元测试失败。例如,输出显示“FAILED test_square (main.TestMyModule)”。你还可以查看单元测试失败的函数。例如,“test_square self.assertEqual(square(2), 4)” 表明 square 函数失败。“AssertionError: 8 != 4” 表示值不匹配。详细的输出使你能在实际部署解决方案之前纠正错误。

总结

在本节课中,我们一起学习了:

  • 单元测试是一种验证代码单元是否按设计运行的方法。
  • 在代码开发过程中,每个单元都会被测试。单元测试分为两个阶段进行。
  • 一旦单元通过服务器测试,它就会被合并到最终代码库中。
  • 确保测试文件在名称前或后附加“test”,以清晰区分它们与模块文件。
  • 你可以使用不同的测试函数来构建单元测试。
  • assertEqual 函数是一种常用的断言方法,用于比较两个值。
  • 你可以查看单元测试输出,并确定测试是通过还是失败。

096:Python 打包教程 📦

在本节课中,我们将要学习Python中模块、包和库的概念与区别,并掌握如何创建、验证和使用一个Python包。


模块、包与库的概念 🔍

上一节我们介绍了课程目标,本节中我们来看看Python中几个核心术语:模块、包和库。

Python 模块

一个Python模块是一个包含Python定义、语句、函数和类的 .py 文件。

你可以将模块导入到其他脚本或笔记本中使用。例如,考虑一个名为 module.py 的模块,它包含两个函数。

以下是该模块中函数的代码示例:

def square(number):
    return number ** 2

def doubler(number):
    return number * 2

如果该模块文件位于同一目录下,你可以导入并使用其中的函数。

考虑使用 square 函数配合 print 命令:

print("4^2 =", square(4))

输出结果为:4^2 = 16

类似地,对于值为4的 doubler 函数:

print("2*4 =", doubler(4))

输出结果为:2*4 = 8

Python 包

一个包是一个包含 __init__.py 文件的目录,该目录下汇集了多个Python模块。__init__.py 文件的存在将其与普通脚本目录区分开来。

示例展示了在父目录下的 my_project 包,其中包含两个模块:module1.pymodule2.py

该包也包含 __init__.py 文件。

当你导入一个模块或包时,Python创建的对应对象类型始终是 module

请注意,模块和包的区别仅存在于文件系统层面。

Python 库

一个库是包的集合,或者它本身可以是一个单独的包。

示例包括 numpytorchpandas

请注意,术语“包”和“库”经常互换使用。因此,numpytorchpandas 也常被称为包。


创建Python包的步骤 🛠️

上一节我们了解了核心概念,本节中我们来看看如何创建一个Python包。

考虑有两个模块:

  • module1.py 包含两个函数:squaredoubler
  • module2.py 包含一个函数:mean

要将 my_project 文件夹变成一个包,你必须在 my_project 文件夹中有一个 __init__.py 文件。

__init__.py 文件的内容必须是:

from . import module1
from . import module2

以下是创建包的典型步骤:

  1. 创建一个以包名命名的文件夹。
  2. 在该文件夹中创建一个空的 __init__.py 文件。
  3. 创建所需的模块文件(如 module1.py, module2.py)。
  4. 最后,在 __init__.py 文件中,添加引用包中所需模块的代码。


验证Python包 ✅

创建包之后,你需要验证它。

以下是验证包的步骤:

  1. 打开一个bash终端。
  2. 确保当前目录与你的包所在的文件夹处于同一层级。
  3. 通过在shell中运行 python 命令来打开Python解释器。

在Python提示符下,键入 import 后跟项目名称,例如:

import my_project

如果该命令运行无误,则表明包已成功加载。

测试包中函数的一般结构是:包名.模块名.函数名(参数)

例如,使用 my_project.module1.square(2),该函数将返回值 4


使用Python包 🚀

创建并验证包后,如果包文件夹位于同一目录下,你可以在其他脚本中使用它。

在这种情况下,你在父目录中有一个 test.py 文件。

你可以导入包中的函数,例如使用以下Python代码:

from my_project.module1 import square, doubler
from my_project.module2 import mean

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/9d798d535d72184a6afde660cd860bdd_55.png)

print("4^2 =", square(4))
print("2*4 =", doubler(4))
print("(2+1+3)/3 =", mean([2, 1, 3]))

然后你可以运行这些函数并检查是否得到正确的结果。


总结 📝

本节课中我们一起学习了以下内容:

  • Python模块:是一个包含Python定义、语句、函数和类的 .py 文件。
  • Python包:是一个包含 __init__.py 文件的目录,该目录下汇集了多个Python模块。
  • Python库:是包的集合,或者它本身可以是一个单独的包。
  • 创建包:创建一个以包名命名的文件夹,在其中创建空的 __init__.py 文件,创建所需模块,并在 __init__.py 文件中添加引用这些模块的代码。
  • 验证包:可以通过bash终端和Python解释器导入包来验证。
  • 使用包:如果包文件夹位于同一目录下,你可以在其他脚本中导入并使用它。

097:单元测试 🧪

在本节课中,我们将要学习单元测试。单元测试是一种系统化、可重复的代码测试方法。我们将了解其基本概念、工作流程,并通过一个简单的Python示例来学习如何编写单元测试。

概述

单元测试是一种验证代码单元是否按预期工作的方法。一个“单元”是应用程序中一个较小且可测试的部分,通常是函数或模块。我们将使用Python内置的unittest库来构建测试。

什么是单元测试?

单元测试是一种系统化、可重复的测试代码的方法。其核心目的是验证代码中的各个单元是否按照设计运行。

一个“单元”指的是应用程序中一个较小、可测试的部分,通常是函数或模块。在本例中,我们的单元是my_module.py文件中的squaredouble函数。

我们将使用unittest库,这是一个Python内置模块,提供了一个包含测试功能的框架。

单元测试的工作流程

上一节我们介绍了单元测试的基本概念,本节中我们来看看从单元测试到发布到生产代码库的完整测试流程。

以下是测试流程的主要步骤:

  1. 开发与单元测试:在代码开发过程中,对每个单元进行测试。如果测试失败,开发者需确定原因并进行修复,然后重新测试该单元。
  2. 持续集成/持续交付测试:一旦单元测试通过,代码会在持续集成/持续交付的服务器测试环境中进行测试。
  3. 问题修复与回归:如果单元在服务器测试中失败,代码将返回给开发者以确定原因并进行修复,然后流程重新开始。
  4. 合并到主代码库:一旦单元通过服务器测试,它将被合并到最终的主代码库中。

如何构建单元测试

了解了工作流程后,现在让我们看看如何实际构建测试。我们将通过一个名为test_functions.py的文件来学习。

以下是构建单元测试文件的关键步骤:

  • 文件命名:首先,注意文件名添加了test前缀或后缀,以标识它是一个单元测试文件。这是一个良好的命名规范。
  • 导入库和函数:接下来,我们导入unittest库以及我们想要测试的函数。
  • 创建测试类:然后,我们创建一个测试类。良好的命名规范是:为你正在测试的文件名加上Test前缀作为类名,例如TestMyModule
  • 继承TestCase类:接着,让这个类继承unittest库中的TestCase类。这允许我们的类使用TestCase类中的方法。
  • 创建测试方法:现在,我们在TestMyModule类中为每个要测试的函数创建一个方法。我们通过在被测函数名前加上test_来命名这些方法。请注意,这一步是强制性的,因为只有以test开头的方法才会被运行。
  • 编写测试用例:最后,我们可以开始创建测试用例。这是通过使用assertEqual函数来完成的。
  • 添加执行入口:为了在运行文件时执行测试,我们添加if __name__ == '__main__': unittest.main()代码块。

让我们通过代码来具体说明:

# test_functions.py
import unittest
from my_module import square, double  # 导入要测试的函数

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/6c3ef5baf318097ffffc64f66eff3847_32.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/6c3ef5baf318097ffffc64f66eff3847_33.png)

class TestMyModule(unittest.TestCase):  # 创建测试类并继承TestCase
    def test_square(self):  # 测试square函数的方法
        self.assertEqual(square(2), 4)  # 断言:square(2)应该等于4
        self.assertEqual(square(3.0), 9.0)  # 测试浮点数

    def test_double(self):  # 测试double函数的方法
        self.assertEqual(double(2), 4)
        self.assertEqual(double(-3.1), -6.2)

if __name__ == '__main__':
    unittest.main()  # 运行所有测试

深入理解 assertEqual

上一节我们构建了测试文件,本节中我们来仔细看看测试类中使用的assertEqual

assertEqual比较两个值并判断它们是否相等。它用于检查函数是否为给定的输入返回了正确的值。

其基本结构如下:
self.assertEqual(actual_value, expected_value)

  • 实际值:我们调用正在测试的函数。
  • 期望值:我们放入函数预期返回的值。

例如,在第一个测试中,我们使用数字2测试square函数,如果函数运行正确,它应该返回4

  1. 首先,函数被求值:square(2)得到结果(例如4)。
  2. 然后,将得到的实际值(4)与期望值(4)进行比较,看它们是否相等。

运行我们的测试文件后,如果函数实现正确,我们将得到类似“OK”的输出,表示两个测试都通过了。

当测试失败时

但是,如果我们的函数没有正确实现会发生什么?

考虑以下情况,square函数被错误地实现为计算一个数的立方而不是平方:

# my_module.py 中的错误实现
def square(n):
    return n * n * n  # 错误:这是立方,不是平方

在这种情况下,assertEqual的求值将如下所示:
self.assertEqual(square(2), 4) -> self.assertEqual(8, 4)
这将导致断言失败。

测试文件的输出将显示失败信息,我们可以轻松地看到哪个函数的单元测试失败了,以及assertEqual失败的原因和函数实际求值的结果是什么。

总结

本节课中我们一起学习了单元测试。我们了解到单元测试是验证代码单元功能性的系统化方法。我们探讨了从开发到集成的测试流程,并动手实践了如何使用Python的unittest库创建测试文件、编写测试类和方法,以及使用assertEqual进行断言。最后,我们还分析了测试通过和失败时的不同输出结果。掌握单元测试是保证代码质量、构建可靠AI应用的重要一步。

098:Python包创建教程 📦

在本节课中,我们将学习如何创建一个Python包。我们将从Python模块和包的基本概念讲起,然后逐步演示创建、验证和使用一个自定义包的完整流程。


Python模块与包概述 📚

上一节我们介绍了Python脚本的基本概念,本节中我们来看看如何将代码组织成更高级的结构。

一个Python模块是一个包含Python定义、语句、函数和类的.py文件。我们可以将模块导入到其他脚本或笔记本中,以复用代码。

例如,假设有一个名为module.py的文件,其中包含两个函数:一个函数对输入进行平方运算并返回结果,另一个函数将输入翻倍并返回结果。

如果该模块文件与我们的脚本在同一目录下,我们可以导入它并使用其中的函数。

一个Python包则是将多个Python模块组织在一个包含__init__.py文件的目录中。这个特殊的文件将该目录标识为一个Python包,而不仅仅是一个普通的文件夹。

以下是一个包的示例结构:

my_package/
├── __init__.py
├── module1.py
└── module2.py

当你导入一个模块或包时,Python创建的对象类型始终是module。模块和包之间的区别主要在于文件系统层面。

一个是一个或多个包的集合。例如,NumPy或PyTorch都可以被称为库。值得注意的是,“包”和“库”这两个术语经常互换使用,因此PyTorch和NumPy也常被称为包。


创建Python包的步骤 🛠️

了解了基本概念后,现在我们来一步步创建一个自己的Python包。

以下是创建包的具体步骤:

  1. 创建包目录:创建一个以包名命名的文件夹。
  2. 创建__init__.py文件:在该文件夹内创建一个空的__init__.py文件。稍后我们将在此文件中添加代码。
  3. 创建模块:在包目录内创建你的模块文件(例如module1.py)。
  4. 编辑__init__.py文件:在__init__.py文件中添加代码,以引用包内的模块。这可以控制包的导入行为。
  5. 验证包:打开终端,切换到包所在的目录,运行Python解释器,尝试导入你的包。如果没有错误,则表明包已成功加载。

验证与使用你的包 ✅

创建好包之后,我们需要验证它是否能正常工作,并学习如何使用它。

验证包的通用结构是:包名.模块名.函数名(参数)

例如,使用我们创建的my_package

import my_package.module1
result = my_package.module1.square_function(5)

一旦包创建成功,并且包文件夹与脚本在同一目录下,我们就可以在其他脚本中使用它。

假设在父目录中有一个test.py文件,我们可以这样导入包中的函数:

from my_package import module1

然后,我们可以运行这些函数并检查是否得到正确的结果。


总结 🎯

本节课中我们一起学习了Python包的核心知识。我们首先区分了模块、包和库的概念,然后详细讲解了创建一个Python包的五个步骤:创建目录、添加__init__.py文件、编写模块、配置初始化文件以及最终验证。最后,我们演示了如何在其他脚本中导入和使用自定义的包。掌握包的创建与管理,能帮助你更好地组织代码,构建更复杂的项目。

099:使用Flask创建Web应用程序 🚀

在本节课中,我们将要学习如何使用Flask微框架来创建Python Web应用程序。我们将了解什么是框架,探索Flask的核心特性,并通过一个简单的示例来演示如何构建和运行一个基础的Web应用。


什么是框架?🤔

在Python中,框架是为特定目的而开发和提供的一系列包或模块的集合。它通过自动化常见的开发任务,帮助开发者更高效地构建应用程序。

以下是流行的Python Web框架:

  • Flask
  • Django
  • Dash
  • Tornado
  • Web2py

微框架是一种极简主义的Web应用框架。它允许你创建一个最基础的Web应用,但需要依赖其他包来获得更多功能。


深入了解Flask 🔍

上一节我们介绍了框架的概念,本节中我们来看看Flask的具体细节。

Flask是一个用Python编写的开源、可扩展的微框架,用于快速、轻松地创建Web应用。

Flask基于两个核心组件构建:

  1. Werkzeug:一个Web服务器网关接口工具包。它实现了请求、响应和其他Web实用功能,使得在其之上构建Web框架成为可能。
  2. Jinja2:一个Python模板引擎,用于渲染动态网页。

Flask支持CRUD操作(即创建、读取、更新、删除),允许我们发起POSTPUTGETUPDATEDELETE请求。

Flask的主要特性包括:

  • 服务静态文件:Flask应用被设置为在名为static的文件夹内查找HTML、CSS和JS资源。
  • 可扩展性:尽管Flask本身是微框架,但它具有可扩展性。这意味着有许多包可以与Flask结合使用,以添加用户认证、数据存储等其他功能。

Web应用中的CRUD操作 📝

为了更好地理解,让我们以一个用户管理Web应用为例。

以下是不同HTTP方法在CRUD操作中的应用:

  • 创建 (Create):使用POSTPUT请求来创建新对象或数据。在我们的例子中,即创建一个新用户。两者的区别在于,POST每次请求都会创建,而PUT在第一次请求时创建,之后则更新它。大多数Web应用使用POST进行创建。
  • 读取 (Read):使用GET请求从服务器读取数据。在我们的例子中,即读取用户信息。
  • 更新 (Update):使用UPDATE请求来更新现有数据或对象。
  • 删除 (Delete):使用DELETE请求来删除现有数据或对象。

大多数Web应用倾向于使用POST进行创建、更新和删除操作,而使用GET进行读取操作。

Flask的API端点可以创建为返回多种形式的响应,例如字符串、JSON、HTML、错误对象等,同时还会返回一个响应状态码。


创建你的第一个Flask应用 🛠️

上一节我们介绍了Web应用的基本操作,本节我们来动手创建一个简单的Flask应用。

首先,我们需要安装Flask。使用Python的标准包管理器pip执行以下命令:

pip install flask

安装完成后,我们就可以开始创建Web应用了。基本步骤是:导入Flask,实例化Flask类以创建应用,然后运行应用。

让我们看一个示例Web应用,它服务于根API端点(/)的GET请求,并返回字符串“Hello World”作为响应。

# 从flask包中导入Flask模块
from flask import Flask

# 实例化Flask类,创建一个名为“my_first_application”的Web应用
# ‘app’只是一个引用名,可以是任何名称,但为清晰起见,大多数应用使用‘app’
app = Flask("my_first_application")

# 定义路由和当访问此路由时将调用的方法
# 如果没有指定方法,默认为GET。这个端点现在将能够服务于根路径(‘/’)的GET请求
@app.route('/')
def hello():
    # 当访问定义的API端点时,将调用hello方法。它不接受参数,并返回字符串“Hello World”
    return 'Hello World!'

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dd95a412911bb50ce266649daeb5fd9f_29.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dd95a412911bb50ce266649daeb5fd9f_30.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dd95a412911bb50ce266649daeb5fd9f_31.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dd95a412911bb50ce266649daeb5fd9f_32.png)

# 如果__name__属性被设置为‘__main__’,则运行Web应用
# 默认情况下,除非显式更改,否则__name__被设置为‘__main__’
if __name__ == '__main__':
    # 我们可以像运行任何其他Python应用一样保存和运行此代码
    app.run()

要启动开发环境下的服务器,只需将代码保存在一个Python文件中(例如 app.py),然后像运行其他Python脚本一样运行它:

python app.py

当Web应用服务器启动时,它会给出可以访问该应用的IP地址和端口(通常是 127.0.0.1:5000)。要检查端点,我们可以在浏览器中打开这个地址,看到从Web服务器应用返回的字符串“Hello World”。


使用模板和参数 📄

Flask应用可以服务静态和动态的HTML页面,这些页面被称为模板

默认情况下,Flask应用在根目录下名为templates的目录中查找模板。如果这些模板需要使用图像、样式表或JavaScript文件,这些资源则存储在根目录下名为static的文件夹中。

  • 静态页面:按原样渲染。
  • 动态页面:通常包含为每个请求动态填充的信息。这些信息通常基于作为参数传递的值。参数可以通过URL传递,也可以作为请求参数传递。

让我们看一个更复杂的Flask应用示例。

首先,导入必要的模块:

from flask import Flask, request, render_template

接下来,实例化Flask并(可选地)设置静态文件夹。默认文件夹名是static,但只要你显式设置,也可以使用不同名称的目录。

app = Flask(__name__, static_folder='static')

在这个Web应用中,我们定义了三个端点:

  1. /sample:渲染一个静态HTML页面,该HTML中的图像来自static目录。
  2. /user/<username>:这里的<username>是URL中的参数。该方法已显式设置为GET(这只是为了展示如何设置请求类型)。页面使用我们在URL中传递的参数进行渲染。
  3. /userusername作为请求参数传递。页面使用我们作为请求传递的参数进行渲染。

你将在实验环节中看到这个示例的具体实现。


总结 📚

本节课中我们一起学习了以下内容:

  • 应用框架自动化了与构建应用相关的常见任务。
  • Flask微框架可用于创建Web应用程序。
  • 流行的Python应用框架包括Django、Flask、Tornado和Web2py。

通过掌握Flask的基础,你已经迈出了使用Python构建动态Web应用的第一步。

100:应用程序开发的Python库与框架

在本节课中,我们将要学习Python在应用程序开发中至关重要的两类工具:库与框架。我们将了解它们各自的定义、作用、优势以及区别。


Python库:应用程序开发的工具箱

Python库可以被看作是工具箱。每个库都包含特定的工具,用于简化和加速特定的编程任务。

以下是几个核心的Python库及其作用:

  • NumPy:用于进行高级数学计算。例如,处理大型多维数组和矩阵。
    import numpy as np
    array = np.array([1, 2, 3, 4, 5])
    
  • Pandas:提供强大的数据操作和分析能力,尤其擅长处理表格数据。
  • Matplotlib:一个数据可视化库,可以轻松创建各种图表、直方图、散点图等。
  • Requests:简化发送HTTP请求的过程,是进行网络通信的必备库。
  • Beautiful Soup:用于从网页中抓取信息,能方便地对解析后的文档树进行遍历、搜索和修改。
  • SQLAlchemy:一个功能完整的SQL工具包和对象关系映射(ORM) 工具。它为开发者提供了SQL的全部功能和灵活性,同时允许以面向对象的方式操作数据库。
  • Pytest:一个测试框架,允许用户轻松创建简单测试,同时也支持对应用程序和库进行复杂的功能测试。

这些库为开发者节省了大量编写基础功能的时间和精力。


框架:应用程序的预定义结构

上一节我们介绍了完成特定任务的库,本节中我们来看看更宏观的构建工具——框架。

框架是用于应用程序开发的预定义结构。除了提供结构,框架还为一整套应用程序开发流程提供指导方针。框架通过提供一个定义良好的代码编写和组织结构来促进良好的编码实践,并允许复用代码库以添加功能。

一些常见的Python Web框架例子包括Django、Flask和Web2py。


使用框架的优势

使用框架进行应用开发有多项好处。以下是其主要优势:

  • 简化开发流程:框架通过预写的代码库、模块和开发者指南,简化了开发过程。
  • 简化调试过程:借助预构建的调试工具,Web框架为开发者简化了Web应用程序的调试过程。
  • 用更少的代码实现更多功能:框架配备了多个预构建的库和模块,开发者在编写代码时可以充分利用这些资源,无需从零开始创建所有必需的功能。
  • 提高数据库管理效率:框架自带内置的数据库集成工具,有助于无缝集成数据库端点以传输数据。
  • 增强安全性:安全性是应用程序用户的核心关切。使用框架的另一个好处是,开发者可以利用内置的安全功能和指南来实施安全措施。


框架与库的核心区别

让我们简要地看看框架和库之间有何不同。

  • 框架包含了应用程序的基本流程和架构,使你能够构建完整的应用程序。它提供了一套“骨架”,你需要填充“血肉”。
  • Python库是一组仅执行特定功能的包。它更像是工具箱里的一把“螺丝刀”或“锤子”,用于完成某个具体任务。

简单来说,框架决定了“如何构建”,而库提供了“用什么来构建”的具体工具


总结

本节课中我们一起学习了Python库与框架的核心知识。

我们了解到,Python库如同工具箱,每个库都有特定工具来简化和加速编程任务。框架则是应用程序开发的预定义结构,提供架构和开发指南。

使用框架能带来诸多好处,包括简化开发与调试流程、用更少代码实现更多功能、提高数据库管理效率以及增强安全性。

最关键的区别在于,框架使你能够构建完整的应用程序,而库则辅助实现特定的功能

101:Flask简介 🚀

在本节课中,我们将要学习Flask Web框架。我们将定义Flask,描述其主要特性,解释如何安装Flask及其主要依赖,并阐明Flask与另一个Python Web框架Django之间的主要区别。


什么是Flask?🤔

Flask是一个用于创建Web应用程序的微框架。与其他一些大型框架不同,它不固执己见,也不将用户绑定到特定的工具集。

Flask的一个复杂依赖是Python。运行Flask 2.2.2需要Python的最低版本为3.7。Flask由Armin Ronacher于2004年创建,最初是一个愚人节玩笑。它因其易用性和可扩展性而迅速流行起来。Flask提供了创建Web应用程序所需的最小依赖,但它具有可扩展性,许多社区扩展为Flask添加了额外功能。


Flask的主要特性 ✨

以下是Flask的核心功能列表:

  • 内置开发服务器:Flask自带一个在开发模式下运行应用程序的Web服务器。
  • 调试器:Flask配备了一个调试器,帮助调试应用程序。该调试器在浏览器中显示交互式回溯和堆栈跟踪。
  • 日志记录:Flask使用标准的Python日志记录来处理应用程序日志。你可以使用相同的记录器来记录关于应用程序的自定义消息。
  • 测试支持:Flask提供了一种测试应用程序不同部分的方法。此测试功能使开发人员能够遵循测试驱动开发方法。你可以使用像pytestcoverage这样的框架来确保代码按预期工作。
  • 请求与响应对象:开发人员可以访问请求和响应对象,以提取参数和自定义响应。

上一节我们介绍了Flask的核心功能,本节中我们来看看它的一些附加特性。

以下是Flask的附加功能:

  • 静态文件支持:该框架支持静态资源,如CSS文件、JavaScript文件和图像。Flask提供了在模板中加载静态文件的标签。
  • 模板引擎:你可以使用Jinja2模板框架开发动态页面。这些动态页面可以显示可能随每个请求而变化的信息,或者检查用户是否已登录。
  • 路由与动态URL:Flask提供路由功能,并支持动态URL,这对于RESTful服务极其有用。你可以为不同的HTTP方法创建路由,并在应用程序中提供重定向。
  • 错误处理:你可以在Flask中编写在应用程序级别工作的全局错误处理器。
  • 会话管理:Flask支持用户会话管理。

流行的社区扩展 📦

Flask的强大之处在于其可扩展性。以下是你可以添加到应用程序中的一些流行社区扩展:

  • Flask-SQLAlchemy:为Flask添加了对名为SQLAlchemy的ORM的支持,为开发人员提供了一种在Python中处理数据库对象的方法。
  • Flask-Mail:提供了设置SMTP邮件服务器的能力。
  • Flask-Admin:让你可以轻松地为Flask应用程序添加管理界面。
  • Flask-Uploads:允许你向应用程序添加自定义的文件上传功能。

除了上述扩展,这里还有一些其他有用的扩展:

  • Flask-CORS:允许你的应用程序处理跨源资源共享,使跨源JavaScript请求成为可能。
  • Flask-Migrate:为SQLAlchemy ORM添加数据库迁移功能。
  • Flask-User:添加用户认证、授权和其他用户管理活动。
  • Marshmallow:为你的代码添加了广泛的对象序列化和反序列化支持。
  • Celery:一个强大的任务队列,可用于简单的后台任务和复杂的多存储程序和调度。

如何安装Flask ⚙️

Flask可通过名为pip的Python包管理器获取,并且pip在实验环境中可用。但是,如果要在你自己的机器上安装,建议首先使用venvpipenv模块创建一个虚拟环境。

你可以使用以下命令安装Flask 2.2.2:

pip install flask==2.2.2

建议在你的应用程序中固定依赖项的版本号。这确保了应用程序可以在不同的环境(如开发、预发布和生产)中从头开始复现。这也确保了当包在没有版本号的情况下自动更新时,不会意外引入新的问题和错误。


Flask的内置依赖 🔧

Flask附带了一些内置依赖,这些依赖实现了各种功能:

  • Werkzeug:实现了WSGI(Web服务器网关接口)。这是应用程序和服务器之间的标准Python接口。
  • Jinja2:一种模板语言,用于渲染应用程序中的页面。
  • MarkupSafe:随Jinja2一起提供。它在渲染模板时转义不受信任的输入,以避免注入攻击。
  • ItsDangerous:用于安全地签名数据。这有助于确定数据是否被篡改,并用于保护Flask的会话Cookie。
  • Click:一个用于编写命令行应用程序的框架。它提供了flask命令,并允许添加自定义管理命令。

要查看内置依赖,你可以在虚拟环境中使用pip freeze命令,可以看到所有未内置的包默认都已安装。


Flask与Django的对比 ⚖️

现在,我们来了解另一个Python Web框架Django。以下是Flask和Django之间的一些关键区别:

  • 定位与规模:Flask旨在成为一个非常轻量级的框架。而Django是一个全栈框架。因此,Flask只提供创建Web应用程序所需的基本依赖,但开发人员可以选择提供附加功能的其他扩展。另一方面,Django包含了创建全栈应用程序所需的一切。
  • 灵活性与约定:Flask非常灵活。你可以以即插即用的方式添加和移除组件。另一方面,Django是固执己见的,它为开发人员做出了大部分决策,以便他们可以专注于应用程序的逻辑。


总结 📝

本节课中我们一起学习了Flask Web框架。我们了解到Flask是一个附带最少依赖的微框架,用于构建网站。Flask具有调试服务器、路由、模板和错误处理等功能。Flask可以通过使用社区扩展进行扩展。Flask可以作为Python包安装。与Flask相比,Django是一个全栈框架。

102:Flask基本应用程序和路由 🚀

在本节课中,我们将要学习如何创建和运行一个带有基本路由的Flask应用程序,解释如何从服务器向客户端返回JSON响应,并描述Flask中可用的各种配置选项。


创建第一个Flask应用程序

在创建第一个Flask应用程序之前,请确保你已经安装了Flask。

接下来,创建一个Python文件作为你的服务器,我们将这个文件命名为 app.py

现在,让我们在这个文件中编写代码。首先,从 flask 模块中导入大写的 Flask 类。

from flask import Flask

接着,实例化Flask类的一个对象作为你的应用。构造函数接受一个参数 __name__,你通过传入内置变量 __name__ 来设置应用模块的名称。这个名称用于在文件系统上查找资源,并被扩展用于提供调试信息。

app = Flask(__name__)

现在你已经定义了服务器,让我们添加第一个路由。你希望在调用服务器而不添加路径时,向客户端返回一条消息。因此,你需要使用 @app 装饰器来定义一个路由,该装饰器将路径作为参数。最后,你可以从方法中返回文本或HTML。

让我们看一下代码。@app 装饰器定义在 hello_world 方法上。它接受参数 /,并返回加粗的HTML消息“我的第一个Flask应用程序正在运行”。

@app.route('/')
def hello_world():
    return '<b>我的第一个Flask应用程序正在运行</b>'

运行你的应用程序

下一步是运行你的应用程序。第一步是创建几个系统环境变量。你需要一个名为 FLASK_APP 的变量,它包含主服务器文件的名称。此外,你还需要一个 FLASK_ENV 变量来定义开发或生产环境。这个变量在Flask 2.3中将被弃用。

如你所见,你已经将 FLASK_APP 环境变量定义为包含中央服务器的文件名,并将 FLASK_ENV 设置为 development。最后,通过执行 flask run 命令,将 run 参数传递给Flask框架来运行应用程序。

export FLASK_APP=app.py
export FLASK_ENV=development
flask run

Flask应用程序默认在5000端口上运行。你可以浏览 http://localhost:5000 来查看你的消息。让我们也使用浏览器开发者工具来查看从服务器返回的信息。请求的URL是 http://localhost:5000,请求方法是 HTTP GET。响应的状态码为200,表示成功响应。响应头中的内容类型是 text/html,服务器正在运行,Python版本为3.6.15。

恭喜你成功运行了第一个Flask应用程序。


配置选项与运行方式

现在,你需要在运行每个应用程序之前设置环境变量。你可以通过使用 --app 来标识要运行的Python文件,并添加 --debug 来启用开发模式,从而向Flask命令传递配置。调试标志还会在源文件更改时启用自动重启,这在开发应用程序并希望立即看到更改时非常有用。

在你的例子中,应用存储在一个名为 app.py 的文件中,因此你可以省略这个参数,因为Flask默认会在当前目录中查找 app.py

现在,输出应该看起来像这样,屏幕显示Flask应用程序像以前一样在开发模式下运行。


从Flask应用程序返回JSON

有多种方法可以从Flask应用程序返回JSON。一种方法是返回一个可序列化的对象,如字典或列表。在给定的代码中,你返回一个Python字典,Flask将使用Python的 json 模块将JSON返回给客户端。

@app.route('/data')
def return_data():
    return {'message': 'Hello from JSON!'}

让我们使用 curl 命令测试这是否有效。你将向 localhost:5000/data 发出GET请求,可以看到响应状态为200 OK。除了HTML,你还可以看到响应的内容类型是 application/json

最后,你可以看到返回的JSON。但请注意,如果你返回一个更复杂的对象(如类),请确保它是可序列化的。

第二种方法是使用Flask提供的 jsonify 方法。此方法接受键值对作为输入,并返回相应的JSON。让我们看一个例子。

你首先从Flask导入 jsonify,然后将键值对传递给 jsonify

from flask import jsonify

@app.route('/data_jsonify')
def return_data_jsonify():
    return jsonify(message='Hello from JSONify!')

你应该在浏览器中得到与之前相同的结果,开发者工具应该看起来相同,状态码为200 OK,返回的内容类型为 application/json


Flask的其他配置选项

现在,你已经了解了Flask的两个配置:FLASK_ENVFLASK_APP 变量。Flask提供了许多其他配置选项,你可能在应用程序中使用。

以下是部分核心配置选项:

  • ENV:指示应用程序运行的环境(生产或开发)。
  • DEBUG:启用调试模式。
  • TESTING:启用测试模式。
  • SECRET_KEY:用于签署会话cookie的密钥。
  • SESSION_COOKIE_NAME:会话cookie的名称。
  • SERVER_NAME:绑定主机和端口。
  • JSONIFY_MIMETYPE:默认为 application/json

此外,还有其他方法可以向Flask提供配置选项。Flask提供了一个 config 对象,你可以将配置选项插入到这个对象中。如果你已经有环境变量,可以将它们加载到 Config 对象中。最后,你可以将配置选项保存在一个单独的JSON文件中,并使用 config 对象提供的 from_file 方法加载它们。


应用程序结构

随着应用程序的增长,你应该创建一个目录结构,而不是使用单个Python文件。构建应用程序的方式有很多种,这里是一个例子:

  • 将主要源代码存储在其模块目录中。
  • 将所有配置存储在其文件中。
  • 将所有静态资源(如图像、JavaScript和CSS文件)单独存储。
  • 将所有动态内容存储在模板目录中。
  • 将所有测试文件放在测试目录中。
  • 拥有一个可以激活的虚拟环境,以安装正确版本的依赖项。


总结

本节课中我们一起学习了:

  1. 你可以通过实例化Flask类来创建服务器。
  2. 使用 @app 装饰器来创建URL处理器。
  3. 返回字符串消息,或使用 jsonify 方法返回JSON对象。
  4. 可以从环境变量、Python文件和 app.config 对象直接设置应用程序配置。

103:使用GET和POST模式的请求和响应对象 🚀

在本节课中,我们将学习Flask框架中的两个核心对象:请求对象(Request Object)和响应对象(Response Object)。你将了解如何自定义路由以响应不同的HTTP方法,如何从请求中提取数据,以及如何构建和定制返回给客户端的响应。


自定义Flask路由 🔧

上一节我们介绍了Flask的基础,本节中我们来看看如何自定义路由以处理不同的HTTP请求。

Flask使用路由装饰器 @app.route 来定义路径。默认情况下,该装饰器只响应GET请求。客户端只能向指定路径发送GET请求。

现在,你可以传入第二个参数 methods 来控制路径响应哪些HTTP方法。

以下是两个功能相同的方法示例。第一段代码中,GET方法是隐式声明的;而第二段代码则明确指定了GET方法。

# 隐式指定GET方法
@app.route('/path')
def handle_path():
    return 'Response'

# 显式指定GET方法
@app.route('/path', methods=['GET'])
def handle_path_explicit():
    return 'Response'


处理GET和POST请求示例 📝

以下是另一个例子。/health 这个URL将同时响应GET和POST请求。

如果请求是GET方法,代码将输出状态“0”和方法“GET”。
如果请求是POST方法,代码将输出状态“0”和方法“POST”。

以下是使用curl命令发送GET请求的输出:

Status: 0, Method: GET

以下是使用curl命令发送POST请求的输出:

Status: 0, Method: POST


Flask请求对象详解 🔍

所有发送到Flask的HTTP调用都包含一个请求对象,该对象由 flask.request 类创建。当客户端向Flask服务器请求资源时,该请求由 @app.route 装饰器处理的方法处理。你可以在同一个方法中检查和探索这个请求对象。

现在,请求对象中可用的信息包括:

  • 服务器的地址(以 (host, port) 元组形式)。
  • 随请求发送的头部信息。
  • 客户端请求的资源URL。

以下是请求对象中可访问的其他属性列表:

  • access_route:列出请求被多次转发时的所有IP地址。
  • full_path:表示请求的完整路径,包括任何查询字符串。
  • is_secure:如果客户端使用HTTPS或WSS协议发出请求,则为 True
  • is_json:如果请求包含JSON数据,则为 True
  • cookies:字典,包含随请求发送的任何Cookie。

此外,你还可以从请求头中访问以下数据:

  • Cache-Control:包含如何在浏览器中缓存的信息。
  • Accept:告知服务器客户端理解的内容类型。
  • Accept-Encoding:指示客户端支持的内容编码。
  • User-Agent:标识客户端应用程序、操作系统或版本。
  • Accept-Language:请求特定的语言和区域设置。
  • Host:指定所请求服务器的主机和端口号。

你可以用自定义的请求对象替换默认的请求对象,但这通常是可选的,因为Flask请求类的属性和方法通常足够使用。


请求对象属性实战演示 💻

现在,让我们看看当客户端发出请求时,服务器上打印出的一些实际值。在这个例子中,客户端是来自终端的curl命令,请求的服务器是 127.0.0.1(即localhost)的5000端口。

接下来,打印出一些头部信息:

  • Hostlocalhost:5000
  • User-Agentcurl/7.79.1
  • 客户端请求的内容类型是 application/json

让我们再看一些请求对象的属性:

  • 请求的URL是 http://localhost:5000/
  • access_route 列表包含单个值 127.0.0.1
  • 请求的完整路径是根路径,由单个正斜杠 / 表示。
  • is_jsonFalse,因为我们没有随GET请求发送任何数据。
  • is_secureFalse,因为URL是HTTP而不是HTTPS。
  • cookies 字典的长度为0。


从请求对象获取数据 🛠️

有多种方法可以从请求对象获取信息。

  • 使用 get_data() 以字节形式访问POST请求中的数据,然后你需要负责解析这些数据。
  • 你也可以使用 get_json() 方法获取POST请求中已解析为JSON的数据。

现在,Flask还提供了更聚焦的方法来从请求中获取确切信息,这样你就不必将数据解析成特定类型。

以下是这些方法的列表:

  • args:以字典形式提供查询参数。
  • json:将数据解析为字典。
  • files:提供用户上传的文件。
  • form:包含表单提交中发布的所有值。
  • values:将 args 数据与 form 数据结合。

提取请求中的特定值 📥

既然你知道了请求对象的样子以及从请求参数和主体获取数据的方法,现在让我们看看如何从这些数据中提取特定的值。

到目前为止,你所看到的方法的返回类型要么是 MultiDictImmutableMultiDict,要么是 CombinedMultiDict。所有这些数据结构的行为都类似于Python字典,你可以使用索引或 get 方法来提取值。

对于给定的URL http://localhost:5000/?course=capstone&rating=10,我们想要提取查询参数 courserating

首先,在你的方法中导入Flask和request模块。
然后,使用索引提取 course 参数的值。
接着,使用 get 方法提取 rating 参数的值。

get 方法在参数不存在时返回 None 值,而索引方法会返回错误并导致服务器以400错误请求停止。

浏览器中显示的消息表明请求的 coursecapstonerating10

from flask import Flask, request

@app.route('/')
def index():
    course = request.args['course']  # 使用索引
    rating = request.args.get('rating')  # 使用get方法
    return f'Course: {course}, Rating: {rating}'


Flask响应对象详解 📤

Flask会提供一个响应对象,就像它提供请求对象一样。你可以使用响应对象向客户端发送自定义属性和头部信息。

一些常见的响应属性包括:

  • status_code:指示请求的成功或失败。
  • headers:提供关于响应的更多信息。
  • content_type:显示所请求资源的媒体类型。
  • content_length:响应消息主体的大小。
  • content_encoding:指示应用于响应的任何编码,以便客户端知道如何解码数据。
  • mime_type:设置响应的媒体类型。
  • expires:包含响应被视为过期的日期或时间。

响应对象上还有一些标准方法:

  • set_cookie():在客户端设置浏览器Cookie。
  • delete_cookie():删除客户端上的Cookie。


使用响应对象的不同方法 🎯

现在让我们学习Flask如何使用不同的方法与响应对象协作。

  • 当你从 @app.route 方法返回数据时,会自动为你创建一个状态码为200、MIME类型为HTML的响应对象。
  • jsonify() 也会自动创建一个响应对象。
  • 你可以使用 make_response() 来创建自定义响应。
  • Flask提供了一个特殊的 redirect() 方法来返回302状态码并将客户端重定向到另一个URL。
  • 最后,Flask提供了一个 abort() 方法来返回带有错误条件的响应。

from flask import Flask, jsonify, make_response, redirect, abort

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/b0f423b1ee3f1e0ac594a3136ce1becb_66.png)

app = Flask(__name__)

# 自动创建响应
@app.route('/auto')
def auto_response():
    return 'Hello, World!'  # 自动创建200 OK, text/html响应

# 使用jsonify
@app.route('/json')
def json_response():
    return jsonify({'message': 'Hello, JSON!'})

# 使用make_response创建自定义响应
@app.route('/custom')
def custom_response():
    resp = make_response('Custom Response')
    resp.headers['X-Custom-Header'] = 'Value'
    resp.status_code = 201
    return resp

# 重定向
@app.route('/old')
def old_location():
    return redirect('/new')

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/b0f423b1ee3f1e0ac594a3136ce1becb_68.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/b0f423b1ee3f1e0ac594a3136ce1becb_69.png)

# 中止请求(返回错误)
@app.route('/error')
def cause_error():
    abort(404)  # 返回404 Not Found


总结 📚

本节课中我们一起学习了Flask框架中请求与响应对象的核心用法。

你了解到,Flask为每个客户端调用提供了一个请求对象和一个响应对象。你可以从Flask请求中获取额外信息,如头部信息。你可以解析请求对象以获取查询参数、请求主体和其他参数。并且,你可以在将响应发送回客户端之前,在响应对象上设置状态码和其他属性。

掌握这些对象是构建灵活、健壮的Web应用程序和API的基础。

104:动态路由 🛣️

在本节课中,我们将要学习如何在Flask框架中调用外部API,以及如何通过动态路由向Flask传递参数。掌握这些技能对于构建能够与外部服务交互、并能灵活处理不同请求的RESTful API至关重要。

在Flask中调用外部API 📡

上一节我们介绍了Flask的基本路由概念,本节中我们来看看如何让Flask应用与外部API进行通信。

在Flask中调用外部API最简单的方法是使用Python的 requests 库。你可以将外部API返回的JSON数据直接返回给你的客户端,也可以在将结果发送给客户端之前对其进行处理。

以下是调用外部API的一个具体示例:

import flask
import requests

app = flask.Flask(__name__)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dff7d4f53b7a4f050e60939ae8862dd2_6.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dff7d4f53b7a4f050e60939ae8862dd2_7.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dff7d4f53b7a4f050e60939ae8862dd2_8.png)

@app.route(‘/author‘)
def get_author():
    # 使用requests库请求Open Library API,搜索作者Michael Crichton的信息
    res = requests.get(‘https://openlibrary.org/search.json?author=Michael Crichton‘)

    # 检查来自Open Library API的响应状态码
    if res.status_code == 200:
        # 如果响应是200,将JSON返回给客户端
        return res.json()
    elif res.status_code == 404:
        # 如果响应是404,发送错误信息
        return ‘Something went wrong.‘, 404
    else:
        # 对于其他任何响应,返回状态码500和服务器错误信息
        return ‘Server error.‘, 500

在这个示例中,代码首先导入了必要的模块,定义了一个路由 /author。当访问该路由时,它会向外部API发起请求,并根据返回的状态码决定向客户端返回何种内容。

动态路由与参数传递 🔄

在开发RESTful API时,经常需要将资源ID作为请求URL的一部分发送。例如,创建一个根据国际标准书号(ISBN)返回图书信息的端点,但ISBN不应硬编码在代码中,而应由客户端通过URL提供。Flask为此提供了动态路由功能。

现在让我们看一个具体例子,将名为 isbn 的变量作为URL的动态部分:

@app.route(‘/book/<isbn>‘)
def get_book_by_isbn(isbn):
    # 将ISBN变量传递给Open Library API
    res = requests.get(f‘https://openlibrary.org/isbn/{isbn}.json‘)
    # 将结果返回给客户端
    return res.json()

Flask还允许你设置参数类型,框架会利用这些信息来验证传入的请求。例如,你可以创建一个端点来获取旧金山机场的航站楼数量:

@app.route(‘/terminals/<string:airport_code>‘)
def get_terminals(airport_code):
    # 此路由装饰器会在用户在URL末尾发送一个字符串时触发
    # 根据机场代码查询并返回航站楼数量
    # ... 查询逻辑 ...
    return {‘terminals‘: terminal_count}

同样地,在上一个ISBN的例子中,你可以指定ISBN为数字类型:

@app.route(‘/book/<int:isbn>‘)
def get_book_by_isbn(isbn):
    # 现在isbn参数被验证为整数类型
    # ... 处理逻辑 ...

以下是Flask中其他一些参数类型的示例:

  • string: 默认类型,接受任何不包含斜杠的文本。
  • int: 接受正整数。
  • float: 接受正浮点数。
  • path: 类似 string,但接受斜杠,可用于表示路径。
  • uuid: 接受UUID格式的字符串。

复杂参数类型示例:UUID 🆔

虽然 stringintfloat 是简单参数,但你也可以使用更复杂的类型,例如 uuid 来表示通用唯一标识符。

以下是一个使用UUID的示例。你可以创建一个端点,通过特定的UUID来获取网络信息:

import uuid

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dff7d4f53b7a4f050e60939ae8862dd2_34.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-ai-rbt/img/dff7d4f53b7a4f050e60939ae8862dd2_35.png)

@app.route(‘/network/<uuid:network_id>‘)
def get_network_info(network_id):
    # 此路由期望一个UUID类型的变量network_id
    # UUID作为参数传递给方法
    # 假设有一个函数能根据UUID查找网络
    network = find_network_by_uuid(network_id)

    if network:
        # 如果找到UUID,返回成功消息和网络信息
        return {‘status‘: ‘success‘, ‘network‘: network}, 200
    else:
        # 否则,返回错误代码和相应消息
        return {‘status‘: ‘error‘, ‘message‘: ‘Network not found.‘}, 404

在这段代码中,路由期望一个 uuid 类型的 network_id 变量。这个UUID被作为参数传递给处理函数,函数根据该UUID查找网络并返回相应结果。

总结 📝

本节课中我们一起学习了Flask框架中两个重要的高级功能。

首先,我们了解了如何在Flask应用中调用外部API,这通过使用 requests 库实现,并需要妥善处理不同的HTTP响应状态码。

其次,我们深入探讨了动态路由。你学会了:

  • 如何解析请求对象以获取查询参数、请求体等信息。
  • 如何在将响应发送回客户端之前,在响应对象上设置状态码。
  • 如何使用动态路由和参数类型验证来创建灵活且健壮的RESTful API端点。

掌握动态路由和外部API调用,将使你能够构建出功能更加强大、交互性更好的Web应用和微服务。

105:错误处理 🛠️

在本节课中,我们将要学习API开发中的错误处理机制。你将了解HTTP状态码的不同类别,掌握如何在Flask框架中处理和返回错误,从而构建出更健壮、更友好的Web服务。


HTTP状态码概述

每一个HTTP响应都包含一个三位数的状态码,用于指示请求的成功或错误状态。客户端负责解析这个状态码。有效的状态码范围是100到599。

这些状态码按每100个为一组进行分类:

  • 100-199:信息性状态码,表示请求已被接收,正在处理。
  • 200-299:成功状态码,表示请求已被成功接收、理解并接受。
  • 300-399:重定向状态码,表示需要客户端采取进一步的操作以完成请求。
  • 400-499:客户端错误状态码,表示请求包含语法错误或无法完成。
  • 500-599:服务器错误状态码,表示服务器在处理请求的过程中发生了错误。

本课程中编写的API将遵循此规范。例如,当客户端请求一个不存在的资源时,你可以返回一个404状态码;对于格式错误的请求,可以返回400状态码。


Flask中的默认状态码

Flask服务器在从 @app.route 装饰的方法返回时,默认会自动返回200 OK状态。当你使用 jsonify 方法响应请求时,默认也会返回200。

以下代码执行时,将返回一个状态码为200的成功响应:

return jsonify({"message": "Success"})


如何返回自定义状态码

你的代码可以返回非默认的状态码。Flask允许你通过一个元组来发送响应内容和状态码。

在下面的代码中,你返回了一条HTML响应信息,并显式设置了状态码为200:

return "<h2>My first application in action</h2>", 200

你也可以使用 make_response 方法来显式设置状态码。下面的代码返回与上一段代码相同的HTML消息和HTTP状态码200,但这里使用了 make_response 方法:

resp = make_response("<h2>My first application in action</h2>")
resp.status_code = 200
return resp

常用HTTP状态码示例

上一节我们介绍了如何返回自定义状态码,本节中我们来看看一些在本课程中可能会用到的具体状态码。

以下是几个关键状态码的说明:

  • 200:默认的成功状态,表示请求已成功处理。
  • 201:告知客户端服务器已成功创建了资源。
  • 202:表示请求已被接受,正在处理中,常用于批处理操作。
  • 204:服务器成功处理了请求,但没有返回任何内容。此状态适用于你希望浏览器不执行任何操作(例如,用户停留在当前页面)的场景。
  • 400:表示无效请求。可能意味着参数缺失、格式不正确或以其他方式无效。
  • 401:表示身份验证凭证缺失或无效。
  • 403:表示客户端凭证权限不足,无法完成请求。
  • 404:表示服务器找不到请求的资源。
  • 405:表示请求的方法(如GET, POST)不被支持。
  • 500:表示服务器内部发生错误。


在API端点中返回错误

既然你了解了不同的HTTP状态码,作为开发者,你需要从服务中返回正确的代码。让我们看一个例子。

这个 search_response 方法会查找名为 q 的数据库查询参数。服务在解析你的查询后,会调用模拟的 fetch_from_database 方法。

以下是该方法的逻辑:

  1. 如果资源存在,代码会将资源返回给客户端,服务器会隐式返回200状态码。
  2. 如果资源未找到,则返回404状态码。

现在,让我们使用 curl 程序来调用这个端点。

  1. 调用路由时不提供查询参数:curl 程序返回消息“input parameter missing”,状态码为422
  2. 使用正确的资源ID调用路由:curl 命令返回资源作为响应体,状态码为200
  3. 使用一个不存在的资源调用路由:curl 命令返回消息“resource not found”,状态码为404

应用级错误处理

Flask提供了一种在应用级别处理错误消息的方法。这里我们看到一个处理404错误的方法,它返回消息“API not found”并附带404状态码。

@app.errorhandler(404)
def not_found(error):
    return jsonify({"error": "API not found"}), 404

同样,这段代码创建了一个处理500错误的处理器,并返回消息“something went wrong on the server”。

@app.errorhandler(500)
def internal_error(error):
    return jsonify({"error": "Something went wrong on the server"}), 500

总结

本节课中我们一起学习了Web API错误处理的核心知识。

你了解到HTTP响应需要一个状态码来指示请求处理的结果。HTTP状态码分为多个类别,分别表示成功、客户端错误或服务器错误。Flask在响应时会隐式返回成功的200状态码,但你也可以显式提供其他状态码。此外,Flask还提供了强大的应用级错误处理器,帮助你统一管理错误响应。

通过合理使用这些状态码和错误处理机制,你可以使你的API更易于调试和使用,为用户提供更清晰的反馈。

106:使用Flask部署Web应用程序 🚀

在本节课中,我们将学习如何使用Flask框架来创建和部署一个Python Web应用程序。Flask是一个轻量级的“微框架”,能够帮助我们快速、轻松地构建Web应用。我们将了解Flask的核心功能、如何安装它,并一步步创建一个能响应请求的简单Web应用。

什么是Flask?🤔

Flask是一个用于使用Python快速、轻松创建Web应用程序的微框架。

Flask支持CRUD操作,即通过发起POSTPUTGETUPDATEDELETE请求来实现创建读取更新删除功能。

以下是Flask应用程序的基本结构。请注意Flask包的标志。

Flask中的CRUD操作

上一节我们介绍了Flask的基本概念,本节中我们来看看如何使用Flask进行具体的CRUD操作。

以下是Flask中不同HTTP方法对应的操作:

  • POSTPUT请求用于创建对象或数据。例如,可以使用POST和PUT请求来创建一个用户。
    • 两者的区别在于:POST在每次请求时都会创建对象或数据。
    • PUT仅在第一次请求时创建对象或数据,并在后续的请求中持续更新该对象或数据。
  • 在大多数Web应用程序中,你会看到使用POST来创建对象或数据。
  • 可以使用GET请求从服务器读取数据。
  • 可以使用UPDATE请求来更新现有的数据或对象。
  • 可以使用DELETE请求来删除现有的数据或对象。

需要注意的是,大多数Web应用程序倾向于使用POST进行创建、更新和删除对象及数据,而使用GET进行读取。

另一个视频详细解释了POST、PUT和GET请求。接下来,让我们看看如何使用Flask创建Web应用程序。

创建Flask Web应用程序 🛠️

上一节我们了解了Flask支持的请求类型,本节我们将动手创建一个Flask应用。

以下是创建Flask Web应用程序的步骤:

  1. 安装Flask包:第一步是使用Python的标准包管理器Pip安装Flask包。像所有其他包一样,你可以使用命令 pip install flask,这将获取Flask的最新版本。
    • 代码示例pip install flask
  2. 导入Flask模块:安装Flask包后,就可以创建Web应用程序了。接下来,从flask包中导入Flask模块。为此,输入 from flask import Flask
    • 代码示例from flask import Flask
  3. 实例化Flask类:创建一个Flask类的对象作为Web应用程序,例如命名为“我的第一个应用程序”,并将其存储为app
    • 代码示例app = Flask("My first application")
    • 大多数应用程序为了清晰起见使用引用名app。然而,app只是一个引用名称,你可以使用任何其他名称。
  4. 定义路由和方法:添加路由以及访问该路由时将调用的方法。例如,输入 @app.route('/')
    • 在这个例子中,既没有指定GET也没有指定POST。当你不指定请求类型时,默认是GET请求。因此,在这个例子中,该端点现在将能够为根路由/提供GET请求服务。
  5. 编写处理函数:将方法写为def hello():。当系统访问上一步中定义的API端点时,将调用hello方法。它不接受任何参数,并返回字符串“Hello world!”。
    • 代码示例
      @app.route('/')
      def hello():
          return 'Hello world!'
      
  6. 添加运行条件并启动应用:添加一个条件,即Web应用程序仅在__name__属性设置为__main__时才运行。默认情况下,__name__被设置为__main__,除非被显式更改。你可以像运行任何其他Python应用程序一样保存和运行它。输入 app.run(debug=True) 以在开发环境中启动服务器。
    • 代码示例
      if __name__ == '__main__':
          app.run(debug=True)
      

要启动开发环境中的服务器,你需要将代码保存在一个Python文件中,并像运行任何其他Python应用程序一样运行它。

当Web应用程序服务器启动时,它会提供可以访问该应用程序的IP地址和端口。

要检查端点,你可以打开浏览器并连接到服务器输出中看到的这个端点(通常是127.0.0.1:5000),然后看到从Web服务器应用程序返回的字符串“Hello world!”。

使用Flask模板 📄

上一节我们创建了一个返回简单文本的应用,本节我们来看看如何用Flask渲染更复杂的HTML页面。

模板不过是Web应用程序提供的预创建的HTML页面。它们可以是静态的,也可以是动态的。

默认情况下,Flask应用程序在根目录下名为templates的目录中查找模板。如果模板需要使用图像、样式表或JavaScript文件,这些文件存储在根目录下名为static的文件夹中。静态页面按原样渲染。

动态页面通常包含为每个请求动态填充的信息。这些页面通常基于作为参数传递的值。参数可以通过URL传递,也可以作为请求参数传递。

让我们看一个示例Flask应用程序。

  1. 导入必要模块:首先导入Flask以创建Web应用程序,导入request以处理传入的请求,导入render_template以渲染静态和动态HTML页面。
    • 代码示例from flask import Flask, render_template, request
  2. 实例化Flask并设置静态文件夹:接下来,实例化Flask并设置静态文件夹。例如:app = Flask("My first application")。默认文件夹名是static,但只要显式设置,你可以将静态内容放在不同名称的目录中。
  3. 定义端点:注意这个Web应用程序中有三个端点。
    • 第一个是 /sample:这将渲染一个静态HTML页面。此HTML中的图像来源于静态目录。
      • 代码示例
        @app.route('/sample')
        def get_sampleHTML():
            return render_template('sample.html')
        
    • 第二个是 /user/<username>:其中尖括号内的username是参数。页面使用我们在URL中传递的参数进行渲染。
      • 代码示例
        @app.route('/user/<username>', methods=['GET'])
        def get_user(username):
            return render_template('user.html', username=username)
        
    • 第三个是 /user:其中用户名作为请求参数传递。页面使用作为请求传递的参数进行渲染。

总结 📝

本节课中我们一起学习了如何使用Flask框架。

  • 你了解到Flask是一个用于创建Web应用程序的微框架,并支持CRUD操作。
  • 学习了如何使用Pip安装Flask包。
  • 掌握了使用Flask创建Web应用程序的步骤:导入Flask、实例化Flask、运行应用程序。
  • 最后,你还学会了如何使用Flask渲染静态和动态模板。

通过本课的学习,你已经具备了使用Flask搭建简单Web应用的基础知识。

107:课程简介

在本节课中,我们将要学习《构建AI应用》这门课程的整体介绍。这门课程由IBM的开发者与AI倡导者Antonio Kanggano和Taanmei Bkhi创建,并得到了他们的同事Sophia Chai和Y Yao的贡献。我们将了解课程的目标、先决条件以及你将通过本课程构建的项目。

📚 课程概述

欢迎来到《构建AI应用》课程。本课程将教你如何集成多种人工智能服务,以构建更智能、更有用的应用程序。

我们将通过使用IBM Watson服务来实现这一目标,但无论你决定使用哪种服务,其基本原理都是通用的。

🔗 先决条件与课程定位

本课程是我们Coursera AI专项课程的一部分。因此,学习Antonio的《无需编程构建AI驱动的聊天机器人》课程是先决条件。

本课程建立在你从先修课程中获得的Watson Assistant技能之上。如果你尚未学习该课程,建议暂停本课程,先注册学习先修课程。

🤖 课程核心项目:构建学生顾问聊天机器人

在本课程中,我们同样将构建一个聊天机器人。但这一次,你将学习如何通过将Watson Assistant与IBM Cloud目录中的其他服务集成,来创建更有用、更复杂的聊天机器人。

具体来说,我们将教你如何开发一个学生顾问。这个顾问不仅能使用预设答案响应用户,还能利用现有的知识库,为学生可能提出的众多问题获取答案。

在模块6的最终项目中,你将通过为Coursera平台本身开发一个学生顾问,来展示你新获得的技能,给我们留下深刻印象。

❓ 学生顾问聊天机器人的价值

你可能会好奇学生顾问聊天机器人的意义是什么。

像Coursera这样成功的慕课平台,会收到大量来自像你这样的在线学习者的支持问题。

一个学生顾问聊天机器人可以为大多数问题提供答案,同时仍允许将更复杂、需要人工干预或额外关怀的咨询升级至人工客服团队处理。

以下是学生可能提出的几类问题示例:

  • 关于平台本身及其使用的问题。例如,他们可能会问“旁听课程和付费课程有什么区别?”
  • 在线学习者也可能向聊天机器人寻求职业发展建议。他们可能会问“我应该学习哪门课程来了解聊天机器人?”或者说“我想成为一名数据科学家”。如果聊天机器人能在此处提供一些指导,那将非常棒。
  • 用户也可能遇到一些技术问题,聊天机器人可以显著减少人工支持团队需要处理的工单数量。

这使我们能够以较低成本扩展客户服务规模,同时为学生提供7x24小时的答案支持。

更重要的是,相同的技能可以应用于为各种企业创建聊天机器人,而不仅仅是像Coursera这样的慕课平台。

🎯 课程技能的广泛适用性

你在本课程中学到的知识,无论你构建何种聊天机器人,都将使你受益匪浅。此外,学习如何集成各种AI服务,即使你最终构建的应用程序根本不包含聊天机器人,也会带来回报。

在下一个视频中,我们将讨论在本课程中将采用哪些AI技术。

📝 总结

本节课中,我们一起学习了《构建AI应用》课程的简介。我们了解了课程的目标是集成多种AI服务构建复杂应用,明确了先修课程的要求,并认识了核心项目——一个能利用知识库回答问题的学生顾问聊天机器人。我们还探讨了这类机器人的实际价值及其技能的广泛适用性。接下来,我们将深入探讨本课程将使用的具体AI技术。

108:构建AI应用程序 🚀

在本课程中,我们将学习如何集成多种人工智能服务,以构建更智能、更有用的应用程序。我们将以IBM Watson服务为例进行实践,但所学的核心原理适用于任何你选择使用的服务。

本课程由IBM的开发者与AI倡导者Antonio Kanggano和Tanmei Bkhi创建,并得到了他们同事Sophia Chai和Y Yao的贡献。它是我们Coursera AI专业课程的一部分,学习本课程的前提是已经完成了Antonio的“无需编程构建AI驱动的聊天机器人”课程。

上一节我们介绍了课程背景,本节中我们来看看本课程的具体目标。本课程将建立在你在前置课程中获得的Watson Assistant技能之上。如果你尚未学习前置课程,建议先暂停本课程,完成前置学习。在本课程中,我们同样会构建一个聊天机器人,但这次你将学习如何通过将Watson Assistant与IBM Cloud目录中的其他服务集成,来创建更有用、更复杂的聊天机器人。

具体来说,我们将教你开发一个学生顾问机器人。这个机器人不仅能使用预设答案回复用户,还能利用现有的知识库,为学生们可能提出的各种问题寻找答案。在模块6的最终项目中,你将运用新掌握的技能,为Coursera平台本身开发一个学生顾问机器人,以此展示你的学习成果。

你可能会好奇学生顾问聊天机器人有什么用处。像Coursera这样成功的慕课平台会收到大量来自像你一样的在线学习者的支持性问题。学生顾问聊天机器人可以为大多数问题提供答案,同时仍能将更复杂、需要人工干预或特别关注的问题转交给人工客服团队处理。

以下是学生可能提出的几类问题示例:

  • 关于平台本身及其使用的问题,例如:“旁听课程和付费课程有什么区别?”
  • 寻求职业发展建议的问题,例如:“我应该学习哪门课程来了解聊天机器人?”或“我想成为一名数据科学家。”
  • 遇到技术问题时寻求帮助。

这样的机器人能够以低成本扩展客户服务规模,并为学生提供7x24小时的解答。更重要的是,相同的技能可以应用于为各种企业创建聊天机器人,而不仅仅是像Coursera这样的慕课平台。

你在本课程中学到的知识,无论你构建何种聊天机器人都会很有用。此外,学习如何集成各种AI服务,即使你最终构建的应用程序根本不包含聊天机器人,也会让你受益匪浅。

在下一节视频中,我们将讨论在本课程中将运用哪些AI技术。

本节课中我们一起学习了本课程的目标和意义:通过集成多种AI服务来构建功能强大的学生顾问聊天机器人,并了解了其实际应用场景和价值。

109:使用Watson Assistant创建聊天机器人 🚀

在本节课中,我们将学习如何使用IBM Watson Assistant服务创建一个基础的聊天机器人。我们将从启动服务实例开始,逐步完成定义对话技能、创建意图与实体,并最终构建一个能够处理基本学生咨询的对话流程。


概述

本模块包含两个实验。第一个实验中,我们将为学生顾问创建一个基础的聊天机器人。第二个实验中,我们将为这个聊天机器人集成Watson Discovery的响应功能。本视频将展示你在第一个实验中需要完成的操作。现在,请专注于理解视频内容,你将在实际实验环节中执行相同的步骤。


启动Watson Assistant实例

首先,我们需要启动Watson Assistant服务实例。


创建助手

在服务中,我们将为学生顾问创建一个新的助手。

我们将它命名为 Student Advisor Chatbot。我们会启用预览链接,以便快速与朋友或同事分享机器人进行测试。


添加对话技能

创建好助手后,我们需要为其添加一个对话技能。

我们将这个技能简单地命名为 Student Advisor。由于我们的聊天机器人将使用英语,因此需要确保选择英语作为语言。


选择内容目录

创建对话技能后,我们选择内容目录。

这里会看到一个预定义的意图列表,这些意图适用于大多数聊天机器人和不同行业。我们将添加 General 目录到我们的技能中,这样我们的机器人就能处理闲聊对话。

一系列以 general 为前缀的意图会被添加到我们的意图列表中。这使我们能轻松区分这些预定义意图和我们即将自定义的意图。


创建自定义意图

接下来,让我们创建自己的意图。

我们将创建一个名为 #enrollment_cost 的意图,并添加一些学生可能提出的关于课程费用的查询示例。

然后,我们再创建一个意图来处理用户关于Coursera专业证书的提问。

同样,我们需要添加一些用户可能提出的问题示例,例如:

which data Science certificate?


创建实体

处理完意图后,我们现在可以专注于添加一些实体,以捕获用户输入中的具体信息。

我们将创建一个名为 @professional_certificate 的实体。毕竟,可用的专业证书数量有限,我们可以通过实体来识别它们。

我们将为每个专业证书添加一个值到实体中,同时添加一些同义词。例如,data analysisdata engineering 也应被检测为数据科学证书的查询示例。

顺便一提,你现在观看的这个视频课程,正是即将上线的新AI专业证书的一部分。请务必查看。


创建课程推荐意图

目前,我们有了闲聊意图、关于费用的意图、关于专业证书的意图,以及一个用于区分不同证书的实体。


但我们还缺少一个用于课程推荐的意图。让我们来创建它。

我们将这个意图命名为 #course_recommendation,并添加一些示例,例如:

I want to learn Python.

recommend me a course on nutrition.



构建对话流程

现在我们已经完成了基础的意图和实体设置,是时候创建对话流程了。

系统会默认为我们创建 WelcomeAnything else 节点。

我们将编辑 Welcome 节点来优化聊天机器人的开场白。在响应中,我们将添加:

Hello, I'm a student advisor chatbot. I can help you with your questions about our site and give you course recommendations.

接下来,我们需要处理一些基本的闲聊互动。为了让对话机器人结构清晰,我们将专门为闲聊节点添加一个文件夹。这个文件夹是一个容器,有助于我们保持组织性,因此我们无需为其指定条件。

以下是我们要添加到文件夹中的节点:

  • 问候节点:我们首先添加一个处理问候的节点,其条件使用我们的 #general_greetings 意图。
  • 感谢节点:我们重复此过程,添加另一个子节点来处理用户的感谢。这个节点的条件将是 #general_positive_feedback 意图,并提供一些典型的响应,每次由聊天机器人随机选择,例如 You're very welcome.No problem.
  • 道别节点:最后,我们将第三个子节点添加到闲聊文件夹中。这个节点将处理道别,条件是 #general_ending 意图,响应将是一系列道别语变体,例如 See you!Have a great day.

现在,聊天机器人可以问候用户、处理基本闲聊,并且得益于 Anything else 节点,当它无法理解用户时,可以通知用户。虽然功能尚不完善,但我们的聊天机器人已初具雏形。


添加特定领域节点

折叠闲聊文件夹后,我们将能够选择 Welcome 节点并在其下方添加节点。

以下是我们要添加的特定领域节点:

  • 注册费用节点:这个节点将处理注册费用查询,因此其条件是 #enrollment_cost 意图,并在其响应中提供适当的解释。
  • 专业证书节点:接下来,我们选择刚刚创建的 Enrollment Cost 节点,在其下方创建另一个节点。这个节点将处理专业证书的推荐和请求。节点执行的条件是 #professional_certificate_recommendation 意图。

响应将取决于用户询问的专业证书类型。因此,我们需要将节点从常规文本响应自定义为条件多响应。

启用多响应后,我们将能够为每个可用的专业证书实体值提供特定的响应。

最后,我们将设置一个条件为 true 的响应,它将作为我们的后备情况。这个响应将提供一个指向Coursera网站上列出所有专业证书页面的链接。

  • 课程推荐节点:我们将为第三个也是最后一个特定领域节点(即我们的课程节点)重复此过程。对于这个节点,我们将条件设置为 #course_recommendation 意图,并暂时将响应留空。实际上,Coursera目录中的课程太多,无法为每个课程硬编码响应。相反,我们将在本模块后面的实验4中,通过利用Discovery以编程方式访问相关课程列表。

测试与总结

作为快速完整性测试,我们可以启动“试用”面板,验证聊天机器人是否能正确响应示例查询,例如:

Can you recommend a professional certificate?

现在轮到你了。在下一个实验中,你将亲自重复这些步骤。到实验结束时,你将拥有一个与本视频中看到的相同的基础聊天机器人。祝你好运。




总结

本节课中,我们一起学习了使用Watson Assistant创建聊天机器人的基础流程。我们从启动服务、创建助手和对话技能开始,然后定义了处理不同用户目标的意图(如询问费用、证书推荐和课程推荐)以及用于识别具体信息的实体。最后,我们构建了包含欢迎语、闲聊处理和特定领域响应的对话树。虽然当前机器人功能尚简,但它已具备了核心的对话框架,为后续集成更强大的功能(如Watson Discovery)奠定了基础。

110:为您的聊天机器人添加语音选项 🎤

在本节课中,我们将学习如何为基于Watson Assistant构建的聊天机器人添加语音交互功能。我们将探讨三种主要的实现路径,并分析各自的优缺点,帮助你根据应用场景选择最合适的方案。


概述:为何需要语音接口

Watson Assistant 提供了一个直观的数据交互界面,它体现了人工智能的独特价值。

我们不再局限于显式的界面交互。借助Watson,现在可以探索自然的、隐式的数据交互方式。聊天机器人是出色的技术,但与它们交互的方式多种多样,最佳选择取决于你的具体应用。

例如,某些用例需要基于文本的界面,而另一些则需要基于语音的界面。然而,在大多数情况下,与基于文本的界面相比,基于语音的界面通常更直观、更易于使用。

这是因为语音界面需要用户付出的努力更少。语音是人类拥有超过130万年的交流能力,而书面语言仅存在了大约6000年。

在为Watson Assistant聊天机器人实现语音界面时,主要有三种路径可以选择。


三种语音接口实现路径

上一节我们了解了语音交互的重要性,本节中我们来看看三种具体的实现方法。

以下是三种主要的实现方式:

  1. 通过电话呼叫使用聊天机器人:利用类似Twilio的API,它内置了语音转文本和文本转语音能力。
  2. 自行实现解决方案:开发一个应用程序,利用Watson的语音转文本和文本转语音API。
  3. 通过电话使用聊天机器人:依赖Voice Agent with Watson服务提供的便捷集成。

当然,还有其他选项,包括与Amazon Echo等设备集成。本课程不涵盖这些内容,但你将学到的技能将使你能够自行快速掌握如何将Watson服务与任何第三方渠道集成。

接下来,让我们详细分析这三种方法的优缺点。


1. 使用电话呼叫作为接口

首先,我们来讨论使用电话呼叫作为Watson Assistant的接口。在这种情况下,假设你使用像Twilio这样的API,它提供了内置的语音转文本和文本转语音能力。

以下是这种方法的优缺点:

  • 优点
    • 可访问性高:无论用户使用何种电话,无论他们是否有互联网连接,甚至在有些情况下无论是否有电力,他们都能访问聊天机器人提供的服务。
    • 访问快捷:用户无需下载应用程序来与聊天机器人交互,只需拨打一个电话号码即可。
  • 缺点
    • 需要自行编排服务:这意味着你需要手动连接、集成并测试Watson Assistant与你所使用的语音API。如果你还使用其他API,也需要手动接入。
    • 灵活性有限:你仅限于使用电话的键盘和语音功能,无法接收触摸、加速度或视觉输入等其他形式的输入。


2. 使用Watson语音API的应用程序选项

其次,是Watson语音API应用程序选项。本质上,这种方法需要你开发自己的应用程序,供用户下载或在线访问。

这通常是一个移动应用程序,通过利用Watson的语音转文本和文本转语音功能,来处理用户与机器人之间的交互。

以下是这种方法的优缺点:

  • 优点
    • 适用特殊功能:如果你的应用程序或聊天机器人提供某些特殊功能,而其他更常见的界面或消息应用程序无法提供,那么这种方法通常是个好主意。
    • 灵活性高:可以设计丰富的交互体验。
  • 缺点
    • 用户需要下载应用:这通常会给用户带来额外的不便,他们需要将应用程序下载到设备上。
    • 可能需要多平台开发:如果你希望覆盖更广泛的用户群,可能需要为多个操作系统开发此应用程序。例如,开发移动应用时,你会希望同时支持iOS和Android。
    • 需要自行处理服务编排:这种方法也需要你自行处理和实现Watson服务之间的编排。

3. 使用Voice Agent with Watson方法

最后,我们来谈谈Voice Agent with Watson方法。本质上,这是一种通过电话暴露Watson Assistant的简单而强大的方式。

它可以与SIP中继集成,SIP代表会话发起协议。简单来说,你会获得一个分配给您的电话号码,Voice Agent允许人们在拨打该号码时与你的聊天机器人交谈。

在后台,用户的语音通过Watson的语音转文本转换为文本,生成的文本被发送到Watson Assistant,其响应再通过Watson文本转语音生成最终的音频响应,传递给电话另一端的用户。

以下是这种方法的优缺点:

  • 优点
    • 服务编排自动化:Watson语音转文本、Watson Assistant和Watson文本转语音之间的编排都已为你完成。不过,你可以通过自己的SOE(服务编排引擎)进行定制。
    • 集成简便:Voice Agent承担了繁重的工作,负责将这些Watson服务与你提供的SIP中继集成。
    • 功能强大:它提供了许多强大的功能,其中之一是“Barge-in”,允许用户通过插话打断Watson,以及一种轻松直接连接到人工坐席的方式。
  • 缺点
    • 高级功能限制:一些高级功能仅在Voice Agent通过IBM Voice Gateway在本地部署时才可用,这需要采用包含公共和私有云组件的混合IBM云方法。


总结与课程实践选择

本节课中我们一起学习了为聊天机器人添加语音功能的三种主要方式。

总而言之,为你的聊天机器人赋予“声音”有多种方法。

在本模块的实验中,我们将选择第二种方法,因为它是最灵活且最具教育意义的一种。使用Python,你将实际集成Watson Assistant和Watson语音API。

111:为AI助手集成Watson语音服务 🎤

在本节课中,我们将学习如何将IBM Watson的语音服务集成到您已创建的AI助手中。您将了解如何通过语音与助手进行交互,包括将用户的语音输入转换为文本,以及将助手的文本回复合成为语音输出。本节主要聚焦于理解核心概念,具体的实践操作将在后续的实验环节进行。

实验目标与架构概述

实验5的目标是帮助您将Watson语音服务与您创建的助手集成。其整体架构非常简单。

用户通过音频提供输入,Watson语音转文本服务会将用户的录音转录成文本。随后,这段文本被传递给助手以生成Watson的回复。最后,助手的文本回复通过文本转语音服务合成为音频。

核心流程详解

接下来,我们详细拆解实现语音交互的各个步骤。

1. 获取用户语音输入

程序将运行一个while循环,其循环体为空(使用pass语句)。这个循环会持续运行,直到用户录制了一段音频并将其保存在当前工作目录中。

while 条件未满足:
    pass

2. 调用语音转文本服务

一旦检测到音频文件,程序会将其发送给Watson语音转文本服务。服务会返回一个JSON响应,我们需要从中解析出Watson置信度最高的文本转录结果。

3. 调用助手服务并管理上下文

获得的文本随后被传递给Watson助手服务。我们从服务获得响应后,需要做两件事:

  1. 更新对话的上下文,以确保能跟踪对话的进展。
  2. 获取给用户的文本回复。

当前的上下文被存储为一个全局变量,它始终保存最新的对话状态。每次用户发送消息并获得响应后,都会从Watson的JSON响应中更新这个上下文。

4. 合成并播放语音回复

助手的文本回复被送入Watson文本转语音服务,合成为音频。由于代码运行在Jupyter Notebook环境中,音频通过IPython.display.Audio模块播放,并设置为自动播放,这样用户就无需手动点击播放按钮。

主循环与用户操作

最后,您将运行主循环。这个主循环会等待用户录制音频,然后执行获取转录文本、传递给助手、记录上下文、将回复转为语音并最终播放Watson回复的完整流程。

在Jupyter Lab中录制语音,您需要:

  1. 点击屏幕左侧的调色板选项卡。
  2. 选择“录制音频”。
  3. 弹出的新窗口会显示一个麦克风图标,点击它开始录音。
  4. 完成后,点击停止按钮。

录制完成后,当前工作目录中会生成一个.webm格式的音频文件。

总结与展望

本节课中,我们一起学习了为AI助手集成Watson语音服务的核心概念与流程。我们了解了如何通过一个循环等待语音输入,如何调用语音转文本和文本转语音服务,以及如何管理对话上下文以实现连贯的交互。

虽然您即将看到的实现代码本身较为简洁,但它背后所代表的“与计算机进行端到端的语音通信”是一个极其复杂的领域。现在,是时候开始动手实践了。

112:了解部署选项 🚀

在本节课中,我们将学习如何将构建好的Watson Assistant聊天机器人部署到不同的渠道和平台,使其能够被最终用户访问和使用。我们将探讨多种部署方法,从简单的预置集成到更灵活的自定义代理应用方案。


概述

通过前面的学习,我们已经掌握了如何集成不同服务来构建由AI驱动的聊天机器人。无论你构建的是聊天机器人还是更通用的应用程序,这些原则都适用。现在,我们需要讨论如何将这些成果部署出去。将聊天机器人锁定在自己的账户中是没有意义的,我们必须学习如何将其暴露给外界,让广大用户能够访问。

部署选项概览

Watson Assistant提供了多种方式将你的聊天机器人部署到用户面前。以下是几种主要的途径。

1. 预置集成渠道

集成是部署Watson Assistant聊天机器人最简单的方法之一。你只需选择包含对话技能的助手,然后选择一个预制的集成方案,即可将其部署到你选择的渠道。

在本课程中,我们已经见过一种预置集成——预览链接。除此之外,还有其他几种可用的集成渠道,包括:

  • Facebook Messenger
  • Slack
  • Intercom(仅限Plus和Premium用户使用,因此在Watson Assistant的免费实例中看不到此选项)

这些集成极大地简化了将Watson Assistant连接到Facebook Messenger和Slack等界面的过程。重要的是,要将Watson Assistant视为对话引擎,而不是界面本身。用户可以在Facebook Messenger中输入消息,该输入会被发送给Watson Assistant,后者提供响应并发送回来,最终由Messenger显示给用户。因此,你可以将同一个助手部署到多个渠道,允许用户从不同的界面与同一个引擎交互。

2. 语音代理与WordPress插件

除了托管的集成渠道,我们还有更多部署助手的选择。

上一模块我们已经讨论过语音代理。这种部署方式使你的客户可以通过电话与你的聊天机器人交谈,而不是通过网站或即时通讯工具。

WordPress是另一个流行的选择,这要归功于我们功能齐全的插件。将聊天机器人部署到WordPress网站非常简单:一键安装插件,再一键激活,然后复制你的Watson Assistant凭证即可完成。你的WordPress网站上就会弹出一个漂亮的聊天框。这可以说是目前将Watson Assistant聊天机器人部署到网站的最简单方法。该插件也提供了丰富的选项,因此你几乎可以自定义聊天框界面的所有方面,用户正是通过这个界面与聊天机器人交互。如果你拥有WordPress网站,这绝对是最佳选择。

3. 自定义代理应用方法

那么,如果你想将聊天机器人部署到一个没有现成托管集成或插件的界面或即时通讯工具上,该怎么办呢?从概念上讲,这相当简单。Watson Assistant通过API提供服务。

因此,你只需要一个充当中间人的代理应用程序。这个应用程序将从界面(例如某个消息应用)收集输入,并通过API调用将其发送给Watson Assistant。一旦获得响应,代理应用会将其发送回界面,显示给用户。

这种方法甚至可以用于那些已有集成渠道(如Facebook和Slack),只是使用预置集成更加方便。然而,了解如何自己构建代理应用非常重要,这能确保你始终可以将Watson Assistant集成到你偏好的任何渠道。

到目前为止,你已经知道Watson Assistant可以直接从对话节点调用其他服务。但同样重要的是要指出,你自己的应用程序也可以利用对其他服务和后端系统的访问权限。

这可以为你提供极大的灵活性。在某些情况下,界面和你的应用程序之间可能没有区别,因为你只是将聊天机器人添加到自己的Web或移动应用中,而不是将其部署到第三方渠道。对于复杂的场景,也可以让你的应用程序与一个代理应用程序通信,以保持职责分离。这样,你的代理应用只专注于与Watson Assistant通信,而主应用程序则专注于为应用用户提供的实际功能。不过,在这种情况下,主应用程序仍然需要负责提供用户与聊天机器人交互的界面。

本模块的实验将向你展示如何使用托管集成,以及如何采用代理应用方法进行部署。

通过这种方式,你将能够将聊天机器人部署到任何渠道,同时在可用时仍能利用最便捷的方法。


总结

在本节课中,我们一起学习了Watson Assistant聊天机器人的多种部署选项。我们了解了便捷的预置集成渠道(如Facebook Messenger、Slack)、针对特定平台的解决方案(如WordPress插件),以及最灵活的自定义代理应用方法。掌握这些知识后,你将能够根据项目需求和目标平台,选择最合适的方式将你的AI聊天机器人交付给最终用户,使其真正发挥作用。

113:将聊天机器人部署到Facebook Messenger 🚀

在本节课中,我们将学习如何将之前课程中构建的基础聊天机器人,集成并部署到Facebook Messenger平台。我们将逐步完成从创建Facebook页面和应用,到最终连接Watson Assistant的整个过程。


创建Facebook页面与应用

上一节我们介绍了课程目标,本节中我们来看看部署的第一步:创建必要的Facebook资源。

首先,你需要注册一个Facebook账户。如果你已拥有账户,可以跳过此步骤。

接下来,你需要创建一个Facebook公共主页,用于承载我们的Watson Assistant聊天机器人。

现在,你已创建了Facebook公共主页,接下来需要创建一个Facebook应用,以便与我们的Watson Assistant聊天机器人进行集成。

为此,你需要一个Facebook开发者账户。拥有账户后,即可创建你的Facebook应用。

系统会要求你选择一个应用场景。对于我们的目的而言,这些场景并不适用,因此可以直接跳过此步骤。


获取应用凭证

为了使你的Watson聊天机器人能够连接到Facebook应用,你需要获取Facebook应用的应用密钥。此密钥可在应用设置的“基本”部分找到。


连接Watson Assistant与Facebook

现在我们需要将Watson Assistant连接到我们的Facebook公共主页。我们将通过应用的“产品”部分来完成此操作。

具体来说,我们需要为应用添加Messenger功能。

我们需要编辑权限,以允许Messenger访问我们的应用。

然后选择我们想要集成的公共主页。

为你的Facebook公共主页生成页面访问令牌

凭借这些凭证(即应用密钥页面访问令牌),我们就可以将Messenger与Watson Assistant集成。

启动你的Watson Assistant实例,并选择“集成”部分。在这里,你需要添加一个集成。

选择“Facebook Messenger”集成。将你的Facebook应用的应用密钥凭证粘贴到“应用密钥”框中。

将来自Facebook应用的页面访问令牌粘贴到“页面访问令牌”框中。

然后,记下生成的验证令牌。我们需要用它来正确配置我们的Messenger。

我们还需要生成一个回调URL并记下它。这个URL同样是我们Facebook应用所需要的。


在Facebook应用中完成配置

回到Facebook,我们Messenger的设置允许我们订阅事件。

在这里,我们将能够粘贴从Watson Assistant获得的回调URL验证令牌,并选择“messages”和“messaging_postbacks”作为订阅字段。

这确保了用户消息将被传递给Watson Assistant,并且其回复将显示回给用户。

我们还需要选择要监控此类事件的公共主页。

至此,我们的Watson Assistant聊天机器人就已与Facebook Messenger集成完毕。


测试与发布

你将能够通过在你的Facebook应用页面上使用Messenger来测试聊天机器人。然而,要做到这一点,你首先需要将自己添加为测试人员。

在本实验提供的材料中,我们为你提供了额外的步骤,以便在你对集成工作方式满意后,将其向公众开放。

现在,轮到你动手实践了。仔细遵循实验6中的步骤,你将能够很快部署你的聊天机器人。


总结

本节课中,我们一起学习了将Watson Assistant聊天机器人部署到Facebook Messenger的完整流程。我们涵盖了创建Facebook页面与应用、获取关键凭证、在Watson Assistant中配置集成,以及在Facebook开发者后台完成最终设置的核心步骤。通过遵循这些步骤,你可以将AI对话能力扩展到广泛的Messenger用户。

114:将您的聊天机器人部署到Slack 🚀

在本节课中,我们将学习如何将已构建的Watson Assistant聊天机器人集成并部署到Slack工作区中。通过本次实践,您将掌握连接两个平台所需的关键配置步骤。


概述:什么是Slack?🤔

Slack是一款团队协作中常用的沟通工具。

通过在Slack上部署聊天机器人,您可以改善团队的工作流程,或与朋友和家人一起设置重要事件的提醒。

本次实验的目标是将我们的聊天机器人与Slack进行集成。


第一步:创建Slack工作区与应用 🏗️

我们将从创建一个Slack应用开始。首先需要创建一个Slack工作区。访问Slack.com,输入您的电子邮件地址以开始创建。

为您的新工作区选择一个名称,并为项目和团队名称进行同样的操作。创建工作区后,我们将继续创建一个Slack应用,使其能够与我们的Watson Assistant聊天机器人通信。

因此,我们的第二步是登录Slack工作区,然后访问Slack网站的“应用”部分。





到达后,我们将创建一个新应用。

您需要为应用命名,并指定您希望部署此应用的工作区,然后创建应用。


第二步:创建Slack机器人用户 🤖

现在我们有了一个Slack应用,我们需要在Slack网站的Slack API相关部分创建一个Slack机器人用户。在这里,我们将添加一个新的机器人用户。


我们将确保机器人始终在线并准备好回答用户的问题,然后创建该用户。

接下来,我们需要记录下我们的客户端ID、客户端密钥和验证令牌。在Watson Assistant内部集成Slack时,我们将需要这些凭证。


现在,我们需要在我们的工作区内安装Slack应用,并且还需要对其进行授权。


保存将提供的OAuth访问令牌和机器人用户OAuth访问令牌。


第三步:在Watson Assistant中添加Slack集成 🔗

上一节我们准备好了Slack应用的所有凭证,本节中我们来看看如何在Watson Assistant中完成集成配置。

登录您的IBM Cloud账户并启动您的Watson Assistant实例。选择我们的“Student Advisor”聊天机器人。

在“集成”部分,我们将添加一个集成。

在这里,我们将像在上一个实验中所做的那样选择一个服务,但这次我们当然选择Slack。

在这里,我们将粘贴我们的一些凭证,即验证令牌、OAuth访问令牌和机器人用户OAuth访问令牌。这允许Watson Assistant连接到Slack。


我们还将能够为我们的Slackbot生成一个请求URL以供订阅。我们需要记下它,因为我们需要它回到Slack中配置我们的Slackbot。我们需要启用传入Webhook。




第四步:启用事件并连接URL ⚙️

接下来,我们启用事件并将Slack连接到从Watson Assistant收到的请求URL。每当Slack中发生选定的事件时,对此URL的HTTP调用将通知Watson Assistant,以便它可以做出适当的响应。

以下是需要启用的事件列表:

  • message.im:这将启用直接消息来触发聊天机器人的响应。
  • app_mention:这将启用提及(@机器人)来触发聊天机器人的响应。






总结与下一步 🎯

本节课中,我们一起学习了将Watson Assistant聊天机器人部署到Slack的完整流程。我们完成了从创建Slack工作区和应用、配置机器人用户、获取关键凭证,到在Watson Assistant中设置Slack集成并配置事件订阅的所有关键步骤。

现在您已经了解了所有步骤,接下来就轮到您在下一个实验中进行实际操作了。祝您好运!

115:如何在云上创建数据库实例 🗄️

在本节课中,我们将学习云数据库的核心概念,并演示如何在IBM Cloud上创建一个DB2数据库服务实例,以便为后续的SQL查询学习提供实践环境。

概述:什么是云数据库?

要学习SQL,首先需要一个可供练习查询的数据库。一个简便的方法是在云上创建一个数据库实例,并使用它来执行SQL语句。

完成本课后,你将能够:

  • 理解与云数据库相关的基本概念。
  • 列举几种云数据库。
  • 描述数据库服务实例。
  • 演示如何在IBM DB2 on Cloud上创建服务实例。

云数据库基础概念

云数据库是一种通过云平台构建和访问的数据库服务。它具备传统数据库的许多功能,并增加了云计算的灵活性。

使用云数据库的优势包括:

  • 易于使用:用户几乎可以从任何地方,通过供应商的API、Web界面或自己的应用程序(无论是在云端还是远程)访问云数据库。
  • 可扩展性:云数据库可以在运行时扩展或收缩其存储和计算能力,以适应不断变化的需求和使用情况,因此组织只需为实际使用的资源付费。
  • 灾难恢复:在发生自然灾害、设备故障或停电时,数据通过在地理上分布区域的云端远程服务器上的备份得以保持安全。

以下是云端关系型数据库的一些例子:

  • IBM DB2 on Cloud
  • IBM Cloud上的Databases for PostgreSQL
  • Oracle Database Cloud Service
  • Microsoft Azure SQL Database
  • Amazon Relational Database Service (RDS)

这些云数据库可以在云端运行,既可以作为由你管理的虚拟机,也可以根据供应商的不同,作为托管服务提供。数据库服务根据服务计划的不同,可以是单租户或多租户的。


数据库服务实例

要在云中运行数据库,你必须首先在你选择的云平台上配置一个数据库服务实例。

数据库即服务(DBaaS)实例为用户提供了对云端数据库资源的访问,而无需设置底层硬件、安装数据库软件和管理数据库。

数据库服务实例将在相关的表中保存你的数据。一旦数据加载到数据库实例中,你就可以使用Web界面或应用程序中的API连接到该实例。

一旦连接成功,你的应用程序就可以向数据库实例发送SQL查询。数据库实例随后将SQL语句解析为对数据库中数据和对象的操作。

任何检索到的数据都将作为结果集返回给应用程序。


实践:创建IBM DB2 on Cloud实例

上一节我们介绍了云数据库服务实例的概念,本节中我们来看看如何在IBM Cloud上实际创建一个DB2数据库实例。

IBM DB2 on Cloud是在云端为你提供的SQL数据库。你可以像使用任何数据库软件一样使用DB2 on Cloud,但无需承担高昂的硬件设置或软件安装和维护开销。

以下是创建DB2服务实例的步骤:

  1. 导航至IBM Cloud目录并选择DB2服务
    • 注意:DB2服务有多个变体,包括DB2 Hosted和DB2 Warehouse。出于我们的目的,我们将选择附带免费Lite计划的DB2服务。

  1. 选择Lite计划

    • 如果需要更改默认设置,你可以输入服务实例名称、选择部署区域以及服务的组织和空间,然后点击“创建”。
  2. 从IBM Cloud仪表板管理实例

    • 你可以通过从IBM Cloud仪表板选择“服务”来查看你创建的IBM DB2服务。

    • 在此仪表板中,你可以管理你的数据库实例。例如,你可以点击“打开控制台”按钮来启动数据库实例的Web控制台。该Web控制台允许你创建表、加载数据、浏览表中的数据以及执行SQL查询。

  1. 获取连接凭证
    • 为了从你的应用程序访问数据库实例,你将需要服务凭证。首次使用时,你需要创建一组新凭证。你也可以选择为不同的应用程序和用户创建多组凭证。

    • 创建一组服务凭证后,你可以将其视为一个JSON代码片段。凭证包含建立数据库连接所需的详细信息,包括以下内容:

      • 数据库名称端口号
      • 主机名:这是你的数据库实例所在的云端服务器的名称。
      • 用户名密码:这是你连接时将使用的用户ID和密码。
      • 注意:你的用户名默认也是创建表的模式名

总结

本节课中,我们一起学习了云数据库的核心优势与概念,并逐步演示了如何在IBM Cloud上创建并配置一个DB2数据库服务实例。你现在已经知道,云数据库实例(DBaaS)免去了硬件设置和软件管理的麻烦,并可以通过服务凭证从应用程序进行连接。

现在你已了解如何在云上创建数据库实例,下一步就是实际去创建一个。

116:理解Watson Discovery 🧠

在本节课中,我们将要学习IBM Cloud上最酷的服务之一——Watson Discovery。我们将了解它如何作为一个高级的洞察引擎,利用人工智能能力从数据中提取有价值的信息。

概述:什么是Watson Discovery? 🔍

Watson Discovery可以被视为一个高级的洞察引擎。它的核心目标是利用沃森的人工智能能力,从您的数据中提取洞察力。大多数公司都拥有丰富的数据。真正的挑战在于提取洞察力并发现可操作的信息。

这正是数据科学家角色近年来变得如此突出的原因。数据无处不在,而利用数据改善业务的能力才是真正的价值所在。

Watson Discovery的实际应用示例 📰

为了让概念更具体,我们来看一个实际例子。Watson Discovery允许您加载自己的数据,但它也附带了一个便捷的Watson Discovery新闻数据集,其中包含过去60天的新闻文章。这个庞大的集合会自动为您维护和更新,让您可以轻松分析新闻。

现在想象一下,如果您是一名记者、作家或任何需要分析新闻的人,能够访问超过1000万篇新闻文章是非常惊人的。但这也相当令人不知所措。您如何查询如此庞大的数据集以从中提取洞察力呢?

Watson Discovery的核心功能:数据增强与查询 ✨

这正是Watson Discovery的魔力所在。Discovery能够应用人工智能算法来增强您导入的原始数据。对于为您导入的新闻集合,这种增强包括从文档中提取关键词、标记概念、提取特定实体(如国家、公司甚至人物),以及进行情感分析,判断一篇关于特定公司的新闻文章是积极的、中性的还是消极的。

Discovery允许我们查询这些增强后的数据。我们可以通过自然语言、可视化构建器或使用Discovery特有的语法(称为Discovery查询语言)来构建查询。在Watson Discovery新闻中,我们甚至有一些示例查询可以立即获得结果,并向我们展示该语法的具体写法。

这些示例查询的另一个优点是,它们让您了解可以使用Watson Discovery提取何种洞察力。例如,使用这个新闻集合,我们可以找出新闻中受到最积极报道的前10家公司、最近被收购的AI公司,甚至是科技行业中被提及最多的人物。想象一下,如果没有像Discovery这样的服务,手动完成这些工作会是多么困难。

这些查询之所以可能,是因为Watson Discovery增强了文档。以一篇关于特斯拉的文章为例,沃森会阅读文章,判断其情感是积极、消极还是中性,检测相关人物(例如埃隆·马斯克),以及其中提到的公司(例如特斯拉和梅赛德斯-奔驰)等等。

深入Discovery查询语言 💻

在本模块的实验中,您会更熟悉Discovery查询语言,但我想让您了解一下它的样子。

让我们放大这个关于媒体中讨论最积极的公司的特定查询。

我们首先从enriched_text开始,这是一篇新闻文章的文本加上沃森为我们添加的所有增强信息。然后,我们选择文档中的entities。实体是由沃森检测到的特殊值。

可以将其理解为公司、人物、城市等。接着,我们筛选特定类型的实体,在我们的例子中是公司,但我们只想要积极情绪的子集。因此,我们使用情感分析增强功能来要求较高的积极情绪得分。

最后,我们指定希望通过实体名称(例如Netflix或Facebook)来聚合结果。

如果我们想找出受到负面媒体报道的人物,我们只需将实体类型过滤器从公司更改为人物,并调整情绪得分要求即可。有时您会发现同一个名字同时出现在最积极和最消极的列表中。这对于非常著名的政治家来说并不罕见,因为他们往往在新闻界收到两极分化的报道,所以他们可能会收到很多积极的提及,但同时也会受到很多批评。

不必过于担心立即掌握查询语言的细节。有更简单的方法可以使用自然语言或可视化模式来查询Discovery。

尽管如此,重要的是您要知道,如果需要,高级选项是存在的。您使用Discovery越多,操作越多,您就会越熟悉其强大的查询语言。

连接您自己的数据源 📂

能够访问新闻数据固然很好,但大多数企业可能更感兴趣的是能够查询他们自己的数据和文档。Discovery允许您轻松连接各种数据源以创建自己的集合。

例如,它与Salesforce、SharePoint、Box和IBM Cloud对象存储有集成。

您还可以让Discovery爬取网站信息,以及直接上传文档,包括PDF文件。

您的业务可能具有特定领域的实体,因此Discovery甚至为您提供了创建自定义机器学习模型的能力,用于识别和分类与您特定业务相关的实体。

这是一个更高级的主题,需要与另一个沃森工具——即Watson Knowledge Studio——集成,它允许您创建和训练模型。就本课程而言,我们不会利用此类功能,但重要的是您知道如果需要,它是可用的。事实上,您可以自由探索Discovery及其在本课程涵盖内容之外的功能,通过查阅官方文档。

总结 📝

本节课中,我们一起学习了Watson Discovery的核心概念。我们了解到它是一个强大的洞察引擎,能够通过人工智能增强数据(如提取实体、分析情感),并提供多种查询方式(自然语言、可视化、专用查询语言)来从海量数据(如新闻集合或企业自有文档)中提取有价值的业务洞察。这为解决企业“数据丰富,洞察匮乏”的挑战提供了强大工具。

117:创建Discovery集合 🗂️

在本节课中,我们将学习如何创建并使用Watson Discovery集合。我们将从探索一个预置的新闻集合开始,了解其强大的查询功能,然后动手为Coursera的课程内容创建一个自定义集合,为后续构建智能聊天机器人打下基础。


概述与目标

本模块实验的目标是让您熟悉Watson Discovery集合,并创建一个包含Coursera课程内容的专用集合。您可以在观看本视频时专注于理解步骤,实际操作将在实验环节完成。

探索预置的新闻集合

上一节我们介绍了本课的目标,本节中我们来看看如何访问和探索Watson Discovery服务。

首先,从IBM Cloud仪表板开始。点击“服务”以查看已实例化的服务列表。在列表中找到您的Discovery服务并点击其名称。


注意:如果您的账户中没有Discovery实例,请返回本课程第一个模块的实验1,按照说明创建一个。

接下来,点击“启动Watson Discovery”按钮,启动Discovery实例的管理界面。


界面会显示一个自动为我们创建的默认新闻集合,以及两个用于从其他来源或本地驱动器数据创建集合的按钮。我们可以先探索这个新闻集合。点击“Watson Discovery News”磁贴以打开该集合。

这个集合是自动添加和管理的,它包含了来自多种出版物、多种语言的数百万篇近期新闻文章。例如,我的集合显示仅英文每天就新增30万篇文章。这些文章不仅仅是原始数据,Watson会分析它们并自动添加有用的元数据来分类其中的信息,以便我们能够查询这个庞大的数据集。

事实上,为了让我们快速上手,屏幕右侧提供了一些预构建的查询。让我们点击第一个关于“AI公司收购”的查询下的“运行”按钮,看看结果如何。

在左侧,您会注意到这个查询是通过Discovery查询语言定义的。其他选项包括自然语言和方便的可视化模式。enriched_text.concepts.text:"artificial intelligence" 是Discovery查询语言的写法,意思是我们要获取所有被Watson识别为与“人工智能”概念相关的文档。

但是,我们不需要所有可能的结果。我们希望将查询过滤到公司收购相关的内容。因此,您会注意到查询在屏幕左下角对文档进行了过滤。这里使用的Discovery查询语言要求:从我们已经选出的所有关于AI的文章中,筛选出包含“收购”行为,特别是收购任何“公司”类型实体的文章。

本质上,我们是在筛选讨论公司收购的AI文章。

在右侧的结果中,您会看到显示了104篇相关匹配文档中的前10篇。对于每篇文章,我们都获得了各种有用的信息,包括标题、URL、文本、Watson用于分类文章的概念和关键词,以及文章的情感是积极、消极还是中性。

请想一想,我们免费获得了多么强大的功能:一个由Watson分类的海量新闻集合,以及智能查询它的能力。如果您是一名记者,这将是一个无比宝贵的工具。

创建自定义课程集合

那么,如果您不是记者呢?好消息是,在处理您自己的数据时,您同样可以驾驭这种力量。

在本课程中,我们将开发一个能够帮助Coursera学生解答问题的聊天机器人。根据经验,许多学生会询问课程推荐。由于Coursera有海量的主题,在聊天机器人中硬编码每个主题是不可行的。因此,我们将转而依靠Discovery来处理此类查询。但首先,我们需要创建一个包含课程数据的集合。让我们看看如何完成这一步。

在您Discovery服务的“管理数据”部分,您会看到我们之前讨论过的两个按钮。在本模块的实验中,您将下载一个包含Coursera课程子集的JSON文件。因此,这里我们点击“上传您自己的数据”。

点击后,会弹出一个窗口要求我们输入集合名称。我们将集合命名为“Coursera courses”,由于我们的课程主要是英文,保留默认语言为英语,然后点击“创建”。


在这里,我们可以点击云图标或拖拽文件来上传到我们的集合中。在实验练习期间,您将下载并解压一个包含500个课程文件的ZIP文件。

每个文件都具有以下JSON结构:

{
  "name": "课程名称",
  "slug": "用于重构课程URL的短标识",
  "description": "课程描述文本"
}

最重要的部分是课程名称(name)、用于重构课程URL的短标识(slug),以及描述(description)。描述包含了Watson将用来判断课程内容和与用户查询相关性的文本。

一旦我们点击那个云上传图标,系统将提示选择我们下载的文件。选择您解压ZIP文件的文件夹后,您可以按 Ctrl+A(在Mac上是 Command+A)来选择文件夹内的所有文件,然后点击“打开”。

上传过程需要一点时间,但最终您会看到有500个文档已添加到您的集合中。您可能会收到一些关于“id”是受保护键的警告,但由于它不包含对我们课程有用的信息,可以安全地忽略JSON文件中这个特定键未被导入的事实。

您还会注意到,有选项可以为我们的原始数据添加一些富集功能。我们通过点击右侧的“添加富集”链接来实现。在这里,我们将从下拉菜单中选择“description”字段,因为描述是我们文档中数据最多的字段。

接下来,点击“添加富集”来丰富这个字段。从出现的弹出窗口中,我们将添加“关键词提取”和“概念标记”。还有许多其他选项可用。出于我们聊天机器人的目的,我们的查询将简单地匹配课程与用户关键词的相关性。

添加完两个富集功能后,点击右上角的“X”关闭弹出窗口。

您会注意到,“description”字段现在拥有了两个富集功能。最后,我们可以点击“将更改应用于集合”按钮。

作为完整性检查,我们可以点击Discovery的“查询”部分(左侧的放大镜图标),然后点击“搜索文档”。在这里,我们可以尝试查询一些内容,例如“Python”,然后点击底部的“运行查询”。我们应该看到一系列相关课程,这确认了我们的集合状态良好,已准备好被查询。

总结

在本节课中,我们一起学习了Watson Discovery的核心功能。我们首先探索了强大的预置新闻集合及其查询语言,然后逐步创建了一个包含Coursera课程数据的自定义集合,并为其添加了关键词提取和概念标记等富集功能,使其能够智能地响应用户的课程查询。

现在您已经了解了基本流程,接下来轮到您进行实验2了。

118:集成Watson Assistant与Discovery 🤖➡️📚

在本节课中,我们将要学习如何将Watson Assistant与Watson Discovery服务集成,从而构建一个能够回答更广泛、更具体问题的智能聊天机器人。


Watson Discovery非常出色,但您可能想知道它与聊天机器人有何关联。

您可能知道,Watson Assistant允许我们解释和分类用户的输入,然后根据我们在对话中定义的规则,用一些预定义的响应进行回复。这种方法对于处理常见问题(即图表中的“短头”部分)非常有效。更具挑战性的是处理用户可能提出的“长尾”问题。如果我们的聊天机器人也能回答这些非常具体的问题,那将非常理想。

大多数企业都拥有现有的知识库,这些知识库通常可供客户和支持他们的客服人员使用。这些网页和/或PDF文档往往包含丰富的信息。

手动提取这些文档中所有可能的答案,并将它们准备为对话中成千上万种可能的响应,这是不可行的。

这正是Watson Discovery发挥作用的地方。通过连接Watson Assistant和Watson Discovery,我们可以让Watson Assistant处理我们预定义的查询,同时利用Watson Discovery的查询能力来处理长尾问题。

当无法响应用户时,Watson Assistant会将用户查询传递给Watson Discovery。Discovery能够很好地处理用自然语言表达的查询,并允许我们从已定义的知识库集合中检索相关的答案。

最后,Watson Assistant会将检索到的知识库答案传递给用户。

换句话说,通过集成Watson Assistant和Watson Discovery,我们将能够创建更智能、更有用的聊天机器人。Watson Assistant仍将处理与用户的整个交互,但会将长尾问题外包给Discovery处理。

好消息是,Watson Assistant和Watson Discovery可以轻松集成,无需任何编程。就像您为助手添加对话技能一样,您可以添加一个搜索技能,将您的聊天机器人与Discovery连接起来,从而轻松查询您在那里的集合。

坏消息是,这种便捷的集成仅适用于Plus或Premium计划的用户。如果您像大多数人在培训期间一样使用免费的Lite计划,您将无法添加搜索技能。不过,请不要担心,因为我们仍然可以通过API集成Watson Assistant和Watson Discovery。事实上,每个Watson服务都提供了一个API,可用于以编程方式访问该服务。

因此,我们可以直接从脚本或应用程序查询Watson Discovery集合。这一点,再加上Watson Assistant对话节点能够以编程方式调用API,将使两者能够进行通信。

从对话节点调用远程API的最简单方法实际上是使用云函数。云函数正如其名,它是一个可以执行某些代码并可以远程调用的函数。在我们的案例中,云函数将向Watson Discovery服务发出API请求并返回响应。

然后,Watson Assistant将利用该函数返回的值向用户发出最终响应。我喜欢这种方法,因为它非常灵活。您可能希望在某个时候将您的对话连接到不同的服务,了解如何集成不同的服务将会派上用场。

此外,您还将更加熟悉IBM Cloud Functions提供的无服务器计算模型。

在模块4中,您还将学习如何使用API集成Watson的语音转文本和文本转语音服务。


本节课中,我们一起学习了如何通过API将Watson Assistant与Watson Discovery集成,以扩展聊天机器人的知识处理能力。我们了解了处理常见问题的“短头”与处理特定问题的“长尾”之间的区别,并掌握了利用云函数作为桥梁连接两个服务的基本原理。这种方法不仅增强了机器人的实用性,也为未来集成其他服务打下了基础。

119:向聊天机器人添加Watson Discovery 🧠

在本节课中,我们将学习如何将Watson Discovery服务集成到您的聊天机器人中。我们将通过使用IBM Cloud Functions(无服务器函数)作为桥梁,使Watson Assistant能够查询Discovery服务中的课程数据,从而为机器人提供智能问答能力。


概述与准备工作

上一节我们介绍了Watson Discovery的基本概念。本节中,我们来看看如何将其与聊天机器人进行实际集成。

首先,您需要确保拥有一个已配置好的Watson Discovery服务实例。如果尚未创建,请返回本课程第一模块的实验一,按照说明创建一个。

获取Discovery服务凭证

从IBM Cloud仪表板开始操作。

  1. 选择“服务”以查看已实例化的服务列表。
  2. 在列表中找到您的Discovery服务并选中它。
  3. 获取该Discovery实例的API密钥和URL,并记录下来以备后用。
  4. 启动Watson Discovery工具。

获取课程集合凭证

接下来,打开您之前创建的“Coursera Course catalog”集合。

  1. 选择“API”选项,为此集合获取一些凭证。
  2. 记录下集合ID环境ID。我们稍后需要通过函数查询此集合,将需要这些信息。


配置实验环境

现在,让我们导航到Skills Network实验环境。

  1. 使用您的Cognitive Class或其他社交媒体账户登录SN Labs。
  2. 登录后,选择启动Jupyter Lab。此过程可能需要几分钟才能完成。
  3. Jupyter Lab启动后,请确保选择“Python 3”内核。

设置实验文件

Jupyter Lab笔记本界面如下所示。在第一个单元格中,您将复制实验提供的代码行,然后运行该单元格以执行它。

这将复制我们实验中所需的脚本和配置文件。

此时,您应该在Jupyter Lab环境中看到一个“lab 4”文件夹。此文件夹包含我们无服务器函数的所有代码和配置。该函数将连接到Discovery服务并为我们从集合中检索课程列表。

  1. 选择“lab 4”文件夹,然后进入“lab4-adding-discovery-to-chatbot”子文件夹。
  2. 您会看到一个名为serverless.yml的文件。在此文件中,替换我们之前记录的凭证值,并保存配置。

安装依赖并登录IBM Cloud

接下来,您需要创建另一个单元格,从实验中复制更多代码,然后运行这个新单元格。这将安装一些与IBM Cloud交互所需的库。

然后,您需要从笔记本登录您的IBM Cloud账户。

  1. 创建一个新单元格,并复制实验中提供的代码片段。
  2. 在此处指定您的IBM Cloud凭证并运行该单元格。
  3. 运行后将输出一些关于我们账户的信息,以便我们可以从IBM Cloud账户中检索区域组织名称。我们将使用该信息在该组织和区域内创建一个空间。

部署无服务器函数

接下来,我们将目标指向该空间,为我们的无服务器基础设施安装一些必需的库,并将我们的JavaScript函数部署到Cloud Functions。

我们可以随时列出创建的所有函数。在我们的例子中,只会有一个以“/connect-discovery”结尾的函数。

获取函数的API密钥

接着,我们需要获取该函数的API密钥,以便稍后可以从Watson Assistant调用它。

要查找此信息,我们需要在IBM Cloud上登录并找到“函数”部分。

  1. 我们将看到一个操作列表,并选择我们创建的那个。
  2. 从这里,选择“端点”,我们将在此处获取该操作的URL并进行复制。
  3. 然后选择“API密钥”以显示并复制基于Cloud Foundry的API密钥。

这些将用于在Watson Assistant中进行配置。


在Watson Assistant中集成函数

现在,您已准备就绪,可以开始将此函数与Watson Assistant集成。

从您的IBM Cloud仪表板启动您的Watson Assistant服务。

  1. 选择您的“Student Advisor”技能,然后选择“选项”部分。
  2. 在这里,您将有机会提供我们操作的URL,以及我们从先前步骤中获取的、基于Cloud Foundry的API密钥派生的授权凭证。
  3. 最后,保存这些凭证。

配置对话节点

在对话流程中,找到“courses”节点,并在其下方添加一个名为“discovery”的子节点。

我们需要自定义“courses”节点以使用Webhook。

  1. 找到相关部分并将其切换为“开启”。
  2. 现在,我们将添加一个参数:input 作为键,"<? input.text ?>" 作为其值。
  3. 向下滚动,并将返回变量设置为 webhook_result_1
  4. 接下来,我们将指示该节点的最终操作应为跳转到我们创建的“discovery”节点。具体来说,我们将跳转到评估该节点的条件。

配置Discovery响应节点

选中新节点后,将其条件设置为 true,因为我们希望在提供课程推荐时始终执行它。

添加以下示例响应,该响应通过我们之前定义的函数从Discovery检索相关课程列表。

<? webhook_result_1.response.result.join(‘, ‘) ?>

测试与总结

现在您已全部设置完成。尝试在“Try it out”面板中运行“recommend me a course on databases”来确认节点是否按预期工作。

如果您看到类似于下图的结果,则说明您已成功完成本实验的所有设置。在本课程的下一部分,您将找到实验环节,有机会亲自实践这些步骤。

本节课中,我们一起学习了将Watson Discovery集成到聊天机器人的完整流程。我们通过IBM Cloud Functions创建了一个无服务器函数作为中间件,在Watson Assistant中配置了Webhook来调用该函数,并最终实现了根据用户查询从Discovery知识库中智能检索并推荐课程的功能。这套方法为聊天机器人增添了强大的外部知识查询能力。

120:结论与后续步骤 🎯

在本节课中,我们将回顾整个课程的核心内容,并探讨完成学习后如何继续提升技能、深化实践,以及规划在人工智能领域的职业发展路径。

恭喜你完成了使用Watson API构建人工智能应用的课程。希望你享受这个过程,并学到了在集成不同AI服务时所需的宝贵技能。

课程内容回顾 📚

上一节我们完成了核心项目的构建,本节中我们来整体回顾一下课程涵盖的知识点。

本课程覆盖了相当广泛的内容,包括:

  • Watson Discovery服务
  • 从对话节点调用API
  • 使用无服务器函数
  • 在应用中集成语音API
  • 将聊天机器人部署到主流渠道

如果你感觉尚未完全掌握其中任何一项,这是完全正常的。掌握技能需要持续的练习。

后续学习建议 🚀

了解了课程的核心内容后,接下来我们看看如何巩固所学并继续前进。

我的建议始终是尽可能多地练习这些新获得的技能。顶点项目为你开了个头,但我建议你继续开展自己的其他项目。

以下是你可以采取的后续步骤:

  • 持续实践:基于课程项目,构思并实现你自己的AI应用创意。
  • 深化学习:我鼓励你继续学习IBM人工智能专业认证中的其他相关课程。
  • 获取认证:更好的选择是在Coursera上完成IBM AI专业证书。

获取证书将使你在众多对AI领域感兴趣但缺乏技能和资质证明的人群中脱颖而出。除了为你提供更深入的技能外,它还能展示你对持续技术学习的承诺。

我衷心期待看到你成功进入人工智能行业,并实现你的职业目标。

总结 ✨

本节课中我们一起学习了课程的总结与未来规划。我们回顾了使用Watson API构建AI应用的关键模块,并明确了通过持续实践、深化学习和获取专业认证来巩固技能、推进职业发展的清晰路径。记住,学习是一个持续的旅程,保持好奇与练习是通往精通的桥梁。

posted @ 2026-03-26 08:48  布客飞龙II  阅读(5)  评论(0)    收藏  举报