论文翻译 | Tree of Thoughts: Deliberate Problem Solvingwith Large Language Models 思维树ToT

摘要

        语言模型越来越多地被用于广泛的问题解决任务,但在推理过程中仍然局限于基于标记的、从左到右的决策过程。这意味着它们在需要探索、战略前瞻或初始决策起关键作用的任务中可能会有所不足。为了克服这些挑战,我们引入了一种新的语言模型推理框架,称为“思维之树”(ToT),它推广了流行的“思维链”方法,可以对文本的连贯单元(“思维”)进行探索,作为问题解决的中间步骤。ToT允许语言模型通过考虑多种不同的推理路径和自我评估选择来进行有意的决策,并在必要时向前或向后进行全局选择。我们的实验表明,ToT显著提高了语言模型在需要复杂规划或搜索的三个新任务中的问题解决能力:24点游戏、创意写作和迷你填字游戏。例如,在24点游戏中,虽然只使用“思维链”提示的GPT-4仅解决了4%的任务,但我们的方法成功率达到了74%。所有提示的代码存储库:https://github.com/ysymyth/tree-of-thought-llm。

1 引言

        最初设计用于生成文本的语言模型(LMs)的规模化版本,如GPT [22、23、1、20]和PaLM [5],已被证明在需要数学、符号、常识和知识推理的各种任务上具备越来越强大的能力。令人惊讶的是,所有这些进展的基础仍然是生成文本的原始自回归机制,它逐个标记地进行决策,并且按从左到右的方式进行。这样简单的机制是否足以构建一个通用问题解决器的语言模型?如果不是,哪些问题会挑战当前的范式,应该有什么替代机制?

        关于人类认知的文献提供了一些线索来回答这些问题。关于“双过程”模型的研究表明,人们在决策中有两种模式-快速、自动、无意识模式(“系统1”)和缓慢、有意识模式(“系统2”)[27、28、13、12]。这两种模式以前已经与机器学习中使用的各种数学模型相联系。例如,有关人类和其他动物的强化学习的研究探索了它们进行联想式的“无模型”学习或更深思熟虑的“模型为基础”规划的情况[6]。语言模型的简单联想标记级别选择也类似于“系统1”,因此可能会受益于更深思熟虑的“系统2”规划过程的增强,该过程(1)保持并探索当前选择的多种不同替代方案,而不仅仅选择一种,以及(2)通过主动向前或向后跟踪来评估其当前状态并做出更全局的决策。

        为了设计这样一个规划过程,我们回到了人工智能(和认知科学)的起源,从20世纪50年代开始,Newell、Shaw和Simon的规划过程的研究中获得灵感[18、19]。因此,我们提出了一种用于语言模型的通用问题解决的思维之树(ToT)框架。正如图1所示,现有方法(下文详述)通过对问题解决进行连续语言序列的抽样,而ToT则主动维护一个思维之树,其中每个思维是一个连贯的语言序列,作为问题解决的中间步骤(表1)。这样的高级语义单元使语言模型能够通过一个有意的推理过程自我评估不同中间思维对解决问题的进展(图2、4、6)。通过语言进行搜索启发式的这种实现是新颖的,因为先前的搜索启发式要么是编程的,要么是学习的。最后,我们将这种基于语言的生成和评估多样思维的能力与搜索算法(如广度优先搜索(BFS)或深度优先搜索(DFS))相结合,这些算法允许对思维之树进行系统的前瞻和回溯式探索。

 图1:用llm解决问题的各种方法示意图。每个矩形框代表一个想法,这是一个连贯的语言序列,作为解决问题的中间步骤。参见图2、图4、图6中有关如何产生、评估和搜索思想的具体示例。

        在经验上,我们提出了三个新问题,即24点游戏、创意写作和填字游戏,这些问题即使使用最先进的语言模型GPT-4 [20]也会挑战现有的语言模型推理方法(表1)。这些任务需要演绎、数学、常识、词汇推理能力,并且需要一种融入系统规划或搜索的方式。我们通过支持不同级别的思维、不同生成和评估思维的方法以及适应不同问题性质的不同搜索算法,展示了ToT在所有三个任务上获得了优越的结果。我们还通过系统的剥离分析这些选择如何影响模型性能,并讨论了未来培训和使用语言模型的方向。

2 背景

        我们首先形式化了一些使用大型语言模型来解决问题的现有方法,我们的方法受到了这些方法的启发,后来又与它们进行了比较。我们用pθ表示一个参数为θ的预训练LM,用小写字母x, y, z, s,···表示语言序列,即x = (x[1],···,x[n]),其中每个x[i]是一个标记,因此pθ(x) = Qn i=1 pθ(x[i]|x[1…i])。我们使用大写字母S,···来表示语言序列的集合。
        输入-输出(IO)提示是使用LM: y ~ pθ(y|promptIO(x))将问题输入x转换为输出y的最常见方法,其中promptIO(x)用任务指令和/或少量输入-输出示例包装输入x。为简单起见,让我们表示p提示θ(输出|输入)= pθ(输出|提示(输入)),因此IO提示可以表示为y ~ p IO θ(y|x)。
        思维链(CoT)提示[38]被提出用于解决输入x到输出y的映射是非平凡的情况(例如,当x是一个数学问题,y是最终的数值答案)。
        关键思想是引入思想链z1,····,zn来连接x和y,其中每个zi都是一个连贯的语言序列,作为解决问题的有意义的中间步骤(例如zi可以是数学QA的中间方程)。为了解决CoT问题,对每个思想zi ~ p CoT θ (zi |x, z1···i−1)进行顺序采样,然后输出y ~ p CoT θ (y|x, z1··n)。在实践中,[z1··n, y] ~ p CoT θ (z1··n, y|x)作为一个连续的语言序列进行采样,并且思想的分解(例如,每个zi是一个短语、一个句子还是一个段落)是模棱两可的。
        与CoT (CoT- sc)的自一致性[36]是一种集成方法,它对k .i. id个思维链进行采样:[z (i) 1···n, y(i)] ~ p CoT θ (z1···n, y|x) (i = 1··k),然后返回最频繁的输出:arg max #{i | y(i) = y}。CoT- sc改进了CoT,因为对于相同的问题通常有不同的思维过程(例如,证明相同定理的不同方法),并且通过探索更丰富的思想集,输出决策可以更忠实。然而,在每条链中都不存在对不同思考步骤的局部探索,并且“最频繁”的启发式只适用于输出空间有限的情况(例如,多选择QA)。

3 思维之树:与语言模型一起进行有意识的问题解决

真正的问题解决过程涉及反复利用可用信息来启动探索,进一步揭示更多信息,直到最终发现解决方法。—— Newell等人[18]

人类问题解决的研究表明,人们通过组合问题空间进行搜索——树形结构,其中节点表示部分解决方案,分支对应修改它们的操作[18, 19]。选择哪个分支是由启发式决定的,这些启发式帮助导航问题空间,并指导问题解决者朝着解决方案前进。这个观点突显了使用语言模型解决一般问题的现有方法存在两个关键不足之处:1)在局部上,它们不探索思考过程中的不同延伸——树的分支。2)在全局上,它们不包含任何类型的规划、前瞻或回溯,以帮助评估这些不同的选项——这似乎是人类问题解决的特征之一。

        为了解决这些不足,我们引入了思维之树(Tree of Thoughts,ToT),这是一种允许语言模型在思考上探索多个推理路径的范 paradigm(图1(c))。ToT将任何问题框架化为对树的搜索,其中每个节点都是表示部分解决方案的状态s = [x, z1···i],其中包含输入和到目前为止的思考序列。ToT的具体实例包括回答以下四个问题:

  1. 如何将中间过程分解为思考步骤;
  2. 如何从每个状态生成潜在的思考;
  3. 如何启发性地评估状态;
  4. 使用什么搜索算法。

1 思考分解(Thought decomposition)

        虽然CoT会连贯地采样思考过程,但没有明确的分解,ToT利用问题属性来设计和分解中间思考步骤。如表1所示,根据不同的问题,一个思考过程可以是几个单词(填字游戏)、一行方程式(24点游戏)或整个写作计划的段落(创意写作)。一般来说,思考过程应该足够“小”,以便语言模型可以生成有希望且多样化的样本(例如,通常生成整本书会太“大”而无法连贯),但也应该足够“大”,以便语言模型可以评估其对问题解决的前景(例如,生成一个令牌通常太“小”而无法评估)。

2 思考生成器(Thought generator)G(pθ, s, k)。

给定树的状态s = [x, z1···i],我们考虑两种策略来生成下一个思考步骤的k个候选项:

3. 状态评估器( State evaluator )V(pθ, S)。

        给定不同状态的前沿,状态评估器评估它们朝解决问题的进展程度,作为搜索算法的启发式指标,确定要继续探索哪些状态以及按照什么顺序。虽然启发式是解决搜索问题的一种标准方法,但通常是通过编程(例如DeepBlue [3])或学习(例如AlphaGo [26])实现的。我们提出了第三种选择,即使用语言模型有意识地对状态进行推理。在适用的情况下,这种有意识的启发式方法可以比编程规则更灵活,比学习模型更高效。与思考生成器类似,我们考虑独立评估状态或共同评估状态的两种策略:

对于这两种策略,可以使用学习或规则进行优化。

4. 搜索算法(Search algorithm)。

        最后,在ToT框架中,可以根据树形结构插入和使用不同的搜索算法。我们探索了两种相对简单的搜索算法,并将更高级的算法(例如A* [9]、MCTS [2])留待以后研究:

        从概念上讲,ToT作为使用语言模型进行一般问题解决的方法具有几个优点:(1)普适性。IO、CoT、CoT-SC和自我完善可以看作是ToT的特例(即有限深度和广度的树;图1)。 (2)模块化。基本语言模型以及思考分解、生成、评估和搜索过程都可以独立变化。 (3)适应性。可以适应不同的问题特性、语言模型能力和资源限制。 (4)方便性。不需要额外的训练,只需一个预训练的语言模型即可。下一节将展示这些概念上的优势如何在不同问题的实证性能中得到强有力的体现。

4 实验

        我们提出了三个任务,即使使用最先进的语言模型GPT-4 [20]和标准的IO提示或CoT提示进行采样,这些任务仍然很困难。我们展示了在思维之树(ToT)中进行有意识的搜索可以产生更好的结果,更重要的是,以更有趣和有希望的方式使用语言模型来解决需要搜索或规划的问题。

        除非另有说明,我们使用Chat Completion模式的GPT-4进行实验,采样温度为0.7。

4.1 24点游戏

        24点游戏是一个数学推理挑战,目标是使用4个数字和基本的四则运算(+-*/)得到24。例如,给定输入“4 9 10 13”,一个解决方案的输出可以是“(10 - 4) * (13 - 9) = 24”。

        任务设置:我们从http://4nums.com上获取数据,该网站上有1,362个按人类求解时间从简单到困难排序的游戏,并使用索引为901-1,000的相对困难的游戏进行测试。对于每个任务,如果输出是一个有效的等式,等于24,并且每个输入数字都恰好使用一次,则视为成功。我们报告100个游戏中的成功率作为指标。

        基线:我们使用标准的输入-输出(IO)提示,包括5个上下文示例。对于链式思考(CoT)提示,我们将每个输入-输出对增加3个中间等式,每个等式对两个剩余数字进行运算。例如,给定输入“4 9 10 13”,思考步骤可以是“13 - 9 = 4(剩下:4 4 10);10 - 4 = 6(剩下:4 6);4 * 6 = 24(剩下:24)”。对于每个游戏,我们对IO和CoT提示进行100次采样以获取平均性能。我们还考虑了CoT的自一致性基线,该基线从100个CoT样本中选择多数输出,并在IO样本之上进行最多10次迭代改进。在每次迭代中,如果输出不正确,LM会根据之前的全部历史条件进行“反思错误并生成精炼的答案”。请注意,它使用关于等式正确性的基本事实反馈信号。

        ToT设置:将24点游戏框架为ToT时,将思考分解为3个步骤,每个步骤都是一个中间等式。如图2(a)所示,每个树节点,我们提取“left”数字,并提示LM提出一些可能的下一步。对于所有3个思考步骤,使用相同的“提出提示”,尽管它只有一个包含4个输入数字的示例。我们在ToT中执行广度优先搜索(BFS),每个步骤保留最佳的b = 5个候选者。为了在ToT中进行有意识的广度优先搜索,如图2(b)所示,我们提示LM对每个思考候选进行评估,以确定是否“确定/可能/不可能”达到24。目的是促进可以在少数向前看试验中判定的正确部分解,并基于“太大/太小”的常识消除不可能的部分解,其余部分视为“可能”。我们对每个思考值进行3次采样。

        结果:如表2所示,IO、CoT和CoT-SC提示方法在任务上表现不佳,成功率仅为7.3%、4.0%和9.0%。相比之下,只有广度为b = 1的ToT已经达到了45%的成功率,而b = 5则达到了74%。我们还考虑了IO/CoT的oracle设置,通过使用k个样本(1 ≤ k ≤ 100)计算成功率。为了将IO/CoT(k个中的最佳)与ToT进行比较,我们考虑在ToT中对每个任务访问的树节点数量,b = 1 · · · 5,并将5个成功率在图3(a)中绘制,将IO/CoT(k个中的最佳)视为在bandit中访问k个节点。不出所料,CoT比IO规模更大,最佳的100个CoT样本的成功率为49%,但仍远不及在ToT中探索更多节点(b > 1)。

        错误分析:图3(b)展示了CoT和ToT样本在哪个步骤中失败了任务,即在CoT中的思考步骤(或在ToT中的所有b个思考步骤)中生成的等式是无效的或不可能达到24。值得注意的是,约60%的CoT样本在生成第一步或等价地说,在生成前三个词(例如“4 + 9”)后就失败了任务。这凸显了直接从左到右解码的问题。

4.2 创意写作

        接下来,我们设计了一个创意写作任务,其中输入是4个随机的句子,输出应该是一个有4个段落的连贯段落,每个段落以相应的输入句子结尾。这样的任务是开放式和探索性的,既挑战创造性思维,又要求高层次的规划能力。

        任务设置:我们从http://randomwordgenerator.com随机选取句子来组成100个输入,对于每个输入约束条件,没有真实的段落作为参考。由于我们发现GPT-4大多数时候可以遵循输入约束条件,我们专注于通过两种方式评估段落的连贯性:使用GPT-4零样本提示提供一个1-10的标量分数,或者使用人类判断比较不同方法生成的段落对。对于前者,我们随机选择5个分数并对每个任务输出进行平均,我们发现这5个分数通常是一致的,平均标准差约为0.56。对于后者,我们采用作者中的一个子集进行盲目研究,比较CoT和ToT生成的段落对的连贯性,其中段落的顺序在100个输入上是随机翻转的。

        基线:由于该任务具有创造性的特点,IO和CoT提示都是零样本。尽管前者提示LM根据输入约束条件直接生成一个连贯的段落,后者则提示LM先制定一个简要的计划,然后再撰写段落,即计划作为中间的思维步骤。我们为每个任务生成10个IO和CoT样本。我们还考虑在随机IO样本之上进行迭代改进(k ≤ 5)的方法,其中LM根据输入约束条件和最后生成的段落决定段落是否已经“完全连贯”,如果没有则生成一个精炼的段落。

        ToT设置:我们建立了一个深度为2(仅包含1个中间思维步骤)的ToT - LM首先生成k = 5个计划并选出最佳计划(图4),然后类似地基于最佳计划生成k = 5个段落,并选出最佳段落。这里的广度限制b = 1,每个步骤只保留一个选择。我们使用简单的零样本投票提示(“分析下面的选择,然后决定哪一个对指令最有前途”)在两个步骤上进行5次投票。

        结果:图5(a)显示了100个任务的平均GPT-4分数,其中ToT(7.56)的段落连贯性平均高于IO(6.19)和CoT(6.93)。虽然这样的自动度量可能会有噪声,但图5(b)通过显示人类更喜欢ToT而不是CoT来确认这一发现,其中有41对中的段落,人类更喜欢ToT,而只有21对中人类更喜欢CoT(另外38对被认为“同样连贯”)。最后,迭代改进在这个自然语言任务中更有效,它将IO的连贯性分数从6.19提高到7.67,将ToT的连贯性分数从7.56提高到7.91。我们认为这可以被视为ToT框架中思维生成的第三种方法,其中新的思维可以通过改进旧的思维而产生,而不是独立生成或顺序生成。

4.3 迷你纵横填字游戏

        在“24点游戏”和“创意写作”中,ToT相对较浅 - 最多需要3个思维步骤才能达到最终输出。这里我们将5×5的迷你纵横填字游戏作为一个更难的搜索问题,涉及自然语言。再次强调,目标不仅仅是解决任务,因为更通用的纵横填字游戏可以通过利用大规模检索而不是LM轻松解决[31]。相反,我们旨在探索LM作为一个通用问题解决器的极限,它可以探索自己的思维,并通过有意识的推理作为启发式指导自己的探索。

        任务设置:我们从GooBix中获取数据,其中包含156个5×5迷你纵横填字游戏。由于观察到相邻的游戏包含相似的线索,我们选择使用索引为1、6、...、91、96的20个游戏进行测试,并使用游戏136、141、146、151、156进行提示。对于每个任务,输入描述了5个水平线索和5个垂直线索,输出应该是一个5×5 = 25个字母的填字板,以解决纵横填字游戏。对于评估,我们考虑三个成功的级别:正确字母的比例(每个游戏25个)、正确单词的比例(每个游戏10个)和成功解决的游戏数量。

        基线:我们在IO提示中提供5个示例输入-输出对,而在CoT提示中,另外按照h1..5然后v1..5的顺序包括中间单词。我们对每个提示运行10个样本并对结果进行平均。

        ToT设置:我们利用深度优先搜索(算法2)不断探索最有前途的下一个单词线索,直到状态不再有前途,然后回溯到父状态来探索替代思维。为了使搜索可行,后续的思维被限制不能改变任何填充的单词或字母,因此ToT在最多10个中间步骤中具有中间思维。对于思维生成,在每个状态下,我们将所有现有的思维(例如图6(a)中状态的“h2.motor; h1.tasks”)转化为剩余线索的字母约束(例如“v1.To heap: tm ; ...”),并提示5次提案以提供下一个单词的填充位置和内容的候选方案。重要的是,我们还提示LM为不同的思维给出置信水平,并对这些置信水平进行汇总,以获得要探索的下一个思维的排序列表(图6(a))。对于状态评估,我们类似地将每个状态转化为剩余线索的字母约束,然后评估对于每个线索,在给定约束的情况下是否可能填充。如果任何剩余线索被认为“不可能”填充(例如“v1. To heap: tm s ”),则剪枝该状态的子树的探索,并且深度优先搜索回溯到其父状态来探索下一个有前途的思维。我们将DFS搜索步骤限制为100步,并将最深探索的状态(多个状态时为第一个探索的状态)输出为最终输出。

        结果:如表3所示,IO和CoT提示方法的表现不佳,单词级别的成功率低于16%,而ToT显着提高了所有指标,单词级别的成功率达到60%,并解决了20个游戏中的4个。这样的改进并不令人意外,因为IO和CoT缺乏尝试不同的线索、更改决策或回溯的机制。

        Oracle和消融研究:当从oracle的最佳DFS状态输出(而不是启发式确定的最佳状态)时,每个任务的ToT性能甚至更高,实际解决了7/20个游戏(表3,“+best state”),表明我们简单的输出启发式可以轻松改进。有趣的是,有时当实际解决纵横填字游戏时,状态评估器仍然可能将某些单词视为“不可能”并进行剪枝 - 可能是因为5×5纵横填字游戏设计了一些GPT-4无法识别的罕见词。

5 相关工作

        规划和决策制定(Planning and decision making)。智能规划和决策制定对于实现预定目标至关重要。由于训练过程中使用了大量的世界知识和人类示例,已知语言模型已经吸收了丰富的常识,使其能够在问题设定和环境状态的条件下提出合理的计划[10, 39, 34, 11, 32, 38, 37]。我们提出的“思维树”方法通过同时考虑多个可能可行的计划来扩展现有的规划形式,在每个问题解决步骤中选择最有前途的计划。思维采样和价值反馈之间的集成有机地结合了规划和决策机制,实现了在解决方案树中的有效搜索。另一方面,传统的决策制定程序通常需要训练专门的奖励和策略模型,例如强化学习中的CHAI [30],而我们使用语言模型本身为决策制定提供价值估计。

        自我反思(Self-reflflection)。使用语言模型来评估其自身预测的可行性在问题解决中变得越来越重要。[25, 17, 21]引入了“自我反思”机制,其中语言模型向其生成候选项提供反馈。[4]通过根据语言模型自身的代码执行结果生成的反馈信息来提高语言模型的代码生成准确性。类似地,[14]还引入了“评论家”或审查步骤,用于对操作和状态进行决策,决定解决计算机操作任务中的下一步动作。与我们的方法非常相关的另一个最新工作是“自我评估引导解码”[36]。与我们的方法类似,自我评估解码也遵循了一个树搜索过程,其中叶子节点通过随机波束搜索解码进行采样,然后由语言模型本身以精心准备的自我评估提示进行评估。然而,他们的方法使用了PAL公式[7]来表示思维作为代码,这使得难以解决像本文中考虑的创意写作这样的具有挑战性的任务。因此,我们的“思维树”方法更加通用,并能够处理GPT-4在标准提示下只能达到非常低的准确性的具有挑战性的任务。

        程序引导的语言模型生成(Program-guided LLM generation)。我们的提议还与最近的在符号程序指导下组织语言模型行为的进展相关。例如,[24]将语言模型嵌入到算法搜索过程中,以帮助逐步解决问题,其中搜索树通过可能提供答案的相关段落进行扩展。然而,与我们的方法不同的是,该方法通过采样外部段落而不是语言模型自身的思维来扩展树状结构,并且没有反思或投票步骤。另一种方法LLM+P [15]更进一步,将实际的规划过程委托给经典规划器。

        经典搜索方法(Classical search methods)。最后但并非最不重要的,我们的方法可以被看作是问题解决的现代版本的经典搜索方法。例如,它可以被视为启发式搜索算法,如A* [8],其中每个搜索节点的启发式由语言模型的自我评估提供。从这个角度来看,我们的方法与[16]提出的受A搜索启发的神经逻辑解码相关,该方法受到A搜索的启发,但引入了对于语言模型来说在波束搜索或前k采样解码中提高效率的前瞻启发式。然而,该方法仅限于句子生成任务,而我们的框架设计用于复杂的、多步骤的问题解决,并通过价值反馈进行保护。

6 讨论

        局限性和未来方向。像“思维树”这样的深思熟虑的搜索对于许多现有的GPT-4已经擅长的任务可能并不必要,作为初始步骤,这项工作仅探索了三个相对简单的挑战GPT-4的任务,并呼吁更好的搜索和规划能力与语言模型结合。然而,随着我们开始将语言模型用于更多的实际决策应用(例如编码、数据分析、机器人技术等),可能会出现更复杂的任务,并提供研究这些问题的新机会。此外,与采样方法相比,像“思维树”这样的搜索方法需要更多的资源(例如GPT-4 API成本)才能提高任务性能,但“思维树”的模块化灵活性允许用户自定义性能和成本之间的权衡,并且正在进行的开源努力[29]将在不久的将来可以有效降低这些成本。最后,这项工作侧重于使用现成的语言模型,而使用类似“思维树”风格的高级对抗决策制定(例如对下一个段落的潜在选择进行思考,而不是预测下一个令牌)对语言模型进行微调可能

### Chain-of-Thought Prompting Mechanism in Large Language Models In large language models, chain-of-thought prompting serves as a method to enhance reasoning capabilities by guiding the model through structured thought processes. This approach involves breaking down complex problems into simpler components and providing step-by-step guidance that mirrors human cognitive processing. The creation of these prompts typically includes selecting examples from training datasets where each example represents part of an overall problem-solving process[^2]. By decomposing tasks into multiple steps, this technique encourages deeper understanding and more accurate predictions compared to traditional methods. For instance, when faced with multi-hop question answering or logical deduction challenges, using such chains allows models not only to generate correct answers but also articulate intermediate thoughts leading up to those conclusions. Such transparency facilitates better interpretability while improving performance on various NLP benchmarks. ```python def create_chain_of_thought_prompt(task_description, examples): """ Creates a chain-of-thought prompt based on given task description and examples. Args: task_description (str): Description of the task at hand. examples (list): List containing tuples of input-output pairs used for demonstration purposes. Returns: str: Formatted string representing the final prompt including both instructions and sample cases. """ formatted_examples = "\n".join([f"Input: {ex[0]}, Output: {ex[1]}" for ex in examples]) return f""" Task: {task_description} Examples: {formatted_examples} Now try solving similar questions following above pattern. """ # Example usage examples = [ ("What color do you get mixing red and blue?", "Purple"), ("If it rains tomorrow, will we have our picnic?", "No") ] print(create_chain_of_thought_prompt("Solve logic puzzles", examples)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值