CAMEL AI agent——多角色互动协作完成任务

这段代码是一个模拟对话系统,使用了OpenAI的模型进行对话。它包括定义了一个CAMELAgent类,用来管理对话消息的存储和更新,以及模拟用户和助手的交互过程。该代码通过系统消息模板和预设任务来创建角色和任务提示,然后根据这些提示生成系统消息。接着创建助手和用户的CAMELAgent实例,并模拟对话交互,直到达到对话轮次上限或任务完成。整个过程旨在模拟用户和助手之间的交互,以完成特定的任务和指令。

# 设置OpenAI API密钥
import os
os.environ["OpenAI_API_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类
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

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


# 定义与指定任务相关的系统提示,经过了这个环节之后,任务会被细化、明确化。
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-3.5-turbo', 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)
specified_task = specified_task_msg.content

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


# 定义系统消息模板,并创建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
)

# 创建助手和用户的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)

# 模拟对话交互,直到达到对话轮次上限或任务完成
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

  

运行效果:

整理出一个夏季玫瑰之夜的营销活动的策略

Specified task prompt:
策划“夏日玫瑰之夜”活动:设置露天花园景观、提供玫瑰品鉴和DIY插花体验,推广社交媒体抽奖活动,搭配特别夏季玫瑰产品套餐销售 。

AI User (花店老板):

指令:<介绍“夏日玫瑰之夜”活动的露天花园景观设置>
输入:<“夏日玫瑰之夜”活动将在花店外的露天花园举行,我们计划在花园中设置精美的玫瑰装饰,包括彩色灯光、花环和花瓣铺设,营 造浪漫的氛围。花园中将摆放舒适的座位供客人休息和品鉴玫瑰。>

指令:<介绍“夏日玫瑰之夜”活动的玫瑰品鉴和DIY插花体验>
输入:<在活动中,我们将提供各种品种的玫瑰供客人品鉴,让他们了解不同玫瑰的香气和特点。此外,我们还将设置DIY插花体验区域,让客人亲自动手制作玫瑰花束,体验花艺乐趣。>

指令:<介绍“夏日玫瑰之夜”活动的社交媒体抽奖活动>
输入:<为了推广活动,我们计划在社交媒体平台上举办抽奖活动,邀请粉丝参与。参与者可以通过分享活动海报、标记朋友等方式获得 抽奖资格,奖品可以是免费玫瑰花束或折扣券等。>

指令:<介绍“夏日玫瑰之夜”活动的特别夏季玫瑰产品套餐销售>
输入:<在活动当天,我们将推出特别夏季玫瑰产品套餐,包括精美玫瑰花束、玫瑰花瓶、玫瑰花茶等,以优惠价格销售给参与活动的客 人,让他们带着美好的回忆和产品离开。>


AI Assistant (花店营销专员):

下一个请求


AI User (花店老板):

指令:<提供“夏日玫瑰之夜”活动的整体宣传策略>
输入:<我们将通过制作精美的活动海报和宣传视频,在社交媒体上定期发布活动信息和亮点,吸引更多人关注。同时,我们还计划邀请 当地媒体和花艺爱好者参与活动,增加曝光度。另外,我们会与合作伙伴合作,共同推广活动,扩大影响力。>


AI Assistant (花店营销专员):

下一个请求


AI User (花店老板):

指令:<制定“夏日玫瑰之夜”活动的日程安排>
输入:<活动将于傍晚开始,首先进行玫瑰品鉴和DIY插花体验环节,让客人亲身感受玫瑰的魅力。随后是露天花园晚宴,客人可以在浪漫的花园中享用美食和美酒。晚宴结束后,进行社交媒体抽奖活动,并推广特别夏季玫瑰产品套餐销售。整个活动将持续约3-4小时。>


AI Assistant (花店营销专员):

任务完成。


AI User (花店老板):

<CAMEL_TASK_DONE>


AI Assistant (花店营销专员):

非常感谢您的合作!如果您有任何其他需要帮助的地方,请随时告诉我。

  

在最后一步,当用户(花店老板)发送 "<CAMEL_TASK_DONE>" 标记时,助手(花店营销专员)识别任务已完成,感谢用户的合作并表示愿意提供进一步的帮助。

 

补充:

当用户发送包含 "<CAMEL_TASK_DONE>" 标记的消息时,触发了对话的结束。助手会识别这个标记,并意识到用户认为任务已经完成,因此对话不再进行进一步的交互。这个标记的出现是用户主动结束对话的信号。

在整个交互流程中,助手和用户之间的对话交互是基于预设的角色和任务提示生成的系统消息模板。助手负责指导用户完成任务,用户根据助手的指令或输入提供相应的回复。交互流程遵循一定的规则和约定,确保双方在合作完成任务的过程中能够有效地沟通和协作。

 

在这个模拟对话系统中,发送包含 "<CAMEL_TASK_DONE>" 标记的消息的用户是模拟用户,通过用户代理(user_agent)来模拟用户的行为。这里的用户是一个虚拟实体,用于模拟用户和助手之间的对话交互过程。

 

posted @ 2024-05-23 12:16  bonelee  阅读(181)  评论(0编辑  收藏  举报