在使用者研究領域,傳統的研究方法雖然寶貴,但往往面臨可擴充性、資源密集度和訪問不同用戶群體的挑戰。本文將介紹一種創新的使用者研究方法,通過生成式人工智慧(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( ”’
”’ ))
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’ : ‘<>’ ,}
])
# 設置 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,
}
定義我們的研究員— 這是在這個模擬使用者研究場景中促進會話的角色。用於該角色的系統提示包括幾個關鍵內容:
我們還添加了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 環境中獲得即時可用的輸出,你會看到消息在各個代理之間傳遞。
創建可操作的結果 — 摘要代理
現在我們的類比研究已經結束,我們希望獲得更多可操作的見解。我們可以創建一個摘要代理來支持我們完成這項任務,並在問答場景中使用它。這裡要小心的是,非常大的轉錄本需要一個支援更大輸入(上下文視窗)的語言模型。
我們需要抓取之前類比小組討論中的所有對話,作為使用者提示(輸入)發送給我們的摘要代理。
# 獲取群聊中對使用者提示
消息的回應 = [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 格式的報告卡形式的輸出,同時還能夠根據調查結果在問答式聊天機器人中提出進一步的問題。
下一步 — 我們還能做什麼
這次練習是更大的自主代理架構的一部分,也是我對新型生成式人工智慧和代理架構進行的一系列實驗的一部分。但是,如果你想繼續擴展這項工作和我探索過的一些領域,這裡有一些想法:
與我一起塑造使用者研究的未來。在 GitHub 上探索該專案,貢獻你的見解,讓我們一起創新
使用者研究的未來
綜合使用者研究是該領域創新的前沿,融合了技術複雜性和實用效率。它與傳統方法有很大不同,為獲取消費者洞察提供了一個可控但高度現實的環境。這種方法並非旨在取代傳統研究,而是旨在增強和加速發現深度客戶洞察。
通過逐步引入自主代理、數位角色和代理框架的概念,這種改進的綜合使用者研究方法有望使該領域更容易理解。它邀請研究人員和從業者探索這些創新工具在塑造使用者研究未來方面的潛力。
原作者:Vincent Koc
原文連結:https://medium.com/ux-planet/why-stakeholders-dont-vibe-with-user-research-a87e3e4cd19a
譯者:蔣昌盛
本文由 @蔣昌盛 翻譯發佈於人人都是產品經理。未經作者許可,禁止轉載
題圖來自 Unsplash,基於CC0協定
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供資訊存儲空間服務