使用GPT-3訓(xùn)練一個垃圾短信分類器

圖片

平時我們都會收到很多短信,由于微信等即時通訊工具的普及距误,短信已經(jīng)成為了一個驗證碼接收器宪拥,但是偶爾也有不少垃圾短信,所以對短信進(jìn)行分類和屏蔽是一個很簡單又很重要的需求窃蹋。

目前在AppStroe上有很多實現(xiàn)短信分類的App卡啰,比如《熊貓吃短信》,有需要可以自行下載體驗一下警没。解決這樣的一個簡單的需求的App匈辱,就可以讓App的開發(fā)者賺不少錢,我們可以學(xué)習(xí)一下這種需求用GPT-3如何實現(xiàn)杀迹。

今天這個教程亡脸,我們可以使用GPT-3模型來實現(xiàn)一個垃圾短信分類器,可以做為一個GPT3模型二次開發(fā)訓(xùn)練的簡單的入門練手項目

因為使用成本的原因(訓(xùn)練完成調(diào)用接口仍然需要付費(fèi),而且更貴)浅碾,此方式不適合用于正式的生產(chǎn)環(huán)境大州,僅作為學(xué)習(xí)體驗使用,期待以后會有成本更低更合適的方式及穗。

*如果您沒有開發(fā)基礎(chǔ)也可以了解學(xué)習(xí)訓(xùn)練過程摧茴,再找到有基礎(chǔ)的程序員代為訓(xùn)練 *


圖片

訓(xùn)練數(shù)據(jù)

希望訓(xùn)練什么,就要準(zhǔn)備什么數(shù)據(jù)埂陆,如果想要做一個通用的短信識別那就需要盡可能的廣泛而多的短信樣本苛白,這個案例我們只取一個人的短信來訓(xùn)練,需要的樣本數(shù)量可以很少焚虱,訓(xùn)練出來的模型也會很適用于這個人购裙。

我們從某位同學(xué)手機(jī)上直接導(dǎo)出了一萬條短信(好幾年沒刪),然后隨機(jī)取了500條短信作為樣本進(jìn)行標(biāo)注鹃栽,將短信分成四個簡單的類型:通知短信躏率、垃圾短信、公益短信民鼓、正常短信薇芝,然后將文件保存為.csv格式的文件,放到項目文件夾

分類 短信內(nèi)容
通知短信 【碼上購】【網(wǎng)上營業(yè)廳】您的訂單正在做修改證件操作丰嘉,驗證碼:522348夯到,非本人同意請勿向他人提供驗證碼信息
通知短信 尊敬的客戶:您好!您所反映的問題(工單號:TS00000000000000)已處理完畢饮亏,我司將跟進(jìn)滿意度調(diào)查耍贾,如您收到提示短信,請對我們的服務(wù)給予10分的滿意評價路幸。感謝您的理解和支持荐开!<湖南聯(lián)通10010>
垃圾短信 交費(fèi)、充值更多人選聯(lián)通手機(jī)營業(yè)廳简肴,安全快捷晃听,固定面值本機(jī)交費(fèi)享受9.95折,快來體驗吧砰识!
公益短信 公益短信:4月15日是全民國家安全教育日杂伟。國家安全,人人有責(zé)仍翰!發(fā)現(xiàn)危害國家安全的情況,請撥打舉報電話12339观话,一經(jīng)查實將予獎勵予借。【湖南省國家安全廳】
正常短信 今天上午可以安裝嗎老板

注意事項

  • 樣本數(shù)量最少200條,建議500條以上灵迫,數(shù)據(jù)越多準(zhǔn)確率越高

  • 做分類訓(xùn)練秦叛,每個類型至少有100個樣本,否則會影響準(zhǔn)確率

  • 確保訓(xùn)練的樣本與實際使用的情況是非常相似的瀑粥,否則影響準(zhǔn)確率

  • 如果樣本里面包含敏感信息挣跋,可以用*號或者某某來進(jìn)行脫敏處理,不會影響訓(xùn)練效果

  • 每條樣本添加一個結(jié)束符狞换,比如“###”或者“->"避咆,如果沒有添加,轉(zhuǎn)換工具會問是否需要幫你添加

這里需要注意修噪,我們將短信分為四種查库,并且用中文表示,是方便我們教程測試黄琼,實際使用中樊销,使用數(shù)字代替中文分類,我們將分類換成:

正常短信=1脏款, 通知短信=2围苫, 公益短信=3, 垃圾短信=4

因為模型接口是按token收費(fèi)的撤师,可以理解為按字?jǐn)?shù)收費(fèi)剂府,用數(shù)字就可以節(jié)省一些成本

另外,訓(xùn)練的模型有四種可選丈氓,davinci周循、curie、babbage万俗、ada

其中ada價格最便宜湾笛,性能最好,像這種分類的簡單需求闰歪,使用ada模型就可以了嚎研。

四種模型的價格如下:

模型 訓(xùn)練價格 訓(xùn)練完成調(diào)用價格
Ada $0.0004 / 1K tokens $0.0016 / 1K tokens
Babbage $0.0006 / 1K tokens $0.0024 / 1K tokens
Curie $0.0030 / 1K tokens $0.0120 / 1K tokens
Davinci $0.0300 / 1K tokens $0.1200 / 1K tokens

每1千token,token大概相當(dāng)于字?jǐn)?shù)库倘,一個中文字約為2個token临扮,一條短信大約為140個token,如果我們以ada模型作為訓(xùn)練模型教翩,換算下來杆勇,識別1千條短信大概成本為1.568人民幣。

價格不算便宜饱亿,但是人類歷史上所有有需求但價格昂貴的東西蚜退,最終都會被市場打下來的闰靴。

訓(xùn)練過程

首先安裝最新的openai庫

pip install --upgrade openai

然后導(dǎo)入open的密鑰,可以使用環(huán)境變量導(dǎo)入的方式

export OPENAI_API_KEY="<填你的openai密鑰>" // linux系統(tǒng) 
set OPENAI_API_KEY="<填你的openai密鑰>" // windows系統(tǒng)

GPT-3訓(xùn)練需要將樣本數(shù)據(jù)轉(zhuǎn)換為他們要求的JSONL格式


{"prompt": "輸入的提示", "completion": "輸出的結(jié)果"}
...

{"prompt":"sms: 今天上午可以安裝嗎老板 ->", "completion":" 正常短信"}
……

我們可以使用openai提供的轉(zhuǎn)換工具钻注,來換為符合要求的格式

openai tools fine_tunes.prepare_data -f <樣本文件地址>
openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv

首先將我們csv文件的表頭蚂且,改成 prompt 和 completion,代表輸入和輸出的內(nèi)容幅恋,然后在信息前面加一個標(biāo)志(sms: )杏死,用于區(qū)別正常的內(nèi)容

completion prompt
通知短信 sms:【碼上購】【網(wǎng)上營業(yè)廳】您的訂單正在做修改證件操作,驗證碼:522348捆交,非本人同意請勿向他人提供驗證碼信息淑翼!

處理好csv文件之后,執(zhí)行命令進(jìn)行轉(zhuǎn)換

openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv

其中提示我們一些注意事項零渐,一路點選Y就可以了


(venv) D:\dev2023\openai-tutorial>openai tools fine_tunes.prepare_data -f sms_classifier/sms_sample_500_converted.csv
Analyzing...

- Based on your file extension, your file is formatted as a CSV file
- Your file contains 441 prompt-completion pairs
- Based on your data it seems like you're trying to fine-tune a model for classification
- For classification, we recommend you try one of the faster and cheaper models, such as `ada`
- For classification, you can estimate the expected model performance by keeping a held out dataset, which is not used for training
- All prompts end with suffix ` ##`
- All prompts start with prefix `sms: `
- The completion should start with a whitespace character (` `). This tends to produce better results due to the tokenization we use. See https://beta.openai.com/docs/guides/fine-tuning/preparing-your-dataset for 
more details

Based on the analysis we will perform the following actions:
- [Necessary] Your format `CSV` will be converted to `JSONL`
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: y
- [Recommended] Would you like to split into training and validation set? [Y/n]: y


Your data will be written to a new JSONL file. Proceed [Y/n]: y

Wrote modified files to `sms_classifier/sms_sample_500_converted_prepared_train.jsonl` and `sms_classifier/sms_sample_500_converted_prepared_valid.jsonl`
Feel free to take a look!

Now use that file when fine-tuning:
> openai api fine_tunes.create -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4

After you’ve fine-tuned a model, remember that your prompt has to end with the indicator string ` ##` for the model to start generating completions, rather than continuing with the prompt.
Once your model starts training, it'll approximately take 12.92 minutes to train a `curie` model, and less for `ada` and `babbage`. Queue will approximately take half an hour per job ahead of you.

其中工具會幫我們將樣本分成訓(xùn)練集和測試集窒舟,以便訓(xùn)練完成之后測試訓(xùn)練的效果

同時也提醒我們:

  • 訓(xùn)練完成后,正常的調(diào)用也需要保持與樣本相同的請求格式
  • 如果選擇curie模型诵盼,大概需要12.92分鐘惠豺,如果選擇ada或者babbage模型則更短一些

開始訓(xùn)練

這里我們指定模型為ada:-m ada

指定訓(xùn)練的名稱為:--suffix sms_classifier

(venv) D:\dev2023\openai-tutorial>openai api fine_tunes.create -m ada --suffix "sms_classifier" -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4
Upload progress: 100%|██████████████████████████████████████████| 97.6k/97.6k [00:00<00:00, 95.8Mit/s]
Uploaded file from sms_classifier/sms_sample_500_converted_prepared_train.jsonl: file-HQgXiRZBxwn7In0sUax1WVdj
Upload progress: 100%|██████████████████████████████████████████| 24.3k/24.3k [00:00<?, ?it/s]
Uploaded file from sms_classifier/sms_sample_500_converted_prepared_valid.jsonl: file-gtmsXSjMpmdFowRQ8Hn0FxbX
Created fine-tune: ft-tEt9Oo95zgJ42KJvP4nS8nee
Streaming events until fine-tuning is complete...

(Ctrl-C will interrupt the stream, but not cancel the fine-tune)
[2023-02-14 11:56:00] Created fine-tune: ft-tEt9Oo95zgJ42KJvP4nS8nee

這里提示已經(jīng)創(chuàng)建了一個訓(xùn)練任務(wù),返回了一個任務(wù)ID:ft-zYQQqF1bBvOgiFllSR8R9jvZ

后面我們可以通過這個任務(wù)ID來查詢具體的情況

按Ctrl+C可以中斷輸出任務(wù)訓(xùn)練情況风宁,但不會中斷任務(wù)

如果發(fā)生中斷洁墙,可以使用命令繼續(xù)查看記錄

openai api fine_tunes.follow -i <任務(wù)ID>

等待一會后可以看到已經(jīng)完成了訓(xùn)練


(venv) D:\dev2023\openai-tutorial>openai api fine_tunes.follow -i ft-wHXGw263e8ujLaDHNQGqYB6K
[2023-02-14 13:36:56] Created fine-tune: ft-wHXGw263e8ujLaDHNQGqYB6K
[2023-02-14 13:44:57] Fine-tune costs $0.10
[2023-02-14 13:44:58] Fine-tune enqueued. Queue number: 1
[2023-02-14 13:44:58] Fine-tune is in the queue. Queue number: 0
[2023-02-14 13:45:01] Fine-tune started
[2023-02-14 13:46:10] Completed epoch 1/4
[2023-02-14 13:47:07] Completed epoch 2/4
[2023-02-14 13:48:03] Completed epoch 3/4
[2023-02-14 13:48:59] Completed epoch 4/4
[2023-02-14 13:49:24] Uploaded model: ada:ft-personal:sms-classifier-2023-02-14-05-49-24
[2023-02-14 13:49:25] Uploaded result file: file-SaX4z4avlLH8KXDFM3UyNFoU
[2023-02-14 13:49:25] Fine-tune succeeded

Job complete! Status: succeeded ??
Try out your fine-tuned model:

openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p <YOUR_PROMPT>

可以看到任務(wù)是消耗了$0.10,模型名稱為:ada:ft-personal:sms-classifier-2023-02-14-05-05-31

我們可以輸入一條短信來測試一下結(jié)果戒财,注意格式必須與樣本的格式相同

其中 -M參數(shù)表示限制返回的token長度热监,因為我們只需要返回我們標(biāo)簽分類,所以返回長度1就可以了

(venv) D:\dev2023\openai-tutorial>openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p "sms: 你在哪里###" -M 1
sms: 你在哪里### 1

(venv) D:\dev2023\openai-tutorial>openai api completions.create -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24 -p "sms: 【京東】邀您參與調(diào)研饮寞,有機(jī)會得800京豆孝扛,點 3.cn/1EgRyx-J 回復(fù)TD8退訂###" -M 1          
sms: 【京東】邀您參與調(diào)研,有機(jī)會得800京豆幽崩,點 3.cn/1EgRyx-J 回復(fù)TD8退訂### 4

可以看到模型已經(jīng)能正常識別一些全新的短信并正確分類苦始。

如何應(yīng)用到生產(chǎn)環(huán)境中:

import openai

def model_predict(sms):
    response = openai.Completion.create(
        # 指定要使用的模型:這里使用的是我們訓(xùn)練好的模型
        model="ada:ft-personal:sms-classifier-2023-02-14-05-49-24",
        prompt="""sms: {sms}###""".format(sms=sms),
        temperature=0.6,
        max_tokens=1,
    )
    return response

if __name__ == '__main__':
    sms = "【騰訊云】尊敬的用戶,您好慌申,我是騰訊云技術(shù)顧問陌选。您(賬號ID: 123*****"
    category = {"1": "短信", "2": "通知短信", "3": "公益告短信", "4": " 垃圾短信"}
    response = model_predict(sms)
    print("判斷結(jié)果:", category[response.choices[0].text])

輸出

(venv) D:\dev2023\openai-tutorial>python sms_classifier/test.py  
判斷結(jié)果:通知短信

迭代訓(xùn)練

但是目前準(zhǔn)確率仍然不高,原因有二:

  • 樣本總量不夠多

  • 各分類的樣本數(shù)量不均勻蹄溉,有的太少(不到10條)

為了提高準(zhǔn)確率咨油,我們后續(xù)還可以繼續(xù)整理樣本,對當(dāng)前模型進(jìn)一步進(jìn)行訓(xùn)練柒爵,不需要從頭開始重新訓(xùn)練役电。

同時,繼續(xù)整理新樣本時棉胀,可以先用模型進(jìn)行識別標(biāo)注再人工校對法瑟,可以提高整理速度囱晴。

在創(chuàng)建迭代訓(xùn)練任務(wù)時,增加參數(shù):

-m curie: ft-< org >-< date >

也就是上次訓(xùn)練完成的名稱:ada:ft-personal:sms-classifier-2023-02-14-05-49-24

與上次創(chuàng)建任務(wù)的參數(shù)相同瓢谢,在后面增加參數(shù):

openai api fine_tunes.create -m ada --suffix "sms_classifier" -t "sms_classifier/sms_sample_500_converted_prepared_train.jsonl" -v "sms_classifier/sms_sample_500_converted_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 4 -m ada:ft-personal:sms-classifier-2023-02-14-05-49-24

另外我們還可以對每次的訓(xùn)練結(jié)果進(jìn)行分析,這里需要協(xié)助官方提供的其他工具驮瞧,因篇幅有限這里就不展開聊這個部分氓扛。

更多訓(xùn)練類型與商業(yè)應(yīng)用

GPT-3經(jīng)過訓(xùn)練可以應(yīng)用在很多種場景,可以實現(xiàn)ChatGPT達(dá)不到的效果论笔,可以實現(xiàn)更精準(zhǔn)更強(qiáng)大的商業(yè)應(yīng)用

我們大致規(guī)劃以下可以訓(xùn)練的類型:

內(nèi)容分類器

可以實現(xiàn)對一段內(nèi)容的分類采郎,以下類型都可以用今天這篇教程的方式訓(xùn)練

  1. 短信分類、垃圾郵件分類
  2. 微博博文情緒判斷(消極/積極狂魔、正面/負(fù)面)
  3. 美食評價蒜埋、點評內(nèi)容的分類
  4. 網(wǎng)站留言是否為廣告
  5. 微信群內(nèi)信息是否為廣告/是否為需要重點關(guān)注的信息

結(jié)構(gòu)化信息提取

可以實現(xiàn)對一段內(nèi)容進(jìn)行結(jié)構(gòu)化提取,取出我們想要的重點字段

  1. 簡歷重點信息提取和篩選
  2. IPO招股書最楷、上市公司年報等核心內(nèi)容提取
  3. 從一段求職文本提取重要信息
  4. 快遞地址結(jié)構(gòu)化提取

上下文會話

通過訓(xùn)練對話樣本整份,可以訓(xùn)練一個對話機(jī)器人,實現(xiàn)專用的聊天客服機(jī)器人籽孙。

  1. 公司咨詢客服機(jī)器人
  2. 在線銷售聊天輔助
  3. 語音呼叫應(yīng)答邏輯處理
  4. 心理/法律/醫(yī)療等專業(yè)會話咨詢

信息嵌入查詢

可以通過加載外部數(shù)據(jù)庫烈评,實現(xiàn)更強(qiáng)大的信息查詢功能,在專業(yè)領(lǐng)域進(jìn)行應(yīng)用

  1. 律師文本撰寫:比如輸入案由生成法律條文依據(jù)
  2. 患者病歷診斷犯建,輸入病歷和診斷結(jié)果訓(xùn)練讲冠,從而輔助醫(yī)生判斷病情
  3. 銀行信貸審核,輸入貸款客戶各項信息适瓦,輸出判斷

注意:所有訓(xùn)練樣本都可以脫敏處理竿开,電話、姓名等隱私信息請全部用***號代替玻熙。

訓(xùn)練完之后的模型和數(shù)據(jù)是私有的否彩,只能在你的賬號之下使用。

如果您有以上內(nèi)容的或者可以實現(xiàn)相似功能的樣本揭芍,愿意與我們合作胳搞,可以聯(lián)系我們代為訓(xùn)練,可以在您的賬號之下訓(xùn)練称杨,這項服務(wù)目前不收費(fèi)用肌毅。

本次分享所有的代碼和數(shù)據(jù)集會放在公眾號后,請關(guān)注公眾號并回復(fù):短信分類器 獲取姑原。

ChatGPT正在迅速走紅悬而,全球都在推廣和關(guān)注這個項目,許多人也正在嘗試從中變現(xiàn)獲利锭汛。然而笨奠,他們所采用的方法往往都過于簡單和低門檻袭蝗,如“寫作文”、“寫求職信”等般婆。為了實現(xiàn)更高水平的商業(yè)價值到腥,我們希望嘗試更復(fù)雜,更深度定制的方法蔚袍。例如乡范,我們可以通過收集數(shù)據(jù)庫并進(jìn)行二次訓(xùn)練,比如訓(xùn)練一個適合公司實際情況的客戶服務(wù)的機(jī)器人啤咽。
因此晋辆,我們將在以后逐漸分享我們的研究步驟和操作方法,以幫助那些希望深入了解GPT模型訓(xùn)練的朋友宇整。這樣瓶佳,他們就可以以更低的技術(shù)門檻實現(xiàn)更高級的商業(yè)價值。

我的公眾號:@大鵬學(xué)開發(fā)

我的:aaronpeng2046 加我拉你進(jìn)交流群

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳞青,一起剝皮案震驚了整個濱河市霸饲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盼玄,老刑警劉巖贴彼,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埃儿,居然都是意外死亡器仗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門童番,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精钮,“玉大人,你說我怎么就攤上這事剃斧」煜悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵幼东,是天一觀的道長臂容。 經(jīng)常有香客問我,道長根蟹,這世上最難降的妖魔是什么脓杉? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮简逮,結(jié)果婚禮上球散,老公的妹妹穿的比我還像新娘。我一直安慰自己散庶,他們只是感情好蕉堰,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布凌净。 她就那樣靜靜地躺著,像睡著了一般屋讶。 火紅的嫁衣襯著肌膚如雪冰寻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天皿渗,我揣著相機(jī)與錄音性雄,去河邊找鬼。 笑死羹奉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的约计。 我是一名探鬼主播诀拭,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼煤蚌!你這毒婦竟也來了耕挨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尉桩,失蹤者是張志新(化名)和其女友劉穎筒占,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜘犁,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翰苫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了这橙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏窑。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屈扎,靈堂內(nèi)的尸體忽然破棺而出埃唯,到底是詐尸還是另有隱情,我是刑警寧澤鹰晨,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布墨叛,位于F島的核電站,受9級特大地震影響模蜡,放射性物質(zhì)發(fā)生泄漏漠趁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一哩牍、第九天 我趴在偏房一處隱蔽的房頂上張望棚潦。 院中可真熱鬧,春花似錦膝昆、人聲如沸丸边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妹窖。三九已至纬朝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骄呼,已是汗流浹背共苛。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蜓萄,地道東北人隅茎。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嫉沽,于是被迫代替她去往敵國和親辟犀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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