Chuyển đến nội dung chính

課程 5:越南語文本的 Ingestion、Chunking 與 Vector Indexing

處理 Markdown/PDF,以技術文件結構進行 chunking,儲存完整中繼資料, 最佳化越南語文件的 embedding 管線。

🧠 AI & ML — L0 課程 5:Ingestion、Chunking 與 越南語向量索引 Gemma 4 本地 AI 工程實戰 on Mac 第三部分:內部資料的 RAG 工程 xdev.asia

前言

RAG 的品質不僅取決於模型,更取決於資料的 ingestion、chunking 和 indexing 方式。本課程從基礎到實作,建構完整的管線。

1. 來源文件類型

內部知識庫的常見來源:

  • Markdown 技術文件
  • PDF 作業程序
  • Wiki/Confluence 匯出
  • Slack 討論串匯出

每種來源需要各自的解析器與清理步驟。

2. 文本正規化

Chunking 前的清理:

  • 移除頁首/頁尾/頁碼
  • Unicode 正規化(NFC)
  • 表格扁平化或跳過
  • 保留程式碼區塊

越南語文本需確保聲調符號的正確處理。

3. Chunking 策略

建議參數:

  • Chunk 大小:600-1000 tokens
  • 重疊:50-100 tokens
  • 優先依段落標題分割
  • 不分割程式碼區塊

基於標題的分割比隨機字元數分割的檢索品質更好。

4. 中繼資料儲存

每個 chunk 應附加:

  • doc_id
  • section_title
  • chunk_index
  • source_path
  • last_updated
  • language

豐富的中繼資料讓後續的過濾與除錯更容易。

5. Embedding 管線

本地推薦模型:

  • nomic-embed-text(透過 Ollama)
  • bge-m3(多語言支援)

批次生成 embedding 後 upsert 到向量資料庫。

import chromadb

client = chromadb.PersistentClient(path="./vectordb")
collection = client.get_or_create_collection("internal-docs")

collection.upsert(
    ids=[chunk["id"] for chunk in chunks],
    documents=[chunk["text"] for chunk in chunks],
    metadatas=[chunk["metadata"] for chunk in chunks],
)

6. 索引生命週期管理

  • 在 staging 索引驗證後再提升至生產環境
  • 定期重新索引過時文件
  • 版本控制以支援回滾

Demo 程式碼

Ingestion 管線執行結果 — 處理 127 個 chunk:

Ingestion 結果

ChromaDB collection 狀態確認:

ChromaDB 狀態

原始碼:04-rag-ingestion

總結