用戶畫(huà)像實(shí)踐:神策標(biāo)簽生產(chǎn)引擎架構(gòu)
點(diǎn)擊上方“數(shù)據(jù)管道”,選擇“置頂星標(biāo)”公眾號(hào)
干貨福利,第一時(shí)間送達(dá)

分享嘉賓:王琛@神策數(shù)據(jù)
編輯整理:馮露
出品平臺(tái):DataFunTalk
用戶標(biāo)簽及其應(yīng)用場(chǎng)景
標(biāo)簽生產(chǎn)平臺(tái)的需求
批流一體的標(biāo)簽生產(chǎn)架構(gòu)
總結(jié)
1.?什么是用戶標(biāo)簽

簡(jiǎn)單說(shuō),就是對(duì)用戶的某個(gè)維度特征的描述。對(duì)一群用戶而言,我們?yōu)榱四茏寴I(yè)務(wù)做的更好,就想知道他們的很多特征。比如說(shuō),我現(xiàn)在有個(gè)10萬(wàn)塊錢(qián)的活動(dòng)預(yù)算,那這個(gè)錢(qián)應(yīng)該集中花在哪里呢?針對(duì)這個(gè)問(wèn)題,我們希望對(duì)給定的用戶群體,能知道他們的商業(yè)價(jià)值,對(duì)他們的商業(yè)價(jià)值有一個(gè)很好的描述。知道里面哪些人才是我們重點(diǎn)要服務(wù)的對(duì)象。
2.?用戶標(biāo)簽的應(yīng)用價(jià)值

用戶標(biāo)簽的應(yīng)用主要是四種場(chǎng)景:
用戶特征洞察:
輔助用戶分析和用戶洞察,用戶標(biāo)簽可以幫助業(yè)務(wù)人員快速的對(duì)用戶有一個(gè)認(rèn)知,然后發(fā)現(xiàn)里面顯著的特征,獲得一些商業(yè)靈感。
增強(qiáng)數(shù)據(jù)分析:
標(biāo)簽還可以豐富數(shù)據(jù)的維度。對(duì)我們的業(yè)務(wù)數(shù)據(jù),有更深層次的對(duì)比分析,而分析洞察得到的靈感以后,可以輔助業(yè)務(wù)落地。
精細(xì)化運(yùn)營(yíng):
一方面,可以將用戶群體,切割成更細(xì)粒度的群組,使得運(yùn)營(yíng)從粗放化到精細(xì)化,用多種不同的手段,不同的渠道去觸達(dá),比如說(shuō)短信、推送、郵件等等,對(duì)于用戶進(jìn)行驅(qū)動(dòng)或召回,從而達(dá)到事半功倍的效果。
數(shù)據(jù)產(chǎn)品應(yīng)用:
另一方面,除了驅(qū)動(dòng)人工的業(yè)務(wù)以外,用戶標(biāo)簽還可以成為其他數(shù)據(jù)產(chǎn)品的基礎(chǔ),比如個(gè)性化推薦系統(tǒng),廣告系統(tǒng),CRM等這些系統(tǒng)。自動(dòng)化的業(yè)務(wù)系統(tǒng)能更有效的利用這些用戶標(biāo)簽,從而發(fā)揮更巨大的威力。
3. 為什么常見(jiàn)的標(biāo)簽體系用不起來(lái)?
用戶標(biāo)簽其實(shí)已經(jīng)不是新概念,十幾年前,就已經(jīng)有各種各樣的標(biāo)簽系統(tǒng),但是在我們這幾年的實(shí)踐過(guò)程中,其實(shí)發(fā)現(xiàn),很多的標(biāo)簽系統(tǒng)在實(shí)際落地的過(guò)程中,都會(huì)多多少少的遇到一些問(wèn)題。這里面主要是兩大類問(wèn)題。

難全面覆蓋:
在創(chuàng)建標(biāo)簽的過(guò)程中,數(shù)據(jù)的提供方希望盡可能滿足各種各樣業(yè)務(wù)的需求,就會(huì)有一些發(fā)散性的構(gòu)思,但是實(shí)際上在操作中很難覆蓋特別的全面,業(yè)務(wù)是一直變化的,不能預(yù)知一年以后這個(gè)業(yè)務(wù)發(fā)展成什么樣子,所以很難覆蓋全。
難落地應(yīng)用:
另外一大類問(wèn)題,業(yè)務(wù)方在使用的時(shí)候,面對(duì)的是成百上千的甚至上萬(wàn)的標(biāo)簽,他們也比較懵,不知道怎么使用,也不知道標(biāo)簽的統(tǒng)計(jì)口徑是什么,用戶分層的切割規(guī)則等等這些,從而導(dǎo)致了不會(huì)用或者不好用,用不起來(lái)。
1.?應(yīng)用驅(qū)動(dòng)的標(biāo)簽構(gòu)建
我們的解決方案其實(shí)是基于標(biāo)簽的應(yīng)用流程,去反向去反推這個(gè)標(biāo)簽體系的構(gòu)思和建設(shè)。

這個(gè)反推,其實(shí)是一個(gè)比較需要業(yè)務(wù)經(jīng)驗(yàn)的事情,根據(jù)我們的經(jīng)驗(yàn),大部分情況下,產(chǎn)品部門(mén)和運(yùn)營(yíng)部門(mén),都會(huì)有一些不同的標(biāo)簽使用方式。比如運(yùn)營(yíng)部門(mén),一般是用于做活動(dòng),他們關(guān)心的問(wèn)題是,怎么樣做一個(gè)活動(dòng)才能夠提高客戶的轉(zhuǎn)化。而產(chǎn)品則是負(fù)責(zé)對(duì)某一個(gè)問(wèn)題提供解決方案,他們需要觀察的是客戶的特征,去決定如何設(shè)計(jì)才能解決大多數(shù)的問(wèn)題。
2.?根據(jù)標(biāo)簽的使用目的,體系化梳理標(biāo)簽
總體來(lái)說(shuō),無(wú)論是產(chǎn)品還是運(yùn)營(yíng),我們都把它叫做業(yè)務(wù)部門(mén),他們應(yīng)用標(biāo)簽的流程實(shí)際上一般來(lái)講就分三步。

目標(biāo)人群是誰(shuí)?
其實(shí)是一個(gè)戰(zhàn)略性的問(wèn)題,定位的目標(biāo)人群,這里其實(shí)往往應(yīng)該先看,比如說(shuō)商業(yè)價(jià)值類的標(biāo)簽,然后去幫助我們的業(yè)務(wù)人員發(fā)現(xiàn)商業(yè)價(jià)值最大的那個(gè)人群。
他們喜歡什么?
如果目標(biāo)人群是有比較明確的行為數(shù)據(jù)的,比如說(shuō)他們是活躍用戶,這時(shí)候應(yīng)該去看他的用戶偏好類型的這個(gè)標(biāo)簽,比如他喜歡做什么,然后他的興趣愛(ài)好是什么等等這些。
如果目標(biāo)人群行為數(shù)據(jù)比較少,比如說(shuō)他是新用戶,或者是一些靜默用戶,那這個(gè)時(shí)候就應(yīng)該從他們所屬的生命周期標(biāo)簽出發(fā),去計(jì)劃構(gòu)建促進(jìn)轉(zhuǎn)化或者是召回的策略。
如何執(zhí)行策略?
就是我們應(yīng)該做什么,做一個(gè)什么樣的策略,這個(gè)策略怎么落地?然后當(dāng)策略方向有了以后,還需要一些具體的參考信息,比如推送什么時(shí)間發(fā)這種問(wèn)題,需要有一些具體的營(yíng)銷時(shí)機(jī)類的標(biāo)簽,比如說(shuō)用戶一般的活躍時(shí)間段,然后來(lái)幫助整個(gè)計(jì)劃的這個(gè)落地。
3.?標(biāo)簽類型
回到整個(gè)我們的標(biāo)簽平臺(tái)本身,我們認(rèn)為首先作為一個(gè)標(biāo)簽平臺(tái),它需要具有非常靈活的標(biāo)簽創(chuàng)建的能力,從而才能適應(yīng)不斷變化的業(yè)務(wù)需求。
具體來(lái)說(shuō),我們是把需要?jiǎng)?chuàng)建的這個(gè)標(biāo)簽分成了三個(gè)大類。
數(shù)值聚合型標(biāo)簽:
這類的標(biāo)簽就是主要是在用戶維度的數(shù)值計(jì)算,主要是彌補(bǔ)在數(shù)據(jù)采集當(dāng)中未能及時(shí)補(bǔ)全的一些信息。如:每個(gè)?戶最近半年消費(fèi)次數(shù)、最后?次消費(fèi)時(shí)間、近?周消費(fèi)的商品類別
還有一種數(shù)值聚合是實(shí)時(shí)標(biāo)簽,類似這種標(biāo)簽一般都是用于運(yùn)營(yíng)活動(dòng)的受眾的篩選。如:某活動(dòng)開(kāi)始時(shí)間到當(dāng)前時(shí)間,?戶的下單?額
分群標(biāo)簽:
顧名思義就是給一群人,給他們打上一個(gè)標(biāo)簽。
如:將累計(jì)充值?額超過(guò) 10000 元的?戶標(biāo)記為 「?價(jià)值?戶」
如:X運(yùn)營(yíng)活動(dòng)開(kāi)始后,通過(guò)運(yùn)營(yíng)?注冊(cè)下單的?戶,則標(biāo)記為 「X活動(dòng)轉(zhuǎn)化?戶」
狀態(tài)轉(zhuǎn)化標(biāo)簽:
這個(gè)是我們?cè)谖覀兌x里面是邏輯相對(duì)來(lái)說(shuō)比較復(fù)雜的一類標(biāo)簽,這類標(biāo)簽通常來(lái)說(shuō)都是實(shí)時(shí)標(biāo)簽,對(duì)于實(shí)時(shí)性的要求都會(huì)比較高,要求是秒級(jí)分鐘級(jí)的。如:通過(guò)?為來(lái)標(biāo)記新?戶是否為??黨。
另外一類呢就是還有一些比較復(fù)雜的運(yùn)營(yíng)活動(dòng),或者是從控制成本的角度來(lái)做一些運(yùn)營(yíng)活動(dòng)。如:在規(guī)定時(shí)間內(nèi),完成運(yùn)營(yíng)活動(dòng)中的?少 3 項(xiàng)任務(wù),并完成領(lǐng)券下單轉(zhuǎn)化的,則標(biāo)記為「價(jià)格敏感型?戶」。
4.?標(biāo)簽平臺(tái)的技術(shù)需求

靈活可拓展的標(biāo)簽創(chuàng)建規(guī)則:我們需要有非常靈活可擴(kuò)展的標(biāo)簽的規(guī)則的定義。
在有限的資源條件下支持億級(jí)用戶基數(shù)的標(biāo)簽生產(chǎn):在相對(duì)比較有限的條件下,能夠支持相對(duì)比較大的用戶基數(shù)的標(biāo)簽生產(chǎn),需要對(duì)計(jì)算或者存儲(chǔ)方面有比較高的優(yōu)化,對(duì)于系統(tǒng)架構(gòu)來(lái)說(shuō),平臺(tái)的伸縮性和這種適應(yīng)性都會(huì)要求相對(duì)高一些。
離線標(biāo)簽按天更新,實(shí)時(shí)標(biāo)簽秒級(jí)延遲:對(duì)于業(yè)務(wù),我們一般的標(biāo)簽可能是按天更新的,例行標(biāo)簽。另外有一種就是實(shí)時(shí)活動(dòng),計(jì)算的響應(yīng)要求比較高,實(shí)時(shí)標(biāo)簽的計(jì)算要在秒級(jí)之內(nèi)完成,可能秒級(jí)之內(nèi)還要后面做推送,然后觸達(dá)到用戶。?
1.?基礎(chǔ)數(shù)據(jù)流
下面主要講講技術(shù)問(wèn)題,首先,在我們的理解當(dāng)中,標(biāo)簽平臺(tái)是一個(gè)中間層的服務(wù),為前臺(tái)服務(wù)提供一個(gè)數(shù)據(jù)支持,然后另外一方面,標(biāo)簽平臺(tái)它所用到的數(shù)據(jù)其實(shí)是依賴于底層的基礎(chǔ)數(shù)據(jù)平臺(tái)的原始數(shù)據(jù)。

這張圖就展現(xiàn)了神策基礎(chǔ)數(shù)據(jù)流平臺(tái)的架構(gòu)。數(shù)據(jù)流是從左到右的,最左邊是所有的采集的方式,各種SDK采集了數(shù)據(jù)之后,經(jīng)過(guò)數(shù)據(jù)接收系統(tǒng)、導(dǎo)入系統(tǒng)和存儲(chǔ)系統(tǒng),然后查詢系統(tǒng),最后展現(xiàn)。?
2.?簡(jiǎn)化的數(shù)據(jù)模型
在這個(gè)流里,數(shù)據(jù)模型其實(shí)是非常簡(jiǎn)單的,基本會(huì)分成兩大類:用戶行為數(shù)據(jù)、用戶屬性數(shù)據(jù)。

用戶行為表:

其實(shí)是個(gè)寬表,它里面是幾個(gè)常用的維度,主要描述了什么人在什么時(shí)間,做了一件什么事。所以主要字段就是:時(shí)間、用戶ID、事件、渠道、搜索關(guān)鍵詞、商品價(jià)格等。
用戶屬性表:

用戶屬性表,主要描述用戶的屬性情況,相對(duì)變化不大。主要字段有:用戶ID、性別、注冊(cè)渠道、會(huì)員等級(jí)等。
3.?基于有限流的標(biāo)簽計(jì)算
所以在我們的系統(tǒng)里面,首先會(huì)做一套批量離線的標(biāo)簽處理引擎,依賴的是我們底層比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu)。這個(gè)標(biāo)簽引擎一邊讀事件數(shù)據(jù),一邊讀用戶的屬性數(shù)據(jù),再配合上特定的標(biāo)簽規(guī)則,做一個(gè)批量計(jì)算,最后生成用戶標(biāo)簽。

有限流:
Event-User 數(shù)據(jù)可以理解為永不停?的數(shù)據(jù)流。只要業(yè)務(wù)在用,就有不斷的數(shù)據(jù)進(jìn)來(lái)。
批量離線計(jì)算開(kāi)始時(shí),參與計(jì)算的數(shù)據(jù)已完全?庫(kù)。不會(huì)有還沒(méi)有入庫(kù)的數(shù)據(jù)。
在有限流的情況下,數(shù)據(jù)是穩(wěn)定的,計(jì)算具有冪等性,不會(huì)頻繁變化。與之相對(duì)的就是基于無(wú)限流的實(shí)時(shí)計(jì)算標(biāo)簽,在計(jì)算啟動(dòng)的時(shí)刻,數(shù)據(jù)還在源源不斷的進(jìn)來(lái),計(jì)算不具有冪等性。所以批量標(biāo)簽引擎實(shí)際上跟一些離線數(shù)據(jù)倉(cāng)庫(kù)和離線引擎一樣,最核心的兩部分,一個(gè)是調(diào)度器,一個(gè)是計(jì)算引擎。
實(shí)現(xiàn)?式:
使? Impala + HDFS(parquet) 為底層計(jì)算引擎
標(biāo)簽規(guī)則引擎負(fù)責(zé)將標(biāo)簽定義翻譯為?效 SQL
使? impala 分析函數(shù)實(shí)現(xiàn)特定的規(guī)則
通?調(diào)度器負(fù)責(zé)例?任務(wù)的調(diào)度
4.?非實(shí)時(shí)標(biāo)簽數(shù)據(jù)存儲(chǔ)格式

數(shù)據(jù)存儲(chǔ)方面,我們采取的方式是每個(gè)標(biāo)簽都存一張物理的表,以時(shí)間作為分區(qū),因?yàn)殡x線計(jì)算一般都是按天調(diào)度的,所以就按天存儲(chǔ),每日的結(jié)果存為一個(gè)partition,然后這個(gè)partition下面存的都是parquet類型的文件,并且用gzip來(lái)壓縮。我們這個(gè)單表里面每一行是一個(gè)用戶的ID,然后后面有一列跟的是它的這個(gè)標(biāo)簽的值,在這種結(jié)構(gòu)下用gzip一壓,其實(shí)壓縮比還是比較高的,比較可觀。
5.?標(biāo)簽寬表加速查詢

每個(gè)標(biāo)簽存一張物理表,其實(shí)也是有比較大的問(wèn)題。這個(gè)表雖然在數(shù)據(jù)更新的時(shí)候很好處理,能夠保持更新時(shí)的數(shù)據(jù)的一致性,但是對(duì)于查詢端其實(shí)并不是很友好,尤其是在做多條件過(guò)濾的時(shí)候,需要將底層的多張表進(jìn)行 join 操作,計(jì)算代價(jià)很大。為了提高性能,我們?cè)诤笈_(tái)會(huì)有一個(gè)例行任務(wù),定時(shí)將這些已經(jīng)固化下來(lái)的標(biāo)簽編號(hào),把它合并成一張寬表,主要依據(jù)標(biāo)簽的離線計(jì)算,基本上每天都更新一次,更新完了以后這個(gè)數(shù)據(jù)基本上就固定保持穩(wěn)定了。
標(biāo)簽單表:
數(shù)據(jù)更新代價(jià)低,可保證數(shù)據(jù)?致性
問(wèn)題:查詢需要多張表 join,性能堪憂?
標(biāo)簽寬表的實(shí)現(xiàn)?式:
標(biāo)簽寬表是?個(gè)所有單表 join 的 view
每當(dāng)單表數(shù)據(jù)更新時(shí),更新該 view
定時(shí)將 view 固化為物理表
遺留問(wèn)題:parquet 在列數(shù)過(guò)多的情況下,性能會(huì)有所下降
6.?用bitmap優(yōu)化人群篩選
另外就是使用bitmap來(lái)做人群篩選優(yōu)化,部分標(biāo)簽值所對(duì)應(yīng)的?群使?頻次更?,如「?價(jià)值?戶」、「活躍?戶」等。使?標(biāo)簽篩選?戶,可以理解成針對(duì)?群包的集合操作。
bitmap 過(guò)濾的實(shí)現(xiàn)?式:
將標(biāo)簽值對(duì)應(yīng)的?群包構(gòu)建 RoaringBitmap
?群篩選時(shí),先通過(guò) bitmap 的交并差運(yùn)算得到過(guò)濾?的 bitmap
impala 使? bitmap 做最終的過(guò)濾器,得到?群包(包含太多元素的 bitmap 體積太?,反?影響效率)
7.?基于無(wú)限流的標(biāo)簽計(jì)算

大部分業(yè)務(wù)場(chǎng)景實(shí)際上是離線的部分就能滿足了,實(shí)時(shí)的部分主要是要滿足一些運(yùn)營(yíng)活動(dòng)的一些需求。我們這個(gè)實(shí)時(shí)標(biāo)簽引擎其實(shí)也并不復(fù)雜,輸入的數(shù)據(jù)就是我們實(shí)時(shí)流的事件數(shù)據(jù),根據(jù)標(biāo)簽規(guī)則,還有用戶屬性,用戶標(biāo)簽對(duì)他做在線的一個(gè)計(jì)算,從而輸出的是一個(gè)標(biāo)簽狀態(tài)的變更,最后得到這個(gè)標(biāo)簽結(jié)果。
8.?實(shí)時(shí)標(biāo)簽引擎
實(shí)現(xiàn)?式:
實(shí)時(shí)標(biāo)簽計(jì)算使? Flink
Flink job 監(jiān)聽(tīng) Kafka 的 event topic,計(jì)算由事件觸發(fā)
計(jì)算過(guò)程就是實(shí)現(xiàn)?個(gè)狀態(tài)機(jī)
計(jì)算的中間狀態(tài)存儲(chǔ)在 Flink State 和 KV 存儲(chǔ)中
實(shí)時(shí)計(jì)算能使?的離線標(biāo)簽,需要先訂閱到 KV 存儲(chǔ)中
標(biāo)簽結(jié)果輸出到 Kafka 的 tag topic
9.?批流一體的架構(gòu)

整體的架構(gòu)就像這張圖一樣,在我們的標(biāo)簽管理控制臺(tái)這一層,其實(shí)是對(duì)標(biāo)簽規(guī)則做了一個(gè)劃分,在這里會(huì)識(shí)別當(dāng)前要算的這個(gè)標(biāo)簽,到底是一個(gè)離線標(biāo)簽還是一個(gè)實(shí)時(shí)標(biāo)簽比較好?如果它是實(shí)時(shí)標(biāo)簽,它要對(duì)哪些離線標(biāo)簽進(jìn)行訂閱,也是在這里處理的。離線標(biāo)簽就做離線的計(jì)算,然后在最下面有一個(gè)數(shù)據(jù)同步服務(wù),會(huì)把離線標(biāo)簽計(jì)算的結(jié)果同步到kv里面,這里面其實(shí)也不會(huì)依賴特別多,我們不會(huì)給他做一些特別復(fù)雜的計(jì)算,然后依賴特別多的數(shù)據(jù),因?yàn)閗v里面也會(huì)有性能問(wèn)題。然后Flink State實(shí)際上是kv存儲(chǔ)的半個(gè)緩存,實(shí)際上計(jì)算由Flink Job來(lái)進(jìn)行。

最后總結(jié)一下,我們所理解的標(biāo)簽平臺(tái),實(shí)際上是以應(yīng)用為目標(biāo)來(lái)構(gòu)建的標(biāo)準(zhǔn)體系。我們認(rèn)為在這個(gè)平臺(tái)里面標(biāo)簽規(guī)則一定是要靈活的,要讓真正做業(yè)務(wù)的技術(shù)小白,也能夠靈活的自主配置,然后能夠自己搭建這個(gè)標(biāo)準(zhǔn)體系,能夠自己改規(guī)則。在技術(shù)層面,標(biāo)簽平臺(tái)它是依賴于底層特別穩(wěn)定的數(shù)據(jù)模型和數(shù)據(jù)流的,然后標(biāo)簽平臺(tái)本身它的技術(shù)架構(gòu)實(shí)際上是批流一體,因?yàn)榕肯鄬?duì)來(lái)說(shuō)計(jì)算性能更高,代價(jià)更小,然后流式是實(shí)時(shí)性更高,兩邊一起組合而成的標(biāo)簽生產(chǎn)體系。
1. 有不少的標(biāo)簽計(jì)算邏輯是相似的,怎么合并這一類的相似標(biāo)簽生產(chǎn),怎么提高效率?
首先我們的邏輯是,只要單個(gè)計(jì)算足夠快,就可以不合并,所以大部分情況優(yōu)化的是單個(gè)計(jì)算的性能。相似標(biāo)簽只在 SQL 級(jí)別做了個(gè)結(jié)果的緩存,但實(shí)際效果還不太明顯。更有效的方式可能是人工介入。
2. 運(yùn)營(yíng)圈人的時(shí)候能否支持實(shí)時(shí)標(biāo)簽和離線標(biāo)簽的整合圈人?
這個(gè)其實(shí)是可以的,我們這個(gè)實(shí)時(shí)標(biāo)簽,它的輸出的結(jié)果實(shí)際上到Kafka里面,Kafka后面的消費(fèi)端是可以把它存到hdfs上的,然后就跟離線標(biāo)簽算出來(lái)的結(jié)果實(shí)際上是一樣,并沒(méi)有什么太多的區(qū)別。
3. 現(xiàn)在的實(shí)時(shí)標(biāo)簽?zāi)壳罢急却蟾哦嗌伲渴遣皇遣煌钠髽I(yè)會(huì)根據(jù)業(yè)務(wù)去做一些調(diào)整?
其實(shí)在系統(tǒng)規(guī)劃里面實(shí)時(shí)標(biāo)簽的占比并不高,或者說(shuō)應(yīng)該是比較低。一方面是從計(jì)算資源的角度來(lái)考慮,實(shí)時(shí)計(jì)算的成本會(huì)比較高。另外也是從需求方面考慮,大部分可以通過(guò)合理規(guī)劃,將部分計(jì)算轉(zhuǎn)為離線 & 實(shí)時(shí)相結(jié)合的方式來(lái)處理。
王琛
神策數(shù)據(jù) |?用戶畫(huà)像研發(fā)部 & 武漢研發(fā)中心負(fù)責(zé)人
加入神策數(shù)據(jù)之前,王琛先生曾任職于百度大數(shù)據(jù)部高級(jí)研發(fā)工程師,參與百度日志平臺(tái)、用戶數(shù)據(jù)倉(cāng)庫(kù)、新日志標(biāo)準(zhǔn)化、Impala 查詢優(yōu)化等項(xiàng)目;曾擔(dān)任百納信息 ( 海豚瀏覽器 ) 研發(fā)總監(jiān)、人工智能實(shí)驗(yàn)室負(fù)責(zé)人。王琛先生有 7 年以上大數(shù)據(jù)從業(yè)經(jīng)驗(yàn),碩士畢業(yè)于英國(guó)愛(ài)丁堡大學(xué)人工智能專業(yè)。
