从 CoT 到 Agent,最全综述来了!上交出品

就在前两天,我们刚刚和大家聊了聊最近相当火爆的 AI Agents 这一概念:聊聊我对AI Agents技术的一些看法。水平所限,我们也只是浅浅为大家梳理了一下 AI Agents 的概念发展与其代表性技术,一来不深入二来不细致,只能供大家走马观花,浅尝辄止。

图片

而就在这两天,专业的来了!上海交通大学张倬胜老师为我们带来了一份从思维链(CoT)推理到大模型 Agent 的详细综述,深入讨论了包含 CoT 的基本概念与原理,CoT 背后的范式转移以及从 CoT 到 大模型智能体在内的诸多前沿议题。顺着张老师的综述思路,我们这就再来和大家谈谈 AI Agents!话不多说,直接上车!

论文题目:
Igniting Language Intelligence: The Hitchhiker’s Guide From Chain-of-Thought Reasoning to Language Agents

论文链接:
https://arxiv.org/pdf/2311.11797.pdf

项目地址:
https://github.com/Zoeyyao27/CoT-Igniting-Agent

区别于上次平铺直叙的介绍 AI Agents,基于论文,这次我们就从以下七个问题出发展开讨论 CoT 与 AI Agents 的诸多概念:

图片

1. 什么是思维链 CoT ?

在介绍什么是思维链 CoT 之前,让我们先从两个更大的概念开始。

首先,什么是“语言智能”?语言智能可以被理解为“使用基于自然语言的概念对经验事物进行‘理解’以及在概念之间进行‘推理’的能力”,无疑,人类是目前已知生物之中唯一具备这种高级的抽象与理解能力的生物,从另一个层面而言,语言智能能力也是将人类从动物之中区分出来作为一种“智慧物种”的标志能力之一。

图片

而随着参数量的飞升,以 Transformer 为基础架构的大规模语言模型以 “Chat” 的方式逐渐向人们展现出了它的概念理解与概念推理的能力。直观上,作为“语言模型”的大模型具备概念理解能力并不难理解,但是仅仅像 Word2vec 一样只能得到“国王”与“男人”的“距离”更近的结论对于语言智能而言必然远远不够。

图片

真正引发人们对大模型逼近“语言智能”无限遐想的,在于大模型展现出的概念推理能力。推理,一般指根据几个已知的前提推导得出新的结论的过程,区别于理解,推理一般是一个“多步骤”的过程,推理的过程可以形成非常必要的“中间概念”,这些中间概念将辅助复杂问题的求解

图片

2022 年,在 Google 发布的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中首次提出,通过让大模型逐步参与将一个复杂问题分解为一步一步的子问题并依次进行求解的过程可以显著提升大模型的性能。而这一系列推理的中间步骤就被称为思维链(Chain of Thought)

图片

区别于传统的 Prompt 从输入直接到输出的映射 <input——>output> 的方式,CoT 完成了从输入到思维链再到输出的映射,即 <input——>reasoning chain——>output>。如果将使用 CoT 的 Prompt 进行分解,可以更加详细的观察到 CoT 的工作流程。

图片

如上图所示,一个完整的包含 CoT 的 Prompt 往往由指令(Instruction),逻辑依据(Rationale),示例(Exemplars)三部分组成。一般而言指令用于描述问题并且告知大模型的输出格式,逻辑依据即指 CoT 的中间推理过程,可以包含问题的解决方案、中间推理步骤以及与问题相关的任何外部知识,而示例则指以少样本的方式为大模型提供输入输出对的基本格式,每一个示例都包含:问题,推理过程与答案。

以是否包含示例为区分,可以将 CoT 分为 Zero-Shot-CoT 与 Few-Shot-CoT,在上图中,Zero-Shot-CoT 不添加示例而仅仅在指令中添加一行经典的“Let's think step by step”,就可以“唤醒”大模型的推理能力。而 Few-Shot-Cot 则在示例中详细描述了“解题步骤”,让模型照猫画虎得到推理能力

2. 为什么要使用 CoT ?

自从 CoT 问世以来,CoT 的能力已经被无数工作所验证,如果对使用 CoT 的好处做一个总结,那么可以归纳为以下四点:

  • 增强了大模型的推理能力:CoT 通过将复杂问题分解为多步骤的子问题,相当显著的增强了大模型的推理能力,也最大限度的降低了大模型忽视求解问题的“关键细节”的现象,使得计算资源总是被分配于求解问题的“核心步骤”;

  • 增强了大模型的可解释性:对比向大模型输入一个问题大模型为我们仅仅输出一个答案,CoT 使得大模型通过向我们展示“做题过程”,使得我们可以更好的判断大模型在求解当前问题上究竟是如何工作的,同时“做题步骤”的输出,也为我们定位其中错误步骤提供了依据;

  • 增强了大模型的可控性:通过让大模型一步一步输出步骤,我们通过这些步骤的呈现可以对大模型问题求解的过程施加更大的影响,避免大模型成为无法控制的“完全黑盒”;

  • 增强了大模型的灵活性:仅仅添加一句“Let's think step by step”,就可以在现有的各种不同的大模型中使用 CoT 方法,同时,CoT 赋予的大模型一步一步思考的能力不仅仅局限于“语言智能”,在科学应用,以及 AI Agent 的构建之中都有用武之地。

为了更加直观的展现出 CoT 对大模型能力带来的提升,论文作者在七个不同的推理任务数据集中对 CoT 的效果进行了实验,如下图所示,可以看到,相较于直接 Prompt, CoT 对所有的推理任务都带来了显著的提升

图片

3. 何时应该使用 CoT ?

关于何时应该使用 CoT 事实上还是一个开放问题,但是这篇论文从“工程”与“理论”两个角度为我们带来了一些 CoT 适用场景的洞见。

首先,从工程的角度而言,CoT 的适用场景抽象一下可以被归纳为三点,分别是使用大模型(1),任务需要复杂推理(2),参数量的增加无法使得模型性能显著提升(3)。此外,现有的论文实验也表明,CoT 更加适合复杂的推理任务,比如计算或编程,不太适用于简单的单项选择、序列标记等任务之中,并且 CoT 并不适用于那些参数量较小的模型(20B以下),在小模型中使用 CoT 非常有可能会造成机器幻觉等等问题。

图片

而从理论角度,一篇来自斯坦福的论文《Why think step-by-step? reasoning emerges from the locality of experience》揭示了当大模型的训练数据表现出了如上图中的变量的局部簇结构(Local Clusters of Variables)时,CoT 将会展现极好的效果。而变量的局部簇主要指训练数据中变量之间有着强的相互作用,相互影响的关系。

此外,也有研究指出,当给予大模型的示例之间彼此之间互相区分并不相同时,也有助于提升 CoT 的性能。同时,逻辑依据是否与问题相关,逻辑推理步骤的顺序也会显著影响 CoT 的性能。另外一个有趣的发现是,使用代码数据训练大模型,或者使用符合 CoT 格式的数据训练模型也有助于提升 CoT 的性能。总结一下:

CoT 应当被用于 20B 以上参数规模的模型之中,并且模型的训练数据应当于任务问题相关且彼此相互有较强的联结。

4. 为什么 CoT 会生效?

关于 CoT 为什么会生效,目前尚且没有一套被大家广泛接受的普遍理论。但是,有许多论文对 CoT 与大模型的互动进行了一系列实验,类似物理实验与物理理论的关系,在实验中一些有意思的现象或许可以帮助我们理解 CoT 的工作原理:

  1. 模型规模小会导致 CoT 失效;

  2. 简单的任务 CoT 不会对模型性能带来提升;

  3. 训练数据内部彼此相互联结程度的增加可以提升 CoT 的性能;

  4. 示例中的错误,或者无效的推理步骤不会导致 CoT 性能的下降;

  5. ……

图片

如果我们对这些现象做一些总结与延申,或许可以认为:首先,CoT 需要大模型具备一些方面“最基础”的知识,如果模型过小则会导致大模型无法理解最基本的“原子知识”,从而也无从谈起进行推理;其次,使用 CoT 可以为一些它理解到的基础知识之间搭起一座桥梁,使得已知信息形成一条“链条”,从而使得大模型不会中途跑偏;最后,CoT 的作用,或许在于强迫模型进行推理,而非教会模型如何完成推理,大模型在完成预训练后就已经具备了推理能力,而 CoT 只是向模型指定了一种输出格式,规范模型让模型逐步生成答案。

5. CoT 朝着什么方向发展?

在这 CoT 问世的一年多以来,CoT 也开始从最简单的“Let's think step by step”慢慢进化,作为一篇综述,这篇论文也相当全面的概括了 CoT 的发展方向与进化路径,如果我们需要按图索骥 CoT 的现有文献,可以从下面这张图出发:

图片

总的来说,CoT 的发展方向有三条主要的路径,如图从左到右分别是 “Prompt 模式”,“推理结构”以及“应用场景”。从这三个主要的发展方向出发,我们来概述一下主要的论文:

Prompt 模式

首先,是 Prompt 模式,在上图中的最左边,Prompt 模式主要研究“向大模型输入怎样的 Prompt 可以使得大模型获得更好的推理能力”,关于 Prompt 模式的研究也可以分为两类,分别是指令生成与范例生成。

对于指令生成问题,又可以分为手动指令生成与自动指令生成,显然简单的“Let's think step by step”就属于手动指令生成模式,此外,另一类的手动指令生成模式是 Plan-and-Solve 方法,其主要思想在于让模型制定一个将任务分为更小子任务的计划,再让模型一步一步执行计划、解决问题,其 Prompt 为“Let’s first understand the problem and devise a plan to solve the problem. Then, let’s carry out the plan and solve the problem step by step”。

图片

显然,手动指令生成无法适应复杂的实际情况,因此自动指令生成应运而生,自动指令生成的代表作有两个,分别是自动 Prompt 工程(APE)以及提示优化(OPRO),如上图所示,APE 与 OPRO 的核心思想都在于设计了一套机制让大模型通过观察各个候选的 Prompt 的实际任务中的表现,通过最大化表现得分来自动选择最优的 Prompt 。

类似的,范例生成也可以分为手动范例生成与自动范例生成,传统的 Few-Shot-CoT 就是一种典型的手动范例生成方法,在 Few-Shot-CoT 的基础上,一种让大模型使用手动生成的范例多次回答问题,再从其中依据如熵、方差等的不确定性度量选择“最不确定”的问题,通过手动注释来加强范例生成的 ActivePrompt 方法诞生,成为了一种介于手动范例生成与自动范例生成之间的范例生成方法。而为了将范例生成完全“自动化”,Auto-CoT 方法被提出,具体而言,Auto-CoT 分为两个阶段:(1)问题聚类,对任务数据集进行聚类(2)示例采样:从每个聚类中心中选择一个代表性问题使用 Zero-Shot-CoT 生成思维链作为示例。

推理结构

除了研究“什么样的 Prompt 会诱导出更好的 CoT 能力以外”,还有很大一部分研究者关注于 CoT 本身的结构问题,主要的研究思路包含 “CoT 构造”、“推理聚合”以及 “CoT 验证”

CoT 构造主要将传统线形,链式的 CoT 转化为如表格、树状、图状格式,代表工作有非常出名的 PoT,Tab-CoT,ToT 以及 GoT-Rationale,下面这张图非常清晰的展示了这四种方法的异同:

图片

首先是 PoT,其中 P 指 Programm 即程序,PoT 的思想也非常简单,对思维链中大模型有可能出错的一些计算问题,让大模型生成出编程语言在解释器中运行,以将复杂计算与模型的文本生成解耦。

其次是 Tab-CoT,其中 Tab 指 Tabular 表格,在 ToT 中,研究者迫使大模型在每一步的推理中记录一个“∣步数∣子问题∣过程∣结果∣”的推理表格,并让大模型在推理时从生成的表格中提取答案,从而增强大模型的推理能力。

此外,就是 ToT,其中 T 指 Tree 即思维树,简单理解就是将 CoT 的链式结构扩展为树形结构。ToT 让大模型在解决子问题时生成多个不同的答案选择,通过此建立的树形结构让大模型可以展望未来确定下一步的决策并且通过追溯来纠正历史决策。

基于 ToT 的思想,将 Tree 拓展为 Graph,就形成了 GoT。GoT 系统的核心在于一个“控制器”,控制器处理对图的操作(GoO)以及图状态推理(GRS),其中 GoO 用于将一个给定的任务进行图分解,将一个任务分解为相互连接的节点-边关系,而 GRS 则负责维护大模型在 GoO 生成的图上的推理过程,记录当前步的状态,决策历史等等信息。

图片

除了各种 XoT 以外,对于推理过程的“解码”问题,也有一些工作进行了研究。其中,推理聚合的代表性工作是 Self-consistency CoT。Self-consistency CoT 使用手动设计的 Prompt 生成采样一组不同的推理路径,再通过“多数投票”找到推理步骤中“最一致”的路径,使用这条解码路径驱动原始的贪心解码方式来提示 CoT 性能

最后,在针对推理结构的研究,还有一类是 CoT 验证,CoT 验证开始侧重于通过多轮提问,让大模型进行“自我验证”,在前向后向的反复问答中让大模型可以验证自己的回答,而伴随着 CoT 验证的发展,也有工作开始引入“外部工具”对 CoT 中的信息进行验证,例如信息检索、计算器、计算机程序等等。

图片

CoT 验证最经典的工作即是自我验证(Self-Verification),自我验证有两个步骤,分别是(1)对多个候选的推理路径进行采样;(2)给定问题结论让大模型验证条件是否满足结论,并根据验证分数对候选结论进行排序。

图片

而引入外部工具的 CoT 验证的代表性工作譬如 CRITIC 框架,CRITIC 使得大模型可以交互式的引入外部工具来验证与修改自己的答案输出,经过大模型输出,外部工具验证,验证结果反馈,反馈修改四个循环的步骤加强 CoT 输出的可靠性。而将 CRITIC 的思想进一步推向机制,即出现了任务自适应与流程自动化的 AuRoRA,AuRoRA 从多个来源提取相关知识,将不同来源的知识进行组合、检查与提炼来修改初始 CoT,以提示 CoT 的准确性与逻辑性。

比较有意思的一点在于,在论文《Can large language models really improve by selfcritiquing their own plans?》中,作者质疑了大模型是否可以真的进行可靠的 CoT 验证,在大模型的能力本身“无法解决验证结果反馈提出的问题”时,大模型有可能会过度纠正推理过程,直接跳过正确答案

应用场景

除了对 CoT 本身的改变,还有许多工作将 CoT “部署”于不同的应用场景之下以提升各种场景下大模型的能力,譬如最简单的从单语言 CoT 扩展到多语言 CoT。这些应用场景包括从单模态到多模态以及从复杂推理任务到通用推理任务的扩展。其中,多模态 CoT 具有很大的应用前景,在 CoT 中,多模态可以分为两类:输入多模态与输出多模态。

图片

其中,MM-CoT 是输入多模态研究的第一篇工作,MM-CoT 侧重使用微调方法嵌入 CoT,通过将语言和图像合并在一个包含推理生成与答案推理的两阶段的框架中,使用微调大模型赋予输入多模态 CoT 的能力。基于 MM-CoT,GoT-Input 方法通过对 CoT 生成的思维图进行抽取构建三元组,并使用 GNN 将文本、图像与 CoT 统一,从而生成包含 CoT 信息的最终答案。而区别于输入多模型,VCoT 解决了一个输出多模态的问题,VCoT 通过以生成图片的“标题”以及识别核心关注点作为图像生成的启动过程,通过递归的方式填充图像信息,从而实现输出多模态。

除了多模态 CoT 以外,CoT 目前也已经用于如文本摘要(SumCoT),开放域问答(Self-Prompting LLMs),机器翻译(MAPS),化学(ChemCrow)、医学(Med-PaLM)等等领域

图片

6. CoT 与 AI Agent 有何关系?

回忆我们上一篇中介绍的关于 Agent 的定义,我们期望通过各种AI 技术构建的 Agent 事实上是一类拥有“自主智能的实体”,可以自主的发现问题、确定目标、构想方案、选择方案、执行方案、检查更新。基于大模型解决问题的“通用性”与预训练得到的“先天知识”,构建的大模型智能体可以被认为具有如下图的结构:

图片

上图中大模型智能体主要由三部分组成,分别是 Agent 主体,工具与环境。当人类指令输入 Agent 主体后,Agent 主体通过一系列计划、决策与控制,使用工具与外部环境互动。

其中显然,作为 Agent 主体的大模型是模拟人类智能决策流程的核心,在许多 Agent 需要处理的任务中,Agent 的“先天知识”并不包含解决任务的直接答案,因此 Agent 需要在一系列与外部环境的交互循环中,制定计划,做出决策,执行行动,收到反馈……在一整个计划、决策与控制的循环中,大模型需要具备“感知”,“记忆”与“推理”的能力,如下图所示, CoT 恰恰可以从这三个方面来“赋能” Agent。

图片

感知 CoT

无论是环境的反馈,还是人类的指令,Agent 都需要完成一个对接收到的信息进行“理解”,并依据得到的理解进行意图识别,转化为下一步任务的过程。而使用 CoT 可以大大帮助模型对现有输入进行“感知”,譬如,通过使用“Answer: Let’s think step by step. I see $$, I need to ...”的 Prompt,可以让模型逐步关注接收到的信息,对信息进行更好的理解,再如,在机器人控制的场景下,Agent 的决策不可避免的会出现错误,而接受到错误信息的反馈让 Agent 理解错误的原因调整自己的行动也是 Agent 应用于动态场景下的多轮决策任务中的关键能力,感知 CoT 也将加强模型自我纠错的能力。

图片

此外,值得注意的是,与外部环境的互动需要 Agent 具有处理多模态信息的能力,这种能力要么需要 Agent 本身是一个多模态的大模型,要么需要 Agent 可以将其他模特信息转化为语言进行理解。其中一个非常有意思的问题是“是否大模型 Agent 只能存在以语言为中心的感知?”,如上图所示,事实上有许多工作不仅在以语言为中心的感知中拓展大模型编码其他模态信息的能力,并且也发展出了譬如以图像为中心的感知方法,与将文本与图像进行统一的真正以多模态为中心的感知方法。但是由于多模态信息带来的数据、计算、可扩展性等方面的种种问题,真正以多模态信息为中心的感知时代暂且还未到来。

记忆 CoT

一般而言,大模型智能体通常同时拥有短期记忆与长期记忆的能力。短期记忆一般作为一种时间信息,可以在 Agent 的多轮交互中灵活的改变(因此也被称为工作记忆),短期记忆为大模型提供更加直接的上下文信息支持,因此很自然的可以被建模为一条历史动作链。

相比于短期记忆的“动态性”,长期记忆更多的提供历史事件中的静态信息的记录,是对历史知识更加宏观与抽象的理解,长期记忆可以依赖于大模型中的可训练参数进行构建,也可以通过外部维护的记忆库进行构建。

图片

而当序列长度变长,线性链条式的记忆链效率出现下降时,为了实现针对“记忆”高效的增删改查,一些工作探索了树搜索与矢量检索的方法

其中,树搜索将记忆信息以树结构进行存储,让智能体通过迭代访问文本记忆信息,譬如斯坦福 25 人小镇论文中提出的反思树 Reflection Tree,当智能体面对与环境的多轮交互时,反思树可以让智能体定期抽取历史信息进行“反思”,将反思抽象得到的结果搭建构成一颗反思树,树的叶子节点代表大模型每轮的基本观察,而非叶子节点则代表反思树的抽象程度,越靠近根节点抽象程度越高

而另一种方法则是矢量检索,通过将复杂数据类型建模为矢量数据库来实现长期记忆的高效存储与检索,当智能体遇到新问题需要“回忆”过往记忆时,基于矢量数据库的长期记忆系统则会快速检索相关信息,确保智能体行为一致性。

推理 CoT

除了感知与记忆,借鉴 CoT 的思路让智能体分解任务逐步进行计划与决策以增强智能体解决问题的可靠性。在 Agent 中,CoT 主要的功能在于将计划、行动与观察相互结合,弥合推理与行动之间的差距,显然,推理可以帮助模型制定行动计划处理异常情况,而行动则允许大模型在与外部环境进行交互的同时,收集附加信息支持模型的推理。

譬如,AgentBench 强迫大模型智能体通过“思考”+“行动”步骤完成任务,而行动链技术通过一系列行动历史与未来行动计划帮助智能体进行决策,从而将决策问题转化为 CoT 推理问题。

图片

此外,工具的使用扩展了大模型 Agent 的能力边界,通过使用工具,大模型不再局限于“预测”下一步的动作,而获得了“实际执行”动作的能力,譬如输出代码操作机器,调用 API 获得数据,使用各种软件、计算工具等等,同时,使用浏览器获取“实时更新”的“新知识”作为大模型的检索增强也有效的扩展了大模型的知识边界,也为大模型“自我验证”提供了知识库。而除了使用工具以外,类似编写“教科书”,现在还有一些研究关注在“专门针对 Agent 任务场景”的数据集上对大模型进行微调以获得更强的 Agent

7. 目前 CoT 与 AI Agent 还面临哪些挑战?

尽管,当下 CoT 与 AI Agent 已经编程、科研、办公等等领域得到了极其广泛的应用,但是作为一个新兴领域,无论是CoT 还是 AI Agent 都面临着许多显著的挑战,其中包括:

图片

  1. 在未知领域中的泛化能力:尽管 AI Agent 的出现本身就拓展了大模型解决更加复杂未知领域问题的能力,但是由于缺乏与现实世界真正“具身”的交互,因此一个可以做到浏览网页的 Agent 是否通过同一套框架与工程手段就可以做到操控无人机编组,这一问题仍然悬而未决;

  2. Agent 的过度交互问题:为了完成任务,Agent 需要与环境进行大量复杂多步的交互,而一些研究也表明 Agent 很有可能会陷入到不断交互的循环陷井之中,在交互循环中无意义的空转,并且,由于 Agent 解决问题缺乏“效率”,因此由此生出的日志的存储与信息检索也将成为新的问题;

  3. 个性化 Agent:人手一个的私人智能助理是一个美好的畅想但是一个真正的个性化 Agent 的实现还面临许多问题,目前个性化 Agent 的研究有三条技术进路,分别是从定制化的 Prompt 出发,从微调出发以及从模型编辑出发,但是这些进路都有各自的问题,并且当下研究都主要聚焦于特定的问题背景,目前还不存在一套完整统一的解决方案;

  4. 多智能体社会:如何扩大大模型 Agent 的数量,以组成一个多智能体的社会用于观察“社会行为的涌现”也是一个非常有意思的方向,但是多智能体的计算开销是阻碍这一领域发展的关键问题;

  5. Agent 安全问题:当 Agent 逐步进入人们的日常生活,Agent 与 CoT 的安全性问题就必须得提上日程,譬如老生常谈得隐私泄露、权限滥用、有毒信息等等问题,此外,当 Agent 应用于现实世界后,此外,由于缺少现实世界真正多模态的反馈,譬如人类智能可以感受到“痛”,而 AI Agent 不会有这方面的信息输入,因此如何对完全不同质的两类主体进行“对齐”也将是关键问题;

  6. Agent 的评价:如何客观的评估一个 Agent 的能力也将是 AI Agent 发展带给我们的新问题,想想几年前 NLP 时代的数据集刷榜的评估方式,这种传统评价方式必然不适用于一个不断与外部环境打交道的 Agent。此外,一个做对了 99 步但生成答案错误的智能体可以本身能力要优于一个做错了 99 步但生成答案正确的智能体,因此 Agent 评价也呼唤除了评估执行任务的成功率以外的新指标、新方法。

最后,在这短短一年多的时间内,大家一起见证了大模型、CoT 以及 Agent 技术的飞速发展与其蓬勃的生命力,在工作爆发式增长的当下,一篇逻辑清晰,全面深入的综述相当难得。当然作为针对前沿技术领域的讨论,论文中许多议题都尚无定论,也欢迎大家一起交流讨论~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web-Note】 JavaScript概述

JavaSript基本语法 JavaSript程序不能独立运行&#xff0c;必须依赖于HTML文件。 <script type "text/javascript" [src "外部文件"]> JS语句块; </script> script标记是成对标记。 type属性&#xff1a;说明脚本的类型。 "text/jav…

机器学习库:numpy

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 写在开头 基本数据格式 array 数据定位 argmax 数据生成 random.rand random.randn random.randint 维度拓展 expand_dim 结语 写在…

python桌面开发PyQt6库和工具库QTDesigner安装和配置

一、安装PyQt6 二、安装pyqt6-tools 三、安装外部工具 四、创建QTDesigner 1.首先查找designer.exe的路径&#xff08;可以自己在窗口中选择&#xff0c;也可以使用Everything搜索&#xff09; 2.使用Everything搜索后会出现多个designer.exe,选中&#xff0c;OpenPath 3.选择…

单片机学习7——定时器/计数器编程

#include<reg52.h>unsigned char a, num; sbit LED1 P1^0;void main() {num0;EA1;ET01;//IT00;//设置TMOD的工作模式TMOD0x01;//给定时器装初值&#xff0c;50000,50ms中断20次&#xff0c;就得到1sTH0(65536-50000)/256;TL0(65536-50000)%256;TR01; // 定时器/计数器启…

【Spring Boot】如何集成Swagger

Swagger简单介绍 Swagger是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化RESTful风格的Web服务。功能主要包含以下几点&#xff1a; 可以使前后端分离开发更加方便&#xff0c;有利于团队协作接口文档可以在线自动生成&#xff0c;有利于降低后端开发人员编写…

二叉树经典面试题—折纸

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 折纸问题1.1 解决思路1.2 实现代码 &#x1f48e;总结 1 折纸问题 1.1 解决思路 请把一段纸条竖着放在桌子上&#xff0c;然后从纸条的下边向上方对折1次&#xff0c;压出折痕后展开。此时折痕是凹下去的&#xf…

包你学会十大内排序算法,广度深度兼备,动图演示,详细源码

内排序算法合集 文章目录 内排序算法合集前言冒泡排序冒泡排序的实现冒泡排序的简单实现冒泡排序的优化版本冒泡排序的复杂度分析 简单选择排序简单选择排序的实现简单选择排序的复杂度分析 直接插入排序直接插入排序的实现直接插入排序的复杂度分析 希尔排序希尔排序原理希尔排…

059-第三代软件开发-巧用工控板LED指示灯引脚

第三代软件开发-巧用工控板LED指示灯引脚 文章目录 第三代软件开发-巧用工控板LED指示灯引脚项目介绍巧用工控板LED指示灯引脚第一种方式第二种方式 总结 关键字&#xff1a; Qt、 Qml、 Power、 继电器、 IO 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项…

Leetcode—28.找出字符串中第一个匹配项的下标【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—28.找出字符串中第一个匹配项的下标 实现代码 int strStr(char* haystack, char* needle) {int len1 strlen(haystack);int len2 strlen(needle);int idx -1;int i 0;while(i < len1 - len2) {if(strncmp(haystac…

Django之admin页面样式定制(Simpleui)

好久不见&#xff0c;各位it朋友们&#xff01; 本篇文章我将向各位介绍Django框架中admin后台页面样式定制的一个插件库&#xff0c;名为Simpleui。 一&#xff09;简介 SimpleUI是一款简单易用的用户界面&#xff08;UI&#xff09;库&#xff0c;旨在帮助开发人员快速构建…

数据库基础教程之创建触发器,实现自动更新时间戳(四)

postgresql 更新时间戳需要通过触发器来实现,这里给出两种方法来实现。 创建字段create_time和edit_time 通过Navicat在添加字段时候将字段设置为timestamp类型,生成时间戳方式为CURRENT_TIMESTAMP或者设置为now(),然后点击保存。 新建函数 点击函数,然后在弹出的函数向导中…

ubuntu22.04中ros2 安装rosbridge

ros2 启动rosbridge&#xff1a; 要启动ROS2中的rosbridge&#xff0c;需要先安装ROS2的rosbridge_suite软件包。使用以下命令安装&#xff1a; 更新过可忽略 sudo apt-get update安装命令 sudo apt-get install ros--rosbridge-suite 注意&#xff1a; 将替换为正在使用的R…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

常见的1/2/3位数码管接线详解

今天玩数码管的时候接触到了数码管的接线&#xff0c;分享一下供刚开始接触的童鞋参考 首先了解什么是数码管 数码管是一种可以显示数字和其他信息的电子设备&#xff0c;是显示屏其中一类&#xff0c; 通过对其不同的管脚输入相对的电流&#xff0c;会使其发亮&#xff0c;从而…

哲学家就餐问题

文章目录&#xff1a; 问题描述及分析一次错误的尝试解决方案一解决方案二 问题描述及分析 哲学家就餐问题规定了有5位哲学家正在进行思考和就餐两种活动。用餐在一个桌子上进行&#xff0c;桌子上面有5个盘子和5个叉子&#xff0c;按照循环的方式分配。 问题的约束条件&#…

【数据中台】开源项目(2)-Wormhole流式处理平台

Wormhole 是一个一站式流式处理云平台解决方案&#xff08;SPaaS - Stream Processing as a Service&#xff09;。 Wormhole 面向大数据流式处理项目的开发管理运维人员&#xff0c;致力于提供统一抽象的概念体系&#xff0c;直观可视化的操作界面&#xff0c;简单流畅的配置管…

【React】Memo

组件重新渲染时缓存计算的结果。 实例&#xff1a;count1计算斐波那契数列&#xff0c;count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数&#xff0c;而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…

二十六、搜索结果处理(排序、分页、高亮)

目录 一、排序 二、分页 1、深度分页问题 2、三种方案的优缺点 &#xff08;1&#xff09;fromsize 优点&#xff1a; 缺点&#xff1a; 场景&#xff1a; &#xff08;2&#xff09;after search 优点&#xff1a; 缺点&#xff1a; 场景&#xff1a; &#xff0…

git的使用:本地git下载、sshkey的添加、github仓库创建及文件上传

一、github创建账号 即github注册账号&#xff0c;登录github官网&#xff0c;根据提示注册即可 github官网 二、git客户端下载安装 已有很多git下载安装的博文了&#xff0c;在此就不赘述 三、sshkey的生成与添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

【代码】考虑电解槽变载启停特性与阶梯式碳交易机制的综合能源系统优化调度matlab-yalmip-cplex/gurob

程序名称&#xff1a;考虑电解槽变载启停特性与阶梯式碳交易机制的综合能源系统优化调度 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;提出了一种考虑 变载启停特性的电解槽混合整数线性模型&#xff0c;根据电 氢负荷可以实时调整设备工作状态&…