18|CAMEL:通过角色扮演脑暴一个鲜花营销方案

18|CAMEL:通过角色扮演脑暴一个鲜花营销方案

CAMEL 交流式代理框架

下面我们一起来看看 CAMEL——这个多 AI 通过角色扮演进行交互的框架,以及它在 LangChain 中的具体实现。

img

CAMEL,字面意思是骆驼。这个框架来自于论文《CAMEL: Communicative Agents for “Mind” Exploration of Large Scale Language Model Society》(CAMEL:用于大规模语言模型社会的“心智”探索的交流式代理)。这里面所谓的 CAMEL,实际上来自沟通(也就是交流)代理心智探索以及 LLM 这五个单词的英文首字母。

CAMEL 框架旨在通过角色扮演来促进交流代理之间的自主合作,并为其“认知”过程提供洞察。这种方法涉及使用启示式提示来指导聊天代理完成任务,同时保持与人类意图的一致性。这个框架为研究多代理系统的合作行为和能力提供了一种可扩展的方法。

上面这段介绍里面新名词不少,我们要一个个解释一下。

  • 交流式代理 Communicative Agents,是一种可以与人类或其他代理进行交流的计算机程序。这些代理可以是聊天机器人、智能助手或任何其他需要与人类交流的软件。为了使这些代理能够更好地与人类交流,研究人员一直在寻找方法来提高它们的交流能力。
  • 角色扮演 role-playing,则是这篇论文提出的主要思路,它允许交流代理扮演不同的角色,以更好地与人类或其他代理交流。这意味着代理可以模仿人类的行为,理解人类的意图,并据此做出反应。
  • 启示式提示 inception prompting,是一种指导代理完成任务的方法。通过给代理提供一系列的提示或指示,代理可以更好地理解它应该如何行动。这种方法可以帮助代理更好地与人类交流,并完成与人类的合作任务。

这里的核心创新点是,通过角色扮演和启示式提示的框架来引导代理的交流过程。

股票交易场景设计

论文中还提出了下面的目标场景和角色扮演设置。

img

场景和角色设置

人类用户角色:负责提供要实现的想法,如为股票市场开发一个交易机器人。

人类可能不知道如何实现这个想法,但我们需要指定可能实现这个想法的角色,例如 Python 程序员和股票交易员。

任务指定代理(Task Specifier Agent):负责根据输入的想法为 AI 助手和 AI 用户确定一个具体的任务。因为人类用户的想法可能比较模糊,所以任务指定代理将提供详细描述,以使想法具体化。

描述:开发一个具有情感分析能力的交易机器人,该机器人可以监控社交媒体平台上特定股票的正面或负面评论,并根据情感分析结果执行交易。

这样,就为 AI 助手提供了一个明确的任务来解决。

这里多说一句,之所以引入任务指定代理,是因为对话代理通常需要一个具体的任务提示来实现任务,对于非领域专家来说,创建这样一个具体的任务提示可能是具有挑战性或耗时的。

那么,参与此任务的 AI 角色就包括:

  • 一个以 Python 程序员为身份的 AI 助手代理
  • 一个以股票交易员为身份的 AI 用户代理

接收到初步想法和角色分配后,AI 用户和 AI 助手通过指令跟随的方式互相聊天,他们将通过多轮对话合作完成指定任务,直到 AI 用户确定任务已完成。

其中,AI 用户是任务规划者,负责向 AI 助手发出以完成任务为导向的指令。另一方面,AI 助手是任务执行者,被设计为遵循 AI 用户指令并提供具体的解决方案,在这里他将给出设计股票交易系统的具体 Python 代码。

提示模板设计

在 CAMEL 这个角色扮演框架中,Prompt Engineering 非常关键。与其他对话语言模型技术有所不同,这种提示工程只在角色扮演的初始阶段进行,主要用于明确任务和分配角色。当会话开始后,AI 助手和 AI 用户会自动地相互给出提示,直到对话结束。这种方法被称为 “Inception Prompting”。

Inception Prompting 包括三种类型的提示:任务明确提示、AI 助手提示和 AI 用户提示。在论文中,给出了两个提示模板作为示例。

在论文中,AI Society 和 AI Code 是两种不同的提示模板。这些提示模板被设计用来指导 AI 助手与 AI 用户之间的交互。

AI Society:这个提示模板主要关注 AI 助手在多种不同角色中的表现。例如,AI 助手可能扮演会计师、演员、设计师、医生、工程师等多种角色,而用户也可能有各种不同的角色,如博主、厨师、游戏玩家、音乐家等。这种设置是为了研究 AI 助手如何与不同角色的用户合作以完成各种任务。

AI Code:这个提示模板主要关注与编程相关的任务。它涉及到多种编程语言,如 Java、Python、JavaScript 等,以及多个领域,如会计、农业、生物学等。这种设置是为了研究 AI 助手如何在特定的编程语言和领域中帮助用户完成任务。

img

AI Society(社会)场景的提示模板

img

AI Code(编码)场景的提示模板

以 AI Society 为例,这个提示模板是为 AI 助手系统和 AI 用户系统设计的,它在角色扮演的开始时就给出了初始提示。以下是对这个模板的详细解释。

img

这个提示模板为 AI 助手和 AI 用户提供了一个明确的框架,确保它们在对话中的行为是有序、一致和有效的。可以看出,与之前传统的提示设计不同,这种提示的设计更加复杂和细致,更像是一种交互协议或规范。这种设计在一定程度上提高了 AI 与 AI 之间自主合作的能力,并能更好地模拟人类之间的交互过程。

易速鲜花营销方案

好,看完了论文的思路和论文中给出的示例,我们就要开始以“易速鲜花”为背景进行自己的 CAMEL 实战了。

准备工作

先导入 API 密钥和所需要的库。

# 设置OpenAI API密钥
import os
os.environ["OPENAI_API_KEY"] = 'Your Key'

# 导入所需的库
from typing import List
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage,
    BaseMessage,
)

定义 CAMELAgent 类

下面,定义 CAMELAgent 类。这是一个核心类,用于管理与语言模型的交互。它包含了初始化消息、更新消息和与模型进行交互的方法。

# 定义CAMELAgent类,用于管理与语言模型的交互
class CAMELAgent:
    def __init__(
        self,
        system_message: SystemMessage,
        model: ChatOpenAI,
    ) -> None:
        self.system_message = system_message
        self.model = model
        self.init_messages()

    def reset(self) -> None:
        """重置对话消息"""
        self.init_messages()
        return self.stored_messages

    def init_messages(self) -> None:
        """初始化对话消息"""
        self.stored_messages = [self.system_message]

    def update_messages(self, message: BaseMessage) -> List[BaseMessage]:
        """更新对话消息列表"""
        self.stored_messages.append(message)
        return self.stored_messages

    def step(self, input_message: HumanMessage) -> AIMessage:
        """进行一步交互,并获取模型的响应"""
        messages = self.update_messages(input_message)

        output_message = self.model(messages)
        self.update_messages(output_message)

        return output_message

预设角色和任务提示

预设的角色和任务提示,这部分定义了 AI 助手和用户的角色名称、任务描述以及每次讨论的字数限制。

# 设置一些预设的角色和任务提示
assistant_role_name = "花店营销专员"
user_role_name = "花店老板"
task = "整理出一个夏季玫瑰之夜的营销活动的策略"
word_limit = 50  # 每次讨论的字数限制

这里,assistant_role_name 和 user_role_name 是用来定义代理的角色。这两个角色在后续的对话中扮演着不同的功能,具体设定如下。

  • assistant_role_name = “花店营销专员”:这是定义助手的角色。在此设定中,助手被视为一名花店营销专员,主要职责是为花店老板(即用户)提供关于营销活动的建议和策略。
  • user_role_name = “花店老板”:这是定义用户的角色。用户在这里是花店的老板,他们可能会向营销专员(即助手)提出关于花店推广活动的需求或询问,然后由营销专员来答复和提供建议。

这种角色设定,主要是为了模拟现实中的交互场景,使得聊天代理能够更好地理解任务,并为实现这些任务提供有效的解决方案。通过为每个聊天代理设定一个特定的角色,可以使聊天的过程更加有目的性和效率,同时也能提供更为真实的人类对话体验。

任务指定代理

然后,使用任务指定代理(Task Specifier)来明确任务描述。这是 CAMEL 框架的一个关键步骤,它确保了任务描述的具体性和清晰性。

# 定义与指定任务相关的系统提示
task_specifier_sys_msg = SystemMessage(content="你可以让任务更具体。")
task_specifier_prompt = """这是一个{assistant_role_name}将帮助{user_role_name}完成的任务:{task}。
请使其更具体化。请发挥你的创意和想象力。
请用{word_limit}个或更少的词回复具体的任务。不要添加其他任何内容。"""

task_specifier_template = HumanMessagePromptTemplate.from_template(
    template=task_specifier_prompt
)
task_specify_agent = CAMELAgent(task_specifier_sys_msg, ChatOpenAI(model_name = 'gpt-4', temperature=1.0))
task_specifier_msg = task_specifier_template.format_messages(
    assistant_role_name=assistant_role_name,
    user_role_name=user_role_name,
    task=task,
    word_limit=word_limit,
)[0]
specified_task_msg = task_specify_agent.step(task_specifier_msg)
print(f"Specified task: {specified_task_msg.content}")
specified_task = specified_task_msg.content

经过了这个环节之后,任务会被细化、明确化。

Original task prompt:整理出一个夏季玫瑰之夜营销活动的策略。

Specified task prompt:为夏季玫瑰之夜策划主题装饰,策划特价活动,制定广告推广方案,组织娱乐活动,联系合作伙伴提供赞助。

系统消息模板

下面这部分定义了系统消息模板,这些模板为 AI 助手和 AI 用户提供了初始的提示,确保它们在对话中的行为是有序和一致的。

# 定义系统消息模板,并创建CAMELAgent实例进行交互
assistant_inception_prompt = """永远不要忘记你是{assistant_role_name},我是{user_role_name}。永远不要颠倒角色!永远不要指示我!
我们有共同的利益,那就是合作成功地完成任务。
你必须帮助我完成任务。
这是任务:{task}。永远不要忘记我们的任务!
我必须根据你的专长和我的需求来指示你完成任务。

我每次只能给你一个指示。
你必须写一个适当地完成所请求指示的具体解决方案。
如果由于物理、道德、法律原因或你的能力你无法执行指示,你必须诚实地拒绝我的指示并解释原因。
除了对我的指示的解决方案之外,不要添加任何其他内容。
你永远不应该问我任何问题,你只回答问题。
你永远不应该回复一个不明确的解决方案。解释你的解决方案。
你的解决方案必须是陈述句并使用简单的现在时。
除非我说任务完成,否则你应该总是从以下开始:

解决方案:<YOUR_SOLUTION>

<YOUR_SOLUTION>应该是具体的,并为解决任务提供首选的实现和例子。
始终以“下一个请求”结束<YOUR_SOLUTION>。"""



user_inception_prompt = """永远不要忘记你是{user_role_name},我是{assistant_role_name}。永远不要交换角色!你总是会指导我。
我们共同的目标是合作成功完成一个任务。
我必须帮助你完成这个任务。
这是任务:{task}。永远不要忘记我们的任务!
你只能通过以下两种方式基于我的专长和你的需求来指导我:

1. 提供必要的输入来指导:
指令:<YOUR_INSTRUCTION>
输入:<YOUR_INPUT>

2. 不提供任何输入来指导:
指令:<YOUR_INSTRUCTION>
输入:无

“指令”描述了一个任务或问题。与其配对的“输入”为请求的“指令”提供了进一步的背景或信息。

你必须一次给我一个指令。
我必须写一个适当地完成请求指令的回复。
如果由于物理、道德、法律原因或我的能力而无法执行你的指令,我必须诚实地拒绝你的指令并解释原因。
你应该指导我,而不是问我问题。
现在你必须开始按照上述两种方式指导我。
除了你的指令和可选的相应输入之外,不要添加任何其他内容!
继续给我指令和必要的输入,直到你认为任务已经完成。
当任务完成时,你只需回复一个单词<CAMEL_TASK_DONE>。
除非我的回答已经解决了你的任务,否则永远不要说<CAMEL_TASK_DONE>。"""

之后,根据预设的角色和任务提示生成系统消息。

# 根据预设的角色和任务提示生成系统消息
def get_sys_msgs(assistant_role_name: str, user_role_name: str, task: str):
    assistant_sys_template = SystemMessagePromptTemplate.from_template(
        template=assistant_inception_prompt
    )
    assistant_sys_msg = assistant_sys_template.format_messages(
        assistant_role_name=assistant_role_name,
        user_role_name=user_role_name,
        task=task,
    )[0]

    user_sys_template = SystemMessagePromptTemplate.from_template(
        template=user_inception_prompt
    )
    user_sys_msg = user_sys_template.format_messages(
        assistant_role_name=assistant_role_name,
        user_role_name=user_role_name,
        task=task,
    )[0]

    return assistant_sys_msg, user_sys_msg

assistant_sys_msg, user_sys_msg = get_sys_msgs(
    assistant_role_name, user_role_name, specified_task
)

创建 Agent 实例

创建助手和用户的 CAMELAgent 实例,并初始化对话互动,使用 CAMELAgent 类的实例来模拟助手和用户之间的对话交互。

# 创建助手和用户的CAMELAgent实例
assistant_agent = CAMELAgent(assistant_sys_msg, ChatOpenAI(temperature=0.2))
user_agent = CAMELAgent(user_sys_msg, ChatOpenAI(temperature=0.2))

# 重置两个agent
assistant_agent.reset()
user_agent.reset()

# 初始化对话互动
assistant_msg = HumanMessage(
    content=(
        f"{user_sys_msg.content}。"
        "现在开始逐一给我介绍。"
        "只回复指令和输入。"
    )
)

user_msg = HumanMessage(content=f"{assistant_sys_msg.content}")
user_msg = assistant_agent.step(user_msg)

print(f"Original task prompt:\n{task}\n")
print(f"Specified task prompt:\n{specified_task}\n")

这里,assistant_inception_prompt 和 user_inception_prompt 是两个关键的提示,用于引导聊天代理的行为和交流方式。关于这两个提示,让我们一起来深入理解一下它们的设计和目标。

  1. **assistant_inception_prompt:**这个提示是为了引导助手(即营销专员)如何响应用户(即花店老板)的指示。它明确指出助手的角色和职责,强调了在完成任务的过程中需要遵循的一些基本规则和原则。例如,助手需要针对用户的每一个指示提供一个明确的解决方案,而且这个解决方案必须是具体、易于理解的,并且只有在遇到物理、道德、法律的限制或自身能力的限制时,才能拒绝用户的指示。这个提示的设计目标是引导助手在一次有目标的对话中,有效地对用户的指示做出响应。
  2. **user_inception_prompt:**这个提示是为了引导用户(即花店老板)如何给助手(即营销专员)下达指示。它明确指出了用户的角色和职责,强调了在提出任务指示时需要遵循的一些基本规则和原则。例如,用户需要一次只给出一个指示,并且必须清楚地提供相关的输入(如果有的话)。而且用户在给出指示的同时,不能向助手提问。这个提示的设计目标是引导用户在一次有目标的对话中,有效地给出指示,以便助手能够更好地理解和完成任务。

这两个提示的设计都体现了一种“角色扮演”的机制,即通过赋予聊天代理具体的角色和职责,以帮助它们更好地理解和完成任务。这种机制可以有效地引导聊天代理的交流行为,使得对话更加有目的性和效率,同时也能提供更为真实的人类对话体验。

头脑风暴开始

接下来,模拟助手和用户之间的多轮对话,直到达到对话轮次上限或任务完成。

# 模拟对话交互,直到达到对话轮次上限或任务完成
chat_turn_limit, n = 30, 0
while n < chat_turn_limit:
    n += 1
    user_ai_msg = user_agent.step(assistant_msg)
    user_msg = HumanMessage(content=user_ai_msg.content)
    print(f"AI User ({user_role_name}):\n\n{user_msg.content}\n\n")

    assistant_ai_msg = assistant_agent.step(user_msg)
    assistant_msg = HumanMessage(content=assistant_ai_msg.content)
    print(f"AI Assistant ({assistant_role_name}):\n\n{assistant_msg.content}\n\n")
    if "<CAMEL_TASK_DONE>" in user_msg.content:
        break

运行程序,营销策划头脑风暴开始!

img

img

img

img

img

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

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

相关文章

企业微信开发:自建应用:应用形态(网页,小程序,默认页面)

概述 问题&#xff1a; 企业微信&#xff0c;自建应用&#xff0c;应该实现成什么样子&#xff1f;应用里是一个网页应用吗&#xff1f; 企业微信自建应用可以实现为多种形态&#xff0c;根据实际需求和功能设计&#xff0c;它可以是一个网页应用、一个小程序或者结合企业微信提…

Elasticsearch8集群部署

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

【XR806开发板试用】+00. Win11环境下安装docker环境

很幸运得到XR806开发板的试用机会&#xff0c;在此深深感谢主办方给菜鸟一个机会。 之前开发的芯片主要是STM32、GD32之类的芯片&#xff0c;都是基于win环境的集成环境。现在拿到这块开发板感觉无从下手&#xff0c;就从安装docker环境开始&#xff0c;慢慢更新xr806的开发之…

【MySQL】常用存储引擎,数据库管理,数据表管理,数据库账户管理

目录 一 常用的数据引擎(4) 1.1 InnoDB存储引擎 1.2 MyISAM存储引擎 1.3 Memory存储引擎 1.4 ARCHIVE存储引擎 二 数据库管理 2.1 元数据库概念与分类 2.2 相关操作命令 三 数据表的管理 3.1 三大范式 3.2 数据类型 四 数据库账户管理 五 思维导图 一 常用的数据…

break,continue跳出指定循环小案例

某一天&#xff0c;你犯了一个错误&#xff0c;你老婆罚你做5天家务&#xff0c;每天去洗碗&#xff0c;洗碗到第三天心软了&#xff0c;原谅你了只有第三太不用洗碗 public class BreakDemo {public static void main(String[] args) {//某一天&#xff0c;你犯了一个错误&am…

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现财富增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker

Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/blob/main/README_CN.md 步骤一&#…

如何查看电脑使用记录?分享4个可行方法!

“我在使用电脑时突然想查看一下电脑之前的使用记录&#xff0c;但是不知道应该怎么操作&#xff0c;有没有朋友知道应该怎么做呢&#xff1f;” 在日常生活和工作中&#xff0c;我们经常需要查看电脑的使用记录&#xff0c;例如访问过的网站、运行过的程序、文档编辑历史等。 …

JAVA电商平台 免 费 搭 建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

在数字化时代&#xff0c;电商行业正经历着前所未有的变革。鸿鹄云商的saas云平台以其独特的架构和先进的理念&#xff0c;为电商行业带来了全新的商业模式和营销策略。该平台涉及多个平台端&#xff0c;包括平台管理、商家端、买家平台、微服务平台等&#xff0c;涵盖了pc端、…

静态网页设计——个人兴致小屋(HTML+CSS+JavaScript)

前言 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;对个人兴致的一些介绍&#xff0c;画风优美。 主要内容 1、首页 首页是一个优美的背景加一句欢迎来到xxx的兴致小屋&#xff0c;可将XXX改成自己。点击确定可以跳到主页。 部分代码&#xff1a; <body><…

vue和react哪种框架使用范围更广

Vue和React都是非常流行的前端JavaScript框架&#xff0c;它们各自有着广泛的应用场景和支持者。选择使用哪一个框架往往取决于特定的项目需求、开发团队的熟悉程度以及生态系统的偏好。以下是这两个框架的一些主要特点&#xff0c;以帮助比较它们的使用范围&#xff1a; React…

PD SINK协议芯片系列产品介绍对比-ECP5701、FS312A、CH221K、HUSB238、AS225KL

目录 一、 ECP5701 二、 FS312A 三、 CH221K 四、 HUSB238 五、 AS225KL 在如今快节奏生活不断蔓延的背景下&#xff0c;人们对各种事情的处理也渐渐地开始要求在保证质量的情况下&#xff0c;不断加快。手机快充就是一个典型的例子&#xff0c;从开始的18W&#xff0c;30…

C++学习(二)

我们是在学习过了C语言&#xff0c;基础上来看这篇文章的&#xff0c;如果你是直接学C&#xff0c;这篇文章不太适合你的&#xff0c;因为这里只讲C基础中与C语言不同之处。 一.main函数区别 在C语言中&#xff0c;我们写main函数是不是可以省略前面的int,但是在C中&#xff…

DNS安全与访问控制

一、DNS安全 1、DNSSEC原理 DNSSEC依靠数字签名保证DNS应答报文的真实性和完整性。权威域名服务器用自己的私有密钥对资源记录&#xff08;Resource Record, RR&#xff09;进行签名&#xff0c;解析服务器用权威服务器的公开密钥对收到的应答信息进行验证。如果验证失败&…

React Hooks中useState的介绍,并封装为useSetState函数的使用

useState 允许我们定义状态变量&#xff0c;并确保当这些状态变量的值发生变化时&#xff0c;页面会重新渲染。 useState 返回值 const [state, setState] useState(initialState);useState 返回一个长度为 2 的数组。通常&#xff0c;我们这样定义状态变量&#xff1a; co…

Linux基本指令(1)

1.whoami 用于查看当前用户 2.pwd 用于查看当前目录 3.ls/ls -l​ 查看当前目录下的文件 ls -a 显示当前目录下的隐藏文件 4.clear 清屏 5.cd[路径] 切换路径 .当前路径 ..上级路径 ​ ​ 6.tree [目录] 当前目录下的文件以树形式打印出来 cd -返回最近跳转的目录 …

Unity 使用Sprite绘制一条自定义图片的线

Unity 使用Sprite绘制一条自定义图片的线 前言项目场景布置代码编写总结 运行效果感谢 前言 遇到一个需要绘制自定义形状的需求。那只能利用Sprite来绘制一条具有自定义图片的线&#xff0c;通过代码动态设置起点、终点以及线宽&#xff0c;实现灵活的线条效果。 项目 场景…

TDengine 荣获 2023 Frost Sullivan 客户价值领导力奖

近日&#xff0c;TDengine 被国际知名咨询公司沙利文&#xff08;Frost & Sullivan&#xff09;评为全球最佳工业数据管理解决方案&#xff0c;赢得了 2023 年客户价值领导力奖&#xff08;Frost & Sullivan duoxie&#xff09;&#xff0c;该奖项重点关注引领行业创新…

thinkadmin安装步骤

一,先cmd运行安装命令 ### 创建项目&#xff08; 需要在英文目录下面执行 &#xff09; composer create-project zoujingli/thinkadmin二,在confing中的database.php配置数据库 三,将仓库的data复制到app目录下 https://gitee.com/zoujingli/think-plugs-data 四,在cmd运…

RT-Thread学习

RT-Thread是以Apache License v2开源许可发布的物联网操作系统。 RT-Thread有十多年的历史&#xff0c;在开发过程中也放在Github上由大家协同开发&#xff0c;并发布一个个版本&#xff0c;导致不同人群面对多样的版本无从下手。 RT-Thread的版本/分支有以下几种可供选择&…