首页 > 编程语言 >【论文解读】MetaGPT:用于元编程的多代理协作框架

【论文解读】MetaGPT:用于元编程的多代理协作框架

时间:2024-07-29 16:53:25浏览次数:13  
标签:智能 代码 编程 SOP MetaGPT 协作 LLM

摘要

基于大语言模型的多代理系统在解决自动化问题获得了显著进展。现有的基于大语言模型的多智能体系统已经可以解决简单的对话任务,但是对于更复杂的任务则因链式使用LLM导致的级联幻觉而导致逻辑不一致,从而变得复杂。在此,我们介绍MetaGPT,这是一种创新的元编程框架,将高效的人类工作流程引入基于LLM的多智能体协作中。MetaGPT将标准操作程序 (SOP) 编码到提示序列中,从而实现更简化的工作流程,使具有类人领域专业知识的智能体能够验证中间结果并减少错误。MetaGPT采用装配线范式,将不同角色分配给各种智能体,能够高效地将复杂任务分解为多个智能体共同完成的子任务。在协作软件工程基准测试中,MetaGPT比以前的基于聊天的多智能体系统生成更连贯的解决方案。我们的项目可在链接: MetaGPT中找到。

介绍

利用大语言模型 (LLM) 的自主智能体为提升和复制人类工作流程提供了有前景的机会。然而,在实际应用中,现有系统倾向于过于简化复杂性。他们在实现有效、连贯和准确的问题解决过程时表现欠佳,特别是在需要有意义的协作互动时。
通过广泛的协作实践,人类在各个领域开发了广为接受的标准操作程序 (SOP)。这些SOP在支持任务分解和有效协调方面起着关键作用。此外,SOP概述了每个团队成员的职责,同时为中间输出建立了标准。定义明确的SOP改进了任务执行的一致性和准确性,使其符合定义的角色和质量标准。例如,在软件公司中,产品经理通过标准化结构分析竞争和用户需求,创建产品需求文档 (PRD),以指导开发过程。
受这些理念启发,我们设计了一个有前景的基于GPT的元编程框架,称为MetaGPT,它显著受益于SOP。与其他不同,MetaGPT要求智能体生成结构化输出,例如高质量的需求文档、设计工件、流程图和接口规范。使用中间结构化输出显著提高了目标代码生成的成功率。更形象地说,在MetaGPT模拟的公司中,所有员工遵循严格和简化的工作流程,所有的交接必须符合某些既定标准。这减少了LLM之间闲聊造成的幻觉风险,特别是在角色扮演框架中,如:“嗨,你好吗?”——Alice(产品经理);“很好!你吃午饭了吗?”——Bob(架构师)。
图1:MetaGPT与现实世界人类团队之间的软件开发标准操作程序(SOPs)。
在软件工程中,SOP促进了各个角色之间的协作。MetaGPT展示了其将复杂任务分解为特定可执行程序并分配给不同角色(如产品经理、架构师、工程师等)的能力。
受益于SOP,MetaGPT提供了一种有前景的元编程方法。在这种情况下,我们采用元编程的概念,即“编程到编程”,与更广泛的元学习和“学习到学习”领域相对比。
文档、设计工件、流程图和接口规范的使用显著提高了目标代码生成的成功率。更形象地说,在MetaGPT模拟的公司中,所有员工遵循严格和简化的工作流程,所有的交接必须符合某些既定标准。这减少了LLM之间闲聊造成的幻觉风险,特别是在角色扮演框架中,如:“嗨,你好吗?”——Alice(产品经理);“很好!你吃午饭了吗?”——Bob(架构师)。
受益于SOP,MetaGPT提供了一种有前景的元编程方法。在这种情况下,我们采用元编程的概念,即“编程到编程”,与更广泛的元学习和“学习到学习”领域相对比。
这种元编程的概念还包括了早期的努力,如CodeBERT以及最近的项目如CodeLlama和WizardCoder。然而,MetaGPT作为一种独特的解决方案,通过一个组织良好的专业化智能体小组实现高效的元编程。每个智能体都有特定的角色和专业知识,遵循一些既定标准。这允许在运行时自动进行需求分析、系统设计、代码生成、修改、执行和调试,突显了基于智能体的技术如何增强元编程。
为了验证MetaGPT的设计,我们使用了公开可用的HumanEval和MBPP进行评估。在代码生成基准测试中,MetaGPT在Pass@1中分别达到了85.9%和87.7%的新最高水平。与其他用于创建复杂软件项目的流行框架(如AutoGPT、LangChain、AgentVerse和ChatDev)相比,MetaGPT在处理更高水平的软件复杂性和提供广泛功能方面也表现出色。值得注意的是,在我们的实验评估中,MetaGPT实现了100%的任务完成率,展示了我们设计的鲁棒性和高效性(时间和Token成本)。
我们的贡献总结如下:

  • 我们引入了MetaGPT,这是一种基于LLM的多智能体协作的元编程框架。它非常方便和灵活,具有明确的功能,如角色定义和消息共享,使其成为开发基于LLM的多智能体系统的有用平台。
  • 我们创新地将类人SOP整合到MetaGPT的设计中,显著增强了其鲁棒性,减少了基于LLM的智能体之间无效的协作。此外,我们引入了一种新的执行反馈机制,在运行时调试和执行代码,显著提升了代码生成质量(例如,在MBPP上绝对提高了5.4%)。
  • 我们在HumanEval和MBPP上达到了最新的技术水平。大量结果有力地验证了MetaGPT,表明它是开发基于LLM的多智能体系统的一个有前景的元编程框架。

2 相关工作

自动编程

自动编程的根源可以追溯到上个世纪。1969年,Waldinger和Lee引入了“PROW”,一个设计用于接受用谓词演算编写的程序规格、生成算法并创建LISP实现的系统。Balzer和Soloway在1980年代致力于推进自动编程并提出了实现它的潜在方法。近期的方法使用自然语言处理 (NLP) 技术。自动编程已经发展成为一个提供付费功能的行业,例如Microsoft Copilot。最近,基于LLM的智能体在自动编程开发中取得了进展。其中,ReAct和Reflexion利用链式思维提示生成推理轨迹和行动计划。这些工作展示了ReAct风格的推理循环作为增强自动编程的设计范式的有效性。此外,ToolFormer可以通过简单的API学习如何使用外部工具。与我们的工作最相关的研究由Li等人提出,他们提出了一种简单的角色扮演框架,涉及扮演不同角色的智能体之间的交流。Qian等人利用多个智能体进行软件开发。尽管现有论文提高了生产力,但它们未能充分利用具有结构化输出格式的有效工作流程。这使得处理复杂的软件工程问题变得更加困难。

基于LLM的多智能体框架

最近,基于LLM的自主智能体在工业界和学术界获得了巨大的兴趣。许多工作通过整合多个智能体之间的讨论提高了LLM的问题解决能力。Stable-Alignment通过在沙盒中与LLM智能体进行交互,达成价值判断共识来创建指令数据集。其他工作则关注社会现象。例如,生成式智能体创建了一个由25个智能体组成的小镇,用于研究语言互动、社会理解和集体记忆。在自然语言为基础的心智社会 (NLSOM) 中,具有不同功能的智能体通过多轮“头脑风暴”解决复杂任务。Cai等人提出了一种通过将大模型作为工具制造者和小模型作为工具使用者相结合的成本降低模型。一些工作强调与规划和策略相关的合作与竞争,另一些工作提出了基于LLM的经济。在我们的实现中,我们观察到多智能体合作的几个挑战,例如保持一致性和避免无效循环。这促使我们专注于在软件开发中应用高级概念如标准操作程序到多智能体框架。

3 MetaGPT: 一个元编程框架

MetaGPT是一个用于基于LLM的多智能体系统的元编程框架。第3.1节解释了在该框架中角色专业化、工作流程和结构化沟通,并说明了如何在SOP的背景下组织多智能体系统。第3.2节介绍了一种增强角色沟通效率的通信协议。我们还实现了结构化的通信接口和一个有效的发布-订阅机制。这些方法使智能体能够从其他角色和环境中获得方向性信息。最后,第3.3节介绍了可执行反馈——一种在运行时进一步提高代码生成质量的自我纠正机制。

3.1 标准操作程序中的智能体

角色专业化

明确的角色专业化能够将复杂的工作分解为更小、更具体的任务。解决复杂任务或问题通常需要具有多种技能和专长的智能体的协作,每个智能体都为特定问题贡献专业化的输出。
在一家软件公司中,产品经理通常进行业务导向的分析并得出见解,而软件工程师则负责编程。我们在我们的软件公司中定义了五个角色:产品经理、架构师、项目经理、工程师和质量保证工程师,如图1所示。在MetaGPT中,我们为每个角色指定了智能体的档案,其中包括他们的名字、档案、目标和约束。我们还初始化了每个角色的具体上下文和技能。例如,产品经理可以使用网络搜索工具,而工程师可以执行代码,如图2所示。所有智能体都遵循Yao等人(2022)描述的React风格行为。每个智能体都监控环境(即MetaGPT中的消息池)以发现重要的观察结果(例如,来自其他智能体的消息)。这些消息可以直接触发行动或协助完成任务。
图2:通信协议示例(左)和带有可执行反馈的迭代编程(右)
左:智能体使用共享消息池发布结构化消息。它们还可以根据自己的档案订阅相关消息。右:生成初始代码后,工程师智能体运行并检查错误。如果出现错误,智能体会检查存储在记忆中的过去消息,并将其与PRD、系统设计和代码文件进行比较。

智能体之间的工作流程

通过定义智能体的角色和操作技能,我们可以建立基本的工作流程。在我们的工作中,我们遵循软件开发中的SOP,使所有智能体能够按顺序工作。
具体来说,如图1所示,在获得用户需求后,产品经理进行详细分析,制定包含用户故事和需求池的详细PRD。这是初步的功能分解。然后,结构化的PRD会传递给架构师,架构师将需求转化为系统设计组件,如文件列表、数据结构和接口定义。一旦系统设计中包含了这些信息,它就会被定向给项目经理进行任务分配。工程师们按照指定的类和函数执行(如图2详细描述)。在接下来的阶段,质量保证工程师制定测试用例以实施严格的代码质量。在最后一步,MetaGPT生成一个精心制作的软件解决方案。我们提供了一个详细的示意图(图3)和一个具体实例(附录B)展示MetaGPT中的SOP工作流程。
图3:展示MetaGPT中软件开发过程的示意图,强调其对SOP的显著依赖。更详细的展示见附录B。

3.2 通信协议

结构化通信接口

大多数当前基于LLM的多智能体框架利用不受限制的自然语言作为通信接口。然而,尽管自然语言具有多功能性,但问题来了:纯自然语言通信是否足以解决复杂任务?例如,在电话游戏(或中文悄悄话)中,经过几轮通信后,原始信息可能会被极大地扭曲。
受人类社会结构的启发,我们提出使用结构化通信来规范智能体的通信。我们为每个角色建立了一个模式和格式,并要求个体根据其特定角色和上下文提供必要的输出。如图3所示,架构师智能体生成两个输出:系统接口设计和序列流程图。这些包含系统模块设计和交互序列,是工程师的重要交付物。与ChatDev不同,MetaGPT中的智能体通过文档和图表(结构化输出)而非对话进行通信。这些文档包含所有必要的信息,防止了无关或缺失的内容。

发布-订阅机制

在协作中共享信息至关重要。例如,架构师和工程师经常需要参考PRD。然而,如前人所述,每次一对一地传达这些信息可能会使通信拓扑变得复杂,导致效率低下。
为了解决这个问题,一个可行的方法是将信息存储在全局消息池中。如图2(左)所示,我们引入了一个共享消息池,允许所有智能体直接交换消息。这些智能体不仅在池中发布结构化消息,还可以透明地访问来自其他实体的消息。任何智能体都可以直接从共享池中检索所需信息,消除了询问其他智能体并等待响应的需要,从而提高了通信效率。
与每个智能体共享所有信息可能导致信息过载。在任务执行期间,智能体通常希望只接收与任务相关的信息,避免被无关细节分心。有效的信息管理和传播在其中起着关键作用。我们提供了一个简单而有效的解决方案——订阅机制(见图2(左))。智能体利用角色特定的兴趣来提取相关信息,而不是依赖对话。它们可以根据自己的角色档案选择要关注的信息。在实际实施中,智能体在接收到所有前置依赖项后才会激活其动作。如图3所示,架构师主要关注产品经理提供的PRD,而质量保证工程师的文件可能不太重要。

3.3 带有可执行反馈的迭代编程

在日常编程任务中,调试和优化过程起着重要作用。然而,现有方法通常缺乏自我纠正机制,导致代码生成不成功。之前的工作引入了不可执行的代码审查和自我反思,但它们在确保代码可执行性和运行时正确性方面仍面临挑战。
我们的初期MetaGPT实现由于LLM幻觉(Manakul等,2023)在审查过程中忽略了某些错误。为克服这一问题,在初始代码生成后,我们引入了一种可执行反馈机制,以迭代地改进代码。更具体地说,如图2所示,工程师根据最初的产品需求和设计编写代码。这使得工程师能够利用其自身的历史执行和调试记忆不断改进代码。为了获取更多信息,工程师编写并执行相应的单元测试用例,随后接收测试结果。如果满意,则启动额外的开发任务;否则,工程师在继续编程之前调试代码。这一迭代测试过程将持续到测试通过或达到最大重试次数(3次)。

4 实验

4.1 实验设置

数据集 我们使用了两个公共基准数据集HumanEval和MBPP,以及一个自生成的更具挑战性的软件开发基准数据集SoftwareDev:

  1. HumanEval 包含164个手写编程任务。这些任务包括函数规范、描述、参考代码和测试。
  2. MBPP 包含427个Python任务。这些任务涵盖了核心概念和标准库功能,并包括描述、参考代码和自动化测试。
  3. SoftwareDev 是一个包含70个软件开发任务代表性例子的集合,每个任务都有自己的任务提示(见表5)。这些任务的范围多种多样(见图5),如小游戏、图像处理算法、数据可视化。它们为真实的开发任务提供了一个强大的测试平台。与之前的数据集不同(Chen等,2021a;Austin等,2021),SoftwareDev更加关注工程方面。在比较中,我们随机选择七个代表性任务进行评估。
    评估指标 对于HumanEval和MBPP,我们遵循Chen等人(2021a)和Dong等人(2023)提出的无偏版本的Pass @k,以评估生成代码的功能准确性:
    Pass @k = E Problems [ 1 − ( n − c k ) ( n k ) ] \text{Pass @k} = \mathbb{E}_{\text{Problems}} \left[ 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}} \right] Pass @k=EProblems​[1−(kn​)(kn−c​)​]
    对于SoftwareDev,我们优先考虑实际用途,通过人工评估(A,E)或统计分析(B,C,D)评估性能:
  • 可执行性(A):该指标对代码进行从1(失败/不可运行)到4(完美)的评分。“1”代表不可运行,“2”代表可运行但不完美,“3”代表接近完美,“4”代表完美代码。
  • 成本(B):成本评估包括(1)运行时间,(2)Token使用量,(3)费用。
  • 代码统计(C):包括(1)代码文件,(2)每个文件的代码行数,(3)总代码行数。
  • 生产力(D):基本上定义为Token使用量除以代码行数,指的是每行代码的Token消耗。
  • 人工修订成本(E):通过确保代码顺利运行所需的修订次数来量化,指示人为干预的频率,如调试或导入包。

基线方法 我们将我们的方法与最近在代码生成领域的特定领域LLM进行比较,包括AlphaCode、Incoder、CodeGeeX、CodeGen、CodeX和CodeT,以及通用领域的LLM,如PaLM和GPT-4。基线结果(如Incoder、CodeGeeX)由Dong等人(2023)提供。
我们修改了MetaGPT中的某些基于角色的提示,以生成适合目标问题的代码(例如,为HumanEval和MBPP生成函数而不是类)。在SoftwareDev基准测试中,我们提供了MetaGPT、AutoGPT、LangChain与Python Read-Eval-Print Loop (REPL) 工具、AgentVerse和ChatDev之间的全面比较。

4.2 主要结果

图4:在MBPP和HumanEval上的单次尝试通过率
图4表明,MetaGPT在HumanEval和MBPP基准测试中表现优于所有前述方法。当MetaGPT与GPT-4合作时,与GPT-4相比,它在HumanEval基准测试中的Pass @k显著提高。在这两个公共基准测试中,MetaGPT分别达到了85.9%和87.7%。此外,如表1所示,MetaGPT在几乎所有指标上都优于在具有挑战性的SoftwareDev数据集上的ChatDev。例如,考虑到可执行性,MetaGPT获得了3.75的评分,非常接近4(完美)。此外,它耗时更少(503秒),明显少于ChatDev。考虑到代码统计和人工修订成本,它也显著优于ChatDev。尽管MetaGPT需要更多的tokens(24,613或31,255相比于19,292),它只需要126.5/124.3个tokens生成一行代码。相比之下,ChatDev使用了248.9个tokens。这些结果突显了SOP在多智能体协作中的优势。此外,我们通过可视化示例展示了MetaGPT的自主软件生成能力(图5)。有关更多实验和分析,请参见附录C。
图5:MetaGPT开发的软件示例
表1:SoftwareDev上的统计分析

4.3 能力分析

与开源基线方法如AutoGPT和自主智能体如AgentVerse和ChatDev相比,MetaGPT为软件工程任务提供了功能。如表2所示,我们的框架涵盖了处理复杂和专业开发任务的广泛能力。整合SOP(例如,角色扮演专业知识、结构化通信、简化工作流程)可以显著提高代码生成能力。其他基线方法可以轻松整合类似SOP的设计来提高其性能,类似于在LLM中注入链式思维(Wei等,2022)。

消融研究

  • 角色的有效性 为了解不同角色对最终结果的影响,我们进行了两个涉及生成有效代码和计算平均统计数据的任务。当我们排除某些角色时,生成的代码是不可行的。如表3所示,除了工程师之外的角色的添加一致地提高了修订和可执行性。尽管更多的角色略微增加了费用,总体性能显著提高,证明了各种角色的有效性。
  • 表2:MetaGPT与其他方法的能力比较。‘✅’表示对应框架中存在特定功能,‘❌’表示不存在。
    表3:角色的消融研究。‘#’表示‘数量’,‘Product’表示‘产品经理’,‘Project’表示‘项目经理’。‘✅’表示添加了特定角色。‘Revisions’表示‘人工修订成本’。
  • 可执行反馈机制的有效性 如图4所示,将可执行反馈添加到MetaGPT中,在HumanEval和MBPP的Pass @1上分别显著提高了4.2%和5.4%。此外,表1显示反馈机制提高了可行性(从3.67到3.75)并减少了人工修订成本(从2.25到0.83)。这些结果说明我们设计的反馈机制如何能生成更高质量的代码。更多MetaGPT和不带可执行反馈的MetaGPT的定量结果见表4和表6。

5 结论

本工作介绍了MetaGPT,一个利用SOPs(标准操作程序)来增强基于大语言模型(LLMs)的多智能体系统问题解决能力的创新元编程框架。MetaGPT将一组智能体建模为一个模拟的软件公司,类似于模拟城镇(Park等,2023)和Voyager中的Minecraft沙盒(Wang等,2023a)。MetaGPT利用角色专业化、工作流程管理和高效的共享机制(如消息池和订阅),使其成为一个灵活且便携的平台,适用于自主智能体和多智能体框架。它使用可执行反馈机制在运行时提高代码生成质量。在广泛的实验中,MetaGPT在多个基准测试中达到了最新的技术水平。类人SOP的成功整合激发了未来对人工多智能体系统进行人类启发技术研究的兴趣。我们还将本工作视为对基于LLM的多智能体框架进行规范的早期尝试。展望(见附录A)。

致谢

我们感谢KAUST AI Initiative执行秘书Sarah Salhi和KAUST AI Initiative博士后Yuhui Wang帮助润色部分文本。我们要感谢KAUST AI Initiative博士生Wenyi Wang提供全面反馈,并与Mingchen共同起草了展望(附录A)。我们还感谢DeepWisdom副总裁Zongze Xu提供了AgentStore的插图材料。

作者贡献

  • Sirui Hong进行了大部分实验并设计了可执行反馈模块。她在Ceyao Zhang以及Jinlin Wang和Zili Wang的支持下,主导了初版写作。
  • Mingchen Zhuge设计了自我改进模块,讨论了额外实验,并主导了当前的写作。
  • Jonathan Chen帮助进行了MBPP实验,概述了方法部分,并参与了当前写作。
  • Xiawu Zheng提供了宝贵的指导,审阅并编辑了论文。
  • Yuheng Cheng参与了评估指标设计和HumanEval实验。
  • Steven Ka Shing Yau, Zijuan Lin, Liyang Zhou, Lingfeng Xiao帮助进行了MBPP实验并与开源基线方法进行了比较。
  • Chenyu Ran创作了大部分插图。
  • DeepWisdom的CEO Chenglin Wu发起了MetaGPT,做出了最重要的代码贡献,并指导了该项目。
  • KAUST AI Initiative主任兼IDSIA科学主任Jurgen Schmidhuber指导了该项目并帮助完成了写作。

原文地址

arXiv: 2308.00352
Repo: https://github.com/geekan/MetaGPT
refdoc:https://docs.deepwisdom.ai/main/zh/

标签:智能,代码,编程,SOP,MetaGPT,协作,LLM
From: https://blog.csdn.net/lanlanlll/article/details/140774301

相关文章

  • Lambda-Go:将函数式编程引入 Go
    Lambda-Go:将函数式编程引入Go原创 GoOfficialBlog GoOfficialBlog 2024年07月28日20:16 中国香港函数式编程是编程范式当中的一种,喜欢的人爱之如命,不喜欢的人嗤之以鼻,以简单高效著称的Go天然在函数式编程上有自己的优势。Lambda-Go[1] 是一个旨在将受Haskell......
  • 谁是开源之王?Mistral Large 2重磅发布,支持80多种编程语言
     Llama3.1登顶开源大模型王座仅仅过了一天,就被拉下了神坛,这次的主角是一家法国的团队MistralAI,发布了其最新旗舰模型MistralLarge2,这是一个具有1230亿参数的大型人工智能模型。该模型旨在增强代码生成、数学和推理能力,并支持超过80种编程语言。  模型信息数规模:12......
  • 面向对象编程(2)——封装
    目录一、概念1.1主要特点1.2实例二、封装的内容2.1 属性(数据成员)2.2 方法(成员函数)2.3 实现细节2.4 类的依赖关系2.5示例2.5.1示例2.5.2解释三、原则与注意事项3.1 封装的原则3.2注意事项一、概念        封装(Encapsulation)是面向对象编程......
  • 模块3 面向对象编程高级 --- 第十一章:异常处理
    第十一章异常处理主要知识点1、异常产生的原因2、标准异常类3、Java的异常处理机制4、异常的创建5、异常的抛出6、异常语句的编程学习目标熟悉异常产生的原因和标准异常类的用法。能够运用异常处理机制编写Java程序,提高安全性;11.1异常的......
  • C++题解(17) 狐猬编程: 640.线段覆盖
    题目描述在一条数轴上,有N条线段,第i条线段的左端点是s[i],右端点是e[i]。如果线段有重叠(即使是端点重叠也算是重叠),则输出“impossible”,如果没有重叠则输出“possible”。输入格式输入文件名:640.in多组测试数据。第一行,一个整数G,表示有G组测试数据。1<=G<=10。每组......
  • Git 多人协作操作流程
    一、管理者创建仓库 1.进入仓库界面后右侧进行管理2.随后点击左侧菜单栏仓库成员管理3.选择好用户类型后点击右侧邀请成员二、成员Fork仓库 1.成员点击右上角Fork  2.设置仓库名,路径等(如果本地不存在同名会自动跳过)  3.成功Fork以后就会出现在自己的仓......
  • 【Linux应用编程】Day10_进程 一文详细剖析进程,从基本概念到创建再到进程操作直至消亡
    进程详细剖析进程,包括以下内容:⚫程序与进程基本概念;⚫程序的开始与结束;⚫进程的环境变量与虚拟地址空间;⚫进程ID;⚫fork()创建子进程;⚫进程的消亡与诞生;⚫僵尸进程与孤儿进程;⚫父进程监视子进程;⚫进程关系与进程的六种状态;⚫守护进程;⚫进程间通信概......
  • JUC并发编程:基于Condition实现一个阻塞队列
    Condition方法概述await():当前线程进入等待状态,直到被通知(siginal)或中断【和wait方法语义相同】。awaitUninterruptibly():当前线程进入等待状态,直到被通知,对中断不敏感。awaitNanos(longtimeout):当前线程进入等待状态直到被通知(siginal),中断或超时。awaitUnit......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 在SQL编程中DROP、DELETE和TRUNCATE的区别
    在SQL编程中,DROP、DELETE和TRUNCATE都是用于删除数据的命令,但它们之间有着显著的区别,主要体现在它们删除数据的范围、操作的不可逆性、对表结构的影响、性能以及事务日志的影响上。DROP:作用:DROP命令用于删除整个表及其所有的数据、索引、触发器、约束等。简而言之,它会从......