Data Interpreter: An LLM Agent For Data Science 论文解读

论文地址:https://arxiv.org/abs/2402.18679

Github:MetaGPT: The Multi-Agent Framework

数据解释器(Data Interpreter)是一个基于大型语言模型(LLM)的代理,专门为解决数据科学问题而设计。它通过代码来解决数据科学中的挑战,特别是在需要实时数据调整、复杂任务间依赖关系的优化以及识别逻辑错误的精确推理方面表现出色。数据解释器采用了三种关键技术来增强数据科学问题解决能力:

  • 1. 动态规划与层次图结构:利用层次图结构来实时适应数据变化,动态规划方法使得数据解释器能够适应任务变化,特别是在监控数据变化和管理数据科学问题中固有的复杂变量依赖关系方面表现出高效性。
  • 2. 工具集成与动态增强:在执行过程中动态集成各种人类编写的代码片段,创建特定任务的自定义工具,超越了仅依赖API的现有能力。这一过程涉及自动组合多种工具与自生成的代码,利用任务级执行来独立构建和扩展其工具库,简化工具使用,并根据需要进行代码重构。
  • 3. 逻辑不一致性识别与经验记录提升效率:基于执行结果获得的置信分数,检测代码解决方案与测试代码执行之间的不一致性,并通过比较多次尝试来减少逻辑错误。在整个执行和推理过程中,记录任务级经验,主要包括元数据和运行轨迹,包括成功和失败的经验。

数据解释器在各种数据科学和现实世界任务上进行了评估,与开源基线相比,显示出优越的性能,在机器学习任务中表现显著提升,从0.86提高到0.95。此外,它在MATH数据集上显示出26%的增长,在开放式任务中更是显著提升了112%。该解决方案将在GitHub上发布,地址为:https://github.com/geekan/MetaGPT。

摘要(Abstract)

基于大型语言模型(LLM)的代理在多个领域展现出了显著的有效性。然而,它们在需要实时数据调整、由于各种任务间复杂依赖性所需的优化专业知识,以及识别逻辑错误以进行精确推理的数据科学场景中的性能可能会受到影响。

在本研究中,我们介绍了数据解释器(Data Interpreter),这是一个旨在通过代码解决数据科学问题的解决方案,强调了三种关键技术来增强问题解决能力:

  • 1)动态规划与层次图结构,用于实时数据适应性;
  • 2)动态集成工具以增强执行期间的代码熟练度,丰富所需的专业知识;
  • 3)在反馈中识别逻辑不一致性,并通过经验记录提高效率。

我们在各种数据科学和现实世界任务上评估了数据解释器。与开源基线相比,它展示了卓越的性能,在机器学习任务中表现出显著的改进,从0.86提高到0.95。此外,它在MATH数据集上显示出26%的增长,在开放式任务中更是显著提升了112%。解决方案将在Github上发布。

引言(Introduction)

大型语言模型(LLMs)使代理在广泛的应用中表现出色,展示了它们的适应性和有效性。这些由LLM驱动的代理显著影响了软件工程、导航复杂开放世界场景、促进多模态任务的协作多代理结构、提高虚拟助手的响应性、优化群体智能,并为科学研究做出贡献。

最近的研究集中在通过改进它们的推理过程来提高这些代理的问题解决能力,旨在提高复杂性和效率。然而,包括机器学习、数据分析和数学问题解决在内的数据为中心的科学问题,提出了一些独特的挑战,这些挑战仍有待解决。机器学习过程涉及复杂的、漫长的任务处理步骤,其特点是多个任务之间的复杂依赖关系。这需要专家介入进行过程优化和在失败或数据更新的情况下进行动态调整。对于LLM来说,一次性提供正确的解决方案往往是具有挑战性的。

在当前的数据科学领域,有一种方法是通过编写代码来解决以数据为核心的问题,这种方法被称为解释器范式。它结合了对需求的静态分析和代码的实际执行。尽管这种方法有其优势,但在实际的数据科学应用中,它也暴露出了一些重要的挑战:

1)数据依赖强度:数据科学固有的复杂性源于各个步骤之间的复杂相互作用,这些步骤可能会实时变化。为了获得准确的结果,在开发任何机器学习模型之前,数据清洗和全面的特工程是前提条件。因此,监控数据变化并动态调整转换后的数据和变量至关重要。机器学习建模过程,包括特征选择、模型训练和评估,涉及广泛的处理操作符和搜索空间。挑战在于同时生成和解决整个过程代码。

2)精细的领域知识:数据科学家的专业知识和编码实践在解决数据相关挑战中至关重要。通常嵌入在专有代码和数据中,这些知识对当前的LLM来说往往是不可访问的。例如,为特定领域(如能源或地质学)生成数据转换代码可能对没有所需领域专业知识的LLM构成挑战。现有的方法主要依赖于LLM,这种依赖可能会简化流程,但可能会牺牲性能。

3)严格的逻辑要求:解释器通过代码执行和错误捕获能力来增强问题解决性能。然而,它们往往忽略了无错误的执行,错误地将其视为正确的。虽然基本编程任务可以通过即时执行反馈来简化,并且当要求明确界定时依赖于即时执行反馈,但数据科学问题往往提出了模糊、不规则和定义不明确的要求,这使得LLM难以理解。因此,LLM生成的代码解决方案可能包含需要严格验证逻辑正确性的模糊性,这超出了单纯的执行反馈。

相关工作(Related Work)

作为数据科学家代理的LLM:尖端的大型语言模型(LLMs),在多样化的自然和编程数据上进行预训练,展现出强大的解释能力。例如利用程序解释器来解耦复杂的计算,提升了它们在MATH数据集上的性能,使得具身代理具备基于代码的推理能力。在代码解释能力的基础上,研究人员正在探索如何利用LLM来解决数据科学挑战,并将LLM与专门的机器学习管道集成。例如,自主地从数据和任务描述中开发或增强机器学习模型。此外,将LLM与系统评估配对,通过演化可执行程序来发现解决开放问题的方法。然而,这一领域缺乏专门设计的数据集和评估方法,以评估基于LLM的方法的能力。我们在机器学习问题解决上对我们的工作和各种开源框架进行了基准测试,以提供对这一研究领域的更多洞察和理解。

规划:规划能力是LLM代理的关键能力。规划能力强调为特定问题生成逻辑结构化的行动或思维路线图。对于LLM代理的规划能力,早期工作如CoT和ReAct专注于复杂任务的分解,并为子任务执行顺序规划。由于任务的复杂性,LLM代理生成的单一计划有时是不可行的。因此,一些工作,如ToT和GoT,旨在生成多个计划并选择一个计划执行。尽管这些以前的规划方法展示了令人印象深刻的性能,但它们在解决具有强烈任务依赖性的多步骤问题方面存在困难,这在数据科学任务中是常见的。作为替代,我们利用动态层次规划来增强能力,允许将复杂问题分解为任务和行动图,这在数据科学场景中很常见。

工具:近期的研究集中在通过创建和集成外部工具来提高LLM的能力,提出了多个代理来解决多模态任务,提出了一个基于LLM决策的自动工具选择机制,而不是为特定任务静态分配特定工具。在自我创造工具的领域,将LLM的角色从工具用户转变为创造者,实现了工具创造的自给自足。结合工具的创造和使用来解决问题。在本文中,我们扩展了工具使用的种类和范围。我们不仅实现了他们未来工作中提出的两种工具类型,即“现有工具的升级”和“多个工具的组合”,还提高了工具生成效率和实用性。我们通过利用执行经验而不是依赖于少数几个提示来实现这一点。此外,本研究支持创建各种私有工具库,并允许LLM根据需要独立选择和组合多个工具。

推理:推理能力强调理解和处理信息以做出决策,这是LLM代理的另一个关键优势。对于推理能力,以前的工作如Reflexion、Self-Refine、CRITIC专注于鼓励LLM代理反思失败并完善推理过程。此外,利用代码提高LLM解决数学、符号和算法推理问题的准确性的开创性工作。通过使用程序解释器解决数值推理任务,将复杂计算与语言理解和推理解耦。利用迭代提示机制,根据来自环境的反馈和自我验证,增强了Minecraft中代理作为行动使用的程序。与主要关注一般语言反馈或执行反馈的以前方法不同,我们的工作解决了数据科学问题所提出的独特挑战,这些挑战需要高级逻辑推理。具体来说,我们提出了新颖的基于自动化置信度的验证机制来提高推理能力。

图2:数据解释器整体设计。该模型包含三个阶段:动态计划图和管理,其中为数据中心的任务生成计划,并在执行过程中管理每个步骤的状态;工具利用和演化,涉及选择或创建合适的工具解决问题,并不断演化这些工具;以及基于自动信心度的验证,该阶段检查并对逻辑上合理的解决方案进行投票。

方法论(Methodology)

方法论概述

  • 数据解释器采用了一个“计划-代码-审查”范式,将动态规划与层次结构相结合,以实时监控和调整目标。
  • 解释器使用代码来完成每个任务,根据计划分解任务,并通过LLM生成相应的代码。
  • 执行器执行代码,产生可追踪的运行结果,并且每个任务都经过验证过程以确保其可靠性。
  • 执行任务的过程被描述和分析为经验,这些经验可以在未来类似任务中被检索和使用。

动态规划与层次结构(Dynamic Planning with Hierarchical Structure)

  • 数据科学项目包含广泛的细节和长期的流程,这使得直接规划所有详细任务和编码变得复杂。
  • 通过层次结构组织数据科学流程,将复杂的数据科学问题分解为可管理的任务,并将每个任务进一步细分为通过代码执行的具体行动。
  • 介绍了动态计划管理,以确保在执行过程中高效地执行任务并促进计划的修改。
  • 自我调试和人工编辑两种策略被设计出来,以增强解释器的自主完整性和正确性。

工具利用与生成(Tool Utilization and Generation)

  • 为了解决过于复杂而无法从头开始编码的任务,利用现有工具包或集成现有代码片段变得至关重要。
  • 提出了一个双管齐下的方法:一方面推荐或生成最适合的工具,另一方面有效地组织这些工具。
  • 通过LLM对工具进行分类,并根据任务描述和类型选择最合适的工具。
  • 工具的使用遵循任务图中描述的原则和程序,工具的使用本身被视为图中的一个任务。

增强推理的验证与经验(Enhancing Reasoning with Verification and Experience)

  • 设计的任务图、动态计划管理和工具利用可以提高任务规划和工具掌握。
  • 即使代码没有错误地运行,也可能包含逻辑缺陷,因此引入了自动化基于置信度的验证(ACV)来提高结果的正确性和效率。
  • 通过ACV,解释器在执行代码时生成验证代码,以确保输出结果符合任务要求。
  • 经验驱动的推理利用外部存储库,称为“经验池”,来归档每个任务的关键元素,包括任务描述、最终版本的代码和最终答案。

基于分层图结构的动态计划

这种方法借鉴了自动化机器学习中的层次规划技术,通过层次结构将复杂的数据科学问题分解为易于管理的小任务,并进一步将这些任务转化为具体的代码执行动作,从而实现细致的规划与执行。

分层结构

(a) 一个有组织的任务和动作图,展示了高层级机器学习项目的工作流程,包括实现项目目标所需的任务依赖和动作序列。

(b) 任务的有向无环图(DAG),以机器操作状态预测问题为例。任务图展示了拆解的计划任务,而动作图(也称为执行图)则根据计划的任务图执行各个节点。每个节点的执行代码由LLM转换。

这种动态规划方法赋予了Data Interpreter在任务变化时的适应性,而有向无环图(Directed acyclic graph)结构则在监控和处理数据科学问题中的任务依赖关系方面展现出了高效性。

通过这种方式,Data Interpreter能够有效地管理和优化数据科学任务的执行流程,提高了问题解决的准确性。

数据解释器的动态计划管理

(a) 通过人工编辑进行计划细化。左侧图像显示了在图上经过人工编辑的任务,右侧图像则展示了细化后的计划,包括更新后的任务3.1’、3.2’以及新增的任务3.3。

(b) 对失败任务的计划进行细化。在任务执行后,如果任务3.3失败,细化后的计划将整合已有的成功任务,用更新后的任务3.3’替换原任务3.3,并引入新任务4.1、4.2、4.3和5。

工具集成与进化

在数据科学任务中,任务的多样性与专业性要求基于LLM框架具备广泛的工具调用能力。现有的工具调用方式往往局限于API的形式,无法满足任务多样性带来的动态需求。

Data Interpreter 提出了工具集成与生成的方法。通过工具推荐与组织,能够根据任务描述,进行任务分类,从而有效选择合适的工具集。

在执行阶段,Data Interpreter根据工具参数描述、工具方法描述文档的结构化信息,动态嵌入和调整工具参数,以适应任务的具体需求。

此外,Data Interpreter还能够通过自我进化,从执行经验中抽象出工具的核心功能,形成通用的代码片段,集成到工具函数库之中。这些工具函数可以在未来的任务中重复使用,从而减少了调试频率,提高了执行效率。

下图是数据解释器中的工具使用流程,工具推荐最初根据任务分类来选择工具,然后根据任务需求组合多个工具使用:

基于验证与经验驱动的推理

解决数据科学问题需要严谨的数据与逻辑验证过程,现有的研究在解决这一类问题的过程中,往往依赖于代码执行后的错误检测或异常捕获,这一方式往往会误解代码执行正确即任务完成,无法发现逻辑错误,难以提升任务实现的有效性。

Data Interpreter 通过结合基于置信度的自动验证(Automated Confidece-based Verification)策略,显著提升了其在数据科学问题解决中的推理能力。

ACV策略要求Data Interpreter在执行代码后生成验证代码并执行验证,根据执行验证结果校验任务和实现代码的一致性,类似于白盒测试流程。

在需要更严谨数值反馈的场景中,如使用LLM进行数学推理,Data Interpreter可以增加多次独立验证,并通过多次结果的置信度排序来进一步提升效果。

另一方面,Data Interpreter利用经验池存储和反思任务执行过程中的经验,能够从过去的成功和失败中学习代码知识,从而在面对新任务时做出更准确的决策。这种结合实时验证和经验学习的方法,显著增强了解释器的推理能力,提升了任务的解决质量。

下图以MATH内的一个任务说明基于置信度自动验证流程,虚线框内是自动验证的过程,虚线框下方根据验证对多个候选答案进行排序:

实验(Experiments)

实验设置

1. 数据集(Datasets)

  • MATH数据集:包含12,500个问题,其中5,000个用于测试,涵盖不同的学科和难度级别。作者评估了四个典型的问题类型(C.Prob, N.Theory, Prealg, Precalc),并排除了测试集中难度级别为5的几何问题。
  • ML-Benchmark:由于缺乏评估机器学习领域能力的专用数据集和评估指标,作者开发了一个名为ML-Benchmark的基准数据集和相应的评估方法。该数据集包括八个代表性的机器学习任务,分为三个难度级别,每个任务都附有数据、简洁的描述、标准用户需求、建议的步骤和评估指标。
  • 开放式任务基准:为了评估框架对现实世界任务的泛化能力,作者开发了包含20个任务的开放式任务基准。每个任务要求框架理解用户需求、分解复杂任务并执行代码。这些任务覆盖了常见的需求,如光学字符识别(OCR)、网络搜索与爬取(WSC)、自动回复电子邮件(ER)、网页模仿(WPI)、文本到图像转换(T2I)、图像到HTML代码生成(I2C)、图像背景移除(IBR)和迷你游戏生成(MGG)。

2. 评估指标(Evaluation Metrics)

  • 在MATH基准测试中,准确性作为评估指标,手动审查所有方法生成的输出以确定准确响应的数量。
  • 对于ML-Benchmark,使用了三个评估指标:完成率(CR)、归一化性能得分(NPS)和综合得分(CS)。这些指标提供了模型性能的全面洞察。
  • 对于开放式任务,由于缺乏统一的性能标准,默认NPS=0,直接将CS等同于CR。

3. 基线和实施细节(Baselines and Implementation Details)

  • 在所有框架中使用了GPT-4-Turbo(gpt-4-1106-preview)以确保公正的性能评估。
  • 在MATH数据集上,使用了MathChat和AutoGen作为基线模型,并设置了ACV的N=3。
  • 在ML-Benchmark中,选择了四个典型的开源LLM代理框架作为基线:XAgent、AutoGen、OpenInterpreter和TaskWeaver。
  • 在开放式任务基准中,使用了AutoGen和OpenInterpreter作为基线模型。

4. 消融实验

为了进一步探讨相关方法的有效性,研究人员还进行了消融实验。为评估各模块性能,研究人员在ML-Benchmark上,使用了三种配置进行测试:

  1. 初始设置:基础ReAct框架,包含简单的任务理解提示词以及支持代码执行流程;
  2. 增加了基于分层图结构的动态计划,包括分层规划和每一步骤的动态管理,便于实时调整;
  3. 在“2”的基础上增加了工具集成能力。

主要结果(Main Results)

  1. 数学问题解决性能:数据解释器在所有测试类别中取得了最佳结果,特别是在最困难的Precalc类别中,与AutoGen相比准确率提高了0.16。
  2. 机器学习性能:数据解释器在七个任务中的综合得分为0.95,比AutoGen的平均得分0.86提高了10.3%。在Titanic、House Prices、SCTP和ICR等数据集上,数据解释器是唯一一个综合得分超过0.9的框架。
  3. 开放式任务性能:数据解释器的完成率为0.97,比AutoGen提高了112%。

消融研究(Ablation Study)

  1. 核心模块的消融:通过在ML-Benchmark上进行消融实验,评估了不同模块的性能。动态规划和工具利用显著提高了性能。
  2. LLM backbones的消融:在机器学习任务中,较大的LLM backbones如Qwen-72B-Chat和Mixtral-8x7B与GPT-3.5-Turbo的性能相当,而较小的LLM则性能下降。
  3. 经验学习的消融:通过在不同大小的经验池上进行实验,评估了经验学习对任务效率的影响。增加经验池的大小显著减少了每个任务的调试尝试次数和成本。

这些实验结果证明了数据解释器在处理复杂的数据科学任务方面的有效性和优越性,特别是在需要动态调整和高级逻辑推理的场景中。通过这些实验,数据解释器不仅在标准化测试中表现出色,而且在现实世界的开放式任务中也展现了强大的适应性和问题解决能力。

结论(Conclusion)

尽管当前基于大型语言模型(LLM)的代理在处理静态和简单任务方面已经显示出有效性,但当面临复杂的多步骤挑战时,尤其是在机器学习等任务中,它们的性能会下降。我们的分析揭示了各种任务之间复杂的依赖关系带来了关键挑战,通常涉及任务分解,其中单个任务的失败会中断整个流程。此外,这些任务的动态性质引入了特定问题的变异性,要求对编码工具有细微的理解,超越了当前以API为中心的能力。现有的主要针对静态任务的方法往往忽略了这些在复杂数据科学场景中常见的挑战。此外,基于LLM的代理可以通过代码执行反馈来增强它们的问题解决能力。然而,当解释错误反馈以评估任务完成时,它们的能力受到限制。在数据科学场景中,基于LLM的代理必须区分逻辑错误和无错误反馈,从而验证其代码解决方案的可靠性,并提供更准确的结果。

为了解决这些挑战,我们引入了数据解释器,这是一种通过动态规划与层次图、工具集成与演化以及自动化基于置信度的验证来解决数据科学问题的解决方案。我们的数据解释器被精心设计,以增强在管理复杂数据科学任务时的可靠性、自动化和推理能力。通过广泛的评估,我们的数据解释器在机器学习任务、数学问题和现实世界任务性能方面超越了各种开源框架,这标志着基于LLM的代理在数据科学领域能力的重大进步。

附录(Appendix)

1. 计划示例(Plan Example)

  • 展示了一个机器学习任务的典型计划结构,包括任务ID、依赖任务ID、指令和代码等组成部分。
  • 每个任务都详细描述了其目的,例如进行数据探索、特征工程、模型开发和评估等。

2. 工具详情(Tools Details)

  • 列出了数据解释器使用的工具,包括工具名称、类型、功能和应用领域。
  • 工具被分为不同的类别,如机器学习、多模态和通用工具。

3. 工具模式示例(An Example of Tool Schema)

  • 描述了用于特征工程的工具的JSON模式,包括类的类型、描述、方法和参数。
  • 工具模式帮助LLM理解工具的功能和使用场景。

4. 工具使用提示(Tool Usage Prompts)

  • 提供了用于开放式任务和机器学习任务的工具使用提示,包括零次提示和一次提示。
  • 这些提示指导LLM如何在代码中有效地利用预定义的工具。

5. 额外结果(Additional Results)

  • 展示了ML-Benchmark数据集上的完成率和归一化性能得分的额外结果。
  • 提供了ML-Benchmark上的消融实验结果,包括完成率、归一化性能得分和综合得分。

6. ML-Benchmark数据集描述(ML-Benchmark Dataset Description)

  • 详细介绍了ML-Benchmark数据集,包括数据集名称、用户需求、数据集类型、任务类型、难度和使用的评估指标。
  • 包括了从Kaggle收集的典型数据集,以及它们在机器学习任务中的应用。

7. 开放式任务详情(Open-Ended Task Details)

  • 描述了几个典型的开放式任务,包括发票OCR、网络搜索与爬取、电子邮件回复和网页模仿等。
  • 为每个任务提供了场景描述、用户需求、数据处理流程要求和性能要求。

8. 开放式任务结果(Results of Open-Ended Tasks)

  • 展示了数据解释器在多个开放式任务上的结果,包括图像背景移除、文本到图像转换和网络搜索与爬取等。
  • 提供了任务的可视化结果,展示了数据解释器在数据分析和可视化方面的能力。

这些附录内容为读者提供了数据解释器的实施细节、使用的工具和方法、以及实验结果的深入分析,有助于更好地理解数据解释器的工作方式和评估方法。

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

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

相关文章

数据丢失大救星:格式化后如何高效恢复文件

一、格式化危机:如何逆转数据流失 在数字时代,数据丢失无疑是一场灾难。当我们的电脑硬盘、手机或闪存盘不慎被格式化后,重要文件仿佛在一瞬间消失得无影无踪。面对这一突发状况,很多人会陷入迷茫和焦虑之中。那么,格…

Django(三)-搭建第一个应用(2)

一、编写更多视图 问题详情页——展示某个投票的问题和不带结果的选项列表。问题结果页——展示某个投票的结果。投票处理器——用于响应用户为某个问题的特定选项投票的操作。 # 1.问题详情页:展示某个投票的问题和不带结果的选项列表 def detail(request,questi…

放弃 Rust 选择 Zig,Xata 团队推出 pgzx —— 计划使用 Zig 开发基于 PG 的分布式数据库

Summary Xata 公司在基于 PostgresSQL 开发自己的分布式数据库,出于 Zig 和 C 语言以及 PostgreSQL 的 API 有更好的互操作性的考虑,他们选择了 Zig 而非当红炸子鸡语言 Rust。他们的博客文章中对 pgzx 进行了介绍。让我们来看下他们对 Zig 和 Rust 语言…

clickhouse学习笔记02(小滴课堂)

ClickHouse核心基础-常见数据类型讲解 插入数据: decimal类型的数据,整数部分超了会报错,小数部分超了会截取。 查看表结构: 查询: 插入: 更新操作: 这个和mysql的语句不太一样。 删除语句和my…

Kafka总结问题

Kafka Kafka Kafka Kafka的核心概念/ 结构 topoic Topic 被称为主题,在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。topic 相当于消息的分配标签,是一个逻辑概念。主题好比是数据库的表&#xff0…

【SpringBoot】实现一个简单的图片上传

前端上传表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form enctype"multipart/form-data" method"post" action&q…

MCGS学习——弹框报警

弹框报警的制作流程 先绘制一个弹框窗口&#xff0c;在弹框窗口里绘制弹框标志&#xff0c;记得绘制完成之后点击合成单元&#xff0c;此外&#xff0c;打开报警信息按钮中是打开报警界面 绘制好之后&#xff0c;如果我们想让弹窗出现在我们想让他出现的位置&#xff0c;那我…

Likeshop回收租赁系统:回收租赁超方便!

尊敬的各位&#xff0c;很高兴有机会向大家介绍一款备受瞩目的系统——全新的Likeshop回收租赁系统。 无论是电子产品、衣服还是书本&#xff0c;越来越多人选择在二手平台上进行交易或租用&#xff0c;商品回收、租赁的需求越来越大&#xff0c;很多想入场的兄弟们都苦于没有…

(分享)一个图片添加水印的小demo的页面,可自定义样式

有时候想给某张图片添加一个自己的水印&#xff0c;但是又懒的下载相应软件&#xff0c;用js canvas制作一个静态页面&#xff0c;对于单张图片添加自定义文字水印&#xff0c;大小 间距&#xff0c;角度可调。 页面如下&#xff1a; 选择图片&#xff0c;设置相应参数&#x…

公众号超牛鼻的爆文仿写机器人,原创三篇只需6分钟,篇篇是爆文基因

大家好&#xff0c;我是大胡子&#xff0c;专注于RPA提效​&#xff0c;今天就介绍一款公众号超牛鼻的爆文仿写机器人​。 和以前的公众号爆文机器人不太一样&#xff0c;以前的爆文机器人需要手动插入图片、添加封面、插入话题&#xff0c;然后今天这个机器人就完全解决这几个…

代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作 刷题https://leetcode.cn/problems/delete-operation-for-two-strings/description/文章讲解https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html视频讲解https://…

详解:写作和赚钱的 4 个关系!看完你一定会忍不住想开始写!

飞书文档的加密很强&#xff0c;也没有和自家的豆包大模型融合&#xff0c;所以只能通过其他方式获取文档的内容。 &#xff08;1&#xff09;将飞书文档转换为PDF&#xff0c;要用到浏览器插件&#xff1a; GoFullPage - Full Page Screen Capture - Microsoft Edge Addons …

RT-Thread动态内存扩展,使用多块不连续的RAM作为动态内存

开发环境 MCU&#xff1a;STM32F429VET6&#xff08;1M Flash&#xff0c;192K64K共256K SRAM&#xff09; 编译环境&#xff1a;MDK5.38 实时系统&#xff1a;RT-Thread标准版 目的 这颗MCU的SRAM默认是使用192K&#xff0c;即从地址0x20000000开始&#xff0c;最大0x30000…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-分数

solution1 直观上的分数处理 #include <iostream> using namespace std; int main() {printf("1048575/524288");return 0; }#include<stdio.h> #include<math.h> typedef long long ll; struct fraction{ll up, down; }; ll gcd(ll a, ll b){if…

2024中国闪存市场观察:AI助推闪存全面起势?

过去两年&#xff0c;闪存市场一直处于低迷状态&#xff0c;但去年第四季度闪存颗粒资源的上涨&#xff0c;导致闪存产品价格一路上扬&#xff0c;市场遂发生反转。 2024年&#xff0c;中国闪存市场会彻底走向复苏&#xff0c;还是急转直下&#xff1f;中国AI热潮&#xff0c;…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

数据结构进阶篇 之 【二叉树】详细概念讲解(带你认识何为二叉树及其性质)

有朋自远方来&#xff0c;必先苦其心志&#xff0c;劳其筋骨&#xff0c;饿其体肤&#xff0c;空乏其身&#xff0c;鞭数十&#xff0c;驱之别院 一、二叉树 1、二叉树的概念 1.1 二叉树中组分构成名词概念 1.2 二叉树的结构概念 1.3 特殊的二叉树 2、二叉树的存储结构 …

全面:vue.config.js 的完整配置

vue.config.js是Vue项目的配置文件&#xff0c;用于配置项目的构建、打包和开发环境等。 在Vue CLI 3.0之后&#xff0c;项目的配置文件从原来的build和config目录下的多个配置文件&#xff0c;合并成了一个vue.config.js文件。这个文件可以放在项目的根目录下&#xff0c;用于…

AI入侵游戏业:是颠覆者还是创新助手?揭秘未来游戏新趋势!

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的关注焦点。而在娱乐产业中&#xff0c;AI技术的引入也让人们对电子游戏的未来发展产生了无限遐想。那么&#xff0c;AI究竟会给电子游戏行业带来怎样的变革&#xff1f;它会成为行业的颠…

通讯录管理系统实现(C++版本)

1.菜单栏的设置 &#xff08;1&#xff09;我么自定义了一个showmenu函数&#xff0c;用来打印输出我们的菜单栏&#xff1b; &#xff08;2&#xff09;菜单栏里面设置一些我们的通讯录里面需要用到的功能&#xff0c;例如增加联系人&#xff0c;删除联系人等等 2.退出功能…