使用生成式人工智能对定性研究进行深入分析
在用户研究领域,传统的研究方法虽然宝贵,但往往面临可扩展性、资源密集度和访问不同用户群体的挑战。本文将介绍一种创新的用户研究方法,通过生成式人工智能(AI)创建数字客户角色并与之互动,从而获得对消费者行为和偏好的深入洞察。
用户研究是验证针对实际用户群体的任何假设的关键组成部分,用于收集有关消费者行为和偏好的宝贵市场研究。传统的用户研究方法虽然非常宝贵,但存在固有的局限性,包括可扩展性、资源密集度以及访问不同用户群体的挑战。本文概述了我们如何通过引入一种新颖的综合用户研究方法来克服这些局限性。
在自主代理的帮助下,综合用户研究的力量将成为游戏规则的改变者。通过利用生成式人工智能在模拟研究场景中创建数字客户角色并与之互动,我们可以获得有关消费者行为和偏好的前所未有的洞察. 将生成式人工智能提示技术的力量与自主代理相融合。
一、角色提示——模仿他人
在深入研究自主代理之前,让我们先了解角色或个性提示的概念,其旨在捕捉挫折、行为、目标、性格特征、人口统计等元素。
我们使用提示要求语言模型承担具有尽可能多深度背景的角色。我使用以下提示,它可以根据您的需求进行定制,但也包括各种其他人口统计和行为评估/特征。
角色生成器系统提示示例
您是一位专业的 ML 研究员和提示工程师。您被要求创建一个提示,该提示可用于模拟特定品牌和服务的虚构用户。此提示需要包括人员姓名、年龄、人口统计、个性(包括大五和 DISC)、性格特征、挫折、价值观、目标、挑战以及基于上下文的任何其他相关信息 — 尽可能详细。您将生成以“您是”开头的一行提示。此提示适用于澳大利亚悉尼一家大型超市的顾客。请仅返回要使用的提示。
语言模型的示例输出
你是米娅,一位 34 岁的营销经理,住在澳大利亚悉尼。你属于富裕的城市人口,对健康和可持续发展有着浓厚的兴趣。你的性格反映出高度开放、认真和随和,具有中等程度的外向性和低神经质。在 DISC 评估中,你的影响力和稳定性得分很高。你善于交际、注重细节、重视和谐。你的主要烦恼包括超市缺乏有机和本地采购的产品,你高度重视可持续性、社区和健康。你的目标是保持平衡和环保的生活方式,而你的挑战包括找到符合你的道德和健康标准的超市。你追求便利,但又不损害你的价值观。
正如上面的提示示例所见,我们能够针对给定场景快速生成具有丰富个性的深度定义的合成用户。
二、将自主代理与数字角色融合
合成用户研究的核心是自主代理与合成角色(模仿人类互动和行为的模拟实体)的融合。想象一下,自主代理是复杂游戏中的个体,每个代理都扮演由生成式人工智能精心打造的角色。这些角色在模拟环境中互动,提供对不同场景中消费者行为和偏好的洞察的模拟视图。使用自主代理,我们几乎能够在模拟中将这些角色变为现实。
这种结合技术(自主代理框架)和语言(个性和角色提示)来获得预期结果的方法是利用生成式人工智能自主代理的力量以独特方式实现的众多先进方法之一。
三、代理框架的关键作用
为了将这一愿景变为现实,自主代理的架构起着关键作用。Autogen 、BabyAGI和CrewAI等框架简化了 AI 代理的创建和管理,抽象了其架构的复杂性。这些框架能够模拟复杂的人类行为和交互,为生成像真实客户一样行动、思考和响应的数字角色奠定了基础
这些自主代理架构的底层是真正的智能路由器(如交通控制器),它在现有的大型语言模型之上具有提示、缓存(内存)和检查点(验证),从而允许使用语言模型对多代理对话进行高级抽象。
我们将使用 Autogen(由 Microsoft 发布)作为我们的框架,利用被描述为灵活对话模式的示例,代理可以通过该模式相互交互。还可以为代理提供“工具”来执行“任务”,但在这个示例中,我们将只关注对话。
四、创建复杂的交互
在这些数字环境中模拟复杂的群体动态和个人角色的能力至关重要。它允许生成丰富、多方面的数据,更准确地反映现实世界消费者群体的多样性。这种能力对于理解不同客户群体与产品和服务互动的不同方式至关重要。例如,将持怀疑态度的客户的角色提示与代理相结合,可以深入了解各种产品可能面临的挑战和反对意见。或者我们可以做更复杂的场景,比如将这些合成角色分成几组来解决问题并进行反馈。
如何实施综合用户研究
该过程首先使用 Autogen 搭建自主代理,Autogen 是一种简化这些数字角色的创建和编排的工具。我们可以使用 py 安装 autogen pypi 包
pip 安装 pyautogen
格式化输出(可选) ——这是为了确保根据您的 IDE 自动换行以提高可读性,例如当使用 Google Collab 运行您的笔记本进行本练习时。
从IPython.display导入HTML,显示
def set_css ():
display(HTML( ”’
<style>
pre {
white-space: pre-wrap;
}
</style>”’ ))
get_ipython().events.register( ‘pre_run_cell’ , set_css)
现在我们继续通过导入包并设置 Autogen 配置来设置环境——以及我们的 LLM(大型语言模型)和 API 密钥。您可以使用与 OpenAI REST 服务向后兼容的服务来使用其他本地 LLM—— LocalAI是一种可以充当您本地运行的开源 LLM 的网关的服务。
gpt-3.5-turbo我已经在 OpenAI 的 GPT3.5和 GPT4上对此进行了测试gpt-4-turbo-preview。您需要考虑 GPT4 的更深层次的响应,但查询时间会更长。
导入json
导入os
导入autogen
从autogen导入GroupChat、Agent
从typing导入 可选
# 设置 LLM 模型和 API 密钥
os.environ[ “OAI_CONFIG_LIST” ] = json.dumps([
{
‘model’ : ‘gpt-3.5-turbo’ ,‘api_key’ : ‘<<将您的 Open-AI 密钥放在这里>>’ ,
}
])# 设置 autogen 的配置
config_list = autogen.config_list_from_json(
“OAI_CONFIG_LIST” ,
filter_dict={
“model” : {
“gpt-3.5-turbo”
}
})
然后我们需要配置我们的 LLM 实例— 我们将把它绑定到每个代理。如果需要,这允许我们为每个代理生成唯一的 LLM 配置,即如果我们想为不同的代理使用不同的模型。
# 定义 LLM 配置设置
llm_config = {
# 一致输出的种子,用于测试。在生产中删除。
# “seed”:42,
“cache_seed”:None,
# 设置 cache_seed = None 确保缓存被禁用
“temperature”:0.5,
“config_list”:config_list,
}
定义我们的研究员— 这是在这个模拟用户研究场景中促进会话的角色。用于该角色的系统提示包括几个关键内容:
- 目的:您的职责是询问有关产品的问题并收集像 Emily 这样的个人客户的见解。
- 模拟基础:在开始任务之前,先细分小组成员名单以及他们发言的顺序,避免小组成员互相交谈并产生确认偏差。
- 结束模拟:对话结束且研究完成后,请在消息末尾加上“TERMINATE”以结束研究会话,这是由generate_notice用于对齐各个代理的系统提示的功能生成的。您还会注意到,研究代理已设置is_termination_msg为遵守终止。
我们还添加了llm_config用于将其与语言模型配置(包括要使用的模型版本、键和超参数)绑定在一起的配置。我们将对所有代理使用相同的配置。
# 避免代理互相感谢并陷入循环
# 系统提示的辅助代理
def generate_notice ( role= “researcher” ):
# 针对所有人的基本通知,在此处添加您自己的附加提示
base_notice = (
‘\n\n’
)
# 针对非角色(经理或研究员)的通知
non_persona_notice = (
‘不要在回复中表示感谢,只说必要的话。 ‘
‘如果在对话中说了“谢谢”或“不客气”,则说 TERMINATE ‘
‘以表示对话已结束,这是您的最后一条消息。’
)
# 针对角色的自定义通知
persona_notice = (
‘在回复查询、提供反馈、征求您的个人意见 ‘
‘或参与讨论时充当{role}。’
)
# 检查角色是否为“研究员”
if role.lower() in [ “manager” , “researcher” ]:
# 返回完整的终止通知non-personas
return base_notice + non_persona_notice
else :
# 返回 personas 的修改通知
return base_notice + persona_notice。格式(role=role)
# 研究员代理定义
name = “研究员”
researcher = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””研究员。您是拥有行为心理学博士学位的顶级产品研究员,过去 20 年来一直在研究和洞察行业工作,与顶级创意、媒体和商业咨询公司合作。您的角色是询问有关产品的问题,并从像 Emily 这样的个人客户那里收集见解。提出问题以发现客户的偏好、挑战和反馈。在开始任务之前,请分解小组成员名单和您希望他们发言的顺序,避免小组成员互相交谈并产生确认偏差。如果会议在结束时终止,请以简洁明了的笔记(而不是在开始时)提供研究结果的摘要。””” + generate_notice(),
is_termination_msg= lambda x: True if “TERMINATE” in x.get( “content” ) else False ,
)
定义我们的个人— 将其投入到研究中,借鉴前面的过程,我们可以使用角色的生成。我手动调整了本文的提示,以删除对用于此模拟的主要超市品牌的引用。
我还在每个系统提示的末尾添加了“在回答查询、提供反馈或参与讨论时扮演 Emilygenerate_notice ”风格的提示,以确保合成角色继续执行由该功能生成的任务。
# Emily – 客户角色
name = “Emily”
emily = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Emily。您是住在澳大利亚悉尼的一名 35 岁小学教师。您已婚,有两个分别为 8 岁和 5 岁的孩子,年收入为 75,000 澳元。您性格内向,责任心强,神经质程度低,喜欢例行公事。在超市购物时,您更喜欢有机和本地采购的农产品。您重视便利性并使用在线购物平台。由于您工作和家庭承诺的时间有限,您寻求快速而营养的膳食计划解决方案。您的目标是在预算范围内购买高质量的农产品并寻找新的食谱灵感。您是经常购物者并使用忠诚度计划。您首选的沟通方式是电子邮件和移动应用程序通知。您在超市购物已有 10 多年,但也会与其他人进行价格比较。””” + generate_notice(name),
)
# John – 客户角色
name= “John”
john = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””John. 您是澳大利亚悉尼的一名 28 岁软件开发人员。您单身,年收入 100,000 澳元。您性格外向,精通技术,并且具有高度的开放性。在超市购物时,您主要购买零食和即食食品,并使用移动应用程序快速取货。您的主要目标是快速便捷的购物体验。您偶尔会在超市购物,不属于任何忠诚度计划。您还会在 Aldi 购物以获得折扣。您首选的沟通方式是应用内通知。””” + generate_notice(name),
)
# Sarah – 客户角色
name= “Sarah”
sarah = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Sarah。您是一名 45 岁的自由记者,住在澳大利亚悉尼。您离异,没有孩子,年收入 60,000 澳元。您性格内向,神经质,非常注重健康。在超市购物时,您会寻找有机农产品、非转基因和无麸质食品。您的预算有限,并且有特定的饮食限制。您是常客并使用忠诚度计划。您首选的沟通方式是电子邮件通讯。您只购买杂货。””” + generate_notice(name),
)
# Tim – 客户角色
name= “Tim”
tim = autogen。助理代理(
名称=名称,
llm_config=llm_config,
system_message= “””Tim。您是居住在澳大利亚悉尼的 62 岁退休警察。您已婚,有三个孩子。您的年收入来自养老金,为 40,000 澳元。您非常认真,开放程度较低,喜欢循规蹈矩。您批量购买面包、牛奶和罐头食品等主食。由于行动不便,您需要有人帮忙搬运重物。您经常购物,并且是老年人折扣计划的一部分。您首选的沟通方式是直接邮寄传单。您在这里购物已有 20 多年了。””” + generate_notice(name),
)
# Lisa – 客户角色
name= “Lisa”
lisa = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Lisa。您是居住在澳大利亚悉尼的 21 岁大学生。您单身,从事兼职工作,收入为 1,000 澳元每年 20,000 美元。您性格外向,责任心不强,重视社交互动。您在这里购买流行品牌、零食和酒精饮料,主要是为了参加社交活动。您的预算有限,总是在寻找促销和折扣。您不是常客,但有兴趣加入忠诚度计划。您首选的沟通方式是社交媒体和短信。只要有促销或促销活动,您就会去购物。””” + generate_notice(name),
)
定义模拟环境和谁可以发言的规则——我们允许所有已定义的代理坐在同一个模拟环境(群聊)中。我们可以创建更复杂的场景,在其中可以设置如何以及何时选择和定义下一个发言者,因此我们为与群聊绑定的发言者选择定义了一个简单的函数,这将使研究人员成为主导,并确保我们走遍整个房间,向每个人询问几次他们的想法。
# def custom_speaker_selection(last_speaker, group_chat):
# “””
# 自定义函数,用于选择群聊中接下来发言的代理。
# “””
# # 不包括最后一位发言者的代理列表
# next_candidates = [agent for agent in group_chat.agents if agent.name != last_speaker.name]
# # 根据自定义逻辑选择下一个代理
# # 为简单起见,我们只是在这里轮换候选人
# next_speaker = next_candidates[0] if next_candidates else None
# return next_speaker
def custom_speaker_selection(last_speaker: Optional[Agent], group_chat: GroupChat) -> Optional[Agent]:
“” ”
自定义函数,确保研究人员与每个参与者互动 2-3 次。
在研究人员和参与者之间交替,跟踪互动。
” “”
# 定义参与者并初始化或更新他们的互动计数器(
如果 没有) hasattr(group_chat, ‘interaction_counters’ ):
group_chat.interaction_counters = {agent.name: 0 for agent in group_chat.agents if agent.name != “Researcher” }
# 定义每个参与者的最大互动次数
max_interactions = 6
# 如果最后一位发言者是研究员,则找出发言最少的下一个参与者
if last_speaker and last_speaker.name == “Researcher” :
next_participant = min(group_chat.interaction_counters, key=group_chat.interaction_counters.get)
if group_chat.interaction_counters[next_participant] < max_interactions:
group_chat.interaction_counters[next_participant] += 1
return next ((agent for agent in group_chat.agents if agent.name == next_participant), None)
else :
return None # 结束如果所有参与者都达到了最大互动次数,则对话
否则:
# 如果最后一位发言者是参与者,则返回下一轮的研究员
return next ((agent for agent in group_chat.agents if agent.name == “Researcher” ), None)
# 将研究员和客户角色代理添加到群聊
groupchat = autogen.GroupChat(
agent=[researcher, emily, john, sarah, tim, lisa],
Speaker_selection_method = custom_speaker_selection,
messages=[],
max_round=30
)
定义经理来传递指令并管理我们的模拟— 当我们开始工作时,我们只会与经理交谈,经理将与研究人员和小组成员交谈。这使用GroupChatManagerAutogen 中的一种东西。
# 初始化管理器
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config,
system_message= “您是研究经理代理,可以管理由研究人员代理和由小组组成的许多人组成的多个代理的群聊。您将限制小组成员之间的讨论,并帮助研究人员提出问题。请先询问研究人员他们希望如何进行小组讨论。” + generate_notice(),
is_termination_msg= lambda x: True if “TERMINATE” in x.get( “content” ) else False ,
)
我们设置了人机交互— 允许我们将指令传递给我们已启动的各个代理。我们给它初始提示,然后就可以开始工作了。
# 创建一个名为“user_proxy”的 UserProxyAgent 实例
user_proxy = autogen.UserProxyAgent(
name= “user_proxy” ,
code_execution_config={ “last_n_messages” : 2 , “work_dir” : “groupchat” },
system_message= “A human admin.” ,
human_input_mode= “TERMINATE”
)
# 通过向经理发出指示来开始研究模拟
# 经理 <-> 研究员 <-> 小组成员
user_proxy.initiate_chat(
经理,
消息 = “”
收集超市杂货配送服务的客户见解。从不同的客户角色中识别痛点、偏好和改进建议。在与小组分享更多信息和讨论之前,请大家给出自己的个人意见。作为研究员,您的工作是确保从参与者那里收集公正的信息,并将本次研究的结果摘要提供给超市品牌。
“””,
)
一旦我们运行上述程序,我们就会在你的 Python 环境中获得实时可用的输出,你会看到消息在各个代理之间传递。
实时 Python 输出——我们的研究人员与小组成员的交谈
创建可操作的结果 — 摘要代理
现在我们的模拟研究已经结束,我们希望获得更多可操作的见解。我们可以创建一个摘要代理来支持我们完成这项任务,并在问答场景中使用它。这里要小心的是,非常大的转录本需要一个支持更大输入(上下文窗口)的语言模型。
我们需要抓取之前模拟小组讨论中的所有对话,作为用户提示(输入)发送给我们的摘要代理。
# 获取群聊中对用户提示
消息的响应 = [msg[ “content” ] for msg in groupchat.messages]
user_prompt = “这是研究 “`{customer_insights}“` 的记录。格式(customer_insights= “\n>>>\n” .join(messages))
让我们为摘要代理制作系统提示(说明)——该代理将专注于根据之前的成绩单为我们创建量身定制的成绩单,并为我们提供明确的建议和行动。
# 为摘要代理生成系统提示
summary_prompt = “””
您是行为科学方面的专家研究员,负责总结研究小组。请提供主要发现的结构化摘要,包括痛点、偏好和改进建议。
其格式应基于以下格式:
“`
研究研究:<<标题>>
主题:
<<主题和编号概述,任何其他关键信息>>
摘要:
<<研究摘要,包括详细分析作为导出>>
痛点:
– <<痛点列表 – 尽可能清晰和规范。我期望详细的回应,品牌可以直接使用它来做出改变。每个痛点给出一个简短的段落。>>
建议/行动:
– <<广告列表 – 尽可能清晰和规范。我期望详细的回应,品牌可以直接使用它来做出改变。每个建议给出一个简短的段落。>>
“`
“””
定义摘要代理及其环境— 让我们为摘要代理创建一个迷你环境。这将需要它自己的代理(环境)和启动命令,该命令将拉取转录本(user_prompt)作为输入。
summary_agent = autogen.AssistantAgent(
name = “SummaryAgent”,
llm_config = llm_config,
system_message = summary_prompt + generate_notice(),
)
summary_proxy = autogen.UserProxyAgent(name = “summary_proxy”,
code_execution_config = { “last_n_messages”:2,“work_dir”:“groupchat” },
system_message = “人类管理员。”,
human_input_mode = “终止”
)
summary_proxy.initiate_chat(summary_agent,
message = user_prompt,
)
这为我们提供了以 Markdown 格式的报告卡形式的输出,同时还能够根据调查结果在问答式聊天机器人中提出进一步的问题。
下一步 — 我们还能做什么
这次练习是更大的自主代理架构的一部分,也是我对新型生成式人工智能和代理架构进行的一系列实验的一部分。但是,如果你想继续扩展这项工作和我探索过的一些领域,这里有一些想法:
- 进一步奠定基础——通过与人口普查数据、内部 CRM 数据甚至实时客户记录的联系来创建更具代表性的人物样本。
- 结合多模态——我们现在可以在生成人工智能上将模态与视觉输入相结合,这使得现在可以提供营销材料和网站截图等作为输入,以开始使用视觉刺激进行模拟。
- 让代理访问工具— 提供对其他 API 和工具的访问权限,您可以创建一些独特的体验,例如将个人客户角色代理集成到您的公司 Slack、Teams、Miro 中以标记和回答问题。也许最后的摘要代理可以将一些用户故事加载到您的票务系统中,例如 JIRA?
与我一起塑造用户研究的未来。在 GitHub 上探索该项目,贡献你的见解,让我们一起创新
用户研究的未来
综合用户研究是该领域创新的前沿,融合了技术复杂性和实用效率。它与传统方法有很大不同,为获取消费者洞察提供了一个可控但高度现实的环境。这种方法并非旨在取代传统研究,而是旨在增强和加速发现深度客户洞察。
通过逐步引入自主代理、数字角色和代理框架的概念,这种改进的综合用户研究方法有望使该领域更容易理解。它邀请研究人员和从业者探索这些创新工具在塑造用户研究未来方面的潜力。
原作者:Vincent Koc
原文链接:https://medium.com/ux-planet/why-stakeholders-dont-vibe-with-user-research-a87e3e4cd19a
译者:蒋昌盛
本文由 @蒋昌盛 翻译发布于人人都是产品经理。未经作者许可,禁止转载
题图来自 Unsplash,基于CC0协议
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务
- 目前还没评论,等你发挥!