使用生成式人工智能對定性研究進行深入分析
在用戶研究領(lǐng)域,傳統(tǒng)的研究方法雖然寶貴,但往往面臨可擴展性、資源密集度和訪問不同用戶群體的挑戰(zhàn)。本文將介紹一種創(chuàng)新的用戶研究方法,通過生成式人工智能(AI)創(chuàng)建數(shù)字客戶角色并與之互動,從而獲得對消費者行為和偏好的深入洞察。
用戶研究是驗證針對實際用戶群體的任何假設(shè)的關(guān)鍵組成部分,用于收集有關(guān)消費者行為和偏好的寶貴市場研究。傳統(tǒng)的用戶研究方法雖然非常寶貴,但存在固有的局限性,包括可擴展性、資源密集度以及訪問不同用戶群體的挑戰(zhàn)。本文概述了我們?nèi)绾瓮ㄟ^引入一種新穎的綜合用戶研究方法來克服這些局限性。
在自主代理的幫助下,綜合用戶研究的力量將成為游戲規(guī)則的改變者。通過利用生成式人工智能在模擬研究場景中創(chuàng)建數(shù)字客戶角色并與之互動,我們可以獲得有關(guān)消費者行為和偏好的前所未有的洞察. 將生成式人工智能提示技術(shù)的力量與自主代理相融合。
一、角色提示——模仿他人
在深入研究自主代理之前,讓我們先了解角色或個性提示的概念,其旨在捕捉挫折、行為、目標、性格特征、人口統(tǒng)計等元素。
我們使用提示要求語言模型承擔(dān)具有盡可能多深度背景的角色。我使用以下提示,它可以根據(jù)您的需求進行定制,但也包括各種其他人口統(tǒng)計和行為評估/特征。
角色生成器系統(tǒng)提示示例
您是一位專業(yè)的 ML 研究員和提示工程師。您被要求創(chuàng)建一個提示,該提示可用于模擬特定品牌和服務(wù)的虛構(gòu)用戶。此提示需要包括人員姓名、年齡、人口統(tǒng)計、個性(包括大五和 DISC)、性格特征、挫折、價值觀、目標、挑戰(zhàn)以及基于上下文的任何其他相關(guān)信息 — 盡可能詳細。您將生成以“您是”開頭的一行提示。此提示適用于澳大利亞悉尼一家大型超市的顧客。請僅返回要使用的提示。
語言模型的示例輸出
你是米婭,一位 34 歲的營銷經(jīng)理,住在澳大利亞悉尼。你屬于富裕的城市人口,對健康和可持續(xù)發(fā)展有著濃厚的興趣。你的性格反映出高度開放、認真和隨和,具有中等程度的外向性和低神經(jīng)質(zhì)。在 DISC 評估中,你的影響力和穩(wěn)定性得分很高。你善于交際、注重細節(jié)、重視和諧。你的主要煩惱包括超市缺乏有機和本地采購的產(chǎn)品,你高度重視可持續(xù)性、社區(qū)和健康。你的目標是保持平衡和環(huán)保的生活方式,而你的挑戰(zhàn)包括找到符合你的道德和健康標準的超市。你追求便利,但又不損害你的價值觀。
正如上面的提示示例所見,我們能夠針對給定場景快速生成具有豐富個性的深度定義的合成用戶。
二、將自主代理與數(shù)字角色融合
合成用戶研究的核心是自主代理與合成角色(模仿人類互動和行為的模擬實體)的融合。想象一下,自主代理是復(fù)雜游戲中的個體,每個代理都扮演由生成式人工智能精心打造的角色。這些角色在模擬環(huán)境中互動,提供對不同場景中消費者行為和偏好的洞察的模擬視圖。使用自主代理,我們幾乎能夠在模擬中將這些角色變?yōu)楝F(xiàn)實。
這種結(jié)合技術(shù)(自主代理框架)和語言(個性和角色提示)來獲得預(yù)期結(jié)果的方法是利用生成式人工智能自主代理的力量以獨特方式實現(xiàn)的眾多先進方法之一。
三、代理框架的關(guān)鍵作用
為了將這一愿景變?yōu)楝F(xiàn)實,自主代理的架構(gòu)起著關(guān)鍵作用。Autogen 、BabyAGI和CrewAI等框架簡化了 AI 代理的創(chuàng)建和管理,抽象了其架構(gòu)的復(fù)雜性。這些框架能夠模擬復(fù)雜的人類行為和交互,為生成像真實客戶一樣行動、思考和響應(yīng)的數(shù)字角色奠定了基礎(chǔ)
這些自主代理架構(gòu)的底層是真正的智能路由器(如交通控制器),它在現(xiàn)有的大型語言模型之上具有提示、緩存(內(nèi)存)和檢查點(驗證),從而允許使用語言模型對多代理對話進行高級抽象。
我們將使用 Autogen(由 Microsoft 發(fā)布)作為我們的框架,利用被描述為靈活對話模式的示例,代理可以通過該模式相互交互。還可以為代理提供“工具”來執(zhí)行“任務(wù)”,但在這個示例中,我們將只關(guān)注對話。
四、創(chuàng)建復(fù)雜的交互
在這些數(shù)字環(huán)境中模擬復(fù)雜的群體動態(tài)和個人角色的能力至關(guān)重要。它允許生成豐富、多方面的數(shù)據(jù),更準確地反映現(xiàn)實世界消費者群體的多樣性。這種能力對于理解不同客戶群體與產(chǎn)品和服務(wù)互動的不同方式至關(guān)重要。例如,將持懷疑態(tài)度的客戶的角色提示與代理相結(jié)合,可以深入了解各種產(chǎn)品可能面臨的挑戰(zhàn)和反對意見。或者我們可以做更復(fù)雜的場景,比如將這些合成角色分成幾組來解決問題并進行反饋。
如何實施綜合用戶研究
該過程首先使用 Autogen 搭建自主代理,Autogen 是一種簡化這些數(shù)字角色的創(chuàng)建和編排的工具。我們可以使用 py 安裝 autogen pypi 包
pip 安裝 pyautogen
格式化輸出(可選)?——這是為了確保根據(jù)您的 IDE 自動換行以提高可讀性,例如當(dāng)使用 Google Collab 運行您的筆記本進行本練習(xí)時。
從IPython.display導(dǎo)入HTML,顯示
def set_css ():
display(HTML( ”’
<style>
pre {
white-space: pre-wrap;
}
</style>”’ ))
get_ipython().events.register( ‘pre_run_cell’ , set_css)
現(xiàn)在我們繼續(xù)通過導(dǎo)入包并設(shè)置 Autogen 配置來設(shè)置環(huán)境——以及我們的 LLM(大型語言模型)和 API 密鑰。您可以使用與 OpenAI REST 服務(wù)向后兼容的服務(wù)來使用其他本地 LLM——?LocalAI是一種可以充當(dāng)您本地運行的開源 LLM 的網(wǎng)關(guān)的服務(wù)。
gpt-3.5-turbo我已經(jīng)在 OpenAI 的 GPT3.5和 GPT4上對此進行了測試gpt-4-turbo-preview。您需要考慮 GPT4 的更深層次的響應(yīng),但查詢時間會更長。
導(dǎo)入json
導(dǎo)入o??s
導(dǎo)入autogen
從autogen導(dǎo)入GroupChat、Agent
從typing導(dǎo)入 可選
# 設(shè)置 LLM 模型和 API 密鑰
os.environ[ “OAI_CONFIG_LIST” ] = json.dumps([
{
‘model’ : ‘gpt-3.5-turbo’ ,‘api_key’ : ‘<<將您的 Open-AI 密鑰放在這里>>’ ,
}
])# 設(shè)置 autogen 的配置
config_list = autogen.config_list_from_json(
“OAI_CONFIG_LIST” ,
filter_dict={
“model” : {
“gpt-3.5-turbo”
}
})
然后我們需要配置我們的 LLM 實例— 我們將把它綁定到每個代理。如果需要,這允許我們?yōu)槊總€代理生成唯一的 LLM 配置,即如果我們想為不同的代理使用不同的模型。
# 定義 LLM 配置設(shè)置
llm_config = {
# 一致輸出的種子,用于測試。在生產(chǎn)中刪除。
# “seed”:42,
“cache_seed”:None,
# 設(shè)置 cache_seed = None 確保緩存被禁用
“temperature”:0.5,
“config_list”:config_list,
}
定義我們的研究員— 這是在這個模擬用戶研究場景中促進會話的角色。用于該角色的系統(tǒng)提示包括幾個關(guān)鍵內(nèi)容:
- 目的:您的職責(zé)是詢問有關(guān)產(chǎn)品的問題并收集像 Emily 這樣的個人客戶的見解。
- 模擬基礎(chǔ):在開始任務(wù)之前,先細分小組成員名單以及他們發(fā)言的順序,避免小組成員互相交談并產(chǎn)生確認偏差。
- 結(jié)束模擬:對話結(jié)束且研究完成后,請在消息末尾加上“TERMINATE”以結(jié)束研究會話,這是由generate_notice用于對齊各個代理的系統(tǒng)提示的功能生成的。您還會注意到,研究代理已設(shè)置is_termination_msg為遵守終止。
我們還添加了llm_config用于將其與語言模型配置(包括要使用的模型版本、鍵和超參數(shù))綁定在一起的配置。我們將對所有代理使用相同的配置。
# 避免代理互相感謝并陷入循環(huán)
# 系統(tǒng)提示的輔助代理
def generate_notice ( role= “researcher” ):
# 針對所有人的基本通知,在此處添加您自己的附加提示
base_notice = (
‘\n\n’
)
# 針對非角色(經(jīng)理或研究員)的通知
non_persona_notice = (
‘不要在回復(fù)中表示感謝,只說必要的話。 ‘
‘如果在對話中說了“謝謝”或“不客氣”,則說 TERMINATE ‘
‘以表示對話已結(jié)束,這是您的最后一條消息。’
)
# 針對角色的自定義通知
persona_notice = (
‘在回復(fù)查詢、提供反饋、征求您的個人意見 ‘
‘或參與討論時充當(dāng){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= “””研究員。您是擁有行為心理學(xué)博士學(xué)位的頂級產(chǎn)品研究員,過去 20 年來一直在研究和洞察行業(yè)工作,與頂級創(chuàng)意、媒體和商業(yè)咨詢公司合作。您的角色是詢問有關(guān)產(chǎn)品的問題,并從像 Emily 這樣的個人客戶那里收集見解。提出問題以發(fā)現(xiàn)客戶的偏好、挑戰(zhàn)和反饋。在開始任務(wù)之前,請分解小組成員名單和您希望他們發(fā)言的順序,避免小組成員互相交談并產(chǎn)生確認偏差。如果會議在結(jié)束時終止,請以簡潔明了的筆記(而不是在開始時)提供研究結(jié)果的摘要。””” + generate_notice(),
is_termination_msg= lambda x: True if “TERMINATE” in x.get( “content” ) else False ,
)
定義我們的個人— 將其投入到研究中,借鑒前面的過程,我們可以使用角色的生成。我手動調(diào)整了本文的提示,以刪除對用于此模擬的主要超市品牌的引用。
我還在每個系統(tǒng)提示的末尾添加了“在回答查詢、提供反饋或參與討論時扮演 Emilygenerate_notice?”風(fēng)格的提示,以確保合成角色繼續(xù)執(zhí)行由該功能生成的任務(wù)。
# Emily – 客戶角色
name = “Emily”
emily = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Emily。您是住在澳大利亞悉尼的一名 35 歲小學(xué)教師。您已婚,有兩個分別為 8 歲和 5 歲的孩子,年收入為 75,000 澳元。您性格內(nèi)向,責(zé)任心強,神經(jīng)質(zhì)程度低,喜歡例行公事。在超市購物時,您更喜歡有機和本地采購的農(nóng)產(chǎn)品。您重視便利性并使用在線購物平臺。由于您工作和家庭承諾的時間有限,您尋求快速而營養(yǎng)的膳食計劃解決方案。您的目標是在預(yù)算范圍內(nèi)購買高質(zhì)量的農(nóng)產(chǎn)品并尋找新的食譜靈感。您是經(jīng)常購物者并使用忠誠度計劃。您首選的溝通方式是電子郵件和移動應(yīng)用程序通知。您在超市購物已有 10 多年,但也會與其他人進行價格比較。””” + generate_notice(name),
)
# John – 客戶角色
name= “John”
john = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””John. 您是澳大利亞悉尼的一名 28 歲軟件開發(fā)人員。您單身,年收入 100,000 澳元。您性格外向,精通技術(shù),并且具有高度的開放性。在超市購物時,您主要購買零食和即食食品,并使用移動應(yīng)用程序快速取貨。您的主要目標是快速便捷的購物體驗。您偶爾會在超市購物,不屬于任何忠誠度計劃。您還會在 Aldi 購物以獲得折扣。您首選的溝通方式是應(yīng)用內(nèi)通知。””” + generate_notice(name),
)
# Sarah – 客戶角色
name= “Sarah”
sarah = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Sarah。您是一名 45 歲的自由記者,住在澳大利亞悉尼。您離異,沒有孩子,年收入 60,000 澳元。您性格內(nèi)向,神經(jīng)質(zhì),非常注重健康。在超市購物時,您會尋找有機農(nóng)產(chǎn)品、非轉(zhuǎn)基因和無麩質(zhì)食品。您的預(yù)算有限,并且有特定的飲食限制。您是??筒⑹褂弥艺\度計劃。您首選的溝通方式是電子郵件通訊。您只購買雜貨。””” + generate_notice(name),
)
# Tim – 客戶角色
name= “Tim”
tim = autogen。助理代理(
名稱=名稱,
llm_config=llm_config,
system_message= “””Tim。您是居住在澳大利亞悉尼的 62 歲退休警察。您已婚,有三個孩子。您的年收入來自養(yǎng)老金,為 40,000 澳元。您非常認真,開放程度較低,喜歡循規(guī)蹈矩。您批量購買面包、牛奶和罐頭食品等主食。由于行動不便,您需要有人幫忙搬運重物。您經(jīng)常購物,并且是老年人折扣計劃的一部分。您首選的溝通方式是直接郵寄傳單。您在這里購物已有 20 多年了。””” + generate_notice(name),
)
# Lisa – 客戶角色
name= “Lisa”
lisa = autogen.AssistantAgent(
name=name,
llm_config=llm_config,
system_message= “””Lisa。您是居住在澳大利亞悉尼的 21 歲大學(xué)生。您單身,從事兼職工作,收入為 1,000 澳元每年 20,000 美元。您性格外向,責(zé)任心不強,重視社交互動。您在這里購買流行品牌、零食和酒精飲料,主要是為了參加社交活動。您的預(yù)算有限,總是在尋找促銷和折扣。您不是常客,但有興趣加入忠誠度計劃。您首選的溝通方式是社交媒體和短信。只要有促銷或促銷活動,您就會去購物。””” + generate_notice(name),
)
定義模擬環(huán)境和誰可以發(fā)言的規(guī)則——我們允許所有已定義的代理坐在同一個模擬環(huán)境(群聊)中。我們可以創(chuàng)建更復(fù)雜的場景,在其中可以設(shè)置如何以及何時選擇和定義下一個發(fā)言者,因此我們?yōu)榕c群聊綁定的發(fā)言者選擇定義了一個簡單的函數(shù),這將使研究人員成為主導(dǎo),并確保我們走遍整個房間,向每個人詢問幾次他們的想法。
# def custom_speaker_selection(last_speaker, group_chat):
# “””
# 自定義函數(shù),用于選擇群聊中接下來發(fā)言的代理。
# “””
# # 不包括最后一位發(fā)言者的代理列表
# next_candidates = [agent for agent in group_chat.agents if agent.name != last_speaker.name]
# # 根據(jù)自定義邏輯選擇下一個代理
# # 為簡單起見,我們只是在這里輪換候選人
# 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]:
“” ”
自定義函數(shù),確保研究人員與每個參與者互動 2-3 次。
在研究人員和參與者之間交替,跟蹤互動。
” “”
# 定義參與者并初始化或更新他們的互動計數(shù)器(
如果 沒有) hasattr(group_chat, ‘interaction_counters’ ):
group_chat.interaction_counters = {agent.name: 0 for agent in group_chat.agents if agent.name != “Researcher” }
# 定義每個參與者的最大互動次數(shù)
max_interactions = 6
# 如果最后一位發(fā)言者是研究員,則找出發(fā)言最少的下一個參與者
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 # 結(jié)束如果所有參與者都達到了最大互動次數(shù),則對話
否則:
# 如果最后一位發(fā)言者是參與者,則返回下一輪的研究員
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
)
定義經(jīng)理來傳遞指令并管理我們的模擬— 當(dāng)我們開始工作時,我們只會與經(jīng)理交談,經(jīng)理將與研究人員和小組成員交談。這使用GroupChatManagerAutogen 中的一種東西。
# 初始化管理器
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config,
system_message= “您是研究經(jīng)理代理,可以管理由研究人員代理和由小組組成的許多人組成的多個代理的群聊。您將限制小組成員之間的討論,并幫助研究人員提出問題。請先詢問研究人員他們希望如何進行小組討論。” + generate_notice(),
is_termination_msg= lambda x: True if “TERMINATE” in x.get( “content” ) else False ,
)
我們設(shè)置了人機交互— 允許我們將指令傳遞給我們已啟動的各個代理。我們給它初始提示,然后就可以開始工作了。
# 創(chuàng)建一個名為“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”
)
# 通過向經(jīng)理發(fā)出指示來開始研究模擬
# 經(jīng)理 <-> 研究員 <-> 小組成員
user_proxy.initiate_chat(
經(jīng)理,
消息 = “”
收集超市雜貨配送服務(wù)的客戶見解。從不同的客戶角色中識別痛點、偏好和改進建議。在與小組分享更多信息和討論之前,請大家給出自己的個人意見。作為研究員,您的工作是確保從參與者那里收集公正的信息,并將本次研究的結(jié)果摘要提供給超市品牌。
“””,
)
一旦我們運行上述程序,我們就會在你的 Python 環(huán)境中獲得實時可用的輸出,你會看到消息在各個代理之間傳遞。
實時 Python 輸出——我們的研究人員與小組成員的交談
創(chuàng)建可操作的結(jié)果 — 摘要代理
現(xiàn)在我們的模擬研究已經(jīng)結(jié)束,我們希望獲得更多可操作的見解。我們可以創(chuàng)建一個摘要代理來支持我們完成這項任務(wù),并在問答場景中使用它。這里要小心的是,非常大的轉(zhuǎn)錄本需要一個支持更大輸入(上下文窗口)的語言模型。
我們需要抓取之前模擬小組討論中的所有對話,作為用戶提示(輸入)發(fā)送給我們的摘要代理。
# 獲取群聊中對用戶提示
消息的響應(yīng) = [msg[ “content” ] for msg in groupchat.messages]
user_prompt = “這是研究 “`{customer_insights}“` 的記錄。格式(customer_insights= “\n>>>\n” .join(messages))
讓我們?yōu)檎碇谱飨到y(tǒng)提示(說明)——該代理將專注于根據(jù)之前的成績單為我們創(chuàng)建量身定制的成績單,并為我們提供明確的建議和行動。
# 為摘要代理生成系統(tǒng)提示
summary_prompt = “””
您是行為科學(xué)方面的專家研究員,負責(zé)總結(jié)研究小組。請?zhí)峁┲饕l(fā)現(xiàn)的結(jié)構(gòu)化摘要,包括痛點、偏好和改進建議。
其格式應(yīng)基于以下格式:
“`
研究研究:<<標題>>
主題:
<<主題和編號概述,任何其他關(guān)鍵信息>>
摘要:
<<研究摘要,包括詳細分析作為導(dǎo)出>>
痛點:
– <<痛點列表 – 盡可能清晰和規(guī)范。我期望詳細的回應(yīng),品牌可以直接使用它來做出改變。每個痛點給出一個簡短的段落。>>
建議/行動:
– <<廣告列表 – 盡可能清晰和規(guī)范。我期望詳細的回應(yīng),品牌可以直接使用它來做出改變。每個建議給出一個簡短的段落。>>
“`
“””
定義摘要代理及其環(huán)境— 讓我們?yōu)檎韯?chuàng)建一個迷你環(huán)境。這將需要它自己的代理(環(huán)境)和啟動命令,該命令將拉取轉(zhuǎn)錄本(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 = { “l(fā)ast_n_messages”:2,“work_dir”:“groupchat” },
system_message = “人類管理員?!保?/p>
human_input_mode = “終止”
)
summary_proxy.initiate_chat(summary_agent,
message = user_prompt,
)
這為我們提供了以 Markdown 格式的報告卡形式的輸出,同時還能夠根據(jù)調(diào)查結(jié)果在問答式聊天機器人中提出進一步的問題。
下一步 — 我們還能做什么
這次練習(xí)是更大的自主代理架構(gòu)的一部分,也是我對新型生成式人工智能和代理架構(gòu)進行的一系列實驗的一部分。但是,如果你想繼續(xù)擴展這項工作和我探索過的一些領(lǐng)域,這里有一些想法:
- 進一步奠定基礎(chǔ)——通過與人口普查數(shù)據(jù)、內(nèi)部 CRM 數(shù)據(jù)甚至實時客戶記錄的聯(lián)系來創(chuàng)建更具代表性的人物樣本。
- 結(jié)合多模態(tài)——我們現(xiàn)在可以在生成人工智能上將模態(tài)與視覺輸入相結(jié)合,這使得現(xiàn)在可以提供營銷材料和網(wǎng)站截圖等作為輸入,以開始使用視覺刺激進行模擬。
- 讓代理訪問工具— 提供對其他 API 和工具的訪問權(quán)限,您可以創(chuàng)建一些獨特的體驗,例如將個人客戶角色代理集成到您的公司 Slack、Teams、Miro 中以標記和回答問題。也許最后的摘要代理可以將一些用戶故事加載到您的票務(wù)系統(tǒng)中,例如 JIRA?
與我一起塑造用戶研究的未來。在 GitHub 上探索該項目,貢獻你的見解,讓我們一起創(chuàng)新
用戶研究的未來
綜合用戶研究是該領(lǐng)域創(chuàng)新的前沿,融合了技術(shù)復(fù)雜性和實用效率。它與傳統(tǒng)方法有很大不同,為獲取消費者洞察提供了一個可控但高度現(xiàn)實的環(huán)境。這種方法并非旨在取代傳統(tǒng)研究,而是旨在增強和加速發(fā)現(xiàn)深度客戶洞察。
通過逐步引入自主代理、數(shù)字角色和代理框架的概念,這種改進的綜合用戶研究方法有望使該領(lǐng)域更容易理解。它邀請研究人員和從業(yè)者探索這些創(chuàng)新工具在塑造用戶研究未來方面的潛力。
原作者:Vincent Koc
原文鏈接:https://medium.com/ux-planet/why-stakeholders-dont-vibe-with-user-research-a87e3e4cd19a
譯者:蔣昌盛
本文由 @蔣昌盛 翻譯發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載
題圖來自 Unsplash,基于CC0協(xié)議
該文觀點僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)
- 目前還沒評論,等你發(fā)揮!