CAMEL(Cognitive Agent Model for Enhanced Learning)框架是一个基于LangChain的多智能体交互系统,旨在通过逐步对话和任务分解来有效地解决复杂的任务。它通过不同角色的智能体协作和反馈机制,模拟了复杂任务执行的思维过程。这种多智能体协作的模式不仅提升了系统在处理复杂问题时的灵活性,也增强了任务执行的可解释性和透明度。
在CAMEL框架中,智能体之间通过明确的角色分配和任务细化逐步推进任务的完成。每个智能体根据预设的系统消息和对话历史,生成适当的响应。框架中的每一轮交互都可以看作是一个“思考-行动-反馈”的闭环,不断调整任务执行的细节直到任务完成。
1. CAMEL架构:多智能体协作
CAMEL框架的核心思想是将复杂的任务通过多个智能体来共同完成。在此框架中,智能体分别扮演不同的角色,这些角色之间的互动构成了任务执行的主体。每个智能体都有其特定的功能和责任,并且通过消息传递和任务细化的方式,逐步实现任务目标。
在一个完整的CAMEL任务执行流程中,至少有以下两个主要角色:
- 助手角色(Assistant Agent) :负责执行具体的操作或决策,辅助完成任务的每个步骤。通常,它根据对话历史中的指令生成可操作的方案或解决方案。
- 用户角色(User Agent) :负责提供任务的指导和输入信息,确保任务执行的方向正确。用户通常会提供任务的初始描述和逐步指引,确保任务在执行过程中不偏离目标。
这两个智能体通过多轮对话协作,最终达成任务目标。在实际应用中,助手智能体根据任务需求和用户指令生成可操作的方案,而用户智能体则根据助手的反馈继续提供更具针对性的输入,形成一个交替推进的工作流。
2. 关键类和方法
CAMELAgent 类
CAMELAgent 类是整个框架的核心组件。它管理了与语言模型(例如OpenAI的ChatGPT)之间的交互,并控制任务的执行流程。这个类的主要功能包括初始化对话、更新对话消息、发送请求以及接收响应。
主要方法:
__init__:初始化代理,接收系统消息并设置模型实例,调用init_messages()来初始化对话。reset:重置代理,清除当前对话历史,重新开始任务。init_messages:初始化对话消息列表,包含系统消息和任务描述。update_messages:更新对话历史,每次将新的消息(包括用户消息和助手响应)添加到消息列表中。step:执行一次交互,发送用户消息并获取模型的响应,然后更新对话历史。
通过这些方法,CAMELAgent类能够确保智能体间的信息传递准确无误,并逐步推动任务的执行。
创建一个简单的代理
在以下示例中,创建了一个CAMELAgent实例,该代理与OpenAI的语言模型交互,以完成特定任务:
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
通过CAMELAgent,每次执行step方法时,代理与模型的对话历史会被更新,以确保下一轮的交互能够基于完整的上下文。
3. 角色和任务定义
在CAMEL框架中,角色和任务描述是至关重要的组成部分。每个角色都通过系统消息定义了自己的行为规则和交互方式,而任务描述则帮助每个智能体明确任务的目标。
角色设定
角色设定不仅仅是标识助手和用户的身份,更重要的是它定义了各自的责任范围。例如,在营销策略的任务中,助手负责生成营销方案,而用户负责提供指导性输入。
在本示例中,两个角色的设置如下:
- 助手角色:
花店营销专员 - 用户角色:
花店老板
任务定义
任务描述用于定义智能体的共同目标。在本例中,任务为:“整理出一个夏季玫瑰之夜的营销活动的策略”。这个任务可以逐步细化为多个子任务,如:
- 设计活动宣传文案
- 策划活动流程
- 确定活动预算
- 制定社交媒体宣传计划等
这些子任务会通过逐步交互的方式,分配给不同的智能体进行处理。
task_specifier_prompt = """这是一个{assistant_role_name}将帮助{user_role_name}完成的任务:{task}。
请使其更具体化。请发挥你的创意和想象力。
请用{word_limit}个或更少的词回复具体的任务。不要添加其他任何内容。"""
任务的逐步细化会在对话过程中进行,每次用户和助手的对话都会让任务的细节变得更加清晰。
4. 任务执行流程与对话交互
任务执行是通过一系列的角色交互完成的。在对话中,助手和用户分别根据各自的任务需求和系统消息,执行不同的操作。通过step方法,智能体之间的任务执行过程得到有效推动。
任务细化与消息更新
任务细化的过程通常从用户提供初始任务描述开始,之后智能体根据上下文进一步细化任务。例如,助手通过提供创意和具体化任务来帮助用户明确目标。
task_specifier_template = HumanMessagePromptTemplate.from_template(template=task_specifier_prompt)
task_specify_agent = CAMELAgent(task_specifier_sys_msg, ChatOpenAI(model=os.environ["LLM_MODELEND"], temperature=1.0))
通过这种逐步细化任务的方法,任务变得越来越具体,智能体能够在更明确的指引下执行任务。
模拟对话交互
在模拟对话过程中,用户和助手交替发起指令,直到任务完成。每一轮对话中,智能体会根据上一步的反馈更新任务细节,并生成新的响应。
chat_turn_limit, n = 3, 0
while n < chat_turn_limit:
n += 1
user_ai_msg = user_agent.step(assistant_msg)
user_msg = HumanMessage(content=user_ai_msg.content)
assistant_ai_msg = assistant_agent.step(user_msg)
assistant_msg = HumanMessage(content=assistant_ai_msg.content)
print(f"AI User ({user_role_name}):\n\n{user_msg.content}\n\n")
print(f"AI Assistant ({assistant_role_name}):\n\n{assistant_msg.content}\n\n")
if "<CAMEL_TASK_DONE>" in user_msg.content:
break
通过多轮交互,任务逐步推进,直到任务完成。每一轮都依赖于前一轮的反馈,确保了任务执行的连贯性和准确性。
5. 任务完成标识与终止
当任务成功完成时,系统会通过<CAMEL_TASK_DONE>标识任务终止。此标识为对话流程提供了明确的结束标志,确保任务能够在合理的时间内完成,而不会无限期地延续。
if "<CAMEL_TASK_DONE>" in user_msg.content:
break
通过这种机制,CAMEL框架能够在任务执行达到预期目标后自动结束对话,并输出最终结果。
总结与应用前景
CAMEL框架通过模拟多智能体之间的交互,提供了一种新的任务管理和执行方式。其优势在于能够将复杂的任务分解为多个小步骤,并通过逐步交互来推进任务的执行。每个智能体根据其角色的不同,在对话中承担不同的职责,从而保证任务的高效完成。
这种框架适用于多种场景,尤其是在需要协作和决策的复杂任务中。例如,在企业营销、客户服务、项目管理等领域,CAMEL框架都能发挥重要作用。通过LangChain等工具,
CAMEL框架能够结合强大的自然语言理解和生成能力,为各种任务提供智能化的解决方案。