言模型文本處理核心:分詞與嵌入技術(shù)詳解)
1. 從“字”到“數(shù)”理解LLM處理文本的第一步當(dāng)我們和ChatGPT、Claude或者任何一個(gè)大語(yǔ)言模型對(duì)話時(shí)輸入一段文字它就能理解并生成回復(fù)。這個(gè)看似簡(jiǎn)單的過(guò)程背后第一步就是將我們熟悉的、由字符組成的文本轉(zhuǎn)換成模型能夠“計(jì)算”的數(shù)學(xué)形式。這個(gè)過(guò)程就是分詞與嵌入。你可以把它想象成教一個(gè)只會(huì)做數(shù)學(xué)題矩陣運(yùn)算的超級(jí)大腦去讀一本小說(shuō)。我們得先把小說(shuō)拆成一個(gè)個(gè)有意義的“詞塊”分詞然后給每個(gè)“詞塊”分配一個(gè)獨(dú)一無(wú)二的、富含信息的“身份證號(hào)碼”嵌入向量這樣大腦才能開(kāi)始它的工作。為什么這步如此關(guān)鍵因?yàn)槟P偷暮诵摹猅ransformer架構(gòu)——處理的不是字符而是向量。它通過(guò)計(jì)算向量之間的“注意力”來(lái)理解上下文關(guān)系。如果輸入的“身份證號(hào)碼”質(zhì)量不高或者含義模糊模型的理解就會(huì)出偏差導(dǎo)致“答非所問(wèn)”或“胡言亂語(yǔ)”。因此分詞和嵌入的質(zhì)量直接決定了模型“讀懂”輸入的上限。最近大家熱議的RAG、Agent、微調(diào)等技術(shù)其效果好壞很大程度上都依賴(lài)于底層文本到向量的轉(zhuǎn)換是否精準(zhǔn)。一個(gè)糟糕的分詞器可能會(huì)把專(zhuān)業(yè)術(shù)語(yǔ)切得支離破碎一個(gè)粗糙的嵌入模型可能無(wú)法區(qū)分“蘋(píng)果”水果和“蘋(píng)果”公司。所以無(wú)論你是想深入理解LLM原理還是希望優(yōu)化自己的AI應(yīng)用搞懂這一環(huán)都至關(guān)重要。2. 分詞將連續(xù)文本切割成模型的“單詞”分詞英文叫Tokenization其任務(wù)是把一串連續(xù)的字符序列切分成一系列離散的、有語(yǔ)義的基本單元這些單元被稱(chēng)為T(mén)oken。對(duì)于英文這可能近似于單詞加上標(biāo)點(diǎn)對(duì)于中文則復(fù)雜得多因?yàn)橹形臎](méi)有天然的分隔符。2.1 主流分詞算法與策略目前基于Transformer的LLM普遍采用子詞分詞算法它巧妙地平衡了詞匯表大小和語(yǔ)義粒度。其核心思想是高頻詞保留為整體低頻詞或復(fù)雜詞拆分成更小的、可重用的子詞單元。2.1.1 Byte-Pair Encoding從字節(jié)到子詞的構(gòu)建BPE可以說(shuō)是目前最流行的分詞算法GPT系列、Llama等模型都使用它或其變種。它的工作方式非常直觀像一個(gè)迭代合并的游戲初始化將訓(xùn)練語(yǔ)料中的所有文本拆分成最基本的單元比如UTF-8字節(jié)或字符。例如“hello world”初始化為[‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘ ’ ‘w’ ‘o’ ‘r’ ‘l’ ‘d’]。統(tǒng)計(jì)與合并在整個(gè)語(yǔ)料庫(kù)中統(tǒng)計(jì)所有相鄰符號(hào)對(duì)出現(xiàn)的頻率。找到出現(xiàn)頻率最高的一對(duì)比如(‘l’ ‘l’)在“hello”中出現(xiàn)了(‘l’ ‘d’)在“world”中出現(xiàn)了。假設(shè)(‘l’ ‘l’)頻率最高就將它們合并成一個(gè)新的符號(hào)‘ll’并加入詞匯表。迭代重復(fù)步驟2不斷合并高頻的相鄰符號(hào)對(duì)直到達(dá)到預(yù)設(shè)的詞匯表大小例如5萬(wàn)、10萬(wàn)或合并次數(shù)。這樣做的妙處在于“unhappy”可能會(huì)被拆成[‘un’ ‘happy’]其中‘un’和‘happy’都是高頻子詞可以獨(dú)立用于構(gòu)成“unlikely”、“happiness”等詞。這極大地壓縮了詞匯表同時(shí)保持了構(gòu)詞能力。2.1.2 WordPiece與SentencePieceBPE的變體與擴(kuò)展WordPiece被BERT家族模型采用。它與BPE流程類(lèi)似但合并策略不同。BPE合并最高頻的相鄰對(duì)而WordPiece合并能最大程度提升語(yǔ)言模型概率的相鄰對(duì)。它計(jì)算的是合并后對(duì)整個(gè)語(yǔ)料似然度的增益而不僅僅是頻率。理論上這能產(chǎn)生更“自然”的子詞劃分。SentencePiece這是谷歌推出的一個(gè)開(kāi)源庫(kù)它最大的特點(diǎn)是將文本視為Unicode字符序列無(wú)需預(yù)分詞。對(duì)于中文、日文等沒(méi)有空格的語(yǔ)言這是一個(gè)巨大優(yōu)勢(shì)。它直接在原始字符序列上應(yīng)用BPE或Unigram算法避免了因依賴(lài)空格分詞而引入的偏差。你可以把它理解為一個(gè)語(yǔ)言無(wú)關(guān)的、更純粹的分詞工具。2.1.3 中文分詞的獨(dú)特挑戰(zhàn)與工具英文分詞有空格作為天然界限中文則不然。“南京市長(zhǎng)江大橋”就有多種切分可能。傳統(tǒng)的中文NLP任務(wù)依賴(lài)分詞工具如Jieba、HanLP、PKUSeg等。這些工具基于詞典匹配、統(tǒng)計(jì)模型如HMM、CRF或深度學(xué)習(xí)能較好地進(jìn)行詞語(yǔ)切分。但在LLM時(shí)代情況發(fā)生了變化。像ChatGLM、Qwen、Baichuan這樣的中文大模型通常直接采用基于字的BPE或SentencePiece。例如它們可能將“人工智能”直接按字拆成[‘人’ ‘工’ ‘智’ ‘能’]作為初始單元然后通過(guò)BPE學(xué)習(xí)到[‘人工’ ‘智能’]這樣的高頻組合。這樣做的好處是解決未登錄詞問(wèn)題任何新字都能被拆成單個(gè)字符處理不會(huì)因?yàn)椴辉谠~典而失效。簡(jiǎn)化處理流程無(wú)需依賴(lài)外部分詞工具流程統(tǒng)一。弊端可能會(huì)破壞一些固定短語(yǔ)的完整性對(duì)成語(yǔ)、專(zhuān)有名詞的理解可能不如詞語(yǔ)級(jí)分詞精準(zhǔn)。實(shí)操心得如果你在微調(diào)或部署中文LLM時(shí)遇到生成不連貫或理解偏差不妨檢查一下分詞結(jié)果。用模型的tokenizer對(duì)樣例文本進(jìn)行編碼和解碼看看它到底把句子切成了什么樣。有時(shí)在專(zhuān)業(yè)領(lǐng)域如醫(yī)學(xué)、法律加入一些領(lǐng)域?qū)S忻~作為特殊Token能顯著提升模型在該領(lǐng)域的表現(xiàn)。2.2 分詞器的實(shí)際影響與調(diào)優(yōu)分詞不是一個(gè)透明的過(guò)程它直接影響模型性能和用戶體驗(yàn)。上下文長(zhǎng)度限制模型的上下文窗口如4K、8K、128K限制的是Token的數(shù)量而非字符數(shù)。一個(gè)中文字符可能被編碼成1個(gè)或更多Token取決于分詞器。因此一段1000字的中文文本占用的Token數(shù)可能遠(yuǎn)超1000更容易觸達(dá)窗口上限。計(jì)算Token數(shù)量必須使用模型配套的分詞器而不是簡(jiǎn)單地按字計(jì)數(shù)。生成效率與成本模型生成文本時(shí)是以Token為單位進(jìn)行自回歸預(yù)測(cè)的。分詞粒度越細(xì)生成相同字符內(nèi)容所需的預(yù)測(cè)步驟可能越多影響速度。同時(shí)許多API服務(wù)按Token數(shù)計(jì)費(fèi)低效的分詞會(huì)直接增加成本。信息損失過(guò)于激進(jìn)的分詞可能會(huì)破壞語(yǔ)義單元。例如將“U.S.A”切成[‘U’ ‘.’ ‘S’ ‘.’ ‘A’]就丟失了其作為國(guó)家名稱(chēng)的整體性。如何應(yīng)對(duì)理解你的分詞器使用transformers庫(kù)你可以輕松加載并測(cè)試任何Hugging Face模型的分詞器。from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(meta-llama/Llama-3.2-1B-Instruct) text 大語(yǔ)言模型很有趣。 tokens tokenizer.tokenize(text) # 查看分詞結(jié)果 input_ids tokenizer.encode(text) # 查看對(duì)應(yīng)的ID print(tokens) # 例如[大, 語(yǔ)言, 模型, 很, 有趣, 。] print(len(input_ids)) # 實(shí)際的Token數(shù)量處理長(zhǎng)文本當(dāng)文本超過(guò)上下文窗口時(shí)需要進(jìn)行截?cái)嗷蚧瑒?dòng)窗口處理。關(guān)鍵是確保截?cái)帱c(diǎn)不在一個(gè)完整語(yǔ)義單元的中間這需要根據(jù)分詞結(jié)果進(jìn)行判斷有時(shí)甚至需要回退到字符級(jí)別尋找合適的斷點(diǎn)如句號(hào)、換行符。特殊Token處理分詞器除了詞匯表還定義了一系列特殊Token如[CLS],[SEP],[PAD],[UNK],|endoftext|等。在構(gòu)建輸入時(shí)如問(wèn)答對(duì)、多輪對(duì)話必須正確使用這些Token來(lái)分隔不同部分模型才能理解結(jié)構(gòu)。3. 嵌入為每個(gè)Token賦予“靈魂”的向量表示分詞得到了Token序列和對(duì)應(yīng)的ID如[2301, 3928, 1827, ...]。但這些ID只是索引是離散的、孤立的。嵌入層的作用就是將這些離散的ID映射到連續(xù)的、高維的向量空間中。這個(gè)向量就是該Token的嵌入。你可以把整個(gè)詞匯表想象成一個(gè)巨大的抽屜柜每個(gè)抽屜對(duì)應(yīng)一個(gè)Token ID里放著一個(gè)獨(dú)一無(wú)二的、高維的“屬性向量”。這個(gè)向量不是隨機(jī)的而是在訓(xùn)練過(guò)程中根據(jù)該Token在數(shù)十億文本中出現(xiàn)的上下文學(xué)習(xí)到的語(yǔ)義和語(yǔ)法特征的密集表示。3.1 嵌入層的原理與訓(xùn)練在Transformer模型中嵌入層通常是一個(gè)可訓(xùn)練的查找表其維度為[詞匯表大小V, 隱藏維度D]。例如詞匯表有5萬(wàn)個(gè)Token隱藏維度是4096那么這個(gè)嵌入矩陣就是一個(gè)50000 x 4096的龐大參數(shù)矩陣。前向過(guò)程當(dāng)輸入ID為2301時(shí)模型就從這個(gè)矩陣中取出第2301行一個(gè)4096維的向量作為該Token的初始表示。訓(xùn)練過(guò)程這個(gè)矩陣的數(shù)值是如何來(lái)的它是與模型的其他部分注意力層、前饋網(wǎng)絡(luò)一起訓(xùn)練得到的。訓(xùn)練目標(biāo)是讓模型能夠根據(jù)上下文預(yù)測(cè)下一個(gè)Token或完形填空。在這個(gè)過(guò)程中模型會(huì)不斷調(diào)整每個(gè)Token的向量使得語(yǔ)義相似的Token如“貓”和“狗”在向量空間中的位置接近。有語(yǔ)法關(guān)聯(lián)的Token如“吃”和“食物”也能產(chǎn)生關(guān)聯(lián)。同一個(gè)詞的不同形態(tài)如“run”, “running”, “ran”的向量也彼此相關(guān)。最終這個(gè)高維空間形成了一個(gè)復(fù)雜的“語(yǔ)義地圖”模型所有的“理解”都基于在這個(gè)地圖上的計(jì)算。3.2 位置編碼為序列注入順序信息原始的嵌入向量只包含了Token的語(yǔ)義信息但丟失了它在句子中的位置信息。“貓追老鼠”和“老鼠追貓”的Token集合一樣但含義相反。因此必須向模型注入順序信息。這就是位置編碼的職責(zé)。3.2.1 絕對(duì)位置編碼最經(jīng)典的是Transformer論文中提出的正弦余弦位置編碼。它為序列中的每個(gè)位置pos生成一個(gè)與嵌入維度d_model相同的向量。這個(gè)向量的每個(gè)元素都是由不同頻率的正弦和余弦函數(shù)計(jì)算得出的PE(pos, 2i) sin(pos / 10000^(2i/d_model))PE(pos, 2i1) cos(pos / 10000^(2i/d_model))其中i是維度索引。這種編碼的特點(diǎn)是對(duì)于固定的偏移量kPE(posk)可以表示為PE(pos)的線性函數(shù)這有助于模型學(xué)習(xí)相對(duì)位置關(guān)系。然后將這個(gè)位置編碼向量直接加到對(duì)應(yīng)的Token嵌入向量上。3.2.2 相對(duì)位置編碼與旋轉(zhuǎn)位置編碼絕對(duì)位置編碼在長(zhǎng)文本上可能泛化性不佳。后續(xù)的研究提出了更優(yōu)的方案相對(duì)位置編碼不關(guān)注Token的絕對(duì)位置而是關(guān)注Token對(duì)之間的相對(duì)距離。在計(jì)算注意力分?jǐn)?shù)時(shí)加入一個(gè)與相對(duì)距離相關(guān)的偏置項(xiàng)。這更符合語(yǔ)言的理解邏輯我們更關(guān)心詞與詞之間的關(guān)系而非它們離句子開(kāi)頭有多遠(yuǎn)。旋轉(zhuǎn)位置編碼這是當(dāng)前許多先進(jìn)模型如Llama、GPT-NeoX采用的方法。它不進(jìn)行向量相加而是通過(guò)旋轉(zhuǎn)矩陣對(duì)Query和Key向量進(jìn)行變換。具體來(lái)說(shuō)將嵌入向量的每?jī)蓚€(gè)維度看作一個(gè)復(fù)數(shù)根據(jù)位置信息對(duì)這個(gè)復(fù)數(shù)進(jìn)行旋轉(zhuǎn)。RoPE具有很好的外推性即訓(xùn)練在較短序列上推理時(shí)能一定程度上處理更長(zhǎng)的序列這對(duì)擴(kuò)展上下文窗口至關(guān)重要。注意事項(xiàng)當(dāng)你嘗試對(duì)模型進(jìn)行長(zhǎng)度外推即讓訓(xùn)練時(shí)只見(jiàn)過(guò)2048個(gè)Token的模型處理4096個(gè)Token的文本時(shí)位置編碼往往是最大的瓶頸。正弦編碼或可學(xué)習(xí)的位置嵌入通常外推能力很差會(huì)導(dǎo)致超出訓(xùn)練長(zhǎng)度的位置信息混亂。RoPE在這方面表現(xiàn)更好但也有其極限。這就是為什么“無(wú)損擴(kuò)展上下文窗口”成為當(dāng)前一個(gè)重要的研究方向。3.3 嵌入向量的性質(zhì)與可視化訓(xùn)練好的嵌入空間具有一些有趣的數(shù)學(xué)性質(zhì)類(lèi)比關(guān)系經(jīng)典的例子是vec(“國(guó)王”) - vec(“男人”) vec(“女人”) ≈ vec(“女王”)。這表示語(yǔ)義關(guān)系可以通過(guò)向量運(yùn)算來(lái)捕捉。語(yǔ)義聚類(lèi)相似主題的詞會(huì)聚集在一起。所有關(guān)于“水果”的詞向量在空間中會(huì)形成一個(gè)簇與“交通工具”的簇分開(kāi)。我們可以通過(guò)降維技術(shù)如t-SNE、PCA將高維向量投影到2D或3D進(jìn)行可視化直觀地觀察這些性質(zhì)。這不僅是理解模型內(nèi)部表示的好方法也能用于診斷問(wèn)題比如檢查某個(gè)領(lǐng)域的術(shù)語(yǔ)是否被正確編碼。4. 從分詞嵌入到實(shí)際應(yīng)用場(chǎng)景理解了基本原理我們來(lái)看看這些技術(shù)如何在具體場(chǎng)景中發(fā)揮作用以及可能遇到的“坑”。4.1 在RAG中的核心作用檢索的基石檢索增強(qiáng)生成是當(dāng)前讓LLM獲取最新、特定知識(shí)的主流架構(gòu)。其核心步驟是將文檔庫(kù)分塊 - 將文本塊轉(zhuǎn)換為向量 - 存儲(chǔ)到向量數(shù)據(jù)庫(kù) - 用查詢向量檢索相關(guān)塊 - 交給LLM生成答案。這里嵌入模型的質(zhì)量直接決定了檢索的精度。如果你用一個(gè)通用的、在維基百科上訓(xùn)練的嵌入模型去處理充滿專(zhuān)業(yè)術(shù)語(yǔ)的醫(yī)學(xué)論文或法律條款檢索效果很可能不理想。因?yàn)椤靶募」K馈焙汀靶墓!痹谕ㄓ媚P椭械南蛄靠赡懿唤咏卺t(yī)學(xué)場(chǎng)景下它們應(yīng)該非常接近。解決方案領(lǐng)域微調(diào)嵌入模型使用你所在領(lǐng)域的文本數(shù)據(jù)對(duì)開(kāi)源的嵌入模型如BGE、text2vec進(jìn)行微調(diào)。這能讓模型學(xué)習(xí)到領(lǐng)域特有的語(yǔ)義相似度。精心設(shè)計(jì)分塊策略分塊大小chunk size和重疊量overlap對(duì)檢索效果影響巨大。塊太大可能包含無(wú)關(guān)信息稀釋核心內(nèi)容塊太小可能破壞完整語(yǔ)義。對(duì)于技術(shù)文檔按章節(jié)或子章節(jié)分塊可能比固定長(zhǎng)度分塊更好。重疊則可以避免在塊邊界丟失關(guān)鍵信息?;旌蠙z索除了向量檢索語(yǔ)義搜索可以結(jié)合關(guān)鍵詞檢索BM25或元數(shù)據(jù)過(guò)濾日期、作者。這就是所謂的“混合搜索”能兼顧語(yǔ)義匹配和精確匹配提高召回率。4.2 在微調(diào)與提示工程中的隱式影響當(dāng)你進(jìn)行指令微調(diào)或使用提示詞時(shí)分詞和嵌入在暗中施加影響。微調(diào)全參數(shù)微調(diào)會(huì)更新嵌入層的參數(shù)。這意味著模型會(huì)為你在訓(xùn)練數(shù)據(jù)中頻繁使用的特定術(shù)語(yǔ)或表達(dá)方式調(diào)整其向量表示使其更貼合你的領(lǐng)域。提示工程模型的輸出對(duì)提示詞的措辭非常敏感。這背后的一部分原因就是不同的措辭會(huì)導(dǎo)致完全不同的分詞和嵌入序列。“請(qǐng)總結(jié)下文”和“煩請(qǐng)您對(duì)下面的文章進(jìn)行要點(diǎn)歸納”這兩個(gè)提示雖然人類(lèi)看來(lái)意思一樣但它們的Token序列和初始向量表示差異很大可能導(dǎo)致模型激活不同的內(nèi)部路徑從而產(chǎn)生不同的輸出風(fēng)格甚至內(nèi)容。一個(gè)常見(jiàn)的坑是“系統(tǒng)提示詞被忽略”。有些模型在訓(xùn)練時(shí)系統(tǒng)提示和用戶提示是被區(qū)別對(duì)待的例如用特殊Token分隔。如果你在部署時(shí)沒(méi)有正確格式化輸入導(dǎo)致系統(tǒng)提示被分詞后與用戶消息混在一起模型可能就無(wú)法正確識(shí)別指令。務(wù)必查閱模型文檔嚴(yán)格按照要求的格式如ChatML格式、Llama2對(duì)話格式構(gòu)建輸入。4.3 處理多語(yǔ)言與特殊格式的挑戰(zhàn)現(xiàn)代LLM通常是多語(yǔ)言的這給分詞器帶來(lái)了巨大挑戰(zhàn)。詞匯表膨脹為了覆蓋多種語(yǔ)言詞匯表需要包含各種語(yǔ)言的字符和子詞導(dǎo)致詞匯表異常龐大增加了嵌入層的參數(shù)量和計(jì)算開(kāi)銷(xiāo)。不平衡表示訓(xùn)練數(shù)據(jù)中英語(yǔ)占主導(dǎo)導(dǎo)致英語(yǔ)Token的嵌入表示學(xué)習(xí)得最充分其他語(yǔ)言的Token可能表示質(zhì)量較差這就是為什么有些模型在非英語(yǔ)任務(wù)上表現(xiàn)會(huì)下降。特殊格式代碼、數(shù)學(xué)公式、化學(xué)式等具有嚴(yán)格的語(yǔ)法結(jié)構(gòu)。通用的分詞器處理這些內(nèi)容時(shí)可能會(huì)產(chǎn)生無(wú)意義的切分。例如一個(gè)Python函數(shù)名calculate_loss被切成[‘calculate’ ‘_’ ‘lo’ ‘ss’]破壞了其作為一個(gè)標(biāo)識(shí)符的整體性。針對(duì)代碼的模型如CodeLlama會(huì)使用在代碼庫(kù)上訓(xùn)練的分詞器以更好地保留編程語(yǔ)言的語(yǔ)義單元。應(yīng)對(duì)策略對(duì)于特定領(lǐng)域應(yīng)用如果可能優(yōu)先選擇在該領(lǐng)域或語(yǔ)言上有優(yōu)勢(shì)的模型和分詞器。例如處理中文任務(wù)Qwen或ChatGLM通常比同等規(guī)模的通用英文模型更合適。5. 進(jìn)階話題嵌入模型與向量數(shù)據(jù)庫(kù)的協(xié)同雖然LLM內(nèi)部的嵌入層是隨模型一起訓(xùn)練的但在RAG等外部檢索場(chǎng)景中我們通常使用一個(gè)獨(dú)立的、專(zhuān)門(mén)訓(xùn)練用于生成“檢索友好”向量的嵌入模型。這與LLM內(nèi)部的嵌入層目標(biāo)不同前者旨在讓語(yǔ)義相似的文本片段具有相似的向量用于檢索后者旨在為下一個(gè)Token預(yù)測(cè)任務(wù)提供最佳上下文表示。5.1 專(zhuān)用嵌入模型的選擇目前社區(qū)有很多優(yōu)秀的開(kāi)源嵌入模型如BGE系列智源研究院推出中文表現(xiàn)強(qiáng)勁有不同尺寸版本。text2vec朗朗上口的名字中文語(yǔ)義相似度計(jì)算效果很好。E5系列微軟發(fā)布通過(guò)指令微調(diào)指令如“為這段文本生成用于檢索的向量”在檢索任務(wù)上表現(xiàn)優(yōu)異。OpenAI的text-embedding-ada-002雖然非開(kāi)源但作為API服務(wù)效果穩(wěn)定是多語(yǔ)言任務(wù)的常見(jiàn)選擇。選擇時(shí)需要考慮維度通常有384維、768維、1024維等。維度越高表征能力越強(qiáng)但計(jì)算和存儲(chǔ)開(kāi)銷(xiāo)也越大。對(duì)于千萬(wàn)級(jí)以下的文檔庫(kù)768維通常是個(gè)不錯(cuò)的平衡點(diǎn)。上下文長(zhǎng)度嵌入模型本身也有上下文窗口限制如512、1024、2048。如果你的文本塊很長(zhǎng)需要選擇支持長(zhǎng)上下文的模型或者采用動(dòng)態(tài)截?cái)?、分段編碼再池化的策略。微調(diào)與領(lǐng)域適配正如前文所述在特定領(lǐng)域數(shù)據(jù)上微調(diào)嵌入模型是提升檢索效果最有效的手段之一。5.2 向量數(shù)據(jù)庫(kù)的集成與優(yōu)化將文本轉(zhuǎn)換為向量后需要存入向量數(shù)據(jù)庫(kù)進(jìn)行高效檢索。Milvus、Pinecone、Qdrant、Weaviate等都是熱門(mén)選擇。集成時(shí)的關(guān)鍵點(diǎn)索引類(lèi)型向量數(shù)據(jù)庫(kù)使用近似最近鄰搜索算法來(lái)加速檢索。常見(jiàn)的索引有HNSW、IVF-Flat、SCANN等。HNSW分層可導(dǎo)航小世界在精度和速度的平衡上表現(xiàn)很好是默認(rèn)的推薦選擇。IVF倒排文件需要訓(xùn)練更適合分布相對(duì)穩(wěn)定的海量數(shù)據(jù)集。距離度量向量之間的相似度如何計(jì)算最常用的是余弦相似度它只關(guān)注向量的方向而非長(zhǎng)度非常適合嵌入向量。此外還有內(nèi)積、歐氏距離等。必須確保嵌入模型訓(xùn)練時(shí)使用的度量方式與向量數(shù)據(jù)庫(kù)檢索時(shí)使用的度量方式一致否則結(jié)果毫無(wú)意義。元數(shù)據(jù)過(guò)濾這是生產(chǎn)級(jí)應(yīng)用必須考慮的功能。除了向量相似度我們經(jīng)常需要結(jié)合業(yè)務(wù)邏輯進(jìn)行過(guò)濾例如“只檢索2023年之后的文檔”、“只檢索A部門(mén)的報(bào)告”。優(yōu)秀的向量數(shù)據(jù)庫(kù)應(yīng)支持在檢索時(shí)高效地結(jié)合元數(shù)據(jù)過(guò)濾。性能調(diào)優(yōu)對(duì)于億級(jí)向量索引構(gòu)建參數(shù)如HNSW的M和efConstruction、搜索參數(shù)ef對(duì)性能和精度影響巨大。需要在你的數(shù)據(jù)集上進(jìn)行基準(zhǔn)測(cè)試找到最佳參數(shù)。一個(gè)實(shí)戰(zhàn)中的教訓(xùn)我曾遇到一個(gè)案例檢索結(jié)果總是包含一些看似相關(guān)但實(shí)際過(guò)時(shí)的文檔。檢查后發(fā)現(xiàn)問(wèn)題出在分塊時(shí)沒(méi)有把文檔的“更新時(shí)間”這個(gè)元數(shù)據(jù)正確地繼承到向量塊上導(dǎo)致無(wú)法用時(shí)間進(jìn)行過(guò)濾。最終我們修改了預(yù)處理流水線確保每個(gè)文本塊都攜帶了來(lái)源文檔的完整元數(shù)據(jù)問(wèn)題才得以解決。從用戶輸入的一段文字到模型內(nèi)部可以進(jìn)行矩陣運(yùn)算的向量序列分詞與嵌入完成了這個(gè)關(guān)鍵的“翻譯”工作。它不僅是技術(shù)實(shí)現(xiàn)的起點(diǎn)更是影響模型最終表現(xiàn)的質(zhì)量基石。無(wú)論是為了更深入地理解LLM的“黑盒”還是為了構(gòu)建更高效的RAG系統(tǒng)、進(jìn)行更成功的模型微調(diào)投入時(shí)間理解并優(yōu)化這一環(huán)節(jié)都將帶來(lái)豐厚的回報(bào)。在實(shí)際操作中多動(dòng)手實(shí)驗(yàn)用不同的分詞器處理你的文本觀察結(jié)果用不同的嵌入模型為同一句話生成向量計(jì)算它們的相似度在向量數(shù)據(jù)庫(kù)中嘗試不同的索引參數(shù)。這些實(shí)踐經(jīng)驗(yàn)遠(yuǎn)比單純閱讀理論更能讓你把握其中的精妙之處。