所有 AI 提供商都實現統一介面,讓切換提供商無痛進行:
class BaseAIProvider:
def generate(self, prompt: str) -> str:
"""生成文字回應"""
raise NotImplementedError
def generate_stream(self, prompt: str) -> Generator:
"""串流生成回應"""
raise NotImplementedError
def generate_embedding(self, text: str) -> List[float]:
"""生成向量嵌入"""
raise NotImplementedError
def generate_image(self, prompt: str) -> str:
"""生成圖片 (base64)"""
raise NotImplementedError
| 提供商 | 文字生成 | 嵌入向量 | 圖片生成 | 特色 |
|---|---|---|---|---|
| Gemini | ✅ | ✅ | ✅ | 多模態、免費額度 |
| OpenAI | ✅ | ✅ | ✅ DALL-E | 業界標竿 |
| Anthropic | ✅ | ❌ 備援 | ❌ | 超長上下文 |
| Ollama | ✅ | ✅ | ❌ | 完全離線 |
| Groq | ✅ | ❌ 備援 | ❌ | 超高速推理 |
| DeepSeek | ✅ | ❌ 備援 | ❌ | 深度推理 |
RAG (Retrieval-Augmented Generation) 是本專案的核心技術:
上傳文件 → 解析內容 → 分割成 Chunks
將每個 Chunk 轉換為向量,存入資料庫
用戶問題 → 向量化 → 相似度搜尋
將相關 Chunks + 問題送給 LLM 生成答案
Reciprocal Rank Fusion 演算法,結合全文搜尋 + 向量搜尋的排名結果。
LLM 自動擴展查詢,生成同義詞和相關詞,提高召回率。
使用 LLM 對搜尋結果進行智能重排序,提升精準度。
自動識別並合併重複的搜尋結果,避免冗餘資訊。
| 模組 | 端點範例 | 說明 |
|---|---|---|
| 筆記本 | GET /api/notebooks |
取得所有筆記本 |
| 來源 | POST /api/notebooks/:id/sources/upload |
上傳文件 |
| 對話 | POST /api/notebooks/:id/chats/stream |
SSE 串流對話 |
| 工作室 | POST /api/notebooks/:id/studio/mindmap |
生成心智圖 |
| Podcast | POST /api/notebooks/:id/studio/podcast |
生成 Podcast |
筆記本主表:id, title, created_at, folder_id
來源資料:id, notebook_id, type, title, content, url
分割區塊:id, source_id, content, embedding, chunk_index
對話記錄:id, notebook_id, role, content, sources
工作室輸出:id, notebook_id, type, title, data
資料夾:id, name, emoji, order
在本單元中,我們深入了解了:
前端 → API → 服務層 → AI 抽象層
統一介面,輕鬆切換 AI 提供商
文件處理 → 嵌入 → 檢索 → 生成
RRF 融合、Query Expansion、Reranking