3 月某個週二早晨,一位執行長提出一個本來只要三十秒就能回答的問題:我們是否曾同意將賠償上限設定在一百萬美元以下?
答案確實存在。它已被寫下、簽署、歸檔,一直放在共享磁碟機裡。找出答案花了三天,而沒能及時找到答案,代價是四萬美元。
每家組織都有類似的週二。知識是真實存在的,它被保存下來,散布在數百種格式的數百萬份檔案中,而整理方式取決於當時最接近檔案櫃的人。組織知道的,比組織裡的任何人都多。困難在於如何取得這些知識。
關鍵字搜尋失敗的原因很明確,而且可以修正
最顯而易見的解決方法是索引每個字詞並搜尋。輸入「liability cap」,就會得到所有包含「liability」和「cap」的文件。但這個方法會失敗,而失敗的方式值得精確描述,因為每種失敗都指向真正的解決方案必須做什麼。
合約上寫的不是「liability cap」,而是「limitation of liability」。兩個片語,一個意思,零個共用關鍵字。你的搜尋什麼都沒找到,你因此斷定文件不存在。搜尋列無法分辨「我們沒有這樣的合約」與「我們有,只是歸檔時用了不同的詞」。
比對字詞並不等於比對意義。在員工手冊和供應商合約中搜尋「termination」,你會得到解雇、合約到期,以及可能關於終止軟體授權的段落,排名依據只是詞頻,沒有其他更有意義的標準。
人們問的是問題,而不是關鍵字。沒有人用搜尋詞來思考。他們想的是「我們是否曾同意將賠償上限設定在一百萬美元以下?」關鍵字引擎不知道這是一個問題,更不知道其中哪些字詞重要。
真正能縮小差距的方法
解決方法是停止比對字詞,改為比對意義,這需要把文字轉換成可以測量距離的形式。
嵌入模型會讀取一段文字,輸出幾百個數字,把這段文字定位在一個空間裡,距離代表意義的相似度。關於年假的段落會彼此靠近,關於賠償上限的段落則會落在完全不同的位置。模型根據語言的實際使用方式來定位,而不是根據它們共用的字元。
python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
texts = [
"4.2 Annual Leave\nFull-time employees accrue fifteen (15) days...",
"Remote Work Policy > Schedule\nUp to three (3) days per week...",
"Appendix B\nLodging: $180 per night, booked via travel portal.",
]
vectors = model.encode(texts)
print(vectors.shape) # (3, 384): three texts, one map, 384 coordinates each
Enter fullscreen mode Exit fullscreen mode
現在來看有趣的部分。把問題「員工第一年可以休幾天假?」嵌入同一個空間,它會落在最靠近年假段落的位置。那段文字一次也沒有出現「vacation」這個字。關鍵字搜尋掉落的裂縫,正是因為這兩種表述意義相同,而模型唯一關注的就是這個。
這個模型只有 80MB。它可以在筆電上執行,不需要 GPU,也不需要 API 金鑰,這一點的重要性超乎想像:企業 AI 遇到的第一個嚴肅問題不是「哪個模型最好」,而是「我的資料可以放在哪裡」。本地執行的模型對這個問題的回答是「哪裡都不行」。
沒有人會事先警告你的部分
以下是教學文件跳過的步驟。在嵌入任何內容之前,你必須先把文字取出,而檔案庫會抵抗這種做法。
PDF 不是文件。它是一組繪圖指令,恰好產生字母形狀,而要求它提供文字可能遭到拒絕。試算表是披著外衣的資料庫;把它壓平為字串,你會得到一行數字,卻不知道這些數字指的是什麼。1994 年的掃描合約根本沒有文字層,只有紙張的照片,而每個天真的管線都會默默回傳空字串,然後繼續處理,這也是為什麼你檔案庫裡最重要的文件會變得看不見。
接著,在提取文字之後,你必須把它切成片段。如果天真地以 500 個字元為單位切斷,你可能會在句子中間切斷單字,產生一個開頭是「during thei」的區塊,什麼問題都無法回答。如果依照文件本身的結構切分,保留標題,同一段文字就會變成圖書館員能認出已歸檔的內容。
這些都不是有趣的 AI 部分。但這些步驟決定了有趣的 AI 部分能否運作。
如果你想要完整版本
我寫了一本書,從頭開始教你如何建置這個系統,追蹤一家虛構的 240 人製造商,從資料夾裡的單一 PDF,到逐步建立可運作的檢索系統。每一段印出來的程式碼在印出前都已實際執行過。
第 1 章免費,提供完整問題說明,不需要任何程式碼:https://leanpub.com/learn2rag
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.