推薦系統的技術棧

推薦系統是一個非常大的框架,有非常多的模塊在里面,完整的一套推薦系統體系里,不僅會涉及到推薦算法工程師、后臺開發工程師、數據挖掘/分析工程師、NLP/CV工程師還有前端、客戶端甚至產品、運營等支持。我們作為算法工程師,需要掌握的技術棧主要就是在算法和工程兩個區域了,所以這篇文章將會分別從算法和工程兩個角度出發,結合兩者分析當前主流的一些推薦算法技術棧。

首先從推薦系統架構出發,一種分法是將整個推薦系統架構分為召回、粗排、精排、重排、混排等模塊。它的分解方法是從一份數據如何從生產出來,到線上服務完整順序的一個流程。因為在不同環節,我們一般會考慮不同的算法,所以這種角度出發我們來研究推薦系統主流的算法技術棧。

這些模塊的功能主要是:

  • 召回:從推薦池中選取幾千上萬的item,送給后續的排序模塊。由于召回面對的候選集十分大,且一般需要在線輸出,故召回模塊必須輕量快速低延遲。由于后續還有排序模塊作為保障,召回不需要十分準確,但不可遺漏(特別是搜索系統中的召回模塊)。目前基本上采用多路召回解決范式,分為非個性化召回和個性化召回。個性化召回又有content-based、behavior-based、feature-based等多種方式。
  • 粗排:粗拍的原因是有時候召回的結果還是太多,精排層速度還是跟不上,所以加入粗排。粗排可以理解為精排前的一輪過濾機制,減輕精排模塊的壓力。粗排介于召回和精排之間,要同時兼顧精準性和低延遲。一般模型也不能過于復雜
  • 精排:獲取粗排模塊的結果,對候選集進行打分和排序。精排需要在最大時延允許的情況下,保證打分的精準性,是整個系統中至關重要的一個模塊,也是最復雜,研究最多的一個模塊。精排系統構建一般需要涉及樣本、特征、模型三部分。
  • 重排:獲取精排的排序結果,基于運營策略、多樣性、context上下文等,重新進行一個微調。比如三八節對美妝類目商品提權,類目打散、同圖打散、同賣家打散等保證用戶體驗措施。重排中規則比較多,但目前也有不少基于模型來提升重排效果的方案。
  • 混排:多個業務線都想在Feeds流中獲取曝光,則需要對它們的結果進行混排。比如推薦流中插入廣告、視頻流中插入圖文和banner等??梢曰谝巹t策略(如廣告定坑)和強化學習來實現。

畫像層

首先是推薦系統的物料庫,這部分內容里,算法主要體現在如何繪制一個用戶畫像和商品畫像。這個環節是推薦系統架構的基礎設施,一般可能新用戶/商品進來,或者每周定期會重新一次整個物料庫,計算其中信息,為用戶打上標簽,計算統計信息,為商品做內容理解等內容。其中用戶畫像是大家比較容易理解的,比如用戶年齡、愛好通常APP會通過注冊界面收集這些信息。而商品畫像形式就非常多了,比如淘寶主要推薦商品,抖音主要是短視頻,所以大家的物料形式比較多,內容、質量差異也比較大,所以內容畫像各家的做法也不同,當前比較主流的都會涉及到一個多模態信息內容理解。下面我貼了一個微信看一看的內容畫像框架,然后我們來介紹下在這一塊主要使用的算法技術。

一般推薦系統會加入多模態的一個內容理解。我們用短視頻形式舉個例子,假設用戶拍攝了一條短視頻,上傳到了平臺,從推薦角度看,首先我們有的信息是這條短視頻的作者、長度、作者為它選擇的標簽、時間戳這些信息。但是這對于推薦來說是遠遠不夠的,首先作者打上的標簽不一定準確反映作品,原因可能是我們模型的語義空間可能和作者/現實世界不一致。其次我們需要更多維度的特征,比如有些用戶喜歡看小姐姐跳舞,那我希望能夠判斷一條視頻中是否有小姐姐,這就涉及到封面圖的基于CV的內容抽取或者整個視頻的抽??;再比如作品的標題一般能夠反映主題信息,除了很多平臺常用的用“#”加上一個標簽以外,我們也希望能夠通過標題抽取出基于NLP的信息。還有更多的維度可以考慮:封面圖多維度的多媒體特征體系,包括人臉識別,人臉embedding,標簽,一二級分類,視頻embedding表示,水印,OCR識別,清晰度,低俗色情,敏感信息等多種維度。

這里面涉及的任務主要是CV的目標檢測、語義分割等任務,NLP中的情感分析、摘要抽取、自然語言理解等任務。但是這部分算法一般團隊都會有專門負責的組,不需要推薦算法工程師來負責,他們會有多模態的語意標簽輸出,主要形式是各種粒度的Embedding。我們只需要在我們的推薦模型中引入這些預訓練的Embedding。

文本理解

這應該是用的最多的模態信息,包括item的標題、正文、OCR、評論等數據。這里面也可以產生不同粒度的信息,比如文本分類,把整個item做一個粗粒度的分類。

這里的典型算法有:RNN、TextCNN、FastText、Bert等;

關鍵詞標簽

相比文本分類,關鍵詞是更細粒度的信息,往往是一個mutil-hot的形式,它會對item在我們的標簽庫的選取最合適的關鍵詞或者標簽。

這里典型的算法有:TF-IDF、Bert、LSTM-CRF等。

內容理解

在很多場景下,推薦的主題都是視頻或者圖片,遠遠多于僅推薦文本的情況,這里視頻/圖片item中的內容中除了文本的內容以外,更多的信息其實來源于視頻/圖片內容本身, 因此需要嘗試從多種模態中抽取更豐富的信息。主要包括分類信息、封面圖OCR的信息、視頻標簽信息等

這里典型的算法有:TSN、RetinaFace、PSENet等。

知識圖譜

知識圖譜作為知識承載系統,用于對接內外部關鍵詞信息與詞關系信息;內容畫像會將原關系信息整合,并構建可業務應用的關系知識體系,其次,依賴業務中積累用戶行為產生的實體關系數據,本身用戶需求的標簽信息,一并用于構建業務知識的興趣圖譜,基于同構網絡與異構網絡表示學習等核心模型,輸出知識表示與表達,抽象后的圖譜用于文本識別,推薦語義理解,興趣拓展推理等場景,直接用于興趣推理的冷啟場景已經驗證有很不錯的收益。

這方面的算法有:KGAT、RippleNet等。

召回/粗排

推薦系統的召回階段可以理解為根據用戶的歷史行為數據,為用戶在海量的信息中粗選一批待推薦的內容,挑選出一個小的候選集的過程。粗排用到的很多技術與召回重合,所以放在一起講,粗排也不是必需的環節,它的功能對召回的結果進行個粗略的排序,在保證一定精準的前提下,進一步減少往后傳送的物品數量,這就是粗排的作用。


召回模塊面對幾百上千萬的推薦池物料規模,候選集十分龐大。由于后續有排序模塊作為保障,故不需要十分準確,但必須保證不要遺漏和低延遲。目前主要通過多路召回來實現,一方面各路可以并行計算,另一方面取長補短。可以看到各類同類競品的系統雖然細節上多少存在差異,但不約而同的采取了多路召回的架構,這類設計考慮如下幾點問題:

  1. 考慮用戶層面:用戶興趣的多元化,用戶需求與場景的多元化:例如:新聞需求,重大要聞,相關內容沉浸閱讀等等

  2. 考慮系統層面:增強系統的魯棒性;部分召回失效,其余召回隊列兜底不會導致整個召回層失效;排序層失效,召回隊列兜底不會導致整個推薦系統失效

  3. 系統多樣性內容分發:圖文、視頻、小視頻;精準、試探、時效一定比例;召回目標的多元化,例如:相關性,沉浸時長,時效性,特色內容等等

  4. 可解釋性推薦一部分召回是有明確推薦理由的:很好的解決產品性數據的引入;

介紹了召回任務的目的和場景后,接下來分析召回層面主要的技術棧,因為召回一般都是多路召回,從模型角度分析有很多召回算法,這種一般是在召回層占大部分比例點召回,除此之外,還會有探索類召回、策略運營類召回、社交類召回等。接下來我們著重介紹模型類召回。

經典模型召回

隨著技術發展,在Embedding基礎上的模型化召回是一個技術發展潮流方向。這種召回的范式是通過某種算法,對user和item分別打上Embedding,然后user與item在線進行KNN計算實時查詢最近領結果作為召回結果,快速找出匹配的物品。需要注意的是如果召回采用模型召回方法,優化目標最好和排序的優化目標一致,否則可能被過濾掉。

在這方面典型的算法有:FM、雙塔DSSM、Multi-View DNN等。

序列模型召回

推薦系統主要解決的是基于用戶的隱式閱讀行為來做個性化推薦的問題,序列模型一些基于神經網絡模型學習得到Word2Vec模型,再后面的基于RNN的語言模型,最先用的最多的Bert,這些方法都可以應用到召回的學習中。

用戶在使用 APP 或者網站的時候,一般會產生一些針對物品的行為,比如點擊一些感興趣的物品,收藏或者互動行為,或者是購買商品等。而一般用戶之所以會對物品發生行為,往往意味著這些物品是符合用戶興趣的,而不同類型的行為,可能代表了不同程度的興趣。比如購買就是比點擊更能表征用戶興趣的行為。在召回階段,如何根據用戶行為序列打 embedding,可以采取有監督的模型,比如 Next Item Prediction 的預測方式即可;也可以采用無監督的方式,比如物品只要能打出 embedding,就能無監督集成用戶行為序列內容,例如 Sum Pooling。

這方面典型的算法有:CBOW、Skip-Gram、GRU、Bert等。

用戶序列拆分

上文講了利用用戶行為物品序列,打出用戶興趣 Embedding 的做法。但是,另外一個現實是:用戶往往是多興趣的,比如可能同時對娛樂、體育、收藏感興趣。這些不同的興趣也能從用戶行為序列的物品構成上看出來,比如行為序列中大部分是娛樂類,一部分體育類,少部分收藏類等。那么能否把用戶行為序列物品中,這種不同類型的用戶興趣細分,而不是都籠統地打到一個用戶興趣 Embedding 里呢?用戶多興趣拆分就是解決這類更細致刻畫用戶興趣的方向。

本質上,把用戶行為序列打到多個 embedding 上,實際它是個類似聚類的過程,就是把不同的 Item,聚類到不同的興趣類別里去。目前常用的拆分用戶興趣 embedding 的方法,主要是膠囊網絡和 Memory Network,但是理論上,很多類似聚類的方法應該都是有效的,所以完全可以在這塊替換成你自己的能產生聚類效果的方法來做。

這方面典型的算法有:Multi-Interest Network with Dynamic Routing for Recommendation at Tmall等。

知識圖譜

知識圖譜有一個獨有的優勢和價值,那就是對于推薦結果的可解釋性;比如推薦給用戶某個物品,可以在知識圖譜里通過物品的關鍵關聯路徑給出合理解釋,這對于推薦結果的解釋性來說是很好的,因為知識圖譜說到底是人編碼出來讓自己容易理解的一套知識體系,所以人非常容易理解其間的關系。知識圖譜的可解釋性往往是和圖路徑方法關聯在一起的,而 Path 類方法,很多實驗證明了,在排序角度來看,是效果最差的一類方法,但是它在可解釋性方面有很好的效果,所以往往可以利用知識圖譜構建一條可解釋性的召回通路。

這方面的算法有:KGAT、RippleNet等。

圖模型

推薦系統中User和Item相關的行為、需求、屬性和社交信息具有天然的圖結構,可以使用一張復雜的異構圖來表示整個推薦系統。圖神經網絡模型推薦就是基于這個想法,把異構網絡中包含的結構和語義信息編碼到結點Embedding表示中,并使用得到向量進行個性化推薦。知識圖譜其實是圖神經網絡的一個比較特殊的具體實例,但是,知識圖譜因為編碼的是靜態知識,而不是用戶比較直接的行為數據,和具體應用距離比較遠,這可能是導致兩者在推薦領域表現有差異的主要原因。

這方面典型的算法有:GraphSAGE、PinSage等。

精排

排序模型是推薦系統中涵蓋的研究方向最多,有非常多的子領域值得研究探索,這也是推薦系統中技術含量最高的部分,畢竟它是直接面對用戶,產生的結果對用戶影響最大的一層。目前精排層深度學習已經一統天下了,這是王喆老師《深度學習推薦算法》書中的精排層模型演化線路。具體來看分為DNN、Wide&Deep兩大塊,實際深入還有序列建模,以及沒有提到的多任務建模都是工業界非常常用的,所以我們接下來具體談論其中每一塊的技術棧。

特征交叉模型

在深度學習推薦算法發展早期,很多論文聚焦于如何提升模型的特征組合和交叉的能力,這其中既包含隱式特征交叉Deep Crossing也有采用顯式特征交叉的探究。本質上是希望模型能夠擺脫人工先驗的特征工程,實現端到端的一套模型。

在早期的推薦系統中,基本是由人工進行特征交叉的,往往憑借對業務的理解和經驗,但是費時費力。于是有了很多的這方面的研究,從FM到GBDT+LR都是引入模型進行自動化的特征交叉。再往后就是深度模型,深度模型雖然有萬能近似定理,但是真正想要發揮模型的潛力,顯式的特征交叉還是必不可少的。

這方面的經典研究工作有:DCN、DeepFM、xDeepFM等;

序列模型

在推薦系統中,歷史行為序列是非常重要的特征。在序列建模中,主要任務目標是得到用戶此刻的興趣向量(user interest vector)。如何刻畫用戶興趣的廣泛性,是推薦系統比較大的一個難點,用戶歷史行為序列建模的研究經歷了從Pooling、RNN到attention、capsule再到transformer的順序。在序列模型中,又有很多細分的方向,比如根據用戶行為長度有研究用戶終身行為序列的,也有聚焦當下興趣的,還有研究如何抽取序列特征的抽取器,比如研究attention還是膠囊網絡。

這方面典型的研究工作有:DIN、DSIN、DIEN、SIM等;

多模態信息融合

在上文我們提到算法團隊往往會利用內容畫像信息,既有基于CV也有基于NLP抽取出來的信息。這是非常合理的,我們在逛抖音、淘寶的時候關注的不僅僅item的價格、品牌,同樣會關注封面小姐姐好不好看、標題夠不夠震驚等信息。除此之外,在冷啟動場景下,我們能夠利用等信息不夠多,如果能夠使用多模態信息,能很大程度上解決數據稀疏的問題。

傳統做法在多模態信息融合就是希望把不同模態信息利用起來,通過Embedding技術融合進模型。在推薦領域,主流的做法還是一套非端到端的體系,由其他模型抽取出多模態信息,推薦只需要融合入這些信息就好了。同時也有其他工作是利用注意力機制等方法來學習不同模態之間的關聯,來增強多模態的表示。

比較典型的工作有:Image Matters: Visually modeling user behaviors using Advanced Model Server、UMPR等。

多任務學習

很多場景下我們模型優化的目標都是CTR,有一些場景只考慮CTR是不夠的,點擊率模型、時長模型和完播率模型是大部分信息流產品推薦算法團隊都會嘗試去做的模型。單獨優化點擊率模型容易推出來標題黨,單獨優化時長模型可能推出來的都是長視頻或長文章,單獨優化完播率模型可能短視頻短圖文就容易被推出來,所以多目標就應運而生。信息流推薦中,我們不僅希望用戶點進我們的item,還希望能有一個不錯的完播率,即希望用戶能看完我們推薦的商品?;蛘唠娚虉鼍跋M脩舨粌H點進來,還希望他買下或者加入購物車了。這些概率實際上就是模型要學習的目標,多種目標綜合起來,包括閱讀、點贊、收藏、分享等等一系列的行為,歸納到一個模型里面進行學習,這就是推薦系統的多目標學習。

這方面比較典型的算法有:ESSM、MMoE、DUPN等。

強化學習

強化學習與一般有監督的深度學習相比有一些很顯著的優勢,首先強化學習能夠比較靈活的定義優化的業務目標,考慮推薦系統長短期的收益,比如用戶留存,在深度模型下,我們很難設計這個指標的優化函數,而強化學習是可以對長期收益下來建模。第二是能夠體現用戶興趣的動態變化,比如在新聞推薦下,用戶興趣變化很快,強化學習更容易通過用戶行為動態產生推薦結果。最后是EE也就是利用探索機制,這種一種當前和長期收益的權衡,強化學習能夠更好的調節這里的回報。

這方面比較典型的算法有:DQN、Reinforcement Learning for Slate-based Recommender Systems: A Tractable Decomposition and Practical Methodology;

跨域推薦

一般一家公司業務線都是非常多的,比如騰訊既有騰訊視頻,也有微信看一看、視頻號,還有騰訊音樂,如果能夠結合這幾個場景的數據,同時進行推薦,一方面對于冷啟動是非常有利的,另一方面也能補充更多數據,更好的進行精確推薦。

跨域推薦系統相比一般的推薦系統要更加復雜。在傳統推薦系統中,我們只需要考慮建立當前領域內的一個推薦模型進行分析;而在跨域推薦中,我們更要關心在不同領域間要選擇何種信息進行遷移,以及如何遷移這些信息,這是跨域推薦系統中非常關鍵的問題。

這方面典型的模型有:DTCDR、MV-DNN、EMCDR等;

重排序

我們知道常見的有三種優化目標:Point Wise、Pair Wise 和 List Wise。重排序階段對精排生成的Top-N個物品的序列進行重新排序,生成一個Top-K個物品的序列,作為排序系統最后的結果,直接展現給用戶。重排序的原因是因為多個物品之間往往是相互影響的,而精排序是根據PointWise得分,容易造成推薦結果同質化嚴重,有很多冗余信息。而重排序面對的挑戰就是海量狀態空間如何求解的問題,一般在精排層我們使用AUC作為指標,但是在重排序更多關注NDCG等指標。

重排序在業務中,還會根據一些策略、運營規則參與排序,比如強制去重、間隔排序、流量扶持等,但是總計趨勢上看還是算法排序越來越占據主流趨勢。重排序更多的是List Wise作為優化目標的,它關注的是列表中商品順序的問題來優化模型,但是一般List Wise因為狀態空間大,存在訓練速度慢的問題。這方面典型的做法,基于RNN、Transformer、強化學習的都有,這方面因為不是推薦的一個核心,所以沒有展開來講,而且這一塊比較依賴實際的業務場景。

這里的經典算法有:MRR、DPP、RNN等;

工程

推薦系統的實現需要依托工程,很多研究界Paper的idea滿天飛,卻忽視了工業界能否落地,進入工業界我們很難或者很少有組是做純research的,所以我們同樣有很多工程技術需要掌握。下面列舉了在推薦中主要用到的工程技術:

  • 編程語言:Python、Java(scala)、C++、sql、shell;
  • 機器學習:Tensorflow/Pytorch、GraphLab/GraphCHI、LGB/Xgboost、SKLearn;
  • 數據分析:Pandas、Numpy、Seaborn、Spark;
  • 數據存儲:mysql、redis、mangodb、hive、kafka、es、hbase;
  • 相似計算:annoy、faiss、kgraph
  • 流計算:Spark Streaming、Flink
  • 分布式:Hadoop、Spark

上面那么多技術,我內容最重要的就是加粗的三部分,第一是語言:必須掌握的是Python,C++和JAVA中根據不同的組使用的是不同的語言,這個如果沒有時間可以等進組后慢慢學習。然后是機器學習框架:Tensorflow和Pytorch至少要掌握一個吧,前期不用糾結學哪個,這個遷移成本很低,基本能夠達到觸類旁通,而且面試官不會為難你只會這個不會那個。最后是數據分析工具:Pandas是我們處理單機規模數據的利器,但是進入工業界,Hadoop和Spark是需要會用的,不過不用學太深,會用即可。

總結

本文從算法和工程兩個角度分析了推薦系統的一個技術棧,但是還有很多方向遺漏,也有很多方向受限于現在的技術水平深度不夠和有錯誤的情況,后續會不斷補充和更正。

所以技術棧我列出的是一個非常廣度的技術,實際上每一個技術鉆研下去都需要非常多時間,而且不一定是你實際工作中會遇到的,所以不要被那么多技術嚇到,也要避免陷入技術細節的海洋中。

我和非常多的大廠面試官討論過技術深度和廣度的問題,得出來的結論是對于入門的推薦算法工程師而言,實際上深度和廣度的要求取決于你要去的組,有些組有很深的推薦技術沉淀,有很強的工程師團隊,這樣的組就會希望候選者能夠在某個方面有比較深入的研究,這個方面既包含工程方面也包含研究方面。但是如果是比較新的組、或者技術沉淀不深、推薦不是主要任務的組,對深度要求就不會很高??偠灾艺J為對于應屆生/實習生來說,在推薦最重要的工程技術/研究方向,至少在召回和排序模塊,需要選一個作為方向,是需要較深鉆研。對于其他技術/研究方向需要有一定了解,比如可以沒用過強化學習,但是要知道強化學習能夠在推薦中解決什么問題,剩下的可以等到真實遇到需要后再去學習。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容