在世界百年未有之變局與個人自暴自棄的間隙中,我們學一點RAG义锥。 RAG是一種獨特的應用岩灭,“一周寫demo噪径,優(yōu)化搞半年”,我甚至聽說它能破解幻術梗顺。
為了理解其優(yōu)化中的關鍵一環(huán),我們先看下文本向量寺谤。文本向量除了是RAG檢索的重要模塊外变屁,也應用在信息檢索薄料、排序摄职、分類、聚類蛔垢、語義相似度中。
1. 詞向量到文本向量
向量模型把人類世界中的語言,變?yōu)橛嬎銠C世界中的數(shù)字艺玲。輸入一句話饭聚,輸出一維向量。由于transformer中的一句話一般會輸出一個二維向量法绵,其形狀為(sequence_length, embedding_dim)朋譬,因此模型后面通常加一層pooling兴垦,把sequence_length這一維坍塌探越。
pip install open-retrievals
colab上有這段小小的代碼: https://colab.research.google.com/drive/1dTzcMJNX3kSqqjTFUJXwZu6fRnf_5oHD?usp=sharing
更多更好的模型,根據(jù)語言需要(英文或中文還是多語言)节槐,順著MTEB的榜單捋一下就行:https://huggingface.co/spaces/mteb/leaderboard
2. 文本向量的若干主流訓練范式
語言模型可以很容易得到一個文本向量模型拐纱,但語言模型并不是為向量訓練的秸架,因此預訓練的語言模型直接pooling不一定能取得滿意的效果。那么蚂子,根據(jù)向量任務先微調(diào)一下再用。
微調(diào)的目的蒂破,把相似句子向量聚攏更近一些别渔,把不相關的句子向量拉的更遠一些哎媚。如何從一個語言模型訓練出一個向量模型呢?我們從幾篇典型論文中理解其范式稻据。
BGE模型
- 使用普通的文本語料進行RetroMAE預訓練
- 使用大量文本對進行batch內(nèi)負樣本對比學習
- 使用高質(zhì)量文本進行困難負樣本加batch內(nèi)負樣本根據(jù)任務對比學習微調(diào)
GTE模型
- 大量文本對進行batch內(nèi)負樣本對比學習
- 高質(zhì)量文本進行困難負樣本學習
E5-mistral模型
- 合成大量的不同任務不同語言的檢索數(shù)據(jù),困難負樣本與batch內(nèi)負樣本對比學習
nv-embed模型
- 高質(zhì)量檢索數(shù)據(jù)進行困難負樣本加batch內(nèi)負樣本對比學習
- 繼續(xù)根據(jù)非檢索數(shù)據(jù)秋度,如一些分類等其他任務數(shù)據(jù)進行微調(diào)
3. 結論
我們試圖從幾種范式中總結出以下幾點認知:
- 訓練方式荚斯,尤其是合理設計的多階段pipeline仍然能夠提升性能
- 數(shù)據(jù)事期,數(shù)據(jù)大小兽泣、質(zhì)量唠倦、多樣性很重要稠鼻,甚至更長的文本在向量模型中也更受重視候齿。更重要的慌盯,合成數(shù)據(jù)開始展露頭腳
- 模型润匙,Decoder-only LLM微調(diào)的向量模型效果越來越好诗眨。大模型也逐步統(tǒng)治向量模型榜單,帶來的收益和增加的開銷相比如何孕讳,咱也不知道匠楚,但是這些參數(shù)中蘊含的知識確實讓人印象深刻
- 對比學習和難負樣本挖掘仍然扮演關鍵角色。
- 多任務厂财,用不同任務不同來源的數(shù)據(jù)進行訓練芋簿,一個batch內(nèi)如何組織數(shù)據(jù)也有優(yōu)化空間。instruction-based fine-tuning可以在訓練時幫助模型拿到任務上的線索
更多內(nèi)容璃饱,請關注:https://github.com/LongxingTan/open-retrievals