推薦系統(tǒng)架構(gòu)設(shè)計

基于離線訓(xùn)練的推薦系統(tǒng)架構(gòu)

離線訓(xùn)練指使用歷史一段時間(一周或幾周)的數(shù)據(jù)進(jìn)行訓(xùn)練,模型迭代的周期較長(一般以小時為單位)簸喂,模型擬合的是用戶的中長期興趣毙死。基于離線訓(xùn)練的推薦系統(tǒng)常用的算法有LR喻鳄、GBDT、FM

一個典型的基于離線訓(xùn)練的推薦系統(tǒng)由數(shù)據(jù)上報确封、離線訓(xùn)練除呵、在線存儲、實時計算爪喘、AB測試幾個模塊組成颜曾,數(shù)據(jù)上報和離線訓(xùn)練組成監(jiān)督學(xué)習(xí)中的學(xué)習(xí)系統(tǒng),實時計算和AB測試組成預(yù)測系統(tǒng)秉剑,除此之外還有一個在線存儲模塊泛豪,用于存儲模型和模型需要的特征信息實時計算模塊調(diào)用。

數(shù)據(jù)上報 搜集業(yè)務(wù)數(shù)據(jù)組成訓(xùn)練樣本侦鹏,一般分為收集诡曙、驗證、清洗和轉(zhuǎn)換幾個步驟略水。首先收集來自業(yè)務(wù)的數(shù)據(jù)价卤。然后對上報的數(shù)據(jù)進(jìn)行準(zhǔn)確性的驗證,避免上報邏輯錯誤渊涝、數(shù)據(jù)錯位或數(shù)據(jù)缺失等問題慎璧。第三,為了保證數(shù)據(jù)的可信度跨释,需要清理臟數(shù)據(jù)胸私。常見的數(shù)據(jù)清理有:空值檢查毫捣、數(shù)值異常线召、類型異常、數(shù)據(jù)去重等双饥。最后通過數(shù)據(jù)轉(zhuǎn)換蚯姆,講收集的數(shù)據(jù)轉(zhuǎn)換為訓(xùn)練所需要的樣本格式五续,保存到離線存儲模塊洒敏。

離線訓(xùn)練 細(xì)分為離線存儲和離線計算。離線存儲模塊通過分布式文件系統(tǒng)或者存儲平臺來存儲海量用戶行為數(shù)據(jù)疙驾。離線計算常見的操作有:樣本抽樣凶伙、特征工程、模型訓(xùn)練它碎、相似度計算等函荣。樣本抽樣為模型訓(xùn)練提供高質(zhì)量的輸入,首先需要合理定義正負(fù)樣本扳肛,比如通過懲罰權(quán)重和組合等方法并合理設(shè)計正負(fù)樣本來解決正負(fù)樣本不均衡的情況傻挂。同時設(shè)計樣本時應(yīng)盡量保證用戶樣本數(shù)的均衡,對于惡意的刷流量挖息、機(jī)器人用戶金拒,通過樣本去重保證用戶樣本數(shù)的平衡。適當(dāng)考慮樣本多樣性套腹。特征工程對原始特征進(jìn)行轉(zhuǎn)換和組合绪抛,構(gòu)建新的具有業(yè)務(wù)或統(tǒng)計意義的核心特征,通過多模態(tài)embedding等方法將來自用戶电禀、物品和背景的特征向量組合到一起幢码,達(dá)到信息互補(bǔ)。經(jīng)過前面兩步尖飞,模型訓(xùn)練利用給定的數(shù)據(jù)集通過訓(xùn)練得到一個模型症副,用戶描述輸入和輸出變量之間的映射關(guān)系≌考慮到要處理大規(guī)模的訓(xùn)練集贞铣,一般選擇可以分布式訓(xùn)練的近似線性時間的算法。

在線存儲 線上的服務(wù)對時延都有嚴(yán)格的要求腋么,需要推薦系統(tǒng)在幾十毫秒內(nèi)處理完用戶請求返回推薦結(jié)果咕娄,所以針對線上服務(wù)有一個專門的在線存儲模塊,負(fù)責(zé)存儲用于線上的模型和特征數(shù)據(jù)珊擂。一般在線存儲使用本機(jī)內(nèi)存或者分布式內(nèi)存圣勒。為了使在線存儲能夠盡可能地快,在開源軟件的基礎(chǔ)上還可以進(jìn)行一些定制摧扇,比如采用緩存策略圣贸、增量策略、延遲過期策略扛稽,使用固態(tài)硬盤等吁峻。

實時推薦 實時推薦模塊的功能是對來自業(yè)務(wù)的新請求進(jìn)行預(yù)測。在整個過程中,實時計算模塊需要(1)獲取用戶特征用含,根據(jù)請求中的用戶id矮慕,從在線存儲模塊中讀取用戶的畫像以及歷史行為,構(gòu)建出該用戶的模型特征(2)調(diào)用推薦模型啄骇,結(jié)合用戶特征調(diào)用推薦系統(tǒng)的算法模型痴鳄,得到用戶對候選池中每個物品的喜好概率(3)結(jié)果排序,對候選池的打分結(jié)果進(jìn)行排序缸夹,然后返回結(jié)果列表給手機(jī)APP痪寻。實時計算模塊需要從在線存儲模塊讀取很多的數(shù)據(jù),同時需要在很短時間內(nèi)完成大量的模型打分工作虽惭,所以對于該模塊有很高的性能要求橡类。一般來說該模塊需要有一個分布式的計算框架來完成計算任務(wù)。一般常見的做法是將推薦列表生成分為召回和排序兩步芽唇。更進(jìn)一步顾画,在排序得到推薦列表后,為了多樣性和運(yùn)營的一些考慮匆笤,還會加上第三步——重排過濾亲雪,對精排后的推薦列表進(jìn)行處理。重排過濾會給用戶提供一些探索性的內(nèi)容疚膊,避免用戶在平臺上看到的內(nèi)容過于同質(zhì)化而失去興趣,同時過濾掉低俗和違法的內(nèi)容虾标。

在線預(yù)測的幾個階段:召回(分類寓盗,熱度,協(xié)同過濾)→排序(GBDT璧函,LR)→重排過濾(多樣性傀蚌,興趣)

AB測試 一個新的推薦算法上線前一般會經(jīng)過AB測試來測試新算法的有效性

推薦結(jié)果反饋 在數(shù)據(jù)上報模塊搜集的數(shù)據(jù)中,還包括對推薦結(jié)果的反饋蘸吓。

模型更新的robust 大多數(shù)的推薦系統(tǒng)需要在線上提供不間斷的服務(wù)善炫。同時推薦系統(tǒng)例行的模型訓(xùn)練,每天或者每個數(shù)個小時都會更新新的模型库继,為了保證服務(wù)24小時可用箩艺,就要求系統(tǒng)在模型更新的時候仍然能夠正常服務(wù)。程序開發(fā)的時候宪萄,需要在模型計算的時候艺谆,考慮從即使在某些特征缺失或者不匹配的情況下,也能夠最大程度上返回準(zhǔn)確的計算結(jié)果拜英。

海量服務(wù) 對推薦系統(tǒng)的線上服務(wù)需要做到高可靠静汤、高吞吐、低延遲。幾個常見的優(yōu)化方法有:(1)過載保護(hù)虫给,對于突發(fā)的業(yè)務(wù)流量進(jìn)行過載保護(hù)藤抡,防止服務(wù)的雪崩(2)流式計算,通過分布式計算框架應(yīng)對大量在線請求(3)共享內(nèi)存組件抹估,對于一切常用的模型數(shù)據(jù)缠黍,可以考慮放在共享內(nèi)存中,使得在線存儲部分的性能開銷盡可能降低棋蚌。

通用性設(shè)計 將推薦系統(tǒng)通常劃分為四個部分:樣本庫嫁佳、特征庫、算法和模型谷暮。其中蒿往,樣本庫存儲從流水日志中提取的用戶行為和特征。特征庫存儲用戶和物品的屬性等特征湿弦;算法是用于訓(xùn)練模型用到的機(jī)器學(xué)習(xí)算法瓤漏;模型庫存儲的是從樣本和特征計算得到的訓(xùn)練模型。為了不同的算法可以用于不同的樣本和特征颊埃,我們可以使用過一個算法配置表來存儲數(shù)據(jù)蔬充、算法和模型的映射關(guān)系,將模型班利、算法饥漫、樣本和特征的關(guān)系解耦,使得算法可以復(fù)用

用戶畫像 用戶畫像是一個標(biāo)簽化的用戶模型罗标,用于描述用戶的基礎(chǔ)屬性庸队、生活習(xí)性和關(guān)系鏈等信息,對于業(yè)務(wù)了解用戶具有 非常重要的意義闯割,可以幫助大幅的提升推薦的準(zhǔn)確度彻消。

面向深度學(xué)習(xí)的推薦系統(tǒng)架構(gòu)

和傳統(tǒng)的推薦系統(tǒng)相比,面向深度學(xué)習(xí)的推薦系統(tǒng)有著自動提取特征宙拉、建模用戶時序行為和融合多方數(shù)據(jù)源的優(yōu)點宾尚。

面向深度學(xué)習(xí)的推薦系統(tǒng)增加了特征提取和模型服務(wù)兩個模塊。其中特征提取模塊用于從樣本中構(gòu)建特征谢澈,提升模型效果煌贴;模型服務(wù)模塊用于服務(wù)深度學(xué)習(xí)框架的預(yù)測請求,對其進(jìn)行適配澳化〈薏剑總體流程和上面類似:

通過數(shù)據(jù)上報得到的樣本先通過特征提取模塊構(gòu)建特征,然后通過模型訓(xùn)練得到模型缎谷。特征提取模塊得到的特征一方面保存到離線存儲后用于模型訓(xùn)練井濒,一方面存儲到線上存儲用于預(yù)測時調(diào)用灶似。模型預(yù)測流程先由模型服務(wù)模塊拉去模型到線上,再通過AB測試和實時推薦模塊接受來自業(yè)務(wù)的請求瑞你。通過模型服務(wù)模塊得到預(yù)測結(jié)果返回給業(yè)務(wù)酪惭。

特征提取 深度學(xué)習(xí)的最大優(yōu)勢之一,就是能夠通過一種通用的模型學(xué)習(xí)到數(shù)據(jù)的特征者甲,自動獲取到數(shù)據(jù)的高層次表示而不依賴于人工設(shè)計特征春感。針對不同的業(yè)務(wù),特征提取模塊會有不同的任務(wù)虏缸。特征提取模塊利用深度學(xué)習(xí)進(jìn)行特征提取鲫懒,輸入用戶行為、用戶畫像刽辙、物品信息窥岩、背景信息,通過深度學(xué)習(xí)模型得到用戶向量宰缤、物品向量颂翼、背景向量。
特征提取設(shè)計時需要考慮下面兩個問題:首先慨灭,特征生成的流水線需要自動化朦乏,和業(yè)務(wù)定義好數(shù)據(jù)源的接口后,特征提取模塊定期地調(diào)用特征提取任務(wù)生成特征氧骤;其次呻疹,需要由一套特征管理系統(tǒng)對來自不同業(yè)務(wù)、使用不同方法得到的特征進(jìn)行管理筹陵。通過一個特征管理系統(tǒng)诲宇,將特征提取模塊得到的特征注冊到特征庫,這個特征庫負(fù)責(zé)管理原始特征以及各種經(jīng)過特征工程處理后的特征惶翻,每個特征用唯一的特征ID標(biāo)識。在進(jìn)行特征工程的時候鹅心,通過調(diào)用特征ID吕粗,同一份原始特征可以用于不同的特征工程輸入,在模型訓(xùn)練的時候經(jīng)過特征工程處理的謀一份特征又可以被多個算法使用旭愧。

模型服務(wù) 的主要功能是對業(yè)務(wù)請求進(jìn)行預(yù)測颅筋,加載推薦模型進(jìn)行預(yù)測計算,之所以把模型服務(wù)模塊獨立出來输枯,是因為目前的深度學(xué)習(xí)框架往往同時提供了模型預(yù)測服務(wù)的功能议泵。模型服務(wù)提供了加載模型、請求調(diào)用和模型版本管理的功能桃熄。首先先口,加載模型到服務(wù)進(jìn)程,等待請求調(diào)用隆起處提供一個RPC接口,供業(yè)務(wù)方請求碉京;第三厢汹,提供模型版本管理的功能,加載最新的模型版本谐宙,同時在某個版本失敗時提供回滾的功能烫葬。目前較為成熟的方案是tensorflow serving,提供了RPC框架凡蜻、自動模型版本管理等功能

分布式訓(xùn)練 現(xiàn)有的深度學(xué)習(xí)框架導(dǎo)讀提供了分布式計算的框架搭综,使用分布式訓(xùn)練的原因是為了使訓(xùn)練的速度更快,訓(xùn)練的模型更大划栓。如何更新模型的分布式存儲和計算兑巾?目前最常用的解決方案是參數(shù)服務(wù)器,參數(shù)服務(wù)器提供了幾個功能(1)對參數(shù)的分布式存儲(2)提供參數(shù)更新機(jī)制(同步和異步)(3)對參數(shù)的劃分和放置

基于在線訓(xùn)練的推薦系統(tǒng)架構(gòu)設(shè)計

在線訓(xùn)練的推薦系統(tǒng)架構(gòu)適合于廣告和電商等高緯度大數(shù)據(jù)量且對實時性要求很高的場景茅姜∩林欤基于在線訓(xùn)練的推薦系統(tǒng)不區(qū)分訓(xùn)練和測試階段,每個回合都在學(xué)習(xí)钻洒,通過實時的反饋來調(diào)整策略奋姿。一方面在線訓(xùn)練要求其樣本、特征和模型的處理都是實時的素标,以便推薦的內(nèi)容更快地反映用戶實時的喜好称诗。另一方面在線訓(xùn)練并不需要將所有的訓(xùn)練數(shù)據(jù)都存儲下來,所以不需要巨大的離線存儲開銷头遭,使得系統(tǒng)具有很好的伸縮性寓免,可以支持超大的數(shù)據(jù)量和模型。對于數(shù)據(jù)量很大的業(yè)務(wù)場景计维,基于在線訓(xùn)練的推薦系統(tǒng)提高了處理問題規(guī)模的上限袜香,從而能夠帶來更多的收益。

基于在線訓(xùn)練的推薦系統(tǒng)使用的常用的算法有:FTRL-Promimal鲫惶、AdPredictor蜈首、Adaptive Online Learning和PBODL

樣本處理 對于離線訓(xùn)練來說,上報后的數(shù)據(jù)是鮮卑存儲到一個分布式文件系統(tǒng)欠母,然后等待離線計算任務(wù)來對樣本進(jìn)行處理欢策,對于在線訓(xùn)練來說,對樣本的去重赏淌、過濾和采樣等計算都需要實時進(jìn)行踩寇。實時訓(xùn)練對于樣本地正確性、采集質(zhì)量和采樣分布六水,有著更嚴(yán)格的要求俺孙。實際業(yè)務(wù)中上報的數(shù)據(jù)因為種種原因可能會出現(xiàn)數(shù)據(jù)缺失辣卒、冗余和錯報等情況,這就要求樣本處理能夠容忍缺失和錯報鼠冕,以及過濾掉冗余的數(shù)據(jù)添寺。同時對于過于稀疏的數(shù)據(jù)或者噪音數(shù)據(jù),系統(tǒng)會對其進(jìn)行丟棄懈费。另外计露,因為在線學(xué)習(xí)的算法一般都是使用已經(jīng)觀察到的一個數(shù)據(jù)窗口的數(shù)據(jù)來對測試的數(shù)據(jù)進(jìn)行預(yù)測,非常容易過擬合憎乙,所以在樣本處理的時候需要使實時采樣得到的樣本的分布和累計的樣本分布盡量相似票罐, 以避免模型的效果變差。

實時特征 通過實時處理樣本數(shù)據(jù)拼接訓(xùn)練需要的特征構(gòu)造訓(xùn)練樣本泞边,輸入流式訓(xùn)練模塊用于更新模型该押。該模型的主要功能是特征拼接和特征工程。特征拼接對特征進(jìn)行讀取阵谚、選擇蚕礼、組合等操作。首先根據(jù)算法的配置梢什,從樣本中選擇需要的特征奠蹬,從相應(yīng)的存儲接口讀取該特征,將讀取到的用戶嗡午、物品和場景特征拼接在一起囤躁,然后根據(jù)從拼接好特征的樣本中進(jìn)行特征選擇、特征交叉等操作荔睹,并將處理的結(jié)果寫入流處理消息隊列狸演,用于輸出至模型訓(xùn)練和模型評估模塊進(jìn)行流式訓(xùn)練。特征工程按照特征組合規(guī)則僻他,對特征進(jìn)行內(nèi)積宵距、外積和笛卡爾積等操作,構(gòu)造出新的特征吨拗,同時將新的特征和特征庫寫入到特征配置表中消玄。

流式訓(xùn)練 使用實時訓(xùn)練樣本來更新模型,在線訓(xùn)練的優(yōu)勢之一丢胚,是可以支持模型的稀疏存儲。雖然訓(xùn)練使用的特征向量的維度可能是上十億維受扳,但是對于某一個樣本實例來說可能只有幾百個非零值携龟。因此在線訓(xùn)練可以對大規(guī)模的數(shù)據(jù)集進(jìn)行流式訓(xùn)練,每個訓(xùn)練樣本只需要被處理一次勘高。模型方面峡蟋,F(xiàn)TRL-Proximal結(jié)合了OGD(Online Gradient Descent)和RDA(Regularized Dual Averaging)的優(yōu)點坟桅,在準(zhǔn)確度和稀疏性上比這兩個模型都更優(yōu)

模型存儲和加載 模型一般存儲在參數(shù)服務(wù)器中,模型更新后蕊蝗,將模型文件推送到線上存儲仅乓,并由線上服務(wù)模塊動態(tài)加載

基于內(nèi)容的推薦系統(tǒng)架構(gòu)設(shè)計

新聞資訊 因為新聞的時效性要求很高,所以對內(nèi)容的理解非常重要蓬戚。常用的內(nèi)容理解工具有文本分類夸楣、關(guān)鍵詞提取和主題提取等。

視頻音樂 要對視頻和音樂進(jìn)行推薦子漩,首先要對內(nèi)容進(jìn)行理解豫喧,可以通過word2vec等方法將原視頻或音頻表示為一個低維稠密的嵌入向量,然后通過協(xié)同過濾來計算物品之間的相似度用于召回階段幢泼,然后用DNN等算法進(jìn)行精排

廣告購物 針對廣告和購物的場景紧显,很重要的一件事情就是對廣告物品和商品的識別,如果能對物品分類以及廣告詞進(jìn)行OCR識別缕棵,就能夠更好地理解廣告的內(nèi)容孵班,從而產(chǎn)生更精準(zhǔn)的推薦。

推薦系統(tǒng)常用組件

數(shù)據(jù)上報常用組件

Apache Kafka是一個開源的流處理平臺招驴,對實時數(shù)據(jù)源的高吞吐低延遲的統(tǒng)一處理框架

離線存儲常用組件

HDFS是目前使用極為廣泛的分布式文件系統(tǒng)篙程。設(shè)計目標(biāo)是低成本、高可靠性和高吞吐率忽匈。它的容錯機(jī)制使得其可以基于廉價的硬件來構(gòu)建分布式文件系統(tǒng)房午。

離線計算常用組件

Apache Spark是一個基于內(nèi)存數(shù)據(jù)處理的高性能分布式計算框架。

tensorflow

在線存儲常用組件

Redis是一個開源的基于內(nèi)存數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)丹允,它可以用作數(shù)據(jù)庫郭厌、緩存和消息中間件,是目前最常用的key-value數(shù)據(jù)庫之一雕蔽。

Memcached是一種通用的高性能分布式內(nèi)存緩存系統(tǒng)折柠,一般用于將動態(tài)的數(shù)據(jù)緩存到內(nèi)存中幫助提升讀取外部數(shù)據(jù)的速度。

RocksDB是另外一個高性能的key-value數(shù)據(jù)庫批狐,針對多核和固態(tài)硬盤進(jìn)行了優(yōu)化扇售,使其對IO密集的負(fù)載非常友好

模型服務(wù)常用組件

Tensorflow serving可以用于搭建機(jī)器學(xué)習(xí)模型的服務(wù),面向生成環(huán)境設(shè)計嚣艇,靈活而高效承冰,主要特點是自動加載新模型、批量處理請求食零、可水平擴(kuò)展等

實時計算常用組件

Apache Storm是一個開源的分布式實時計算系統(tǒng)困乒,提供了簡單易用的編程模型,使得數(shù)據(jù)的實時流處理變得更簡單贰谣,可以方便對計算拓?fù)溥M(jìn)行管理和擴(kuò)展娜搂。

Spark Streaming是對spark核心API的一個擴(kuò)展迁霎,提供了對實時數(shù)據(jù)流的可擴(kuò)展、高吞吐百宇、高可靠的流處理考廉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市携御,隨后出現(xiàn)的幾起案子昌粤,更是在濱河造成了極大的恐慌,老刑警劉巖因痛,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚苹,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸵膏,警方通過查閱死者的電腦和手機(jī)膊升,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谭企,“玉大人廓译,你說我怎么就攤上這事≌椋” “怎么了非区?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盹廷。 經(jīng)常有香客問我征绸,道長,這世上最難降的妖魔是什么俄占? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任管怠,我火速辦了婚禮,結(jié)果婚禮上缸榄,老公的妹妹穿的比我還像新娘渤弛。我一直安慰自己,他們只是感情好甚带,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布她肯。 她就那樣靜靜地躺著,像睡著了一般鹰贵。 火紅的嫁衣襯著肌膚如雪晴氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天碉输,我揣著相機(jī)與錄音籽前,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛聚假,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闰非,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼膘格,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了财松?” 一聲冷哼從身側(cè)響起瘪贱,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辆毡,沒想到半個月后菜秦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡舶掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年球昨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眨攘。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡主慰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲫售,到底是詐尸還是另有隱情共螺,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布情竹,位于F島的核電站藐不,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秦效。R本人自食惡果不足惜雏蛮,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棉安。 院中可真熱鬧底扳,春花似錦、人聲如沸贡耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲赂。三九已至阱冶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滥嘴,已是汗流浹背木蹬。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留若皱,地道東北人镊叁。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓尘颓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晦譬。 傳聞我的和親對象是個殘疾皇子疤苹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容