「在 AI Agent 的知識庫架構中,RAG 是消除大模型幻覺的定海神針。透過在地化的 Embedding 模型、asyncio.to_thread 非阻斷線程池委派,以及餘弦相似度門檻,我們能確保 Agent 在毫秒級時間內取得最精準的金融知識 context。」
先前,我們陸續解析了 FastAPI Web 服務入口與 ConversationMemory 對話記憶服務。今天我們將深入 Angelina AI Agent 的知識庫心臟。
為了讓系統在處理複雜向量運算時不卡死 FastAPI 的 asyncio Event Loop,RAGEngine 採取了 Thread-pool Offloading 設計,並整合 ChromaDB 本地持久化資料庫與 HuggingFace 在地 Embedding 模型。
今天我們將解剖 rag_engine.py 的核心架構、分詞策略與 Self-healing 重構機制!
Embedding 與向量資料庫 I/O 屬於典型的 CPU/Disk-Bound 阻塞型任務。在 RAGEngine 中,所有對外公開方法均為 async,並在內部透過 asyncio.to_thread 轉交線程池執行:
1. 在地化向量模型 (sentence-transformers/all-MiniLM-L6-v2)
(1) 零 API 延遲與費用:採用在地化 HuggingFace 模型 sentence-transformers/all-MiniLM-L6-v2,完全不需要外呼第三方 API,實現極速、零成本且高度隱私的 Vector Generation。
(2) 單例延遲載入 (_load_embedding_model):採用 Lazy Initialization 策略,僅在服務初始化時載入一次模型,避免重複占用記憶體。
2. ChromaDB 持久化客戶端 (_get_or_create_collection)
(1) 資料庫預設存放在 data/vector_store 目錄下,使用 angelina_knowledge Collection。
(2) 顯式指定 HNSW 索引演算法為餘弦距離:metadata={"hnsw:space": "cosine"}。
當 /chat 或 daily_analysis.py 呼叫 rag_engine.search(query, top_k=5) 時,系統執行以下精準檢索流程:
1. 餘弦相似度轉換演算法
ChromaDB 在 cosine 空間中回傳的是「距離(Distance)」,模組將其精準轉換為人類可讀的「相似度」:
# rag_engine.py 關鍵相似度轉換邏輯
similarity = 1.0 - float(distance)
當管理員透過 POST /knowledge/update 端點更新知識庫,或系統觸發自動學習重構時,會執行 rebuild_index(export_path):
1. 精準 Token 級分詞策略
(1) cl100k_base 編碼:整合 tiktoken 計算真實 Token 長度。
(2) 分詞參數:CHUNK_SIZE_TOKENS = 500(區段大小)、CHUNK_OVERLAP_TOKENS = 50(重疊長度)。
(3) 分隔符優先順序:依序採用 ["\n\n", "\n", "。", ".", " ", ""],優先維護段落與中文句號的語意完整度。
2. 向量庫自癒機制
在 initialise() 啟動階段,若檢測到本地 ChromaDB 檔案損壞或遺失,系統不會掛掉,而是自動觸發 _auto_rebuild():
(1) 自動掃描 data/notebooklm 目錄下最新修改的 .txt 或 .md 匯出檔。
(2) 重新建構 Collection、重新分詞與 Embedding,在數秒內讓 Agent 的知識庫「起死回生」!
透過 app/services/rag_engine.py 的解剖,我們確認了:
明日預告:敬請期待~!