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

news2025/6/9 17:02:14

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

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

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

相关文章

STGAN:用于交通数据插补的时空生成对抗网络

文章地址: STGAN: Spatio-temporal generative adversarial network for traffic data imputation 主要研究问题: 由于硬件故障或数据传输,观测到的交通数据中产生了噪声和缺失条目。这些质量差的数据无疑会降低ITS的性能; 本文贡献: 为交通数据插补任务提出了一种改进…

leetcode13 罗马数字转整数

题目描述&#xff1a;罗马数字由七种字符组成&#xff0c;分别为 I、V、X、L、C、D 和 M&#xff0c;对应的数值分别为 1、5、10、50、100、500 和 1000。在一般情况下&#xff0c;小的数字位于大的数字右边&#xff0c;但有特殊情况&#xff0c;如 IV 表示 4&#xff0c;IX 表…

Spring Cloud之OpenFeign异常处理

简易原理图 原理基于请求头传递错误消息&#xff0c;利用aop和全局异常拦截机制实现。 服务提供者 远程调用本地方法b&#xff0c;throw异常出来FeignExceptionAspect AOP拦截处理异常到请求头中&#xff0c;继续throwGlobalExceptionHandler处理&#xff0c;返回响应Respons…

腾讯云Centos9使用docker的方式安装APISIX

在虚拟机中安装Docker、Docker-compose 安装Docker 清除旧版本的docker yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装docker的依赖 yum install -y yum-utils device-ma…

NE555学习笔记-2024

实物图片 NE555引脚图 内部时序图 示列1&#xff0c;红外接收电路 红外接收电路的工作原理&#xff1a;在上述电路中&#xff0c;TSOP1738构成了该电路的主要组成部分&#xff0c;旨在检测来自任何来源的红外信号。这用于检测38 KHz范围的信号&#xff0c;因此命名为“TSOP173…

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点&#xff1a;单调栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输…

详谈电商网站建设的四大流程!

在21世纪的互联网时代&#xff0c;电商网站的建设是每个企业发展不可缺少的一次机遇。企业商城网站建设成功也许会获得更大的了利润&#xff1b;如果网站建设不成功&#xff0c;那么也会带来一定的损失。所以建设电商网站不是那么一件简单的事情。那么电商网站制作流程是怎样的…

2024年【上海市安全员C3证】试题及解析及上海市安全员C3证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员C3证试题及解析根据新上海市安全员C3证考试大纲要求&#xff0c;安全生产模拟考试一点通将上海市安全员C3证模拟考试试题进行汇编&#xff0c;组成一套上海市安全员C3证全真模拟考试试题&#xff0c;学员…

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…

数据库:基础SQL知识+SQL实验2

&#xff08;1&#xff09;基础知识&#xff1a; 1.JOIN&#xff08;连接&#xff09;&#xff1a; 连接操作用于根据指定的条件将两个或多个表中的数据行合并在一起。JOIN 可以根据不同的条件和方式执行&#xff0c;包括等值连接、不等值连接等。 &#xff08;1&#xff09…

5分钟了解接口测试

接口测试是指对系统接口进行测试的一种质量保障手段&#xff0c;主要是验证接口的功能、性能、安全性等方面是否符合预期。 在接口测试中&#xff0c;可以测试以下内容&#xff1a; 功能测试&#xff1a;验证接口的输入和输出是否符合预期&#xff0c;包括参数的正确性、返回结…

【Docker】docker部署conda并激活环境

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、新建dockerfile文件二、使用build创建镜像1.报错&#xff1a;Your shell has not been properly configured to use conda activate.…

基于LLM+RAG的问答

每日推荐一篇专注于解决实际问题的外文&#xff0c;精准翻译并深入解读其要点&#xff0c;助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号 原文标题&#xff1a;LLMRAG based Question Answering 原文地址&#xff1a;https://teemukanstren.com/2023/12/25/llm…

【网络安全】上网行为代理服务器Network Agent配置

文章目录 About Network Agent SettingsIgnore Internal TrafficInternal Traffic to MonitorAdditional SettingsBandwidth calculation intervalLog protocol traffic periodically 推荐阅读 本文基于websense &#xff08;现在称为Forcepoint&#xff09;的Network Agent 配…

npm发布js工具包

一、创建项目 1、在github上创建一个项目&#xff0c;然后拉取至本地&#xff0c;进入项目目录2、执行 npm init 生成json文件3、创建 src/index.ts 入口文件和 src/isObject.ts 工具方法 src/index.ts export { default as isObject } from ./isObject src/isObject.ts /…

Zookeeper 分布式服务协调治理框架介绍入门

文章目录 为甚么需要Zookeeper一、Zookeeper 介绍1.1 介绍1.2 Zookeeper中的一些概念1.2.1 集群角色1.2.2 会话 session1.2.3 数据节点 Znode1.2.4 版本1.2.5 事件监听器 Watcher1.2.6 ACL 权限控制表(Access Control Lists) 二、 Zookeeper的系统模型2.1.1 ZNode节点2.1.2 ZNo…

亿可达:提升工作效能的秘诀

在竞争激烈的职场中&#xff0c;提高工作效率对于个人和团队都至关重要。而选择适合自己的工作效率软件&#xff0c;可以为我们提供更好的工作协作和任务管理体验。下面是我个人推荐的一些实用工作效率软件&#xff0c;希望能对您有所帮助。 1. Any.do&#xff1a;Any.do是一款…

AI小冰入驻淘宝 将提供虚拟人陪伴服务

AI小冰正式入驻淘宝&#xff01; 据悉&#xff0c;小冰在淘宝开出了“小冰旗舰店”、以及手淘小程序“X Eva 克隆人的平行世界”&#xff0c;为消费者提供基于KOL虚拟人带来的陪伴服务体验。用户搜索“小冰旗舰店”就可以直达店铺进行选购。 ​小冰旗舰店的首批商品包括冰花直充…

‘react-native‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

原因&#xff1a;没有下载react-native 解决下载react-native npm i -g react-native-cli

19|BabyAGI:根据气候变化自动制定鲜花存储策略

19&#xff5c;BabyAGI&#xff1a;根据气候变化自动制定鲜花存储策略 随着 ChatGPT 的崭露头角&#xff0c;我们迎来了一种新型的代理——Autonomous Agents&#xff08;自治代理或自主代理&#xff09;。这些代理的设计初衷就是能够独立地执行任务&#xff0c;并持续地追求长…