🚀 Quivr 的核心功能與特性
根據原始碼內容,Quivr 是一個以生成式 AI 驅動的 RAG(檢索增強生成)系統,設計目的是成為用戶的「第二大腦」。以下是它的主要功能與運作機制。
🔑 核心功能
1️⃣ 精心設計的 RAG 實作架構
Quivr 內建一套高效且有明確設計原則的 RAG 工作流程。
📄 參考:README.md:15
幫助開發者專注於應用層開發,而無需處理繁瑣的底層檢索與生成邏輯。
2️⃣ 支援多家大型語言模型(LLM)
Quivr 可整合多種 LLM 供應商,包含:
📄 參考:README.md:16
OpenAI(GPT 系列)
Anthropic(Claude)
Mistral
Google Gemma
→ 使用者可依照成本、效能與模型特性選擇最適合的 LLM。
3️⃣ 通用文件格式支援
Quivr 可處理多種常見文件類型:
📄 參考:README.md:17
PDF
純文字(TXT)
Markdown
可自定義解析器來支援特殊格式
4️⃣ 可自定義 RAG 流程
使用者可依需求自訂工作流程:
📄 參考:README.md:18
加入網路搜尋功能
整合外部工具與 API
調整檢索與生成策略(如查詢改寫、過濾節點)
5️⃣ 與 Megaparse 整合
Quivr 支援與 Megaparse 整合,提升文件處理與資訊萃取能力。
📄 參考:README.md:19
🧠 Quivr 的核心運作方式
核心邏輯由 Brain 類別負責調度與串接各模組:
📄 參考:index.md:58-61
建立知識庫(從檔案匯入)
將文件轉換為向量嵌入並儲存
透過自然語言查詢知識庫
回傳由 AI 生成的回答
✏️ 使用範例
✅ 基本用法
📄 參考:README.md:57-74
建立一個暫時的文字檔案
建立一個 Brain 實例並匯入檔案
提出問題,獲得 AI 回答
🔧 工作流程設定(YAML)
Quivr 支援使用 YAML 自訂 RAG 工作流程:
📄 參考:README.md:97-115
範例步驟包括:
過濾對話歷史
查詢重寫
進行文件檢索
基於檢索結果生成答案
⚙️ 客製化選項
📄 參考:README.md:120-139
可選擇不同的 reranker 模型(如 Cohere)
設定回傳段落數量(top_n)
調整 LLM 的參數(token 數量、溫度值)
📊 可視化與互動應用
官方文件中包含 工作流程圖解,說明各組件如何協作
📄 參考:README.md:80-82
也提供建立互動聊天介面的示範(如使用 Chainlit)
📄 參考:quickstart.md:73-80
🎯 實際應用場景
根據原始碼與設計,Quivr 適用於以下領域:
個人知識管理:建立可查詢的個人筆記與文件資料庫
研究輔助:解析學術論文並提取重點
法律與技術文件分析:例如契約、政策、技術手冊
客服知識庫建置:協助回應顧客常見問題
教育應用:建立互動式學習助手、解說教材內容
🛠️ 快速上手
📄 安裝教學參考:README.md:45-51
只需數行程式碼即可:
from quivr_core import Brain
from uuid import uuid4
brain = Brain.from_files(
name="Research Papers",
file_paths=["paper1.pdf", "paper2.pdf", "notes.md"],
)
run_id = uuid4()
answer = brain.ask(
run_id=run_id,
question="這些論文的關鍵發現有哪些?",
)
print(answer.answer)
🧾 功能總結
功能 | 說明 |
---|---|
完整的 RAG 流程支援 | 開箱即用,無需手動串接檢索與生成模組 |
多 LLM 支援 | 可依需求切換使用不同語言模型供應商 |
文件格式多元 | 支援 PDF、TXT、Markdown 及自定義格式 |
自訂工作流程 | YAML 組合節點,自由設計處理步驟 |
串流式回應(Streaming) | 適合即時互動應用與聊天機器人 |
可整合外部工具與 API | 如網路搜尋、Megaparse 解析器等 |
📌 備註
官方文件中曾提及 Demo 影片,但目前版本的 README 內被註解掉
從 commit 記錄可看出開發仍持續進行,功能與穩定性持續提升中
🧠 Quivr 如何運作:以圖書館員為喻的人類行為類比
Quivr 是一套以 RAG(檢索增強生成)為基礎的系統,被設計成你的「第二大腦」。我們可以將其運作流程,比喻成一位知識豐富的圖書館員,協助你找出問題答案的過程。
1️⃣ 接收問題(就像圖書館員聽你提問)
當你向 Quivr 提出問題,就像你走到圖書館的諮詢櫃台,請教館員問題。
Quivr 的 Brain 類別就像這位圖書館員,負責接收問題並理解其脈絡。
📄 參考:brain.py:496–500
若你曾經和這位圖書館員聊過,他會記得你過去的問題與話題,幫助他更好理解你現在的需求。Quivr 也一樣,它保留對話歷史:
📄 quivr_rag_langgraph.py:439–445
2️⃣ 理解與分析(像圖書館員在揣摩你的真正意圖)
好的圖書館員在聽完問題後,會稍作思考,試圖澄清你的真正需求,甚至會在腦中重新組織問題。
Quivr 在這步驟中,會使用「路由與拆解」機制分析輸入的查詢內容:
📄 quivr_rag_langgraph.py:325–335
這就像圖書館員心裡思考:「你是在問某個具體事實?還是想了解一個概念的整體脈絡?」
3️⃣ 資料檢索(像圖書館員到書架找資料)
當圖書館員了解了問題,他會走向書架,找出相關書籍或資料。
Quivr 會先從向量資料庫(就像「知識書架」)中搜尋相似內容:
📄 quivr_rag_langgraph.py:617–626
找到之後,會進一步使用 重排序機制 篩選出最有價值的資訊:
📄 quivr_rag_langgraph.py:648–650
如果問題很複雜,圖書館員可能需要分好幾趟去不同區域找資料。Quivr 也類似,它會啟動「動態檢索」功能來多次擴展上下文:
📄 quivr_rag_langgraph.py:700–704
4️⃣ 推理與整合(像圖書館員幫你把資料連成完整答案)
好的圖書館員不會只是把一堆書丟給你,而是會從中整合出一個具脈絡、合理又清晰的答案。
Quivr 在這個階段使用 LLM 執行生成任務,根據檢索內容來組織並產生回應:
📄 quivr_rag_langgraph.py:952–962
這就像語言模型扮演「圖書館員的大腦」,把資料拼接成有邏輯的回覆。
5️⃣ 傳遞答案(像圖書館員耐心說明他的研究結果)
最後,圖書館員會向你口頭解釋他找出的資訊,通常會從最重要的開始說,再補充相關細節。
Quivr 會透過「串流方式」將生成的答案逐段回傳給你,像在進行一場自然的對話:
📄 quivr_rag.py:220–245
與此同時,Quivr 也會將此次對話更新進歷史紀錄,以備日後參考:
📄 brain.py:559–561
6️⃣ 管控內容長度(像圖書館員知道你能吸收多少資訊)
圖書館員不會一次塞給你過多資訊,他會衡量你的吸收能力。
Quivr 也會確保傳遞給語言模型的內容不會超過其 token 限制(上下文長度):
📄 quivr_rag_langgraph.py:744–751
🔁 完整流程類比整理
步驟 | Quivr 行為描述 | 圖書館員行為類比 |
---|---|---|
🟢 接收問題 | 接收使用者查詢,並參考對話歷史 | 聆聽問題並回想過去對話 |
🧠 理解分析 | 拆解查詢內容,識別意圖 | 在心中重新組織你的問題 |
📚 資料檢索 | 使用向量資料庫進行搜尋 | 到書架搜尋合適資料 |
🎯 重排序精選 | 篩選出最有用的內容段落 | 篩掉無關資料,只保留重點書籍 |
🧩 思考與組合 | LLM 整合資訊後產出連貫回答 | 將資料整合為完整答覆 |
📤 串流回覆 | 用對話形式逐段回傳答案 | 逐步口頭解釋內容,並提供細節 |
🧾 記住歷史 | 記錄此次提問與回應,用於下次上下文參考 | 做筆記,幫助日後追蹤與理解 |
📝 備註:
這種比喻特別貼切,因為 Quivr 和圖書館員都是「知識中介」
Quivr 的整個流程以 LangGraph 建構為有向圖(Directed Graph),具高彈性、模組化設計
每個步驟可自由組合、替換,例如不同的檢索器、LLM、重排序器等
🧠 將 Brain 類別比喻成人類行為:就像一位個人圖書館員
根據 Quivr 的原始碼,Brain 類別是整個 RAG(Retrieval Augmented Generation)系統的核心。
如果用人類行為來比喻,它就像你專屬的圖書館員,負責管理你的私人知識圖書館。以下是這個比喻與實際功能之間的對應關係:
1️⃣ 建立圖書館(初始化)
當你「聘請」這位圖書館員(也就是建立一個 Brain 實例)時,你會提供:
圖書館的名稱(name 參數)
一個專屬 ID 識別證(id 參數)
存放書籍的空間(storage 參數)
他所受過的語言訓練(LLM 與嵌入模型設定)
📄 參考:brain.py:110–118
2️⃣ 收集書籍(文件儲存)
圖書館員負責管理你的「書架」。當你帶新書(文件)來時:
他會為每本書建立唯一識別碼
放入書庫中
並建立每本書的摘要卡片(metadata)
📄 brain.py:339–345
3️⃣ 閱讀與摘要(文件處理)
這位圖書館員不只是把書擺著,他還會逐本閱讀,並將重點整理在卡片上,供日後查詢使用。
📄 brain.py:349–354
4️⃣ 建立卡片目錄(向量資料庫)
圖書館員將這些摘要卡片整理成一套「概念索引系統」,透過語意而非關鍵字來快速搜尋。
📄 brain.py:356–358
5️⃣ 記憶過往對話(對話歷史)
圖書館員會保留一份筆記本,記錄你過去問過的問題與他給的回答,幫助理解新問題的背景。
📄 brain.py:290–292
6️⃣ 回答提問(ask 方法)
當你問問題時,這位圖書館員會:
仔細聆聽你提出的問題
查閱他之前的對話筆記以了解背景
搜尋卡片目錄找出相關摘要
篩出最有幫助的卡片
統整資訊,寫成一份完整回答
最後把這次的問與答也記錄到筆記本裡
📄 brain.py:496–500, brain.py:559–561
7️⃣ 思考式回覆(串流回答)
圖書館員不會一次把答案全部告訴你,而是邊思考邊講,逐段分享資訊。
Quivr 透過串流方式回傳回答內容,模擬這種逐步解說的行為。
📄 brain.py:533–535
8️⃣ 圖書館摘要資訊(info 方法)
你可以問圖書館員目前圖書館的狀況,他會告訴你:
現在總共有多少本書
最近的對話紀錄
他目前會使用哪些語言(已設定的模型)
📄 brain.py:273–288
9️⃣ 圖書館備份(save 方法)
這位圖書館員還可以幫你把整座圖書館「打包備份」,包括:
所有的書籍
卡片目錄(向量資料庫)
對話筆記本
他曾受的訓練資料(LLM 設定)
📄 brain.py:207–208
🔁 整體流程範例(從頭到尾的比喻)
想像如下情境:
聘請館員:你建立了一個名為「研究助理」的 Brain 實例
提交書籍:你上傳了一批研究論文
閱讀處理:圖書館員逐一閱讀並整理成重點卡片
建立索引:這些卡片被有系統地歸檔於語意索引中
提問:「這些論文的核心發現是什麼?」
搜尋資料:館員從目錄中找出最有關的摘要卡
統整資訊:他把這些卡片內容整合成清晰回答
口頭解釋:他一段段說明,幫助你理解
記錄過程:他將你的問題與他的答案記下,以備將來查閱
📌 小結與補充說明
Brain 是 Quivr RAG 系統的核心指揮中心
它將實際任務分派給其他模組(如 QuivrQARAGLangGraph 負責檢索與生成)
這位圖書館員的角色不只是儲存與搜尋,更會「理解、連結與回應知識」,真正成為你的「第二大腦」
🧠 Quivr 向量資料庫的人類行為類比
根據 Quivr 的原始碼,若我們將其向量資料庫做成類比,它就像是一位擁有超凡「語意記憶力」的圖書館員,所使用的高度智慧卡片目錄系統 —— 不只靠關鍵字,而是靠概念來找資訊。
1️⃣ 建立「語意指紋卡片」(向量嵌入)
傳統圖書館員會為書籍建立標準索引卡(如標題、作者、主題),但我們這位「概念圖書館員」更厲害:
他會深入閱讀每一份文件
對每個重要章節或段落製作一張「概念索引卡」
他不只是紀錄關鍵字,而是擷取內容的語意本質
每張卡片都帶有獨特的「概念指紋」:向量嵌入
📄 對應程式碼:brain.py:334–335
2️⃣ 整理概念卡片目錄(向量儲存)
與傳統卡片目錄按字母排序不同,這位圖書館員把卡片依語意概念放在多維空間中:
相似概念會「空間上靠近」
他能即時測量任意兩張卡片之間的「語意距離」
即使用詞不同,語意接近的卡片也能被正確放一起
📄 對應程式碼:brain.py:356–358
3️⃣ 以語意查詢(相似度搜尋)
當你提出問題時,這位圖書館員不靠關鍵字,而是靠語意:
他先為你的問題產生一個「語意指紋」
接著掃描整個卡片目錄,尋找與之相似的指紋
即使用的詞彙不同,只要語意相近,也能找到
最終根據「語意相似度」來排序結果
📄 對應程式碼:brain.py:481–483
4️⃣ 精煉搜尋結果(重排序)
找到一堆可能相關的卡片後,圖書館員不會全丟給你,而會進一步篩選:
仔細檢視每張卡片是否真的有幫助
移除「看似相關但實際無用」的卡片
優先挑出最關鍵、最具信息量的卡片
確保整體內容不會超出你能吸收的資訊量(上下文長度)
📄 對應程式碼:quivr_rag_langgraph.py:648–650
5️⃣ 自適應檢索(動態擴充)
若你的問題比較複雜,這位圖書館員會更靈活處理:
一開始先抓一批相關卡片
如果發現不夠,他會再去抓更多
直到資料夠回答為止,或達到限制
同時會控制總資訊量不超過你的理解範圍
📄 對應程式碼:quivr_rag_langgraph.py:700–704
📘 完整類比流程
假設一整個流程如下:
處理文件:你提供研究論文給圖書館員
建立卡片:他為每個重要章節建立帶有「概念指紋」的卡片
整理卡片:將卡片依語意放在多維空間中
提問:「地中海飲食有哪些健康益處?」
轉換問題:他為你的問題產生一個語意指紋
語意搜尋:他掃描卡片找出語意相近的資料
重排序:他精選並過濾出真正有用的卡片
動態補充:如果不夠,就繼續擴大搜尋範圍
整合回答:他將卡片內容組合成完整有邏輯的回應給你
⚙️ 技術實作對應
Quivr 中的這套「語意索引系統」由下列技術實作:
類比元件 | 實際實作 |
---|---|
概念指紋卡片 | 向量嵌入(OpenAI Embeddings 等) |
卡片目錄空間 | 向量資料庫(FAISS) |
語意搜尋 | 相似度搜尋演算法 |
重排序 | Cohere / Jina 等 reranker 模型 |
動態擴充 | 自適應檢索邏輯(Dynamic Retrieval) |
📌 小結
向量資料庫在 Quivr 的 RAG 系統中是不可或缺的核心元件
它支援以「概念語意」為基礎的資訊檢索,遠超過傳統關鍵字搜尋
它與 Brain 類別及其他模組密切整合,構成一套智慧、自然且能理解語意的知識檢索系統
這個「概念圖書館員」的比喻有助於理解向量資料庫不只是資料儲存,而是一個能理解你語意的智慧夥伴。
🧠 向量資料庫就像圖書館員的概念型卡片目錄
如果將 Quivr 的向量資料庫用人類行為來比喻,它就像是一位具備超凡語意記憶力的圖書館員,使用的是一種以概念與意義為基礎的卡片系統,而非僅憑書名或關鍵字。
1️⃣ 建立「概念索引卡片」(向量嵌入)
傳統圖書館員在整理書籍時,會建立基本的卡片:書名、作者、主題。但這位「概念型圖書館員」會:
仔細閱讀每一份文件
對每一個重要段落建立一張特製的「概念索引卡」
不只是記錄關鍵字,而是提取內容的本質與意義
每張卡片都包含一個獨特的「概念指紋」(即向量嵌入)來代表那段內容
📄 對應程式碼:brain.py:334–335
2️⃣ 整理卡片目錄(向量儲存)
與傳統字母排序的卡片不同,我們的概念圖書館員會把卡片依語意概念排列於多維空間中:
相似概念的卡片會被放在彼此靠近的位置
他可以立即測量任意兩張卡片之間的「概念距離」
即使使用不同的術語,也能找出彼此相關的卡片
📄 對應程式碼:brain.py:356–358
3️⃣ 用語意搜尋(相似度搜尋)
當你提問時,這位圖書館員不會只找關鍵字:
他會先為你的問題建立一個「概念指紋」
然後在卡片目錄中掃描找出最接近的指紋
即使你的用詞和內容完全不同,只要概念相近,他就能找到
最後依「概念相似度」排序結果,而非文字相符度
📄 對應程式碼:brain.py:481–483
4️⃣ 精煉搜尋結果(重排序)
找到一批可能相關的卡片後,這位圖書館員不會全部交給你:
他會逐張卡片檢視是否真正與你問題相關
排除那些雖然相似但實際無助的內容
優先挑出最具啟發性與參考價值的資訊
並控制總資訊量在你能消化的範圍內(上下文長度)
📄 對應程式碼:quivr_rag_langgraph.py:648–650
5️⃣ 自適應檢索(動態擴充)
面對複雜問題時,這位圖書館員會更加靈活:
一開始只取出一批標準數量的卡片
如果發現資訊不夠,他會再拿出更多卡片
持續擴展直到資料充足或達到檢索上限
全程確保資訊總量不會超出你的理解負荷
📄 對應程式碼:quivr_rag_langgraph.py:700–704
🧩 完整流程範例
想像以下情境:
處理文件:你帶來幾篇研究論文,圖書館員細讀每一篇
建立概念卡片:每個重要段落都被製作成一張帶有「概念指紋」的卡片
整理卡片目錄:他依據內容意義將卡片編排在語意空間中
提出問題:「地中海飲食對健康有什麼好處?」
建立問題指紋:圖書館員將問題轉換成語意向量
語意搜尋:他快速從卡片中找出相似指紋的內容
重排序篩選:剔除無關內容,優先回傳最關鍵卡片
動態擴充:若結果不足,他會補充更多直到足夠
整合回答:他用卡片內容組合出完整、連貫的答案給你
⚙️ 技術對應
在 Quivr 中,這整個「概念型卡片系統」是由以下元件組成的:
功能 | 技術實作方式 |
---|---|
概念指紋建立(語意向量) | 向量嵌入模型(如 OpenAI Embeddings) |
卡片儲存與檢索 | FAISS 向量資料庫 |
語意搜尋 | 相似度比對演算法 |
結果重排序 | 重排序模型(如 Cohere、Jina) |
自適應擴充檢索 | 動態檢索邏輯(Dynamic Retrieval) |
✅ 小結
向量資料庫是 Quivr RAG 系統的核心元件,使其能夠根據語意進行高效率的知識檢索。
它能超越傳統關鍵字匹配,找出「概念相似但用詞不同」的資訊。
與 Brain 類別等元件緊密結合,形成一套完整的智慧化知識系統。
「概念卡片目錄」的比喻,有助於理解向量資料庫如何運作、為何強大。
🧠 嵌入的比喻:圖書館員的「概念指紋」技巧
若我們延續前面「向量資料庫是圖書館員的概念卡片目錄」的比喻,那麼**嵌入(embeddings)就像是這位圖書館員用來為每份資料製作「概念指紋」**的特殊技術。
1️⃣ 概念指紋的產生過程
想像這位圖書館員擁有一項超能力,可以把任何文字的本質提煉出來,變成一組獨特的「概念圖譜」:
每當有新文件送來,他會細讀全文
不只是標註關鍵字或主題,而是深入分析其真正含義
然後產生一組「概念指紋」——一種捕捉語意本質的模式
這種指紋不是根據文字表面,而是根據底層概念與想法來形成
📄 在 Quivr 中,這步驟由嵌入模型處理(通常是 OpenAI 的 Embeddings)
📄 對應程式碼:brain.py:334–335
2️⃣ 多維語意空間中的位置
與真實世界中的指紋不同,這種「概念指紋」存在於多維的語意空間中:
每個維度代表語意的不同層面
例如:情感(正面/負面)、主題(科學、藝術、政治)、文風、抽象程度等
將所有維度合併後,就形成這段文字在語意空間中的獨特「位置」
📄 Quivr 建立向量資料庫的過程,就是把這些指紋放進這個多維語意空間裡
📄 對應程式碼:brain.py:356–358
3️⃣ 測量概念相似度
這些「概念指紋」最大的威力,在於比較不同內容的語意相似度:
圖書館員可以將兩段不同內容的指紋進行比較
他不是比對字面,而是比對整體概念與思維模式
即使文字完全不同,只要意義接近,指紋也會相似
📄 這正是 Quivr 如何執行相似度搜尋的原理
📄 對應程式碼:brain.py:481–483
4️⃣ 問題也能被指紋化
當你問問題時,圖書館員不會只查關鍵字:
他會先用同樣技術為你的問題建立「概念指紋」
然後比對資料庫中所有文段的指紋
指紋最接近的文件就會被選出
✅ 即使你的提問用的是完全不同的詞彙,也能正確比對並取得相關內容
5️⃣ 「概念」這種通用語言
最神奇的是,這種「概念指紋」超越了具體語言與詞彙的限制:
兩篇用不同字詞描述相同觀念的文章,會有相似的指紋
不同語言的內容,只要講同樣的主題,也會產生類似指紋
甚至比喻、隱喻等間接說法,也能與字面意義的說法連結起來
✅ 因為這些指紋捕捉的是「內容的意義」,而非「表達的形式」
⚙️ 技術實作方式
在 Quivr 中,嵌入的處理流程如下:
每段文字會送入嵌入模型(例如 OpenAI 的 text-embedding-ada-002)
模型透過神經網路分析語意
輸出一個高維度的向量(例如 1536 維的浮點數)
該向量會儲存到向量資料庫(預設為 FAISS)
當有查詢時,系統會產生查詢的嵌入向量,並用餘弦相似度與資料庫中比對
找出最相似的結果並回傳對應文段
🌍 真實案例舉例
假設有一篇文章在討論氣候變遷,但從未出現「全球暖化」這四個字,只提到了:
氣溫上升
冰層融化
溫室氣體
若你用傳統關鍵字搜尋「全球暖化的影響」,這篇文章可能不會出現。
但如果你用嵌入技術:
該文章會有一組概念指紋,代表「氣候變遷」的語意
你的查詢也會產生一組相似的指紋
即使詞彙不同,模型會判定其概念接近,成功配對
✅ 這就是嵌入強大的原因:它理解的是「意義」而非「文字」
📌 補充說明
嵌入是一種「語意壓縮技術」,能把複雜意思壓縮成固定長度的向量
嵌入品質對 Quivr 的檢索效果有重大影響
不同嵌入模型(如 OpenAI、Cohere、BGE 等)各有其優劣與適用領域
「概念指紋」這個比喻能幫助你理解嵌入如何超越關鍵字匹配,抓住語意核心
📚 向量嵌入 vs. 傳統圖書館編目:觀念與方法的比較
根據 Quivr 的原始碼,你想比較 Quivr 的向量嵌入方法與傳統圖書館員使用主題詞與權威詞彙所進行的編目方式。這是一場非常有意義的比較,涉及現代 AI 資訊檢索技術與傳統知識組織系統的根本差異。
🧠 Quivr 中的向量嵌入流程
使用 OpenAI 的嵌入模型建立語意向量:brain.py:334–335
儲存於向量資料庫中:brain.py:356–358
進行語意相似搜尋:brain.py:481–483
🔍 核心比較項目
1️⃣ 知識表達方式(Knowledge Representation)
傳統圖書館編目:
✅ 手動編目:由受訓圖書館員進行內容分析並指派主題詞
✅ 控制詞彙表:使用如 LCSH(國會圖書館主題詞)等標準化詞彙
✅ 階層分類:知識架構多為分類法與樹狀結構
✅ 權威控制:確保人名、機構等命名一致性
Quivr 向量嵌入:
🤖 自動化:AI 模型自動將文字轉換為語意向量
🌐 連續語意空間:以多維空間表示概念
🔄 潛在語意關係:捕捉隱含的語意相似性與概念連結
❌ 無明確階層:關聯存在於向量距離中,而非明確標示
2️⃣ 細緻度與特徵呈現(Granularity & Specificity)
傳統圖書館編目:
📄 文件層級:多為整份書籍或文章指定主題
🔢 詞彙有限:每項資料實際可指派主題有限
✍️ 人工選擇:精選出「重要主題」呈現給讀者
⚖️ 一致性高:強調不同資料間的主題標註一致
Quivr 向量嵌入:
📑 段落或區塊層級:針對每一段文字建立向量
📈 高維度表示:向量可捕捉數百甚至上千個語意維度
🔍 全面覆蓋:自動捕捉文本中所有概念關聯
🔗 保留上下文:向量內隱含詞句與語意的連結
3️⃣ 檢索與搜尋機制(Search & Retrieval)
傳統圖書館編目:
🧩 布林邏輯:透過 AND / OR / NOT 條件檢索
⛳ 精準匹配:需輸入正確主題詞
🧭 主題瀏覽:支援階層式主題導覽
👓 人類可讀:標註詞彙為人類理解所設計
Quivr 向量嵌入:
📐 相似度搜尋:使用餘弦相似度或向量距離
🤏 模糊匹配:即使用字不同也能找出相似內容
📝 範例式查詢:可以輸入一段文字作為查詢樣本
⚙️ 機器最佳化:向量設計優化為機器理解而非人類可讀
4️⃣ 靈活性與演進速度(Adaptability & Evolution)
傳統圖書館編目:
🐢 更新緩慢:主題詞表透過委員會審議進行修訂
📚 向後相容:重視舊資料的可讀性與可用性
🏛️ 文化偏誤:易保留歷史偏見與刻板分類
🧱 關係明確:主題之間的階層與關聯為明文定義
Quivr 向量嵌入:
⚡ 快速演進:模型可快速更新與重訓
🔄 自動適應:新詞彙出現也能自動學習其概念
⚠️ 含有偏誤:嵌入模型可能受訓練資料的偏見影響
🌌 關係浮現:概念之間的關聯來自數據而非人為定義
5️⃣ 可解釋性與透明性(Explainability)
傳統圖書館編目:
✅ 流程透明:有明確的主題指派準則
✅ 決策可說明:館員能說明為何選某主題
📖 標準清楚:依據出版的標準與規則操作
👨🏫 人工監督:主題標註皆經專業人員審核
Quivr 向量嵌入:
❓ 黑箱模型:向量產生過程難以解釋
📊 統計性:來自大量數據模式學習
🧩 難以稽核:無法直接解釋相似度來源
🤖 自動化:少有人工參與與干預
🎯 實務意涵(實際應用差異)
面向 | 傳統編目 | Quivr 嵌入系統 |
---|---|---|
📚 資料發現體驗 | 結構化、可預期 | 關聯式、探索式、彈性高 |
🔧 維護需求 | 需人工持續維護 | 自動處理新資料,但模型需定期更新 |
🌍 跨語支援 | 各語言需獨立主題詞系統 | 向量自然支援跨語語意比對 |
📈 新興主題處理 | 需新增主題詞才能正式標註 | 新議題可即時透過語意比對被納入 |
🎯 精準度 vs 廣度 | 通常追求高精準度 | 可取得更多潛在相關資料(高召回率) |
🔄 混合應用的可能性
現代資訊系統已開始探索混合式方法,例如:
結合 嵌入的語意自動化 與
傳統主題分類的結構與可說明性
在 Quivr 中,未來也可能:
將圖書館的主題詞(如 LCSH)加入向量搜尋的過濾條件
或將主題詞做為語意嵌入的補強訊號,增強檢索精度
📌 備註:
本比較聚焦於觀念差異,而非技術實作細節
兩種系統在不同使用情境下各有強項與限制
Quivr 的嵌入式知識檢索代表一種全新語意驅動的知識組織典範
根據其原始碼與架構設計,Quivr 是一套以生成式 AI 驅動的「第二大腦」系統,旨在成為個人的知識助手。以下是最常見與實用的應用情境,涵蓋個人與專業領域。
1️⃣ 個人知識管理(Personal Knowledge Management)
Quivr 最核心的用途就是成為個人的知識庫,也就是你的「第二大腦」:
儲存並組織個人文件
使用自然語言查詢筆記與資料
根據你自己的內容產生 AI 回答
📄來源:README.md:11
這是 Quivr 的設計起點,也是最普遍的使用方式。
2️⃣ 文件處理與分析(Document Processing and Analysis)
Quivr 能有效處理多種文件格式並建立可搜尋的內容庫:
PDF 文件
純文字檔案(TXT)
Markdown 筆記
自定義格式(可自寫 Parser 支援)
📄來源:README.md:17
對於研究人員、學生、專業人士來說,這是一個強大的知識整理與萃取工具。
3️⃣ 多模型整合(Multi-LLM Integration)
Quivr 支援多家語言模型供應商,提供彈性與可擴展性:
OpenAI(GPT)
Anthropic(Claude)
Mistral
Google Gemma
📄來源:README.md:16
你可以根據預算、表現與語言支援選擇最合適的模型。
4️⃣ 自定義 RAG 工作流程(Custom RAG Workflows)
你可以針對不同應用場景設計工作流程,實現更細緻的控制,例如:
學術研究助理
法律文件分析
醫學文獻整理
技術文件檢索與比對
5️⃣ 多語言內容處理(Multilingual Content Processing)
Quivr 內建語言自動識別與多語重排序模型的支援:
適合處理跨語言資料集
提升國際化研究與多語內容的搜尋效率
適合全球業務情報、跨國研究機構等應用場景。
6️⃣ 互動式聊天應用(Interactive Chat Applications)
透過串流式回應(streaming responses),Quivr 非常適合建立即時對話應用:
📄來源:quivr_rag.py:220-245
可用於:
客服聊天機器人
學習助手
即時研究查詢助理
7️⃣ 結合網路搜尋(Enhanced Web Search with Context)
你可以將 Quivr 擴展為具備網路搜尋能力的工具:
📄來源:README.md:18
應用場景包括:
結合個人知識與最新網路資訊
進行即時事實查核
補充外部資料來源以強化答案
8️⃣ 文件導向應用(Document-Centric Applications)
透過「完整文件語境檢索」,Quivr 特別適合用於需保留文脈的應用:
合約條文分析
政策文件解讀
技術手冊導航
9️⃣ 教育應用(Educational Applications)
Quivr 的 Brain 類別支援多種學習情境:
📄來源:brain.py:87-100
應用實例:
學習助理
課程資料查詢
製作學習素材
🔟 開發者工具整合(Developer Tool Integration)
模組化架構讓 Quivr 可輕鬆整合進開發者工作流程:
📄來源:brain.py:356-358
可應用於:
程式碼文件搜尋
API 文件查詢
技術知識管理平台
🧪 實作範例:個人知識管理
以下是如何使用 Quivr 建立個人文件庫並查詢:
from quivr_core import Brain
from uuid import uuid4
# 建立你的「大腦」並加入文件
brain = Brain.from_files(
name="Research Papers",
file_paths=["paper1.pdf", "paper2.pdf", "notes.md"],
)
# 提問:統整這些文件的重點發現
run_id = uuid4()
answer = brain.ask(
run_id=run_id,
question="這些論文的關鍵發現有哪些?",
retrieval_config=None # 使用預設設定
)
print(answer.answer)
📌 備註
Quivr 架構高度彈性,能擴展到多種專業領域
透過模組化設計,可自訂 RAG 流程、模型與排序器
支援多 LLM + 多語言 + 多格式文件 = 適用範圍廣泛
🧠 Quivr 如何建立知識庫
根據原始碼來看,需要特別注意的是:Quivr 並不是建立傳統那種具有明確實體關聯的「知識圖譜(Knowledge Graph)」。它所建構的,其實是一種基於向量的知識庫(Vector-Based Knowledge Base),運用的是 RAG(檢索增強生成)技術。
以下是 Quivr 建立知識庫的方式說明:
🔧 Quivr 知識庫的核心組件
Quivr 的核心運作元件是 Brain 類別,負責整個知識庫的構建流程。
📄 參考程式碼位置:brain.py:87-100
建立知識庫的流程包含以下幾個關鍵步驟:
1️⃣ 文件匯入與儲存
當你使用文件建立一個 Brain 實例時,Quivr 首先會將這些文件儲存在所選的儲存系統中。
📄 參考:brain.py:339-345
這部分的程式碼負責將檔案上傳與初始化儲存作業。
2️⃣ 文件處理與切分
文件儲存後,Quivr 會進行以下處理動作:
提取文件中的文字內容
將文件拆分為可管理的「段落區塊(chunk)」
為每個區塊附加相關的中繼資料(metadata)
這些處理動作由 process_files 函式執行:
📄 brain.py:46-84
對純文字檔,Quivr 使用遞迴式字元切分演算法來處理。
3️⃣ 向量嵌入生成
當文件被處理並切分後,Quivr 會將每個段落轉換為向量嵌入(vector embedding),預設使用 OpenAI 的嵌入模型。
📄 參考:brain.py:334-335
4️⃣ 建立向量資料庫
這些嵌入向量會被儲存在向量資料庫中(預設為 FAISS),用以支援後續的語意相似度檢索。
📄 參考:brain.py:356-358
此向量資料庫就是 Quivr 知識庫的核心,能根據語意相似度找出最相關的資訊。
🔍 檢索流程(Retrieval Process)
當你對知識庫提出查詢時,Quivr 會:
使用向量相似度搜尋找出相關段落
📄 brain.py:481-483
使用重排序演算法(如 Cohere 或 Jina)提升檢索結果的準確性
📄 quivr_rag_langgraph.py:648-650
🔁 RAG 工作流程(RAG Workflow)
整體 RAG 流程由 LangGraph 所建構的有向圖(Directed Graph)實作而成:
📄 quivr_rag_langgraph.py:254-275
這樣的圖形式工作流程允許彈性設定處理步驟,如:
對話歷史過濾
查詢改寫
文件檢索
回答生成
其中檢索步驟是連結向量知識庫的關鍵:
📄 quivr_rag_langgraph.py:617-626
🔄 動態檢索(Dynamic Retrieval)
Quivr 也支援「動態檢索」,可根據查詢需求自動調整檢索區塊的數量,特別適合處理複雜問題。
📄 quivr_rag_langgraph.py:675-684
🧾 總結:Quivr 知識庫的建立流程
步驟 | 說明 |
---|---|
文件匯入 | 將檔案上傳至儲存系統 |
文件處理 | 提取內容並切分為段落區塊 |
向量嵌入 | 每個區塊轉為向量表示 |
建立索引 | 向量嵌入儲存在向量資料庫中(如 FAISS) |
向量檢索 | 查詢時根據語意找出相關段落 |
重排序 | 使用排序模型提升結果品質 |
回答生成 | 基於檢索內容由 LLM 產生回答 |
🧠 備註
Quivr 並非建構明確實體關係的知識圖譜,而是基於語意相似度的「向量化知識庫」
架構採模組化設計,可自由替換:
嵌入模型(如換成 Hugging Face)
向量資料庫(如換成 Weaviate、Pinecone)
RAG 工作流程亦可針對不同應用情境自訂修改
🔍 Quivr 與主流知識圖譜系統的比較
首先需說明的是:Quivr 並非傳統意義上的知識圖譜系統,而是一種基於向量技術的知識庫,採用 RAG(Retrieval Augmented Generation,檢索增強生成) 方法來進行語意檢索與回答生成。
🧠 Quivr 如何建立知識表示(Knowledge Representation)
Quivr 的知識表示核心由 Brain 類別負責實作:
📄 參考程式碼:brain.py:87-100
主要流程如下:
文件匯入:使用者將文件上傳到指定儲存系統
文件處理:提取內容並切分成段落(chunks)
向量嵌入:每個段落轉換為向量表示(embedding)
儲存向量:使用 FAISS 建立向量資料庫(預設)
語意檢索:透過向量相似度搜尋找出相關段落
📊 Quivr 與傳統知識圖譜系統比較
以下為 Quivr 與幾個主流圖譜系統(Neo4j、Amazon Neptune、Stardog、GraphDB、AnzoGraph)的特性對照表:
1️⃣
Neo4j
特性 | Quivr | Neo4j |
---|---|---|
資料模型 | 向量嵌入 | 屬性標記圖(Labeled Graph) |
關係表達 | 隱性(語意相似度) | 顯性(型別化關係) |
查詢語言 | 自然語言 | Cypher |
實體辨識 | 倚賴語言模型(LLM) | 預先定義的 schema |
可擴展性 | 向量資料庫受限 | 高度可擴展 |
AI 整合 | 原生整合 LLM | 需外掛模組整合 |
2️⃣
Amazon Neptune
特性 | Quivr | Amazon Neptune |
---|---|---|
資料模型 | 向量嵌入 | RDF 或屬性圖 |
查詢語言 | 自然語言 | SPARQL 或 Gremlin |
主機環境 | 自行部署 | 全託管雲端服務 |
可擴展性 | 中等(視向量庫而定) | 企業等級 |
AI 整合 | 內建 RAG 功能 | AI 功能需另建模 |
成本 | 開源免費 | 按用量計費 |
3️⃣
Stardog
特性 | Quivr | Stardog |
---|---|---|
資料模型 | 向量嵌入 | RDF 圖模型 |
推理機制 | 基於 LLM | 邏輯推理引擎 |
查詢語言 | 自然語言 | SPARQL |
知識表達 | 隱性語意 | 顯性本體(Ontology) |
企業功能 | 限制較多 | 完善的企業等級功能 |
向量處理 | 核心功能 | 附加功能 |
4️⃣
GraphDB
特性 | Quivr | GraphDB |
---|---|---|
資料模型 | 向量嵌入 | RDF 三元組資料庫 |
標準支援 | 無明確標準 | 支援 RDF、OWL、SPARQL |
推理能力 | 語言模型推理 | 規則式與語意推理引擎 |
資料視覺化 | 基礎(需自建) | 內建圖譜視覺化工具 |
實體連結 | 隱性連結 | 明確關聯 |
文本處理 | 文件切段 | NLP 與資訊擷取流程 |
5️⃣
AnzoGraph
特性 | Quivr | AnzoGraph |
---|---|---|
資料模型 | 向量嵌入 | RDF 與屬性圖混合模型 |
效能架構 | 單節點向量庫 | 分散式 MPP 架構 |
圖分析能力 | 基礎 | 進階圖形分析 |
擴展能力 | 中等 | 企業等級大規模 |
查詢語言 | 自然語言 | SPARQL、Cypher |
AI 整合 | 內建 LLM 支援 | 額外模組整合 |
🔍 核心差異分析
1. 關係建模方式:
隱性 vs 顯性
傳統圖譜系統(如 Neo4j、Stardog) 使用節點與邊明確建模資料間的結構化關係。
Quivr 則依賴向量空間中的語意相似性,關係為隱性推斷。
📄 參考:brain.py:481-483
2. 查詢方式:
自然語言 vs 結構語言
圖譜系統 使用結構化語言如 SPARQL、Cypher。
Quivr 使用自然語言查詢,經由 RAG 流程解析並回應。
📄 參考:quivr_rag_langgraph.py:254-275
3. 架構需求:
無結構 vs 嚴謹 Schema
傳統圖譜需定義資料 Schema 與實體類型。
Quivr 屬於「無結構」架構,不需預設實體結構。
📄 參考:brain.py:46-84
4. 推理能力:
語言模型 vs 邏輯推理
知識圖譜 仰賴邏輯規則進行本體推理。
Quivr 則使用 LLM 進行語意推理與上下文理解。
📄 參考:quivr_rag_langgraph.py:617-626
🧭 選擇建議:Quivr vs 傳統知識圖譜
✅ 適合選用 Quivr 的情境:
不需建立明確的關聯圖結構
希望快速上手、無需定義 Schema
主要以自然語言查詢為主
希望直接與語言模型整合
資料來源為文件或筆記,重點在問答與摘要功能
✅ 適合選用傳統圖譜的情境:
資料結構複雜、關係明確
需要邏輯推理與規則處理
須支援標準查詢語言(SPARQL、Cypher)
有企業級效能與資料治理需求
希望進行大規模圖形分析與視覺化
📌 總結
分類 | Quivr | 傳統知識圖譜系統 |
---|---|---|
知識表示方式 | 向量語意嵌入 | 顯性實體與關係 |
查詢方式 | 自然語言 → RAG | 結構化語言(SPARQL、Cypher) |
推理方式 | 語言模型推論 | 規則引擎、本體推理 |
架構彈性 | 無結構(免定義 Schema) | 須明確定義資料架構 |
適用場景 | 文件問答、知識摘要、語意檢索 | 複雜資料建模、圖形推理、企業治理 |
AI 整合 | 原生支援(LLM) | 需額外整合 |
📌 備註:
Quivr 的設計更貼近現代 AI 驅動的知識系統趨勢
傳統知識圖譜則更適合需要嚴謹資料結構與推理邏輯的場景
越來越多「混合型架構」正在出現,結合向量嵌入與圖形關係建模
當我們比較「向量技術的知識庫」(Vector-Based Knowledge Base)與「知識圖譜」(Knowledge Graph, KG)時,其差異主要體現在資料結構、查詢方式、推理方式與應用場景上。以下為完整對照:
🧠 向量知識庫 vs. 知識圖譜:全面比較
項目 | 向量技術的知識庫(如 Quivr) | 傳統知識圖譜(如 Neo4j、Stardog) |
---|---|---|
📦 資料結構 | 向量嵌入(embeddings) | 實體 + 關係 + 屬性(節點與邊) |
🔍 查詢方式 | 自然語言查詢 → RAG | 結構化語言查詢(SPARQL、Cypher) |
🤔 關係建模 | 隱含語意關聯(語義相似度) | 顯性語義關係(明確定義邏輯連結) |
🧠 推理方式 | LLM 語意推理(上下文理解) | 規則式推理 / 本體論推理引擎 |
🏗️ 架構需求 | Schema-free,無需預建結構 | Schema-driven,需定義本體與關係 |
📚 知識表達方式 | 語意向量空間中的上下文表示 | 節點(實體)與邊(關係)構成的結構化表示 |
🔄 資料更新 | 文件更新後需重新嵌入向量 | 即時更新關係與屬性即可 |
📈 可擴展性 | 向量資料庫受限於記憶體與檢索效能 | 圖形資料庫可水平擴展、大規模佈署 |
🔧 AI 整合 | 原生支援 LLM(如 GPT、Claude) | 需額外模組整合 AI 功能 |
💬 回答風格 | 生成式回應(摘要式、自由文字) | 精準查詢回傳結構化結果 |
🎯 適合應用場景 | 非結構化文件檢索、問答系統、知識摘要、個人筆記助理等 | 複雜資料模型、法規、供應鏈、生醫圖譜、推薦系統等應用 |
🧩 結論建議
✅ 適合使用向量知識庫(如 Quivr)當你:
想快速上手建立個人或文件型知識系統
主要資料是文字、筆記、PDF、教學內容等
查詢方式偏好自然語言
希望與 LLM 緊密結合(如 GPT 生成回應)
不需要手動建構實體與關係模型
✅ 適合使用知識圖譜當你:
擁有結構化資料,關係複雜(例如人、事件、產品間關係)
需要可解釋推理邏輯、問責性與知識溯源
想透過圖譜分析做複雜的查詢與視覺化
要支援標準語言查詢、規則、推論與驗證
📚 圖書館使用的 Linked Data(連結資料) 明確屬於 傳統知識圖譜(Knowledge Graph) 的範疇,特別是採用了語意網技術(Semantic Web)和W3C 標準。
🧠 為什麼圖書館的 Linked Data 是知識圖譜類型?
以下是幾個關鍵特徵:
特徵 | 圖書館 Linked Data 描述 | 對應類型 |
---|---|---|
📦 資料模型 | 使用 RDF(Resource Description Framework) 三元組模型(主詞-謂詞-賓詞) | ✅ 傳統知識圖譜 |
🧩 架構設計 | 基於 明確定義的本體(Ontology),如 BIBFRAME、Dublin Core、SKOS | ✅ 知識圖譜 |
🔗 關係表達 | 顯性語意關係(例如:「書籍」由「作者」創作) | ✅ 知識圖譜 |
🧠 推理能力 | 可支援推理(Reasoning)與分類,透過 OWL、RDFS 等邏輯推論 | ✅ 知識圖譜 |
🌐 資料連結 | 與其他機構(如 VIAF、Wikidata)交叉連結形成「網狀資料宇宙」 | ✅ 知識圖譜 |
🔍 查詢語言 | 使用標準語言 SPARQL 進行查詢 | ✅ 知識圖譜 |
🔗 常見圖書館 Linked Data 標準與實作
BIBFRAME:取代 MARC 格式的 RDF 模型,由美國國會圖書館推動
Dublin Core:描述資源的核心元素標準(標題、作者、主題等)
SKOS:用於表述分類系統、詞彙表(如主題標籤、分類號)
VIAF、ISNI:用於人名、機構名的實體標識碼,支援跨機構連結
✅ 結論
圖書館所用的 Linked Data 完全屬於「知識圖譜」類型,其特徵包括:
使用語意標準(RDF, OWL, SPARQL)
本體導向資料建模
高度結構化與可互操作性
適用於大規模查詢、共享與連結知識
📚
Linked Data 更適合「權威資料」的原因
Linked Data(語意網技術下的知識圖譜)非常適合處理:
✅
穩定性高、邏輯結構明確、需標準化的資料
,如:
圖書館目錄(書名、作者、ISBN、主題分類)
法規條文與其解釋關係
地名、歷史事件、專有名詞(如 VIAF、ISNI)
學術本體(如醫學術語、教育分類)
原因:
📐 需嚴格結構化(有 schema、本體)
🧠 需邏輯推論與問責性(可驗證關係是否正確)
🔗 要與其他機構資料互連(如 Wikidata、DBpedia)
🏛️ 通常是權威資料庫,變動不頻繁
⚡
向量知識庫更適合「快速變動、非結構化資訊」的原因
Vector-based Knowledge Base(例如使用 RAG 的 Quivr)適合處理:
✅
內容快速產生、難以結構化或動態變化的資訊
,如:
最新新聞、技術趨勢文章
使用者筆記、討論紀錄、支援票據(Helpdesk logs)
學習筆記、研究文件、個人知識管理
公司內部報告、簡報、PDF 彙整
原因:
📄 資料是非結構化或半結構化的自然語言
⏱️ 內容更新頻繁,不適合建模型
🧠 查詢方式是語意驅動的問答、摘要、推理
🚀 建置與應用速度快,支援 LLM 整合
🧭 總結比較
特性 | Linked Data / 知識圖譜 | 向量知識庫(Vector KB / RAG) |
---|---|---|
資料性質 | 權威性高、穩定、可結構化 | 快速變動、非結構化、動態生成 |
架構需求 | 本體、schema、RDF/SPARQL | 無 schema,自然語言為主 |
資料來源 | MARC、規範表、詞彙表、官方資料 | PDF、筆記、聊天記錄、報告等 |
更新頻率 | 低、可控 | 高、即時 |
推理方式 | 本體論 + 邏輯規則 | 語言模型(LLM)語意推理 |
建置與維護成本 | 高(需建模) | 低(只需上傳文件) |
適合應用 | 知識標準化、資料互通、圖譜查詢 | 文件問答、研究支援、快速整理資訊 |
✅ 結論:
若你要處理「標準化、可引用、具邏輯關係」的穩定資訊(如圖書分類、人物身份、法律編碼),→ Linked Data 是最佳選擇。
若你要處理「即時收集、語意搜尋、知識萃取」的筆記或文檔,→ 向量知識庫與 RAG 更靈活實用。
🧩 Quivr 所依賴的元件與套件組成
根據 Quivr 的原始碼與設定檔內容,可以將其外部依賴與核心元件分為以下幾大類:
1️⃣ 核心語言與開發框架
Quivr 是以 Python(版本 3.11 或以上) 開發,並使用多個核心函式庫:
Pydantic:用於資料驗證與設定管理(pyproject.toml:6-7)
Rich:提供美觀的終端機輸出格式(pyproject.toml:12)
2️⃣ LangChain 生態系統依賴
Quivr 的 RAG 系統高度依賴 LangChain 生態系統,作為其語言模型應用框架:
LangChain Core:構建 LLM 應用的基礎核心(pyproject.toml:8)
LangChain:主程式庫(pyproject.toml:9)
LangGraph:用於實作具狀態與流程控制的多步驟對話工作流(pyproject.toml:10)
LangChain Community:社群開發的擴充模組(pyproject.toml:17)
3️⃣ LLM 提供者整合模組
Quivr 支援多家語言模型供應商,並透過 LangChain 套件整合:
OpenAI 模型整合(pyproject.toml:15)
Anthropic(Claude) 模型整合(pyproject.toml:18)
Cohere 模型整合(pyproject.toml:16)
MistralAI 模型整合(pyproject.toml:25)
4️⃣ 向量資料庫與嵌入模型
文件向量化與相似度檢索的依賴:
FAISS(Facebook AI Similarity Search):高效的向量檢索工具(pyproject.toml:21)
Tiktoken:OpenAI 提供的分詞工具,用於切段與 Token 控制(pyproject.toml:13)
5️⃣ 文件處理相關工具
Quivr 能處理多種文件格式,依賴以下模組:
Transformers + SentencePiece:用於嵌入與自然語言處理(pyproject.toml:20)
FastText-LangDetect:用於自動語言偵測(pyproject.toml:26)
MegaParse SDK:文件解析與預處理(pyproject.toml:24)
6️⃣ 實用輔助套件
這些工具用於輔助 Quivr 的基本操作:
HTTPX:非同步 HTTP 請求(pyproject.toml:11)
AIOFiles:非同步檔案處理(pyproject.toml:14)
RapidFuzz:模糊字串比對(pyproject.toml:22)
MarkupSafe:安全處理 HTML/文字(pyproject.toml:23)
7️⃣ 監控與可觀測性(Observability)
Langfuse:提供語言模型使用追蹤、效能監控與記錄分析(pyproject.toml:27)
8️⃣ 間接依賴(Transitive Dependencies)
根據 lock 檔案,Quivr 間接使用以下重要函式庫:
Cohere SDK:用於重排序(requirements.lock:41-42)
SQLAlchemy:資料庫操作 ORM(requirements.lock:265-267)
Pandas:資料處理工具,間接由其他模組依賴(推測自 tzdata 需求)
9️⃣ 工作流程設定檔(Workflow Configuration)
Quivr 使用 YAML 檔案來定義 RAG 工作流程(如:talk_to_file_rag_config_workflow.yaml):
可設定內容包括:
LLM 參數(模型、溫度、Token 限制)
重排序器設定(模型名稱、返回 top_n)
節點流程邏輯與連接方式
🔟 開發與測試相關依賴
開發者可使用以下工具進行型別檢查、測試與程式碼風格檢查:
MyPy:靜態型別檢查(pyproject.toml:39)
Pre-commit:Git Hook 管理工具(pyproject.toml:40)
Pytest:單元測試框架(pyproject.toml:46)
Ruff:快速的 Lint 工具(pyproject.toml:42)
🧠 架構核心組件說明(Component Architecture)
Quivr 架構模組化、職責清晰,各元件間協同運作如下:
組件名稱 | 說明 |
---|---|
Brain | 主要協調模組,管理文件儲存、嵌入生成與檢索流程 |
QuivrQARAGLangGraph | 利用 LangGraph 建立的 RAG 流程控制與推理引擎 |
LLMEndpoint | 統一介面,整合各家 LLM 模型供應商 |
Vector Storage | 儲存向量嵌入,支援檢索與比對 |
整體工作流程包含:
查詢歷史過濾
查詢改寫
文件向量檢索
回答生成與串流輸出
📄 文件處理流程(Document Processing Pipeline)
Quivr 使用 LangChain 的各種 Loader 來載入並解析不同格式文件,例如:PDF、Markdown、TXT 等。
📄 相關程式碼位置:default.py:4-18
📝 備註
Quivr 採模組化設計,方便替換各元件(如:更換 LLM、向量庫、排序器)
系統設計具高度擴充性,支援自定義文件處理器與工具整合
其核心功能建構於 LangChain 生態系統之上,因此依賴眾多語言處理相關模組
🔍 Quivr 的動態檢索能力與其他方案比較
根據 Quivr 原始碼,所謂「動態檢索(Dynamic Retrieval)」是實作於 QuivrQARAGLangGraph 類別中的一個進階特性,屬於 RAG(Retrieval Augmented Generation)流程的一部分。
🧠 什麼是 Quivr 的動態檢索?
Quivr 的動態檢索功能由 dynamic_retrieve 方法負責:
📄 位置:quivr_rag_langgraph.py:675-684
這個方法會根據查詢內容的上下文,自動調整所檢索段落的數量,以確保模型取得足夠背景資訊來生成優質回答。
⚙️ Quivr 動態檢索的運作方式
其演算法流程為:
設定初始檢索參數
根據查詢結果是否足夠,自動增加檢索段落數(k)與重排序數量(top_n)
檢查目前回傳內容是否足以構成有效回答
若不夠,繼續迭代,直到達到「資訊足夠」或達到最大輪次為止
📄 動態調整邏輯見 quivr_rag_langgraph.py:700-704
👉 顯示如何逐步提高 top_n(重排序回傳數)與 k(初始檢索數)
🔑 與其他系統的主要差異
1️⃣ 自動調整檢索數量(Adaptive Retrieval Count)
與固定 k 值的系統不同,Quivr 會根據查詢語意與檢索結果,自動調整:
📄 程式碼範例:quivr_rag_langgraph.py:706-713
每輪都會提升 k 和 top_n
並記錄當前調整參數(有記錄功能)
2️⃣ 上下文感知(Context-Aware Retrieval)
Quivr 會檢查檢索回來的段落是否會超過 LLM 的上下文限制(token 長度):
📄 quivr_rag_langgraph.py:744-751
→ 可避免傳統檢索常見的 過量內容超出 LLM 可處理範圍 問題。
3️⃣ 基於相關性的迭代處理(Relevance-Based Iteration)
系統會在檢索回來的內容不足時,自動執行多次迭代,直到:
找到足夠「有用」的段落,或
達到預設的最大輪數(停止)
📄 quivr_rag_langgraph.py:752-754
→ 傳統方法通常只做一次檢索,且固定數量,無法依查詢動態調整。
4️⃣ 與重排序模型的深度整合
Quivr 在每次迭代中皆會重新執行 重排序模型(如 Cohere、Jina):
📄 quivr_rag_langgraph.py:714-717
→ 可比單純靠向量相似度搜尋更能抓到真正有用的內容。
🔁 Quivr 動態檢索 vs 標準檢索(Quivr 也有標準檢索模式)
📄 標準檢索見:quivr_rag_langgraph.py:617-626
特性 | 動態檢索 | 標準檢索(非動態) |
---|---|---|
是否多輪執行 | ✅ 是(多輪調整) | ❌ 否(單輪處理) |
參數是否動態調整 | ✅ top_n, k 自動變化 | ❌ 固定設定 |
是否檢查上下文長度 | ✅ 有 | ❌ 無 |
結果品質 | 高,適合複雜查詢 | 較低,適合簡單查詢 |
🔍 實作細節流程
動態檢索在 Quivr 中包含以下步驟:
初始設定:設定初始的 top_n 與 k 值
📄 quivr_rag_langgraph.py:696-699
每輪疊代提升檢索數:逐步擴展查詢回傳內容
📄 quivr_rag_langgraph.py:701-717
非同步處理任務(async):提升效能
📄 quivr_rag_langgraph.py:719-733
檢查上下文長度:避免超過 LLM 處理能力
📄 quivr_rag_langgraph.py:744-751
根據相關性與最大輪次決定停止
📄 quivr_rag_langgraph.py:752-754
✅ 實際效益與優勢
優勢 | 說明 |
---|---|
✅ 更適合複雜查詢 | 能逐步擴大上下文,捕捉深層關聯 |
✅ 有效控管 token 使用 | 不會超過 LLM 處理範圍,提升效率 |
✅ 回答品質明顯提升 | 較高機率取得關鍵內容組成回答 |
✅ 查詢適應性高 | 不同查詢主題會自動調整檢索策略 |
🧾 總結:Quivr 動態檢索功能的優勢
項目 | Quivr 動態檢索的特性 |
---|---|
🎯 動態調整 | 根據查詢語意調整回傳段落數量(k, top_n) |
🔄 多輪疊代 | 多次檢索與重排序,取得最佳內容 |
🧠 上下文感知 | 確保不超過 LLM 的 context window |
🤖 重排序整合 | 搭配重排序模型(如 Cohere)以強化結果相關性 |
⚡ 非同步處理 | 提升大規模查詢下的處理效率 |
🧩 彈性架構 | 可自訂與其他工作流程步驟組合(如歷史過濾、改寫等) |
📌 備註:
動態檢索是 Quivr 架構中具「意見導向」的 RAG 特性之一
建構於 LangGraph 架構之上
可搭配不同的向量資料庫與重排序器使用(如 FAISS、Weaviate、Cohere、Jina)
🎯 Quivr 中重排序(Reranking)的目的
在 Quivr 的 RAG 流程中,重排序是一個關鍵元件,它強化了文件檢索與回答品質。根據原始碼,我們可以清楚看出 Quivr 如何實作重排序功能,以及它在整體系統中扮演的重要角色。
1️⃣ 提升檢索相關性
重排序最主要的目的,是提升初步檢索結果的語意相關性。
初步的向量相似度搜尋只能根據嵌入向量計算相似度,而重排序則會套用更高階的語言模型來評估真正的語意與上下文:
📄 參考:quivr_rag_langgraph.py:277–284
✅ 能夠排除「語意類似但脈絡不符」的段落,只保留真正有用資訊給 LLM。
2️⃣ 上下文壓縮(Contextual Compression)
Quivr 會將重排序作為「上下文壓縮」機制的一部分:
📄 quivr_rag_langgraph.py:648–650
✅ 透過重排序,篩出最具價值的段落,節省 LLM 的 token 空間,讓回答品質更集中有效。
3️⃣ 支援動態檢索(Dynamic Retrieval)
在 Quivr 的動態檢索機制中,重排序扮演重要角色:
📄 quivr_rag_langgraph.py:700–704
✅ 系統會根據查詢需求擴大上下文,但仍透過重排序來保證「擴大後的內容仍保持高相關性」。
4️⃣ 可自訂的相關性門檻(Relevance Threshold)
使用者可以自訂重排序的參數(如門檻值),來調整準確率與涵蓋率的平衡:
📄 config.py:362–369
高門檻(High threshold):更精準但涵蓋較窄
低門檻(Low threshold):涵蓋多但可能引入雜訊
5️⃣ 多重重排序模型支援(Multi-Provider Support)
Quivr 支援多個 reranker 模型供應商,例如:
Cohere(預設)
Jina
📄 quivr_rag_langgraph.py:287–294
✅ 不同內容與查詢類型可搭配不同模型,提升彈性與表現。
6️⃣ 多語內容處理能力(Multilingual Support)
Quivr 的重排序系統支援多語處理,這對跨國文件與研究非常重要。
預設使用 Cohere 的 multilingual rerank 模型,能處理多語語境下的語意相關性:
📄 rag_config.yaml:16–24
7️⃣ 最佳化不同工作流程
重排序的設定也可以根據不同的工作流程進行調整:
📄 例如在 talk_to_file_rag_config_workflow.yaml:5–6 中設定 top_n=10,
適合需要更多上下文的情境(例如技術文件、合約、長篇章)。
8️⃣ 控制 LLM 上下文長度(Token 限制)
系統會檢查經過重排序後的段落是否超過語言模型的最大輸入長度:
📄 quivr_rag_langgraph.py:744–751
✅ 可避免 LLM 輸入內容被截斷,進而降低回答品質或引發錯誤。
✅ 總結:Quivr 中重排序的八大用途
功能 | 說明 |
---|---|
🎯 提升檢索品質 | 超越向量相似度,評估語意與脈絡一致性 |
📦 上下文壓縮 | 在有限 token 空間中取得最重要資訊 |
🔄 動態檢索整合 | 與動態擴展上下文策略緊密配合 |
⚙️ 可調式相關性閾值 | 支援使用者自訂查詢精準度與涵蓋範圍 |
🔌 多模型支援 | 支援 Cohere、Jina 等供應商 |
🌍 多語言能力 | 能處理跨語種文件與查詢 |
🧩 彈性流程設計 | 可搭配不同工作流程調整 top_n 數值 |
🧠 上下文長度控管 | 確保輸入內容不超出 LLM 處理限制 |
📌 備註:
Quivr 的重排序功能是建構於 LangChain 的 reranking 模組之上
預設使用 Cohere multilingual reranker
與 Quivr 的 動態檢索(Dynamic Retrieval) 完整整合,是其核心優勢之一
🤖 Quivr 如何連接至 LLM 模型
是的,Quivr 是透過呼叫各家語言模型服務商的 API 來與 LLM 建立連線。根據原始碼,Quivr 使用一個專門的 LLMEndpoint 類別來處理這些連線。
🧱 核心架構:LLMEndpoint
Quivr 連接 LLM 的主要元件是 core 模組中的 LLMEndpoint 類別:
📄 參考:llm_endpoint.py:187-193
此類別提供一個統一的介面,用來與不同 LLM 服務商(如 OpenAI、Anthropic 等)溝通,並透過 LLMEndpointConfig 物件來指定使用哪一家模型與相關設定。
✅ 支援的 LLM 供應商
Quivr 原生支援下列模型供應商,透過 API 方式整合:
OpenAI(預設)
Azure OpenAI
Anthropic(Claude)
Mistral AI
📄 供應商定義在 config.py:68-74 的 DefaultModelSuppliers 列舉中。
🔄 API 呼叫流程
Quivr 是透過 LangChain 函式庫 來實作與 LLM 的實際 API 連線邏輯。
當你初始化 LLMEndpoint 時,系統會根據設定建立對應的 LangChain 客戶端:
📄 參考:llm_endpoint.py:207-209
例如:
使用 OpenAI 時,會建立 ChatOpenAI 實例:
📄 llm_endpoint.py:237-247
使用 Azure OpenAI:
📄 llm_endpoint.py:211-226
使用 Anthropic Claude:
📄 llm_endpoint.py:227-236
使用 Mistral AI:
📄 llm_endpoint.py:249-257
🔐 API 金鑰管理
Quivr 透過 環境變數 管理各家 API 金鑰:
你只需設定像 OPENAI_API_KEY 的變數,Quivr 會自動讀取。
📄 參考:config.py:287-304
🧠 Brain 類別如何使用 LLMEndpoint?
Brain 是 Quivr 的主控制類別,它會使用 LLMEndpoint 來與 LLM 溝通。
當你使用 brain.ask() 發問時,Quivr:
使用 LLMEndpoint 根據設定建立對應 LLM 的連線
將查詢送入 RAG 流程(使用 QuivrQARAGLangGraph)
執行向量檢索與上下文建立
最後由語言模型產生回應
📄 參考:brain.py:524-531,串流回應在 brain.py:533-535
🧪 API 呼叫流程範例
from quivr_core import Brain
from quivr_core.rag.entities.config import LLMEndpointConfig, DefaultModelSuppliers
# 建立一個 LLM 配置(使用 Claude)
llm_config = LLMEndpointConfig(
supplier=DefaultModelSuppliers.ANTHROPIC,
model="claude-3-sonnet",
temperature=0.7
)
# 建立 Brain 實例並使用該模型
brain = Brain.from_files(
name="my_brain",
file_paths=["document.pdf"],
llm_config=llm_config
)
✅ 總結:Quivr 與 LLM 的連線方式
項目 | 說明 |
---|---|
連線方式 | 透過 LangChain 呼叫各 LLM API |
中介類別 | LLMEndpoint(提供統一接口) |
支援模型 | OpenAI、Azure、Anthropic、Mistral |
API 金鑰管理方式 | 使用環境變數(如 OPENAI_API_KEY) |
串流支援 | 支援即時回應串流 |
是否可自訂模型連線 | 可透過 LLMEndpointConfig 完整自定義 |
📌 備註:
預設語言模型為 OpenAI 的 GPT 系列
系統為模組化設計,可輕鬆加入新的 LLM 供應商
所有 LLM 功能皆整合於 LangChain 框架中,開發者不需重複實作
🧠 Quivr 與其他替代方案有何不同?
根據原始碼,Quivr 是一套以生成式 AI 為核心的 RAG(Retrieval Augmented Generation)系統,定位為你的「第二大腦」。以下說明它與其他主流系統在架構與技術實作上的不同之處。
🔧 核心架構差異
1️⃣ 明確架構主張的 RAG 實作
Quivr 採用具「架構主張」(opinionated)的設計,提供一套經優化的 RAG 流程。
📄 來源:README.md:15
與其他 RAG 框架需要繁瑣設定不同,Quivr 預設了合理的處理步驟,讓開發者專注於應用本身,而不必深入理解底層檢索邏輯。
2️⃣ 支援多家 LLM 模型供應商
與某些只支援單一語言模型的工具不同,Quivr 支援多家模型:
📄 來源:README.md:16
OpenAI
Anthropic(Claude)
Mistral
Google Gemma
讓你可依需求自由切換模型、控制成本與效能。
3️⃣ 通用文件格式與自定義解析器支援
Quivr 可處理多種常見文件格式,並允許加入自定義解析器。
📄 來源:README.md:17
相比許多工具只能處理特定檔案,Quivr 的彈性更高。
4️⃣ 基於 LangGraph 的可組合式工作流程
Quivr 使用 LangGraph 實作工作流程,流程以「有向圖」組成,可自由調整處理節點。
📄 來源:quivr_rag_langgraph.py:254-275
例如:你可以決定是否加入歷史過濾、查詢改寫、動態檢索等步驟。
⚙️ 技術實作層面的差異
1️⃣ 向量式知識表示 vs 傳統知識圖譜
Quivr 採用向量方式表示知識(語意相似度),而非明確建模實體關係。
📄 brain.py:87-100
這讓它更適合自然語言查詢與非結構化文件處理。
2️⃣ 支援動態檢索(Dynamic Retrieval)
Quivr 可根據查詢內容自動調整檢索段落數,處理複雜查詢更靈活。
📄 quivr_rag_langgraph.py:675-684
多數 RAG 工具僅提供固定檢索數量。
3️⃣ 支援多種重排序器整合(Reranker)
Quivr 可搭配 Cohere、Jina 等 reranker,提高回傳品質。
📄 quivr_rag_langgraph.py:277-298
且模型與參數設定可輕鬆切換。
🔄 與其他具體工具的比較
工具 | Quivr 特點 |
---|---|
LlamaIndex | LlamaIndex 更靈活,但設定較複雜;Quivr 則是開箱即用、預設佳 |
LangChain | Quivr 建構於 LangChain 上,但用 Brain 類別封裝更高層次抽象 |
知識圖譜 | Quivr 使用自然語言 + 向量搜尋,不需 Schema;知識圖譜則依賴 SPARQL、關係模型 |
商業 RAG 系統 | Quivr 開源可自架設;商用方案多為封閉雲端系統,彈性與隱私較受限 |
🎯 適用情境
Quivr 特別適合以下用途:
✅ 個人知識管理:建立可查詢的文件、筆記庫
✅ 開發者應用整合:Python API 易於嵌入各種應用
✅ 自訂 RAG 工作流程:適用於特定領域的知識問答流程
✅ 多 LLM 環境:方便測試或切換模型供應商
📌 Quivr 的關鍵差異總結
特性 | 說明 |
---|---|
🎯 架構主張明確 | 預設合理流程,簡化使用,但仍可自訂 |
🔄 多 LLM 支援 | 可自由切換 OpenAI、Anthropic、Mistral 等 |
📂 文件支援全面 | 支援多格式且可客製解析器 |
🧠 可組合的圖形流程 | 基於 LangGraph,節點流程彈性大 |
🔍 動態檢索能力 | 根據查詢內容自動擴展上下文 |
🔓 完全開源可自架設 | 適合對資料安全與彈性有要求的使用者 |
📝 備註
Quivr 為活躍開發中專案,近期有持續 commit 與功能新增
架構模組化,可輕鬆替換嵌入模型、向量資料庫、排序器
兼具入門友好性與進階擴展性
💡 Quivr 使用的演算法說明
根據 Quivr 的原始碼架構,我們可以了解其所採用的多種演算法,這些演算法涵蓋了從文件處理、檢索、重排序到答案生成等 Retrieval Augmented Generation(RAG,檢索增強生成)工作流程的各個環節。
1️⃣ 文件處理與切分演算法
🔹 遞迴式字元切分(Recursive Character Splitting)
對於純文字文件,Quivr 採用遞迴式字元切分演算法,將文件拆分為可管理的區塊,並維持一定重疊。
功能:
控制每段文字的大小
維持段落間的語境連貫性
遞迴處理整份文件直到完成
🔹 Tiktoken 分段
對於較複雜文件,則使用 OpenAI 的 Tiktoken 分詞器,按語意分段。
優點:
與 LLM 使用相同的分詞規則
保證每段不超過 token 限制
保持語意一致性
2️⃣ 向量嵌入與相似度檢索
🔹 向量嵌入(Vector Embedding)
Quivr 預設使用 OpenAI 的嵌入模型,將文本轉換成向量表示,以利後續檢索。
🔹 向量相似度搜尋(Vector Similarity Search)
使用 Facebook AI 所開發的 FAISS 工具執行相似度搜尋。
演算法特點:
計算使用者查詢與文件向量的相似度
回傳前 K 個最相似的結果
可根據文件 metadata 加以篩選
3️⃣ 結果重排序演算法(Reranking)
🔹 兩種支援模型:
Cohere Rerank:使用 Cohere 提供的重排序模型
Jina Rerank:使用 Jina AI 提供的模型作為替代
重排序流程會結合 contextual compression retriever,以提昇檢索品質與語境相符度。
4️⃣ RAG 工作流程演算法
🔹 LangGraph 工作流程引擎
Quivr 採用 LangGraph 架構建立工作流程圖(有向圖)來進行 RAG 流程控制。
優點:
彈性的步驟組合與控制流程
支援條件分支與外部工具整合
🔹 查詢改寫與歷史過濾
包含查詢重寫與對話歷史過濾演算法,用以提升語意檢索準確性。
🔹 語境壓縮的文件檢索
工作流程中將:
查詢向量比對初步候選資料
套用重排序
根據相似度與語境壓縮結果過濾最終答案來源
5️⃣ 答案生成演算法(Answer Generation)
🔹 提示工程(Prompt Engineering)
為 LLM 設計精緻提示,以引導產出高品質答案。
🔹 串流式回答生成(Streaming Response Generation)
為即時聊天回應設計的串流演算法。
功能:
LLM 回傳時逐塊處理
即時解析與格式化
回傳格式化的回應段落與 metadata
6️⃣ 語言辨識(Language Detection)
透過語言偵測演算法自動判斷輸入文件語言,以決定後續處理方式。
7️⃣ 設定與客製化能力
所有上述演算法均可透過設定檔(如 rag_config.yaml)進行客製化,包括:
分段大小與重疊程度
選用哪個 Reranker 模型
使用哪個 LLM 及其參數
向量搜尋的 K 值與篩選條件等
📌 重點總結:Quivr 所使用的核心演算法
類別 | 演算法名稱 |
---|---|
文本切分 | 遞迴式字元切分、Tiktoken 分段 |
向量處理 | 向量嵌入生成、FAISS 向量相似度搜尋 |
結果排序 | Cohere 與 Jina 重排序模型 |
工作流程執行 | LangGraph 導向圖結構 |
回答生成 | 提示工程、串流式回答產生 |
語言辨識 | 自動偵測文件語言 |
使用者自定義設定 | YAML 設定檔調整流程參數 |
這些演算法組成 Quivr 的意見導向型 RAG 系統,能有效整合文件內容,進行檢索與問答回應,是一個可擴展且靈活的 AI 知識助理核心架構。
🔧 Quivr RAG 系統中的建議演算法組合
根據 Quivr 的原始碼與設定邏輯,我們可以歸納出多種適用於不同場景的演算法組合。以下是這些組合的運作邏輯、優缺點比較,以及適用情境說明。
1️⃣ 標準 RAG 管線組合
✅ 組合一:OpenAI + FAISS + Cohere Reranker(預設組合)
嵌入模型:OpenAI Embedding(default_embedder)
向量資料庫:FAISS(Facebook AI 相似度搜尋)
重排序器:Cohere 的 rerank-multilingual-v3.0
語言模型(LLM):OpenAI GPT 系列(預設為 gpt-3.5-turbo)
優點:
OpenAI 高品質嵌入模型
FAISS 提供快速的相似度搜尋
Cohere 多語言模型具優秀排序能力
適用於大多數一般用途情境
缺點:
嚴重依賴外部 API 服務
成本偏高(因使用 OpenAI 與 Cohere)
✅ 組合二:OpenAI + FAISS + Jina Reranker
與組合一類似,但重排序使用 Jina AI 模型
優點:
與 Cohere 模型略有不同,對某些領域可能更合適
當 Cohere 不可用時可作為替代方案
缺點:
仍依賴外部服務
執行表現可能依資料領域而異
2️⃣ 自定義工作流程組合
✅ 組合三:動態檢索 + 擴展語境(Dynamic Retrieval with Expanded Context)
動態檢索邏輯:根據查詢複雜度自動調整檢索段數
使用模型:建議 GPT-4 或其他支援長上下文的模型
優點:
根據查詢內容自動擴大語境
適用於需要更多背景資訊的複雜問題
善用 LLM 的大輸入長度
缺點:
Token 使用增加,費用上升
多輪檢索導致速度變慢
✅ 組合四:全文件語境的自定義工作流程(Custom Workflow with Document Context)
策略:同時取得文件相關段落與完整語境資訊
設定:使用低溫度 LLM(如 0.3)提高答案一致性
優點:
能維持上下文連貫性,答案更完整
適合結構化文檔問答需求
缺點:
Context token 使用量增加
有機會引入部分不相關段落
3️⃣ 特殊應用場景組合
✅ 組合五:多語言處理(Multilingual Processing)
額外元件:自動語言偵測演算法
優點:
適合處理多語種資料
能跨語言提供檢索與回答
缺點:
在專業領域文件表現可能不如單語專用模型
✅ 組合六:串流回應 + 函式呼叫(Streaming + Function Calling)
特色:實現即時回答的串流輸出,支援功能調用格式輸出
優點:
回應即時顯示,提高互動性
支援結構化輸出(如 JSON)
缺點:
需使用支援 Function Calling 的 LLM
實作較為複雜
📊 組合比較表
組合名稱 | 速度 | 回答品質 | 成本 | 適用情境 |
---|---|---|---|---|
OpenAI + FAISS + Cohere | 快速 | 高 | 高 | 通用場景 |
OpenAI + FAISS + Jina | 快速 | 高 | 高 | 重排序替代方案 |
動態檢索 + 擴展語境 | 中等 | 非常高 | 非常高 | 複雜查詢 |
自定義工作流程(完整文件語境) | 中等 | 高 | 高 | 保持文件語境完整性 |
多語言處理組合 | 快速 | 多語優秀 | 高 | 國際化、多語環境 |
串流回應 + 函式呼叫 | 快速 | 高 | 高 | 高互動性應用 |
🧪 範例:實作動態檢索組合
from quivr_core import Brain
from quivr_core.rag.entities.config import RetrievalConfig, WorkflowConfig, NodeConfig
# 建立自定義工作流程
workflow_config = WorkflowConfig(
name="Dynamic Retrieval",
nodes=[
NodeConfig(name="START", edges=["filter_history"]),
NodeConfig(name="filter_history", edges=["dynamic_retrieve"]),
NodeConfig(name="dynamic_retrieve", edges=["generate_rag"]),
NodeConfig(name="generate_rag", edges=["END"]),
]
)
# 建立檢索設定
retrieval_config = RetrievalConfig(
workflow_config=workflow_config,
k=30, # 初始檢索數量
reranker_config={"top_n": 10, "supplier": "cohere"},
llm_config={"model": "gpt-4", "max_context_tokens": 8000, "temperature": 0.3}
)
# 啟用自定義設定
brain = Brain.from_files(
name="My Knowledge Base",
file_paths=["document1.pdf", "document2.txt"],
)
answer = brain.ask("有哪些深入見解可以提供?", retrieval_config=retrieval_config)
✅ 建議使用情境
一般使用者:建議從組合一開始(OpenAI + FAISS + Cohere)
進階查詢/研究用途:組合三(動態擴展語境)最合適
需要完整文件語境時:組合四
多語使用者或國際化需求:組合五(支援語言偵測)
互動式應用(如 AI 助手 UI):組合六(支援串流與函式輸出)
🔧 註:
所有組合均可依照 rag_config.yaml 調整參數
效果會因資料類型與查詢複雜度而異
Quivr 架構彈性高,可自由替換或自建模組組合