【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录

  • 前言
  • 一、智能体
    • 1-1、Agent概述
    • 1-2、Agent与ChatGPT的区别
  • 二、多智能体框架MetaGPT
    • 2-1、安装&配置
    • 2-2、使用已有的Agent(ProductManager)
    • 2-3、多智能体系统介绍
    • 2-4、多智能体案例分析
      • 2-4-1、构建智能体团队
      • 2-4-2、动作/行为 定义
      • 2-4-3、角色/智能体 定义
      • 2-4-4、创建队伍,添加角色
      • 2-4-5、内部机制介绍
      • 2-4-6、人工介入
      • 2-4-7、记忆/内存
  • 附录
    • 1、react_mode(智能体的思维范式介绍)
      • 1-1、ReAct
      • 1-2、By order
      • 1-3、Plan and act
  • 总结


前言

用公式来讲,智能体=大语言模型LLM+观察+思考+行动+记忆

一、智能体

1-1、Agent概述

Agent(智能体): 具有一定自主性和目标导向性,可以在没有持续人类干预的情况下执行任务和作出决策。以下为Agent的一些特性:

(1)自主性和目标导向性

  • 自主性:Agent具备自主执行任务的能力,不需要外部指令即可根据设定的目标进行操作。
  • 目标导向性:Agent设置并追求特定的目标或任务,这些目标指导其决策过程和行为模式。

(2)复杂的工作流程

  • 任务规划与执行:Agent能够规划如何达到其目标,包括任务分解、优先级排序以及实际执行。
  • 自我对话和内部决策:在处理问题时,Agent可以进行内部对话,以自我推理和修正其行动路径,而无需外部输入。

(3)学习和适应能力

  • 反思和完善:Agent能从自身的经验中学习,评估过去的行为,从错误中吸取教训,并改进未来的策略。
  • 环境适应性:在遇到变化的环境或不同的挑战时,Agent能够适应并调整其行为以最大化目标达成。

(4)记忆机制

  • 短期记忆:使用上下文信息来做出即时决策。
  • 长期记忆:保留关键信息,供未来决策使用,通常通过外部数据库或持久存储实现。(例如使用向量数据库)

(5)工具使用与集成

  • API调用和外部数据访问:Agent可以利用外部资源(如API、数据库)来获取信息,填补其知识空白,或执行无法直接通过模型内部处理的任务。
  • 技术整合:Agent能整合多种技术和服务,如代码执行能力和专业数据库访问,以丰富其功能和提高效率。

LLM 驱动的自主Agents系统概述如下图所示:(包含工具调用、记忆、计划、执行模块)
在这里插入图片描述

1-2、Agent与ChatGPT的区别

Agent与ChatGPT的区别: Agent与ChatGPT在设计、功能和目标上有一些关键区别。虽然它们都是基于人工智能技术,但应用方式和交互性质大不相同。下面是这两者的主要区别:

(1)目标和自主性

  • ChatGPT:主要是一个响应型模型,专注于对用户的特定输入生成一次性、相关且连贯的回答。它的主要目的是解答问题、提供信息或进行对话模拟。
  • AI Agent:更强调在持续的任务中表现出自主性。它能够设定和追求长期目标,通过复杂的工作流程自主地完成任务,比如从错误中自我修正、连续地追踪任务进展等。

(2) 交互方式

  • ChatGPT:用户与ChatGPT的交互通常是线性的和短暂的,即用户提问,ChatGPT回答。它不保留交互的历史记忆,每次交互都是独立的。
  • AI Agent:可以维持跨会话的状态和记忆,具有维持长期对话的能力,能够自动执行任务并处理一系列相关活动,例如调用API、追踪和更新状态等。

(3)任务执行和规划能力

  • ChatGPT:通常只处理单个请求或任务,依赖用户输入来驱动对话。它不具备自我规划或执行连续任务的能力。
  • AI Agent:具备规划能力,可以自行决定执行哪些步骤以完成复杂任务。它可以处理任务序列,自动化决策和执行过程。

(4)技术整合与应用

  • ChatGPT:主要是文本生成工具,虽然能够通过插件访问外部信息,但核心依然是文本处理和生成。
  • AI Agent:可能整合多种技术和工具,如API调用、数据库访问、代码执行等,这些都是为了实现其目标和改善任务执行的效率。

(5)学习和适应

  • ChatGPT:它的训练是在离线进行,通过分析大量数据来改进。
  • AI Agent:除了离线学习,更复杂的AI Agent可能具备实时学习能力,能够从新的经验中迅速适应和改进,这通常需要一定的记忆和自我反思机制。

二、多智能体框架MetaGPT

在这里插入图片描述

2-1、安装&配置

安装: 必须要python版本在3.9以上 ,这里使用conda,尝鲜安装。

conda create -n metagpt python=3.9 && conda activate metagpt

开发模式下安装: 为开发人员推荐。实现新想法和定制化功能。

git clone https://github.com/geekan/MetaGPT.git
cd ./MetaGPT
pip install -e .

模型配置: 在文件 ~/.metagpt/config2.yaml下,有关于各大厂商模型的配置详细列表参考:LLM API Configuration

llm:
  api_type: "openai"  # or azure / ollama / groq etc. Check LLMType for more options
  model: "gpt-4-turbo"  # or gpt-3.5-turbo
  base_url: "https://api.openai.com/v1"  # or forward url / other llm url
  api_key: "YOUR_API_KEY"

2-2、使用已有的Agent(ProductManager)

概述: 调用ProductManager Agent,注意,会话上下文是需要独立创建的

import asyncio

from metagpt.context import Context
from metagpt.roles.product_manager import ProductManager
from metagpt.logs import logger

async def main():
    msg = "Write a PRD for a snake game"
    context = Context()  # The session Context object is explicitly created, and the Role object implicitly shares it automatically with its own Action object
    role = ProductManager(context=context)
    while msg:
        msg = await role.run(msg)
        logger.info(str(msg))

if __name__ == '__main__':
    asyncio.run(main())

输出结果:
在这里插入图片描述

2-3、多智能体系统介绍

多智能体系统: 即智能体社会,用公式表示为:

MultiAgent = 智能体 + 环境 + 标准化的操作程序(SOP)+ 通信 +经济

各个部分的详细介绍:

  • Agent:每个智能体都可能有独特的LLM、观察、思想、行动和记忆,在多智能体系统中,各个智能体协同工作,就像人类社会一样。
  • 环境: 环境是各个Agent交互的共同空间,Agent从环境中观察与自身有关的重要信息,并执行相应的操作。
  • 标准化操作程序(Standardized operating procedure): 即设置好的程序,用来管理智能体的行为以及智能体间的交互,确保系统的有序、高效进行。
  • 通讯:通讯,即Agent之间的信息交换。
  • 经济:指的是多智能体环境中的价值交换系统,决定了资源如何分配和任务的优先级。

简单示例:

在这里插入图片描述

具体介绍如下:

  • 在该环境下,三个智能体Alice、Bob、Charlie彼此交互。
  • 每个智能体都可以把信息或者是行为结果输出到环境中。
  • 以Agent——Charlie的内部进程为例(其他Agent类似),基于LLM,即决策🧠,并且拥有观察、思考、行动能力。思想和其进一步的行动主要是由LLM决策的,并且同时拥有使用工具的能力。
  • 智能体Charlie通过观察Alice智能体的相关文档以及Bob智能体的代码需求,参考上下文记忆,思考如何编写代码并采取行动,最终行动输出代码文件。
  • 智能体Charlie的输出结果刚好是智能体Bob观察的对象,智能体Bob在环境中得到了Charlie的输出结果,并且做出了进一步的响应。

2-4、多智能体案例分析

概述: 虽然单智能体可以解决很多任务,但是复杂的任务还是需要多智能体之间的协作。

2-4-1、构建智能体团队

构建智能体团队的步骤如下:

  • 定义每个能执行特定动作的角色
  • 标准化操作程序,即SOP的构建,确保每个角色遵守程序。实现过程:让每个角色观察自己的上游输出,根据上游输出做出相应的响应,并且输出内容到下游。
  • 初始化所有智能体,创建一个带有环境的队伍,让他们能够互相交互。(主要是根据上游角色发布到环境中的消息来做出响应。)

具体的智能体以及对应的行为定义如下:

  • 角色:SimpleCoder, 动作:SimpleWriteCode,接收用户指令并且写出主要代码
  • 角色:SimpleTester , 动作:SimpleWriteTest,从动作/行为SimpleWriteCode的输出中获取主要的代码并且提供测试用例。
  • 角色:SimpleReviewer , 动作:SimpleWriteReview,从动作/行为SimpleWriteTest 的输出中获取测试用例,检查测试用例的覆盖程度以及质量,输出报告。

2-4-2、动作/行为 定义

写代码行为如下:

from metagpt.actions import Action

class SimpleWriteCode(Action):
    PROMPT_TEMPLATE: str = """
    Write a python function that can {instruction}.
    Return ```python your_code_here ```with NO other texts,
    your code:
    """
    name: str = "SimpleWriteCode"

    async def run(self, instruction: str):
        prompt = self.PROMPT_TEMPLATE.format(instruction=instruction)

        rsp = await self._aask(prompt)

        code_text = parse_code(rsp)

        return code_text

测试用例代码书写行为如下:

class SimpleWriteTest(Action):
    PROMPT_TEMPLATE: str = """
    Context: {context}
    Write {k} unit tests using pytest for the given function, assuming you have imported it.
    Return ```python your_code_here ```with NO other texts,
    your code:
    """

    name: str = "SimpleWriteTest"

    async def run(self, context: str, k: int = 3):
        prompt = self.PROMPT_TEMPLATE.format(context=context, k=k)

        rsp = await self._aask(prompt)

        code_text = parse_code(rsp)

        return code_text

测试用例评审行为如下:

class SimpleWriteReview(Action):
    PROMPT_TEMPLATE: str = """
    Context: {context}
    Review the test cases and provide one critical comments:
    """

    name: str = "SimpleWriteReview"

    async def run(self, context: str):
        prompt = self.PROMPT_TEMPLATE.format(context=context)

        rsp = await self._aask(prompt)

        return rsp

2-4-3、角色/智能体 定义

写代码角色定义:

  • 使用set_actions函数,为角色装配行为。
  • 使用_watch函数,观察上游重要信息(来自于用户或者是其他智能体),这里UserRequirement代表的是用户输入
class SimpleCoder(Role):
    name: str = "Alice"
    profile: str = "SimpleCoder"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self._watch([UserRequirement])
        self.set_actions([SimpleWriteCode])

代码测试角色定义:

  • 同样的, 使用set_actions函数,为角色装配行为。
  • 同理,使用_watch函数,观察上游重要信息(来自于用户或者是其他智能体),这里主要的观察来源是SimpleWriteCode。
  • 这里,重写act函数,使用所有对话内容作为测试行为的上下文,写出更加精准的测试用例。
class SimpleTester(Role):
    name: str = "Bob"
    profile: str = "SimpleTester"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_actions([SimpleWriteTest])
        self._watch([SimpleWriteCode])
        # 既观察SimpleWriteCode,也观察SimpleWriteReview,这样可以做到一个循环的自我修正。
        # self._watch([SimpleWriteCode, SimpleWriteReview])  # feel free to try this too

    async def _act(self) -> Message:
        logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")
        todo = self.rc.todo

        # context = self.get_memories(k=1)[0].content # use the most recent memory as context
        context = self.get_memories()  # use all memories as context

        code_text = await todo.run(context, k=5)  # specify arguments
        msg = Message(content=code_text, role=self.profile, cause_by=type(todo))
		
        return msg

测试用例评审角色定义: 同上。

class SimpleReviewer(Role):
    name: str = "Charlie"
    profile: str = "SimpleReviewer"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_actions([SimpleWriteReview])
        self._watch([SimpleWriteTest])

2-4-4、创建队伍,添加角色

概述: 使用Team来雇佣三位角色

  • idea: 即复杂任务描述,代表用户输入
  • investment: 投资人工智能公司的金额,暂时不清楚有什么用
  • n_round: 模拟的回合数,大部分情况,该数字越大越好,但是也并不是绝对的,简单任务,回合少点就ok,复杂任务需要调试一个相对均衡的回合。多了有可能复读机或者性能下降。
import asyncio
import typer
from metagpt.logs import logger
from metagpt.team import Team
app = typer.Typer()

@app.command()
def main(
    idea: str = typer.Argument(..., help="write a function that calculates the product of a list"),
    investment: float = typer.Option(default=3.0, help="Dollar amount to invest in the AI company."),
    n_round: int = typer.Option(default=5, help="Number of rounds for the simulation."),
):
    logger.info(idea)

    team = Team()
    team.hire(
        [
            SimpleCoder(),
            SimpleTester(),
            SimpleReviewer(),
        ]
    )

    team.invest(investment=investment)
    team.run_project(idea)
    asyncio.run(team.run(n_round=n_round))

if __name__ == '__main__':
    app()

输出:

在这里插入图片描述

2-4-5、内部机制介绍

概述: 详细介绍整个多智能体系统的运行机制。

  • 如右图所示,Role(智能体)将观察来自于环境的输出信息。(只观察特定Action,这要看参数设置)
  • 如果一个特定的行为输出了信息到环境,并且恰好是Role要观察的行为,那么Role将做出反馈。
  • 首先,Role将会思考并选择一种行为作为接下来要执行的,之后会执行该行为并且得到输出,输出后续将会被投入到环境中去。

在这里插入图片描述

2-4-6、人工介入

概述: 在真实场景下,我们往往需要人类介入来修正多智能体团队协作中的一些错误。

在2-4-4中,我们设置SimpleReviewer的is_human参数为True即可。这样我们可以控制协作流程,代替测试用例评审角色,作为测试用例评审角色来参与到整个流程中。每次轮到我们响应时(测试用例评审角色),正在运行的进程都会暂停等待我们的输入。我们可以根据其他Agent的输出,提出合理要求以参与到整个交互中。

team.hire(
    [
        SimpleCoder(),
        SimpleTester(),
        # SimpleReviewer(), # the original line
        SimpleReviewer(is_human=True), # change to this line
    ]
)

2-4-7、记忆/内存

概述: 记忆是Agent的核心,Agent需要依靠记忆来做决策。类Memory是Agent记忆的抽象表示,当角色初始化时,以self.rc.memory初始化记忆,它将把它随后观察到的每条消息存储在一个列表中,以便将来检索。当记录的记忆被需要时,你可以使用self.get_memories来获取记忆。

def get_memories(self, k=0) -> list[Message]:
    """A wrapper to return the most recent k memories of this role, return all when k=0"""
    return self.rc.memory.get(k=k)

例如在2-4-3中: 我们调用整个函数是为了向测试智能体提供完整的历史记录。

async def _act(self) -> Message:
        logger.info(f"{self._setting}: ready to {self.rc.todo}")
        todo = self.rc.todo

        # context = self.get_memories(k=1)[0].content # use the most recent memory as context
        context = self.get_memories() # use all memories as context

        code_text = await todo.run(context, k=5) # specify arguments

        msg = Message(content=code_text, role=self.profile, cause_by=todo)

        return msg

添加记忆: 使用self.rc.memory.add(msg)添加记忆,并且msg必须是Message对象。

Notice: 角色通常需要记住它之前说过或做过什么,以便采取下一步行动。所以建议在复写act函数的逻辑时,建议将动作输出的消息添加到角色的内存中。

附录

1、react_mode(智能体的思维范式介绍)

概述: 接收到对环境的观察后,智能体会进行思考以及做出一些行为来应对,MetaGPT目前提供两种方式,即ReAct和By Order。

1-1、ReAct

ReAct: 先思考,后行动,直到Agent决定停止循环。每次思考(_think)时,角色会选择一种行为来回应观察,并且执行选择的行为在_act函数,而行为的输出结果将会是下一次思考的观察对象,LLM作为大脑,动态的选择行为去执行。

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS: ReAct详细介绍可以参考我的另一篇文章:REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS【大模型的协同推理】

在这里插入图片描述

Notice: 如果你想要角色执行更多次思考-行动循环,那么你可以设置参数max_react_loop。实验证明,设置该参数非常有必要,在react的过程中,如果思考-行动循环少,往往会做出错误的决策,即少执行或者错误执行行为

self._set_react_mode(react_mode="react", max_react_loop=6)

1-2、By order

By order: 按照set_actions中设定的行为去依次执行。该情况适用于我们清楚Agent该依次执行哪些行为。

在这里插入图片描述

例如在目录2-4-2的案例中,我们就是顺序执行行为,先写代码,后执行代码。

class RunnableCoder(Role):
    name: str = "Alice"
    profile: str = "RunnableCoder"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_actions([SimpleWriteCode, SimpleRunCode])
        self._set_react_mode(react_mode="by_order")

    async def _act(self) -> Message:
        ...

1-3、Plan and act

先拟定计划,之后使用计划去执行一系列动作:

在这里插入图片描述

参考文章:

《MetaGPT智能体开发入门》教程
Datawhale教程.
MetaGPT—GitHub官网
openAI研究主管文章
awesome-ai-agents——AI agent汇总
MetaGPT智能体入门——官方文档

LLM图形化界面:
川虎 Chat 🐯 Chuanhu Chat
chatgpt-KnowledgeBot


总结

好困好困😩

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

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

相关文章

力扣141环形链表问题|快慢指针算法详细推理,判断链表是否有环|龟兔赛跑算法

做题链接 目录 前言: 一、算法推导: 1.假设有环并且一定会相遇,那么一定是在环内相遇,且是快指针追上慢指针。 2.有环就一定会相遇吗?快指针是每次跳两步,有没有可能把慢指针跳过去? 3.那一定…

算法第十五天:leetcode19.删除链表的倒数第N个节点

一、删除链表的倒数第N个节点的题目描述与链接 19.删除链表的倒数第N个节点的链接如下表所示,您可直接复制下面网址进入力扣学习,在观看下面的内容之前您一定要先做一遍哦,以便让我印象更深刻!!!https://leetcode.cn/p…

学习记录——day16 操作受限的线性表 链式栈

操作受限的线性表 1、在之前的内容,无论是顺序表还是链表,都是详细处理的线性表,既可以在端点处进行操作也 可以在中间位置操作 2、现实生活中,有很多并不需要在中间进行操作的序列,只在端点处进行操…

安宝特方案|解放双手,解决死角,AR带来质量监督新体验

AR质量监督 解放双手,解决死角 在当今制造业快速发展的背景下,质量监督成为确保产品高质量和完善的管理制度的关键环节。然而,传统的质量监督方式存在诸多挑战,如人工操作带来的效率低下、查岗不及时、摄像头死角等问题。 为了解…

wpf中轮询显示图片

本文的需求是,在一个文件夹中,放一堆图片的集合,然后在wpf程序中,按照定时的方式,循序显示照片。 全部代码 1.声明一个PictureInfo类 namespace WpfApp1 {public class PictureInfo{public string? FileName { get; …

OpenAI发布GPT-4 Mini的深度分析及中国大模型的弯道超车机会

引言 在OpenAI封禁中国IP访问其API后,紧接着推出了GPT-4 Mini,这是一个引发广泛关注和讨论的新举措。此举不仅让人们质疑OpenAI的战略方向,更引发了对中国大模型是否能弯道超车的讨论。本文将详细分析GPT-4 Mini的特点、市场影响及中国大模型…

Golang | Leetcode Golang题解之第275题H指数II

题目: 题解: func hIndex(citations []int) int {n : len(citations)return n - sort.Search(n, func(x int) bool { return citations[x] > n-x }) }

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证,后端依然也需要进行验证,以防不合规的数据直接进入服务器,如果不对其进行拦截,严重的甚至会造成系统直接崩溃! 本文结合…

算法学习笔记(8.8)-多重背包

目录 Question: 思路解析: 代码示例 多重背包的优化问题: 1.二进制优化 代码示例: 2.单调队列优化(滑动窗口) 代码示例 Question: 4. 多重背包问题 I - AcWing题库https://www.acwing.com/problem/content/description/4/ 多重背包简单来说其…

嵌入式面试总结

直接I/O——绕过内核缓冲 Linux允许应用程序在执行文件I/O操作时绕过内核缓冲区,从用户空间直接传递数据到文件或磁盘设备。 在调用open()函数时,直接添加O_DIRECT标志。 某些应用程序的作用是测试磁盘设备的读写速率,那么就要保证read等操…

【计算机毕业设计】890社区宠物管理与服务系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码

说明: 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据,将数据通过mediacodec编码输出H264码流(使用ffmpeg播放),存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…

Minos 多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 …

【odoo17 | Owl】前端js钩子调用列表选择视图

概要 在我们选择多对一或者多对多字段的时候,经常看到可以弹出列表弹窗让人一目了然的效果,效果如下: 那么,这种效果是odoo本身封装好的组件,我们在平时的前端界面开发的时候,既不是后端视图的情况下&#…

Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离

1. 前提准备 1.1 主机IP:192.168.186.77 version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1 ports:- "3306:3306&quo…

SearchGPT 搜索引擎发布:让信息检索变得简单

如今的互联网时代,我们每天都在与海量数据搏斗。无论是学习、工作还是生活,我们都需要快速准确地获取所需信息。然而,传统搜索引擎往往让人感到力不从心:关键词需要精准,结果泛滥成灾,有用信息如大海捞针。…

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点: 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题:遇到防火墙就用隧道技术,…

vue elementui 在table里使用el-switch

<el-table-columnprop"operationStatus"label"状态"header-align"center"align"center"><template slot-scope"scope"><el-switch active-value"ENABLE" inactive-value"DISABLE" v-mod…

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述&#xff1a; MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片&#xff0c;能够根据不同的型号配置来实现对XY&#xff0…

Idea2024 创建Meaven项目没有src文件夹

1、直接创建 新建maven项目&#xff0c;发现没有src/main/java 直接新建文件夹&#xff1a;右击项目名->new->Directory 可以看到idea给出了快捷创建文件夹的选项&#xff0c;可以根据需要创建&#xff0c;这里点击src/main/java 回车&#xff0c;可以看到文件夹已经创建…