
在本地從企業文件構建 AI 代理商知識庫
從企業文件構建 RAG 知識庫的逐步指南——完全在本地進行解析、清洗、分塊、嵌入和索引。涵蓋常見錯誤、規模考慮和稽核要求。
AI 代理商的好壞取決於其背後的知識庫。您可以在最好的硬體上使用最好的代理商框架部署最好的模型,如果知識庫包含解析不佳的文件、分塊不好的文本、重複內容或過時信息,代理商仍然會給出錯誤的答案。
這不是理論上的問題。在企 業代理商部署中,檢索品質——向量存儲返回的內容的準確性和相關性——是代理商輸出品質的最強預測指標。使用 7B 模型的構建良好的知識庫,始終優於使用 70B 模型的雜亂知識庫。瓶頸幾乎總是數據,而不是模型。
本指南詳細介紹了完全在本地從企業文件構建代理商知識庫的完整管線。沒有數據離開您的網路。沒有外部 API 被調用。每個組件都在本地運行。
管線概覽
原始企業文件
↓
步驟 1:文件攝入(解析)
↓
步驟 2:文字清洗
↓
步驟 3:帶元數據的分塊
↓
步驟 4:嵌入(本地模型)
↓
步驟 5:向量存儲索引
↓
步驟 6:檢索測試和驗證
↓
代理商 RAG 查詢
每個步驟都有特定的要求、常見的失敗模式和品質指標。跳過或簡化任何步驟都會降低最終知識庫的品質——以及代理商的輸出品質。
步驟 1:文件攝入
企業文件有幾十種格式:PDF(基於文字的和掃描的)、Word 文件(.docx、.doc)、Excel 試算表、PowerPoint 演示文稿、電子郵件(.eml、.msg)、HTML 頁面、純文本文件,以及有時來自企業系統的專有格式。
良好解析的樣子
良好的文件解析保留了原始文件的結構和含義:
- 節標題被識別和標記,不會被扁平化為正文文字
- 表格被提取為結構化數據(行和列保留),不轉換為文字流
- 列表保持其順序和嵌套
- 頁眉和頁腳被識別並與正文內容分開
- 頁碼從文字中移除,但作為元數據記錄
- 帶文字的圖片(帶標籤的圖表、示意圖)進行 OCR 並提取文字
- 傳達含義的格式提示(粗體、斜體、下劃線)被保留或注釋
特定格式挑戰
PDF 是最常見也是最麻煩的格式。從 Word 生成的基於文字的 PDF 很直接——文字層可以提取。掃描的 PDF 是需要 OCR 的圖像。從網頁生成的 PDF 可能有不尋常的列佈局。帶有表單字段的 PDF 在表單層中有簡單文字提取遺漏的數據。
Word 文件通常更容易解析,但複雜的格式——嵌套表格、文字框、SmartArt、嵌入對象——可能會迷惑提取器。修訂追蹤和批注可能相關或不相關,取決於用例。
Excel 試算表存在結構性挑戰:儲存格之間的關係(哪個標題與哪個值對應)是空間性的,而非文字性的。將試算表扁平化為文字會丟失這些關係。合併儲存格、多個工作表和公式增加了複雜性。
電子郵件的元數據(發件人、收件人、日期、主題)通常比正文文字對檢索更重要。電子郵件鏈有轉發文物、回覆標記和簽名塊,應該清理。附件需要單獨處理。
實際方法
使用具有格式特定邏輯的文件解析器處理多種格式。在您的文件語料庫樣本上運行解析器,並手動檢查輸出。標記未通過品質檢查的文件——超過閾值的 OCR 錯誤、缺失節、損壞的表格——以供人工審查或重新處理。
品質指標: 解析準確率——有多少百分比的文件在沒有重大結構錯誤的情況下被解析?目標:基於文字的文件 90% 以上,掃描文件 80% 以上(帶 OCR)。
步驟 2:文字清洗
解析的文字不是乾淨的文字。清洗移除了降低檢索品質而不增加信息價值的文物。
要移除的內容
- 樣板內容: 每頁重複的頁眉、頁腳、版權聲明、保密免責聲明。這些在不增加檢索價值的情況下向向量存儲添加噪音。
- 頁碼和頁眉: 每頁上的「第 47 頁,共 132 頁」和「Acme Corp — 機密」會污染嵌入空間。
- OCR 文物: 誤識別的字元、斷裂的詞語、來自差質掃描的亂碼文字。輕微的 OCR 錯誤(將「l」替換為「1」)可以通過後處理糾正。嚴重錯誤可能需要重新掃描或手動轉錄。
- 編碼問題: Unicode 標準化、智慧引號 vs 直引號、破折號 vs 連字符。 這些看起來微不足道,但會導致重複檢測失敗(具有不同編碼的相同文字被視為不同的)。
- 重複內容: 相同文件存在於多個位置(電子郵件附件、共享硬碟、文件管理系統)。相同段落出現在多個文件中(標準條款、樣板部分)。
要保留的內容
- 領域術語: 不要「清理」技術術語、縮寫或行業術語。「ICD-10-CM」不應該被標準化為「ICD 10 CM」。
- 數值數據: 數字、測量值、日期、財務值。這些對檢索很有價值。
- 文件結構: 節分隔、標題層次、列表結構。這些為分塊提供信息。
- 元數據: 作者、日期、文件類型、版本、部門。這些支援過濾檢索。
去重策略
去重在兩個層面進行:
文件層面: 精確和近似重複偵測。 基於哈希的比較捕捉精確重複。基於相似性的比較(MinHash、SimHash)捕捉近似重複——90% 以上相似但有輕微差異的文件(版本號、日期、格式)。
段落層面: 標準條款、樣板部分和頻繁複製的文字出現在許多文件中。應對這些進行去重,以防止向量存儲過度表示常見文字,而犧牲獨特的高價值內容。
品質指標: 去重率——有多少百分比的重複或近重複內容被移除?目標:95% 以上的重複被消除,同時保留零唯一內容。
步驟 3:帶元數據的分塊
分塊是大多數知識庫構建出錯的地方。默認方法——每 512 或 1,024 個字元分割文字——易於實現,但可靠地產生糟糕的結果。
為什麼字元數分塊會失敗
字元數分塊對文件結構沒有意識。它會分割:
- 標題行和數據行之間的表格,創建一個有列名但沒有數據的塊,以及另一個有數據但沒有列名的塊
- 條件和結果之間的條件語句(「如果患者有糖尿病...」在一個塊,「...那麼開立二甲雙胍」在下一個塊)
- 列表項目之間的編號列表,失去列表的上下文
- 段落中間的一個句子,創建以句子碎片開頭和結尾的塊
每個這樣的分割都創建了單獨無意義或誤導性的塊。當代理商檢索到說「那麼開立二甲雙胍」而沒有條件的塊時,它可能會無條件推薦二甲雙胍。
語義分塊
語義分塊在自然主題邊界處分割:
- 節標題: 在每個標題處分割。這保留了文件的邏輯單元。
- 段落邊界: 在一個節內,在段落分隔處分割。每個段落通常處理一個點。
- 表格邊界: 將表格作為單個塊完整保留。在每個表格塊中包含表格標題。
- 列表邊界: 完整保留列表。在列表項目中包含引導文字。
塊配置
| 參數 | 推薦範圍 | 理由 |
|---|---|---|
| 目標塊大小 | 300–800 個 token | 足夠大以提供上下文,足夠小以進行精確檢索 |
| 最大塊大小 | 1,200 個 token | 硬性上限,防止過大的塊佔主導地位 |
| 重疊 | 50–100 個 token | 保持相鄰塊之間的上下文連續性 |
| 最小塊大小 | 50 個 token | 避免缺乏上下文的微塊 |
元數據標記
每個塊必須攜帶支援過濾檢索和可追溯性的元數據:
- source_document: 原始文件的文件名或文件 ID
- source_path: 文件系統或 DMS 中原始文件的位置
- document_date: 文件的創建或最後更新時間
- document_author: 誰創建了文件
- document_type: 政策、程序、指南、合同、電子郵件、報告等
- section_title: 此塊所在節的標題
- chunk_index: 此塊在文件中的位置(用於排序)
- classification: 保密級別、部門、業務單元
這些元數據有三個用途:
- 過濾檢索: 「查找關於出差政策的信息」→ 按 document_type=policy 過濾,搜索「出差」
- 時效加權: 當多個版本存在時,優先考慮來自較新文件的塊
- 稽核追蹤: 將任何代理商回應追溯到具體的塊和源文件
品質指標: 塊連貫性——對於樣本塊,每個塊是否包含完整的、獨立的信息片段?目標:80% 以上的塊是連貫的獨立單元。
步驟 4:嵌入
嵌入將文字塊轉換為捕獲語義含義的數值向量。相似的概念產生相似的向量,支援語義搜索。
選擇嵌入模型
對於本地部署,嵌入模型必須在本地運行。不調用外部 API。目前最佳選項:
| 模型 | 維度 | 速度(CPU) | 品質(MTEB) | 大小 |
|---|---|---|---|---|
| all-MiniLM-L6-v2 | 384 | 快 | 良好 | 80MB |
| E5-large-v2 | 1,024 | 中等 | 很好 | 1.3GB |
| BGE-large-en-v1.5 | 1,024 | 中等 | 很好 | 1.3GB |
| E5-mistral-7b-instruct | 4,096 | 慢(需要 GPU) | 優秀 | 14GB |
對於大多數企業知識庫,E5-large-v2 或 BGE-large-en-v1.5 提供了最佳的品質和速度平衡。它們在 CPU 上批量嵌入運行良好,並為語義搜索產生高品質向量。
對於非常大的知識庫(50 萬個以上塊),其中檢索品質至關重要,E5-mistral-7b-instruct 提供了更好的語義理解,但需要 GPU 以獲得合理的嵌入速度。