[论文笔记] ChatDev:Communicative Agents for Software Development

news2024/11/15 10:34:21

Communicative Agents for Software Development(大模型驱动的全流程自动化软件开发框架)

会议arxiv 2023
作者Chen Qian Xin Cong Wei Liu Cheng Yang
团队Tsinghua University
论文地址https://arxiv.org/pdf/2307.07924.pdf
代码地址https://github.com/OpenBMB/ChatDev/blob/main/
简介一种基于聊天的软件开发框架ChatDev

作者希望提出的自然语言到软件框架的潜力可以照亮将llm集成到软件开发中的新可能性,并标志着自然语言处理、软件工程和集体智能领域新前沿的曙光。

Introduction

image.png
软件工程需要一种有系统的、有纪律的方法来开发、操作和维护软件系统。近年来,深度学习技术的发展促使研究人员探索其在软件工程中的应用,旨在提高有效性、效率和降低成本。
在一步生成一个软件系统时,缺乏任务特异性会让llm感到困惑。软件开发中的细粒度任务,例如分析用户/客户需求和选择编程语言,提供了llm所处理的高级任务所缺乏的指导思想。其次,在决策过程中缺乏质证,造成重大风险。
ChatDev遵循经典的瀑布模型,将设计流程分为:设计、编码、测试和文档编写,每个阶段会有多个不同角色的代理。ChatDev利用一个chat chain,将每个阶段分为原子子任务,在聊天链中,每个节点代表一个特定的子任务,两个角色参与上下文感知、多回合讨论,以提出和验证解决方案。

Contributions

  • 提出了一种基于聊天的软件开发框架ChatDev,仅通过指定一项任务,就会依次处理设计、编码、测试和文档编写。通过语言交流来统一过程,简化了软件开发,消除了每个阶段对特定模型的需求。
  • 提出了聊天链来将开发分解成顺序的原子子任务,每个子任务需要两个角色之间的协作交互和相互检查。
  • 为了缓解代码幻觉等问题,引入了一种叫“思想指导机制”,通过执行角色转换,指导者将特定代码修改思想注入到指令中,以实现更精确的指导。
  • 实验结果证实了ChatDev带来的效率以及成本收益。

ChatDev

Main Problem

每个阶段需要多个角色之间进行有效的交流沟通,在确定交互顺序以及参与的相关个体等提出了较大的挑战。

Chat Chain

软件开发过程的四个不同的阶段:设计、编码、测试和文档化。在设计阶段,通过协作头脑风暴产生创新想法,并定义技术设计需求。编码阶段包括源代码的开发和检查,而测试阶段将所有组件集成到一个系统中,并利用解释器的反馈信息进行调试。文档化阶段包括环境规范和用户手册的生成。

image.png
整个体系分为阶段级和聊天级,阶段级即软件开发过程的四个不同的阶段,聊天级在每个阶段会分为多个原子聊天对话,由当前阶段所需人员参与讨论。

Designing

image.png

Role Assignment

System prompts用于角色扮演过程中给每个代理分配角色,并且这些提示在对话开始前将角色分配给代理。Instructor最初扮演CEO的角色,参与互动,Assistant扮演CPO的角色,执行任务并提供回答。为了实现角色的专门化,还给代理提供了inception prompting,使代理能够履行其角色的设定。Instructor和Assistant包含有关指定任务和角色、通信协议、终止标准和防止不良行为(指令冗余、无信息响应、无限循环等)的约束。

Memory Stream

  • 通过memory stream是一种机制,维护之前的对话记录。
  • 通过提示来建立通信协议,如当双方达成一致时,会生成满足特定格式要求的结束信息()。

Self Reflection

总的来说就是,当观察到对话双方达成一致的时候,没有触发预定义的结束的通信协议(),这时需要进行reflection,让一个新的提问者发起一个新的聊天,将对话双方的聊天记录给Assistant,要求其从对话中获取信息摘要。

Coding

编码阶段有三个预定义的角色:CTO、programmer和art designer。聊天链将编码阶段分解为顺序的原子聊天任务,例如生成完整的代码(CTO和程序员)和设计图形用户界面(设计师和程序员)。
编程环节包括两个基本步骤:后端写代码,和前端设计交互界面。编程环节最大的难点就是如何避免模型幻觉,最大正度保证代码的正确性,以及在多轮对话中如何进行复杂长代码的编写和修改。
代码编写步骤的核心指令如下,CTO智能体给程序员智能体的指令是:以面向对象的编程语言python为基础,先给出核心类和方法。程序员智能体会按照指令以markdown为语法进行代码和注释的编写。之后代码编写环节会循环执行N次多轮对话,不断对代码进行更新优化。
image.png

Code Management

为了处理复杂的软件系统,ChatDev使用面向对象的编程语言。ChatDev引入了“版本演化”机制来限制角色之间对最新代码版本的可见性,而从内存流中丢弃较早的代码版本,版本逐步进化消除了代码幻觉。

Thought Instruction

image.png
传统的回答问题可能导致不准确或不相关的信息,特别是在代码生成中,天真的指令可能导致意想不到的幻觉。在生成代码时,这个问题变得尤为严重。为了解决这个问题,提出了一种“思维指导”的机制,灵感来源于“思维链提示”。这种机制包括在指令中明确地解决特定的问题解决思想。(如交换角色,询问哪些没有实现,然后切换回来让其更精确的执行)

Testing

测试阶段分为三个角色:Programmer、Reviewer和Tester。该过程由顺序的原子聊天任务组成,包括同行评审(程序员和评审员)和系统测试(程序员和测试员)。
在实践中,观察到允许两个代理仅根据来自解释器的反馈消息进行通信并不能得到一个无bug的系统。程序员的修改可能不会严格遵循反馈,从而导致幻觉。为了解决这个问题,还是采用了Thought Instruction机制,不过这种是迭代进行,直到其认为潜在的错误已经被消除了,系统能够成功运行。(本质上是黑盒测试)

Documenting

image.png
文档编写阶段分为三个角色:CEO、CPO、CTO和Programmer。
CTO指示Programmer为环境依赖项提供配置说明,从而产生一个类似requirements.txt的文档。本文档支持用户独立配置环境。同时,CEO向CPO传达需求和系统设计,CPO生成用户手册。

Experiments

Setup

  • 使用“gpt3.5-turbo-16k”,temperature设置为0.2
  • 在编码阶段,最多允许5次代码完成尝试,评审者被允许5次聊天提出修改。
  • 对于基于Python的系统,使用Python 3.8.16作为测试的解释器

Dataset

Camel组织了一个指令跟随对话数据集,它跨越了20种编程语言、50个领域和每个领域50个任务。从这个广泛的任务集中,随机选择了70个任务,包括具体的和相对抽象的案例。

Main Results

image.png

  • #Code Files:代码文件夹数量
  • #Asset Files:外部文件数量
  • #Document Files:生成文档数量
  • #Lines of Source Codes:生成源代码行数
  • #Lines of Dependencies:环境依赖数(外部软件组件)
  • #Lines of User Manual:软件用户手册行数
  • #Version Updates:版本迭代次数
  • #Software Re-development:开发周期

Duration Analysis

image.png
平均耗时为409.84秒,最长耗时为1030秒。

Dialogue Statistics

image.png
ChatDev开发一个软件需要36,902.23个提示token,11,567.37个完成token,以及总共48,469.60个token。软件生产的平均总成本大约是0.15693美元,平均每款软件的设计师成本为0.1398美元,而每款软件平均包含8.74个图形创作。因此,CHATDEV的平均软件开发成本为0.2967美元。

Reviewer-Programmer Dialogue Analysis

image.png

在代码审查期间,Reviewer和Programmer交流中最经常讨论的问题是“未实现的方法”(34.85%)。这种挑战通常出现在复杂模型的代码生成中,核心功能通常会接收占位符标签(如Python中的“pass”)以进一步完成。此外,对话框经常讨论“未导入的模块”的主题(19.70%)。这个问题源于代码生成的本质,生成的代码往往会忽略次要的细节。然而,在代码生成的上下文中,确保代码的可执行性变得至关重要。幸运的是,本文提出的thought instruction机制通过迫使Reviewer识别不完整的方法并要求Programmer填充它们,有效地解决了这些问题。这种机制可以应用于其他场景,在这些场景中,任务是基于大型模型完成的,但缺少某些部分。有趣的是,Reviewer还强调了代码健壮性的重要性。他们强调了将来处理潜在异常时的注意事项,并提供了避免重复类别的提示(3.03%)。此外,Reviewer还提供了关于代码中未使用类的建议(1.52%),识别无限循环(1.52%),并强调适当的环境初始化的必要性(1.52%)。

Tester-Programmer Dialogue Analysis

image.png

Tester和Programmer之间最常见的调试问题是“模块未找到”(45.76%),占了将近一半的情况。这反映了该模型忽略非常细微细节的倾向,尽管它们很简单。幸运的是,通过本文提出的thought instruction机制,通常可以通过导入所需的类或方法轻松解决此类错误。第二常见的错误类型是“属性错误”和“未知选项”,各占15.25%。“attribute error”是类属性使用错误,“unknown option”是方法调用参数错误。另一种常见的错误类型是“import error”,它类似于“未找到模块”,主要是由import语句中的错误引起的,比如导入了错误的类或使用了错误的导入路径。除了这些常见的错误类型外,ChatDev还能够检测相对罕见的错误类型,比如初始化不正确的GUI(5.08%)、错误的方法调用(1.69%)、缺少文件依赖关系(1.69%)、未使用的模块(1.69%)、装饰器语法错误(1.69%)等等。

Case Study

Gomoku

image.png
如果人类用户不满意art designer创建的图像,他们可以灵活地在ChatDev完成软件后手动替换原始图像。

image.png
The example of making programming language choices in designing.

Conclusion

Problems

  • 即使将大模型的temperature设置为很低的值,仍然存在内部的随机性,所以这项技术比较适合开放和创造性的软件生产场景。
  • 有些生成的软件无法满足用户需求,可能是因为不清楚用户的需求和文本或代码固有的随机性。
  • 直接生成的图像可能不总是在逐渐增强GUI的美观性,过多的复杂性还可能影响用户体验。
  • 大型语言模型可能会显示出固有的偏见,导致生成的代码模式不一定与真正的程序员解决问题的思路一致。此外,生成的软件目前缺乏对敏感文件操作的恶意意图识别。
  • 这项研究可能会对初级程序员来说有帮助,但对于复杂或大规模的软件,存在非常大的挑战性。

ChatDev利用LLMs来促进软件开发过程中涉及的多个角色之间的有效通信和协作。通过使用聊天链将开发过程分解为顺序的原子子任务,其支持细粒度焦点,并促进每个子任务的期望输出。此外,Thought Instruction机制通过在代码完成、检查和测试期间指导程序员进行特定的代码修改,减轻了与代码幻觉相关的挑战。

Practice

Quick Start

  1. clone code
git clone https://github.com/OpenBMB/ChatDev.git
项目结构:
├── CompanyConfig # Configuration Files for ChatDev, including ChatChain, Phase and Role config json.
├── WareHouse # Folder for generated software
├── camel # Camel RolePlay component
├── chatdev # ChatDev core code
├── misc # assets of example and demo
├── online_log # Demo Folder
├── run.py # Entry of ChatDev
├── requirements.txt
├── README.md
└── wiki.md
  1. set up environment
conda create --name chatdev_env python=3.9 -y -i https://pypi.tuna.tsinghua.edu.cn/simple
conda activate ChatDev_conda_env

cd ChatDev
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. set openAI API Key
# macos or linux
export OPENAI_API_KEY="your_OpenAI_API_key"
# windows
$env:OPENAI_API_KEY="your_OpenAI_API_key"
  1. build software
# macos or linux
python3 run.py --task "[description_of_your_idea]" --name "[project_name]"
# windows
python run.py --task "[description_of_your_idea]" --name "[project_name]"

all params

usage: run.py [-h] [--config CONFIG] [--org ORG] [--task TASK] [--name NAME] [--model MODEL]

argparse

optional arguments:
  -h, --help       show this help message and exit
  --config CONFIG  Name of config, which is used to load configuration under CompanyConfig/; Please see CompanyConfig Section below
  --org ORG        Name of organization, your software will be generated in WareHouse/name_org_timestamp
  --task TASK      Prompt of your idea
  --name NAME      Name of software, your software will be generated in WareHouse/name_org_timestamp
  --model MODEL    GPT Model, choose from {'GPT_3_5_TURBO','GPT_4','GPT_4_32K'}
  1. run software
# macos or linux
cd WareHouse/project_name_DefaultOrganization_timestamp
python3 main.py
# windows
python run.py --task "[description_of_your_idea]" --name "[project_name]"

所有生成的软件都在WareHouse/NAME_ORG_timestamp下:
image.png

目录结构:
├── 20230822165503.log # log file
├── ChatChainConfig.json # Configuration
├── PhaseConfig.json # Configuration
├── RoleConfig.json # Configuration
├── todo.prompt # User query prompt
├── meta.txt # Software building meta information
├── main.py # Generated Software Files
├── manual.md # Generated Software Files
├── todo_app.py # Generated Software Files
├── task.py # Generated Software Files
└── requirements.txt # Generated Software Files

Multi-Agent

目前LLM应用上主要分为三个方面:

  • 直接回复用户的问题(主要使用的是模型的“内部知识”)
  • 通过外部知识库或搜索引擎结果来结合上下文去进行回复(主要使用的是模型分析总结的能力)
  • 让模型作为一个智能体,结合Prompt以及外部工具或多个智能体交互来完成特定任务

第三种Agent现如今非常火,是目前LLM应用上的一个重要方向。其本质是通过结合大量预定义的Prompt(角色扮演、职责之类的)以及指导式的Prompt(流程控制,协作之类的)来完成多个智能体的交互,以及结合外部工具来完成各种复杂的任务。

大部分Agent项目的共同点:

  • CoT Prompt:思维链Prompt,对任务进行拆分。
  • Self-Reflection:自反思机制,比如ChatDev的自反思机制,在智能体对话双方达成一致的时候,正常情况下会触发“通信协议”,然后进行终止对话,而其自反思机制会介入第三方,让第三方智能体去提出进行总结的问题,将这个问题还有两个智能体的对话历史记录交给Assistant这个智能体去回答总结之后的决策。(这一做法能够有效的让Assistant反思整个对话流程所产生的结论)
  • Memory Stream:记忆可以看成“长期记忆”以及“短期记忆”,可以把Prompt里的内容看成“短期记忆”,“长期记忆”就是那些外部存储的对话记录。(由于LLM输入信息有长度限制,当聊天进行比较久的时候,模型容易遗忘之前对话的内容,所以需要将对话内容进行外部存储。获取长期记忆的方法最常见的有“语义搜索”,通过embedding模型,对所有的对话信息进行向量化,之后进行交互的时候同样将其进行向量化,然后通过相似度匹配来获取最相似的“记忆”文本)
  • Divide and Conquer:将大任务拆分成多个原子子任务,就像ChatDev将任务流程化,每个流程又有多个原子任务;这种做法可以让模型更好的完成任务。

Agent在其他方向的应用:

  • Behaviour simulation(行为模型)

Generative agents: Interactive simulacra of human behavior(利用沙盒环境创建多个生成代理来模拟可信的人类行为)
Recagent: A novel simulation paradigm for recommender systems(使用多个代理来模拟推荐场景下用户的行为)

  • Data construction(数据构建)

Multi-party chat: Conversational agents in group settings with humans and models(通过分配不同角色的agent来收集和评估多方对话)
CAMEL: communicative agents for “mind” exploration of large scale language model
society(提出了一个角色扮演框架,利用代理为复杂任务生成多样化和详细的指令)

  • Performance improvement(性能提升)

In-context impersonation reveals large language models’ strengths and biases(发现让agent承担不同的角色可以提高其性能)
Improving factuality and reasoning in language models through multiagent debate(通过利用多agent体辩论提高了事实正确性和推理准确性)
Encouraging divergent thinking in large language models through multi-agent debate(利用多agent相互辩论来解决自我反省中的思维退化问题)

更多的Agent Paper:https://github.com/zjunlp/LLMAgentPapers

开源多智能体项目:

  • AutoGPT:比较早期的一个项目
  • Generative Agents:斯坦福小镇
  • AgentSims:国内开源的类似斯坦福小镇(在类似ChatGPT的LLM在社区流行之后,如何评估大语言模型(LLM)的能力是一个悬而未决的问题。现有的评估方法存在以下缺点:(1)评估能力有限;(2)基准脆弱;(3)指标不客观。我们建议基于任务的评估,即LLM代理在模拟环境中完成任务,是解决上述问题的一劳永逸的解决方案)
  • MetaGPT:类似ChatDev的软件开发多智能体框架
  • CAMEL:任务导向型,沟通式多智能体协同框架,ChatDev的基础

引用

Github ChatDev Readme
解密Prompt系列18. LLM Agent之只有智能体的世界 - 风雨中的小七 - 博客园
GitHub - DSXiangLi/DecryptPrompt: 总结Prompt&LLM论文,开源数据&模型,AIGC应用
AutoGPT与LLM Agent解析
大模型应用的另一范式:大模型智能体

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

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

相关文章

HTML_CSS学习:表格、表单、框架标签

一、表格_跨行与跨列 1.相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格_跨行与跨列</title> </head> <body><table border"1" cellspacing"0&qu…

(一)基于IDEA的JAVA基础4

注释文本&#xff0c;注释模版 单行注释://开头放在代码前面&#xff0c;对少部分。 多行注释:快捷方式ctrlshift/,对段落代码注 释。 文档注释:/**……**/&#xff0c;用于声明作者或创作时 间。 文档注释如何设置&#xff0c;首先找到File中…

【前端Vue】Vue3+Pinia小兔鲜电商项目第2篇:什么是pinia,1. 创建空Vue项目【附代码文档】

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 全套教程部分目录&#xff1a; 部分文件图片&#xff1a; 什么是pinia Pinia 是 Vue 的专属状态管理库&#xff0c;可以实现跨组件或页面共享状态&#xff0c;是…

html5cssjs代码 033 SVG元素示例

html5&css&js代码 033 SVG元素示例 一、代码二、解释 一个SVG图形&#xff0c;该图形由一个椭圆、一个圆形和一个矩形组成。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><title>编程笔记 html5&css&js SVG元素示例…

公司系统中了.rmallox勒索病毒如何恢复数据?

早晨上班时刻&#xff1a; 当阳光逐渐洒满大地&#xff0c;城市的喧嚣开始涌动&#xff0c;某公司的员工们纷纷踏入办公大楼&#xff0c;准备开始新的一天的工作。他们像往常一样打开电脑&#xff0c;准备接收邮件、查看日程、浏览项目进展。 病毒悄然发作&#xff1a; 就在员…

Databend x CubeFS:面向未来的企业级云原生数据存储与分析

用场景的丰富&#xff0c;企业面临着前所未有的数据存储挑战。大规模数据存储变得日常化&#xff0c;伴随着超大容量和快速变化的I/O需求&#xff0c;传统的存储解决方案已经难以满足企业对弹性、运维效率及总体拥有成本&#xff08;TCO&#xff09;的更高要求。这些挑战促使基…

三角形重心坐标插值法 Interpolation Across Triangles: Barycentric Coordinates

本专栏内容整理了GAMES101的计算机图形学课程的主要内容&#xff0c;作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误&#xff0c;或有其他建议&#xff0c;欢迎大家指出。 附上GAMES101计算机图形学课程&#xff1a;GAMES101: 现代计算机图形学入门正在上传…

Django日志(二)

一、Handler Handler决定如何处理logger中的每条消息。它表示一个特定的日志行为,例如 将消息写入屏幕、文件或网络Socket handler对应的是个字典,每一个键都是一个handler的名字,每个值又一个字典,描述了如何配置对应的handler实例 2.1、内置Handler class(必需):处理…

【每日八股】Java基础经典面试题4

前言&#xff1a;哈喽大家好&#xff0c;我是黑洞晓威&#xff0c;25届毕业生&#xff0c;正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结&#x1f970;。 本篇文章记录的Java基础面试题&#xff0c;如果你也在复习的话不妨…

Scikit-Learn逻辑回归(二)

Scikit-Learn逻辑回归二&#xff1a;多项式与正则化 1、多项式回归回顾1.1、逻辑回归为什么要使用多项式1.2、多项式回归及原理 2、逻辑回归与多项式 1、多项式回归回顾 本文接上篇&#xff1a;Scikit-Learn逻辑回归(一) 上篇中&#xff0c;我们详细介绍了逻辑回归的概念、原理…

第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV

卢俊义在水里被张顺抓住&#xff0c;用轿子抬到了梁山。宋江等人下马跪在地上迎接&#xff0c;请他坐第一把交椅。卢俊义宁死不从&#xff0c;大家只好说留他在山寨几天&#xff0c;先让李固带着马车货物回去。吴用对李固说&#xff0c;你的主人已经答应坐第二把交椅了&#xf…

matlab实现Logistic回归

一、目的和要求 1.编程实现Logistic Regression并应用于数据集&#xff1b; 2.绘制二元分类函数、sigmoid函数和代价函数&#xff1b; 3.正则化logistic回归代价。 二、算法介绍 步骤&#xff1a; 选择一个合适的分类函数来实现分类&#xff08;Sigmoid函数&#xff09; …

OpenHarmony开发之图形UI组件解析

简介 图形UI组件实现了一套系统级的图形引擎。 该组件为应用开发提供UIKit接口&#xff0c;包括了动画、布局、图形转换、事件处理&#xff0c;以及丰富的UI组件。 组件内部直接调用HAL接口&#xff0c;或者使用WMS(Window Manager Service)提供的客户端与硬件交互&#xff…

[flask] flask的基本介绍、flask快速搭建项目并运行

笔记 Flask Flask 本身相当于一个内核&#xff0c;其他几乎所有的功能都要用到扩展&#xff08;邮件扩展Flask-Mail&#xff0c;用户认证Flask-Login&#xff0c;数据库Flask-SQLAlchemy&#xff09;&#xff0c;都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、…

哪些企业适合构建企业新媒体矩阵?

⭐关注矩阵通服务号&#xff0c;探索企业新媒体矩阵搭建与营销策略 新媒体矩阵就是在某个平台或多个平台开设、联动多个账号&#xff0c;组建有关系的不同账号集群。 在数字化转型的浪潮下&#xff0c;矩阵已然成为企业实现品牌塑造、市场开拓与用户互动的重要阵地。 然而&…

算法沉淀——贪心算法六(leetcode真题剖析)

算法沉淀——贪心算法六 01.坏了的计算器02.合并区间03.无重叠区间04.用最少数量的箭引爆气球 01.坏了的计算器 题目链接&#xff1a;https://leetcode.cn/problems/broken-calculator/ 在显示着数字 startValue 的坏计算器上&#xff0c;我们可以执行以下两种操作&#xff1…

FPGA 实现CRC-8/ROHC(已验证)

1 FPGA crc代码在线生成工具 工具1 // vim: ts=4 sw=4 expandtab// THIS IS GENERATED VERILOG CODE. // https://bues.ch/h/crcgen // // This code is Public Domain. // Permission to use, copy, modify, and/or distribute this software for any // purpose with or wi…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能&#xff0c;我们通常会通过应用系统采集用户的个人简历信息…

网络通信——IP地址、端口号、协议(TCP、UDP)

通信架构 网络通信三要素 IP地址 IPv4地址 IPv6地址 IP域名 IP常识 端口号 概念 协议 开放式网络互联标准&#xff1a;OSI、TCP/IP 传输层的2个通信协议——UDP、TCP TCP协议&#xff1a;三次握手建立建立可靠连接 进行三次握手的原因&#xff1a;为了确保客户端和服务端…

jsp学习

1.新建文件&#xff0c;创建web动态项目 2.项目点击next两下&#xff0c;点击勾选gentear&#xff0c;点击finish 3.文件成功后是有jsp文件 4.在webapp新建jsp文件 5. 使用模板html5建立文件 <% page language"java" contentType"text/html; charsetUTF-8&qu…