【EAI 004】LLM+P:借助LLM和PDDL赋予机器人最优规划能力

论文标题:LLM+P: Empowering Large Language Models with Optimal Planning Proficiency
论文作者:Bo Liu, Yuqian Jiang, Xiaohan Zhang, Qiang Liu, Shiqi Zhang, Joydeep Biswas, Peter Stone
作者单位:Department of Computer Science, The University of Texas at
Austin, Department of Computer Science, State University of New York at Binghamton, Snoy AI
论文原文:https://arxiv.org/abs/2304.11477
论文出处:–
论文被引:78(01/05/2024)
论文代码:https://github.com/Cranial-XIX/llm-pddl

Abstract

大型语言模型(LLMs)已经展现出非凡的零样本泛化能力:最先进的聊天机器人可以为日常生活中出现的许多常见问题提供似是而非的答案。然而,到目前为止,LLMs 还不能可靠地解决机器人的长周期规划问题。相比之下,经典规划器一旦以格式化的方式给出问题,就能使用高效的搜索算法快速确定正确甚至最优的规划。为了两全其美,本文介绍了 LLM+P,这是第一个将经典规划器的优势融入 LLM 的框架。LLM+P 接收规划问题的自然语言描述,然后用自然语言返回解决该问题的正确(或最优)计划。LLM+P 首先将语言描述转换成用规划域定义语言(PDDL)编写的文件,然后利用经典规划器快速找到解决方案,再将找到的解决方案翻译回自然语言。除了 LLM+P,我们还从机器人规划场景中定义了一系列不同的基准问题。通过对这些基准问题的综合实验,我们发现 LLM+P 能够为大多数问题提供最佳解决方案,而 LLM 甚至无法为大多数问题提供可行的计划。我们还展示了 LLM+P 能够让家用机器人解决用户用自然语言指定的复杂操纵任务

I. INTRODUCTION

自从这一领域诞生以来,人工智能研究人员就一直在努力创造能用自然语言交谈的程序,并使其具有与人一样的优雅和灵活性。虽然即使是相对简单的模型,如 1966 年的 Eliza [1],也能对一些提示生成看似合理的回答,但生成提示总是相对容易,这暴露了它们与人相比的弱点–缺乏真正的理解

虽然 GPT-4 [2] 和 ChatGPT [3] 等大型语言模型(LLM)已经远远超出了几年前的预期,但它们在这方面并没有什么不同。事实上,互联网上现在充斥着这样的例子:人们陶醉于让 ChatGPT 生成连 5 岁的人类小孩都知道是不明智的输出结果。

鉴于 LLM 的设计和训练方式,这种现象不足为奇。LLMs 并不是专门为展示理解能力而设计的,而是为了在人类在事先设定的上下文下生成可能对人类来说是合理的单词序列。用 Mahowald et.al 的话说[4],LLMs 在语言能力(知道怎么说)方面已经达到了惊人的熟练程度;但在功能能力(知道说什么)方面却差强人意。举例来说,如果询问一个在他们的训练语料库中没有出现过的简单算术问题的结果,或者询问一个需要了解世界如何运作的新颖规划问题的解决方案,他们(相对)很容易上当受骗。

这是否意味着我们应该加大力度,将所有算术和规划问题都纳入他们的训练语料库?显然,这是痴人说梦。另一方面,这又有什么必要呢?我们已经有了能保证得出正确答案的计算器和通用符号规划器。因此,将 LLM 与这些工具连接起来是一种自然而然的替代方法,当然我们也不是第一个探索这种方法的人。

有鉴于此,本文研究目标是首次使 LLM 能够正确解决规划问题。我们的目标是在不改变 LLM 本身的情况下实现这一目标,即使是微调 [5], [6]。相反,我们引入了一种称为 LLM+P 的方法,通过这种方法,当我们向 LLM 提供规划问题的自然语言描述时,LLM:

  • 1)输出适合作为通用规划器输入的问题描述;
  • 2)使用通用规划器解决问题;
  • 3)将规划器的输出转换为自然语言(或连接到机器人的动作执行器)。

我们广泛的经验评估表明,LLM+P 能够为更多的规划问题生成正确的解决方案,其能力远远超过 LLM 本身。虽然本文展示的是规划问题,但这一通用方法也可应用于任何一类拥有完善求解器的问题,例如算术问题(利用计算器)

Limitation:本文并没有要求 LLM 识别它所收到的提示是否适合使用 LLM+P 管道进行处理。未来一个有价值的研究方向是考虑识别提示何时应由 LLM+P 处理

II. BACKGROUND

本节将介绍我们用来表示将由 LLM 解决的规划问题的符号,并回顾经典规划器的标准表示方法。

A. The Classical Planning Problem

从形式上看,规划问题 P P P 的输入是由 ⟨ S , s i n i t , S G , A , f ⟩ ⟨\mathscr{S}, s^{init}, \mathscr{S}^G, \mathscr{A}, f⟩ S,sinit,SG,A,f 元组定义的:

  • S \mathscr{S} S 是一个有限且离散的状态集合,用来描述世界的状态(即状态空间)。我们假设有一个因子状态空间(factored state space),即每个状态 s ∈ S s\in \mathscr{S} sS 是由一组固定变量的值定义的。

  • s i n i t ∈ S s^{init} \in \mathscr{S} sinitS 是初始世界状态(world state)。

  • S G ⊂ S \mathscr{S}^G \subset \mathscr{S} SGS 是一组目标状态。 S G \mathscr{S}^G SG 通常被指定为一系列目标条件(goal conditions),所有这些条件都必须在目标状态下成立。

  • A \mathscr{A} A 是一组符号化的动作(symbolic actions)。

  • f f f 是底层状态转换函数。 f f f 将当前状态和一个动作作为输入,并输出相应的下一个状态。

规划问题 P P P 的解是由 ⟨ a 1 , a 2 , . . . , a N ⟩ ⟨a_1, a_2, ..., a_N⟩ a1,a2,...,aN 组成的抽象的规划 π π π。使得 a 1 a_1 a1 的先决条件在 s i n i t s^{init} sinit 中成立, a 2 a_2 a2 的先决条件在应用 a 1 a_1 a1 后的状态中成立,以此类推,目标条件都在应用 a N a_N aN 后的状态中成立。

B. Planning Domain Definition Language (PDDL)

规划域定义语言(PDDL)是经典规划问题的标准化编码[7], [8]。规划问题 P 的 PDDL 表示分为两个文件:领域文件(domain file)和问题文件(problem file)。

  • 领域 PDDL 文件提供了世界底层规则的提升表示(lifted representation)。它包括一组谓词,这些谓词定义了状态空间 S S S 和行动 A A A 及其前提条件和效果(即转换函数 f)。
  • 问题 PDDL 文件提供了一个对象列表,用于定义域,问题的初始状态 s i n i t s^{init} sinit 和目标条件 S G \mathscr{S}^G SG存在着大量的符号规划器(symbolic planners),它们可以实现高效的搜索算法,以解决 PDDL 形式化的规划问题

在这项工作中,我们的目标是将描述初始状态 s i n i t s^{init} sinit 和目标条件 S G \mathscr{S}^G SG 的自然语言提示用 PDDL 格式化,并利用符号规划器输出正确的计划。我们假设领域规则是可用的(参见第三节中的假设)。

在这里插入图片描述

III. METHOD

本节首先使用一个运行示例来研究在 PDDL 中制定计划提示的方法,然后介绍 LLM+P 方法。

A. Large Language Model as a PDDL Writer

LLM 不擅长规划或长周期推理(long-horizon reasoning)[9],但擅长描述和翻译文本输入,包括以 PDDL 格式重写规划提示(planning prompts)。直觉告诉我们,我们可以将 PDDL 视为一种不同于英语的语言,因此用 PDDL 重写规划提示实质上是一项机器翻译任务,而这正是众所周知的 LLM 所擅长的。在此,我们提供了一个由 GPT-4 编写的 PDDL 问题文件示例,该文件未进行任何提示工程。生成的文件似乎具有正确的 PDDL 语法,但却使用了一个虚构的谓词(empty),并且忽略了 b1 在桌子上的初始条件。

在这里插入图片描述

B. In-Context Learning

众所周知,LLMs 能够在不对其参数进行微调的情况下进行上下文学习(in-context learning),即 LLMs 能够通过简单地对一些输入标签对(demonstrations)进行调节,从而执行未见过的下游任务[10]。下面是一对用自然语言和 PDDL 编写的问题描述,作为上下文提供给 GPT-4。当上下文与上述示例中的提示一起包含时,规划器就能直接解决生成的 PDDL 问题文件。

在这里插入图片描述

C. Large Language Model + Classical Planner (LLM+P)

在这里插入图片描述

在介绍了 LLM 在 PDDL 和上下文学习中对问题进行编码的能力之后,介绍 LLM+P 解决方案(图 1 的底部)。具体来说,我们假设对于每个问题领域,人类专家都能提供一个领域描述(即动作前提条件和效果),该描述将固定用于该领域中发生的所有问题实例。虽然自动生成描述的问题是另一个有价值的研究课题,但在本文中,我们假定描述可以作为 PDDL 域文件提供。LLM+P 方法可直接用作向机器人系统下达任务的自然语言接口。例如,假设我们想让机器人扮演调酒师,调制鸡尾酒。合理的做法是告诉它可以采取哪些行动,但让它自己去推断如何在一组配料的组合下最有效地调制新的鸡尾酒。此外,我们假设Agent会得到一个最小示例,该示例展示了该领域内一个简单问题的示例问题 PDDL 是什么样子的。接下来,Agent将面临一个可能相当复杂的新问题(P)。一旦生成了问题 PDDL 文件,我们就会将其与所提供的领域 PDDL 文件一起输入任何经典规划器,以生成 PDDL 规划 [11]。最后,LLM 将 PDDL 计划翻译回自然语言,完成 LLM+P 管道:

  • 1)根据与人类用户的对话,机器人知道何时触发 LLM+P。
  • 2)提供领域 PDDL,以定义机器人能够执行的操作。该规范与任务无关,与任务相关的实体在 LLM 生成的问题 PDDL 中指定
  • 3)还提供了用自然语言描述的简单问题及其相应的问题 PDDL 文件。

IV. RELATED WORK

本节首先简要介绍了经典规划算法。然后总结了在使用大型语言模型完成规划任务方面的最新进展。最后,本节还将讨论最近关于利用外部模块增强 LLM 的研究。

A. Classical Planning

自动规划或经典规划技术可用于计算实现给定目标的行动序列 [12],[13],[14]。自动规划算法已广泛应用于机器人系统。

  • Shakey 是第一个配备规划组件的机器人,它是用 STRIPS [15] 构建的。之前的一些通用规划架构也被证明可用于机器人规划,如 PRODIGY [16] 和 HTN [17]。
  • 最近为机器人设计的经典规划系统经常使用规划域描述语言(Planning Domain Description Language, PDDL)或答案集编程(Answer Set Programming, ASP)作为规划器的底层动作语言 [18],[19],[20],[21]。例如,研究人员使用经典规划算法为执行配送任务的移动机器人安排行动序列 [22],为自动驾驶车辆推理安全高效的城市驾驶行为 [23],以及为移动机器人团队规划行动 [24]。
  • 任务与运动规划(Task And Motion Planning, TAMP)是一种分层规划框架,它将离散空间中的经典规划与连续空间中的机器人运动规划相结合 [25], [26]。

上述大多数规划方法都需要特定领域的编程语言作为问题及其解决方案的基础表述。而 LLM+P 则利用 LLM 的优势,作为机器人的自然语言接口来解决复杂的规划任务。促使我们使用此类经典规划系统的主要原因是,这些规划系统大多是完善的,它们能保证逻辑上的正确性,并在存在规划的情况下输出规划。许多规划系统还能找到最优(最短)计划,至少在时间充足的情况下是这样。

B. Planning with Large Language Models

近年来,人们开发了各种大型语言模型(LLM),如 Bert [27],CodeX [28],Opt [29],GPT-3 [10],ChatGPT [30],GPT-4 [2],Llama [31],Llama2 [32] 和 PaLM [33]。由于 LLM 经过大量离线文本数据的预训练,因此它们具有惊人的零样本泛化能力,可用于机器人规划任务 [34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45]。最近有几种方法成功地从 LLMs 中提取了任务知识,从而用自然语言为机器人分解指令或指示。例如,

  • 通过迭代增强提示,LLMs 可用于家居领域的任务规划 [38]。
  • SayCan 是另一种方法,它利用 affordance functions 对机器人进行规划,以考虑行动的可行性,其中的服务请求是用自然语言指定的[34]。
  • ChatGPT for Robotics [3] 研究了如何将 ChatGPT 应用于通用机器人领域 。

然而,现有 LLM 的一个主要缺点是缺乏对复杂任务的长周期推理能力(见 [9], [46] 和 [2] 第 8.2 节)。当遇到此类任务时,它们产生的输出往往是不正确的,即按照输出计划实际上并不能解决任务。因此,在这项工作中,我们将重点利用经典规划器的特性来解决这个问题。同样,最近的一些工作也研究了将经典规划与 LLM 结合起来的方法 [47],[48],[49],[50],[51],[52],[53],[54],[55],[56],[57]。它们或使用提示,或使用微调,使 LLM 能够解决 PDDL 规划问题。通过迭代查询 LLM,长周期规划能力也得到了提高,这在 Minecraft [58] 中得到了验证。相比之下,我们并不完全依赖 LLM 作为问题求解器,而是更多地利用规划器(即生成准确和最优的规划)和 LLM 本身(即将自然语言问题描述转换为 PDDL 的 one-shot 泛化)的优势

C. Augmenting LLMs with External Modules

最近开发的方法表明,通过将 LLM 与外部模块相结合,可以提高 LLM 下游任务的性能。例如,

  • WebGPT [59] 是 GPT-3 的微调版,它结合了网络知识来回答开放式问题。
  • Lazaridou et al.研究了如何利用谷歌等搜索引擎作为 LLM 的外部工具[60]。
  • MemPrompt [61] 提出了一种人在回路系统,在该系统中,不断增长的错误记忆和用户反馈将作为过去的经验,融入提示中,以更准确地回答新问题。
  • REPLUG [62] 是另一种检索增强语言建模范例,它将语言模型视为一个黑盒子,并用一个可微调的检索模型对其进行增强。
  • [63],[64] 研究了使用计算器进行计算。

在最近与我们相关的工作中,Schick et al.训练了一个名为 ToolFormer 的模型,该模型可以通过对 LLMs 提示的在线增强来决定何时以及如何调用某些工具 API [65]。在这项工作中,我们提出经典规划器可以成为另一个特别有用的外部模块。相比之下,LLM+P 并不依赖于对 LLM 的任何微调或再训练。LLM+P 只需将经典规划器的知识融入现有的 LLM 中,就能实现长周期推理和规划功能

作者获悉,同时进行的一项工作[66]介绍了使用 SayCan 数据集[34]将 LLM 与 PDDL 集成的初步结果。不过,SayCan 数据集的范围有限,因为它只包含三个预定义的操作。因此,原论文中评估的所有模型变体都达到了约 90% 的成功率。由于 SayCan 数据集的同质性,Lyu et al.并不需要对领域 PDDL 进行严格定义,这可能会导致计划不可行。因此,我们认为我们的 LLM+P 方法是对增强具有最佳规划能力的 LLM 的更全面研究。

V. EXPERIMENTS

我们进行实验来回答这些问题:

  • 1)How well does LLM-AS-P work? To what extent can state-of-the-art LLMs and LLM-based reasoning methods be directly used for planning? (Not at all)
  • 2)How well does LLM+P work compare to LLM-AS-P? (Much better)
  • 3)What role does the context play in the success of LLM+P? (It’s crucial)
  • 4)Can LLM+P help make service robots more efficient on realistic tasks? (Yes)

A. Benchmark Problems

我们从以往的 International Planning Competitions 中借鉴了七个机器人规划领域,并为每个领域提供了 20 个自动生成的任务 [67]。以下是规划领域的列表,以及每个领域的简要概述。

1)BLOCKSWORLD:给定桌子上的一组积木,机器人的任务是将它们重新排列成指定的目标配置。

2)BARMAN:机器人调酒师的任务是利用现有的配料和容器为顾客调制鸡尾酒。

3)FLOORTILE:一组机器人的任务是在地砖上绘制颜色图案。机器人可以走动并变换颜色,但不能踩在涂有油漆的地砖上。

4)GRIPPERS:一组有两个抓手的机器人的任务是在不同房间之间移动物体。

5)STORAGE: 给定一组升降机,目标是使用升降机将板条箱提升并投放到仓库中。板条箱最初存放在不同的区域,升降机可以在不同的存放区域之间移动。

6)TERMES:机器人的任务是通过搬运和放置积木来建造复杂的结构,还可以爬到积木上建造塔楼。

7)TYREWORLD:机器人的任务是更换爆胎,例如,给轮胎充气,拧紧螺母,完成后按正确顺序将工具搬回引导箱。

B. Experiment Setup

我们使用 GPT-4 进行所有实验。将 temperature 设置为 0,并使用概率最高的响应。因此,LLM 返回的响应是确定性的。生成文本 PDDL 响应后,我们将其输入 FAST-DOWNWARD 规划器,并尝试使用 SEQ-OPT-FDSS-1(保证最优)和 LAMA(不保证最优)两种 alias,最大搜索时间为 200 秒。我们报告了最优 alias 的成功率,对于超时的域,我们在括号中显示了次优 alias 的成功率。对于基线方法,我们手动计算最优方案的数量,并在括号中报告正确方案的数量(如果存在次优方案)。

我们还对最近一种基于 LLM 的深思熟虑的推理方法 Tree of Thoughts [68] 进行了评估,简称为 LLM-AS-P (TOT)。我们将原始 ToT 实现中的广度优先搜索算法用于规划。我们会提示 LLM 从允许的行动中扩展搜索树,并评估路径达到目标的可能性。时间限制同样为 200 秒

C. Results and Analysis

在这里插入图片描述

表 I 提供了在 7 个领域应用 LLM-AS-P 和 LLM+P 的结果。

Findings (LLM-AS-P):

  • 1)尽管 LLM-AS-P 为每个问题提供了一个自然语言计划,但其中大多数计划并不可行。主要原因是 LLM-AS-P 缺乏对先决条件的推理能力。

  • 2)在大多数情况下,无论是否将示例计划作为上下文,LLM-AS-P 的失败方式都是一样的。特别是在 BLOCKSWORLD 领域,LLM-AS-P 无法跟踪 ON 和 CLEAR 等属性。在 BARMAN 域中,LLM-AS-P 的计划无法在再次使用前清洁酒杯。

  • 3)最难处理的域是具有复杂空间关系的域。LLM-AS-P 方法(无论有无上下文)在此类问题上完全失败。在 FLOORTILE 域,LLM-AS-P 生成 “move right to tile 0-4 and paint tile 1-2 black”,但机器人只能将邻近的地砖涂成黑色。在 TERMES 和 STORAGE 中,LLM-AS-P 忽略了机器人不能在原位置卸载木块/木箱的要求。

  • 4)LLM-AS-P (TOT) 在每个树节点上调用 LLM,提供可用行动列表,然后调用 LLM 将树上的每条新路径作为部分计划进行评估。我们发现,LLM 能够对部分计划给出合理的排序,但它往往无法识别计划是否能达到目标。由于 LLM 调用次数较多,LLM-AS-P (TOT) 在大多数情况下都会超时,因此不适合解决长周期问题

Findings (LLM+P):

  • 1)LLM+P 可为大多数问题生成最优规划。大多数失败案例都是由于问题文件指定错误造成的,例如缺少一个初始条件(例如,在 FLOORTILE 中让瓷砖断开连接),导致规划问题无法解决

  • 2)在没有上下文(即示例问题及其相应的问题 PDDL)的情况下,我们发现 LLM 无法生成正确的问题 PDDL 文件。因此,上下文对 LLM+P 的工作非常重要

D. Robot Demonstration

我们将 LLM+P 部署到一个负责整理家居的真实机器人身上,从而验证了 LLM+P 能够高效地解决现实中的服务机器人问题。用户要求机器人将一个芥末瓶从茶几上移到储藏室,并将空汤罐从边桌上扔掉。由于边桌和回收箱都在从茶几到餐具室的途中,因此最佳方案是将芥末瓶搬到边桌上,扔掉汤罐后再重新抓起,总成本为 22。图 2 显示了 LLM+P 找到的最优计划。提示的部分内容和生成的 PDDL 如下所示。LLM-AS-P 输出了一个次优计划,即先把瓶子拿到储藏室,然后再回去拿汤罐,总成本为 31。

在这里插入图片描述
在这里插入图片描述

VI. CONCLUSION AND FUTURE WORK

在这项工作中,我们建议利用经典规划器,使大型语言模型具备最佳规划能力。LLM+P 框架的关键设计选择是让 LLM 专注于将规划问题从自然语言转换为结构化 PDDL 格式。此外,我们还表明,让 LLM 意识到一个简单的 (problem, PDDL) 对作为上下文学习的示范(或上下文)也很重要。进一步扩展 LLM+P 框架的一些有趣方向包括:

  • 1)使 LLM 能够自动检测何时以及如何应用 LLM+P。
  • 2)减少 LLM+P 对人类信息的依赖,可能涉及微调。

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

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

相关文章

关于使用统一服务器,vscode和网页版jupyter notebook的交互问题

autodl 查看虚拟环境 在antodl上租借了一个服务器,通过在网页上运行jupyter notebook和在vscode中运行,发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包,可以使用以…

用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few…

揭秘六大热门认证考试

六大热门认证考试是什么❓今天为大家详细解读PMP、ACP、CDGA、软考中项、软考高项、NPDP、CISP等热门认证考试,让你不再彷徨👇 1️⃣PMP 👑PMP认证是全qiu公ren的项目管理专业认证,旨在评估项目管理人员在项目过程中所需的知识、技…

Java学习苦旅(二十二)——MapSet

本篇博客将详细讲解Map和Set。 文章目录 搜索概念模型 MapMap.Entry<K, V>Map的常用方法说明TreeMap和HashMap的区别 Set常用方法说明TreeSet和HashSet的区别 结尾 搜索 概念 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…

RT-DETR Gradio 前端展示页面

效果展示 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradio,你只需几行代码就可以生成一个网页应用程序,…

route 命令

格式&#xff1a; route [-f] [-p] [Command] [Destination] [mask Netmask] [Gateway] [metric Metric] [if Interface] 功能&#xff1a; route 命令是用于操作基于内核ip路由表&#xff0c;它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口。 …

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…

【Docker基础二】Docker安装Mysql8

下载镜像 安装mysql&#xff08;版本&#xff1a;8.0.35&#xff09; # 拉取镜像 docker pull mysql:8.0.35 # 查看镜像是否已经下载 docker images 创建挂载目录 # 宿主机上创建挂载目录 (可以不创建&#xff0c;docker run -v配置了挂载目录&#xff0c;docker会自动…

PolarDB Serverless能力测评:秒级弹升、无感伸缩与强一致性,助您实现高效云数据库管理!

前言 PolarDB MySQL 传统的关系型数据库有着悠久的历史&#xff0c;从上世纪60年代开始就已经在航空领域发挥作用。因为其严谨的一致性保证以及通用的关系型数据模型接口&#xff0c;获得了越来越多的应用。2000年以后&#xff0c;随着互联网应用的出现&#xff0c;很多场景…

JS新手入门笔记整理:条件判断

判断语句&#xff1a;IF 单向判断&#xff1a;if... 语法 if&#xff08;条件&#xff09; {…… } 如果“条件”返回结果为true&#xff0c;则会执行大括号{}内部的程序&#xff1b;如果“条件”返回结果为false&#xff0c;则会直接跳过大括号{}内部的程序&#xff0c;然后…

【JAVA】Iterator 和 ListIterator 有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 在Java中&#xff0c;遍历集合是日常编程中常见的任务&#xff0c;而Iterator和ListIterator作为遍历集合的两个主要接口&#xff0…