解题笔记:通过角色扮演生成鲜花营销方案
一、问题背景
在现代营销策略中,角色扮演是一种常见的创意思维方法。本任务的目标是通过角色扮演的方式,利用LangChain与OpenAI的语言模型,帮助生成一个鲜花营销方案。我们将模拟“花店老板”和“花店营销专员”之间的对话,逐步设计出一个夏季玫瑰之夜的营销活动策略。
二、解题思路
- 角色设定:我们定义两个角色:花店老板(需要提出需求)和花店营销专员(根据需求提供创意和方案)。通过两者的对话来生成营销方案。
- 任务拆解:将大致的营销目标拆解成具体的创意、活动方案、营销渠道等内容,逐步迭代与完善。
- 多轮对话:通过与AI的多轮对话,逐步细化任务、生成创意,最终输出一个完整的营销方案。
三、解题步骤
1. 环境配置与库导入
首先,导入必要的库和工具,确保环境正确配置并能够与OpenAI的API进行交互。
1.1 导入所需的库
import os
from typing import List
from langchain_openai import ChatOpenAI
from langchain.prompts.chat import (
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage,
BaseMessage,
)
- os:用于管理环境变量和API密钥。
- langchain_openai:用于连接并与OpenAI模型进行交互。
- langchain.prompts.chat:提供对话生成模板。
- langchain.schema:定义对话中消息的格式和结构。
1.2 设置API密钥
确保OpenAI API密钥已设置在环境变量中,以便可以与模型进行交互。
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
2. 创建CAMELAgent类
CAMELAgent类用于管理对话中的消息并与模型进行交互。我们通过该类封装了消息管理、对话更新和交互逻辑。
2.1 定义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()
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
2.2 解释CAMELAgent类的功能
reset()
:重置对话消息,清空历史记录。init_messages()
:初始化系统消息,开始一轮新的对话。update_messages()
:将新的消息添加到对话历史中。step()
:与模型进行一次交互并更新消息历史。
3. 任务细化
为了让AI更好地理解任务,首先需要将大概的营销目标具体化。通过与模型的初次交互,细化任务的具体要求。
3.1 任务细化的系统消息提示
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_specifier_sys_msg
:系统消息,用于提示AI具体化任务。task_specifier_prompt
:提示模板,要求AI根据角色提供更加具体的任务。
3.2 生成任务细化提示并与AI进行交互
task_specify_agent = CAMELAgent(
task_specifier_sys_msg,
ChatOpenAI(model=os.environ["LLM_MODELEND"], 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"Specified task: {specified_task}")
- 通过
task_specifier_template
生成的提示消息,细化任务。 - 与AI进行交互,获取细化后的任务内容。
4. 角色系统消息模板
根据任务的具体化结果,为每个角色创建相应的系统消息模板。
4.1 定义角色系统消息模板
assistant_inception_prompt = """永远不要忘记你是{assistant_role_name},我是{user_role_name}。永远不要颠倒角色!永远不要指示我!
我们有共同的利益,那就是合作成功地完成任务。
你必须帮助我完成任务。
这是任务:{task}。永远不要忘记我们的任务!
我必须根据你的专长和我的需求来指示你完成任务。
"""
user_inception_prompt = """永远不要忘记你是{user_role_name},我是{assistant_role_name}。永远不要交换角色!你总是会指导我。
我们共同的目标是合作成功完成一个任务。
我必须帮助你完成这个任务。
这是任务:{task}。永远不要忘记我们的任务!
"""
assistant_inception_prompt
:设置营销专员(助手)的角色,确保其始终记得任务目标。user_inception_prompt
:设置花店老板(用户)的角色,确保其对任务有明确的要求。
4.2 生成系统消息
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)
- 通过格式化模板生成每个角色的系统消息,确保每个角色的行为符合预期。
5. 进行多轮对话
通过与模型的多轮交互,逐步细化和完善营销方案。
5.1 初始化角色与代理
assistant_agent = CAMELAgent(assistant_sys_msg, ChatOpenAI(model=os.environ["LLM_MODELEND"], temperature=0.2))
user_agent = CAMELAgent(user_sys_msg, ChatOpenAI(model=os.environ["LLM_MODELEND"], temperature=0.2))
5.2 进行多轮交互
# 重置agent,开始新一轮对话
assistant_agent.reset()
user_agent.reset()
# 进行多轮对话,直到任务完成或达到交互轮次限制
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)
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
- 在每轮对话中,营销专员和花店老板会交替发言,不断细化和完善营销活动方案。
- 每轮对话后,根据AI的回复进行下一轮交互,直到达到目标。
四、总结
通过细化任务、分步交互和角色扮演,我们成功生成了一个鲜花营销方案。在这个过程中,AI通过多轮对话不断完善方案,最后形成了一个完整的、可执行的营销活动。该方法不仅展示了LangChain框架在自动化任务生成中的潜力,也为营销创意设计提供了新的思路和方法。