# 模型一本正經胡說八道,怪模型嗎?本地 RAG 教程拆台:沒有證據,答案再順也是編的 ## ① 開頭:官方來源與反常識結論 官方來源:Medium 作者 … · @swordBluesy · TwKit
@swordBluesy
# 模型一本正經胡說八道,怪模型嗎?本地 RAG 教程拆台:沒有證據,答案再順也是編的 ## ① 開頭:官方來源與反常識結論 官方來源:Medium 作者 soberdataengineer,2026 年 10 月 25 日發表,原文標題直譯為《用 Ollama、Qdrant 與 Python 做一個本地 RAG 應用》。先把反常識結論放前面:模型答錯,往往不是模型不夠聰明,而是你根本沒給它證據——一個連你的員工手冊都沒讀過的模型,憑什麼答對年假幾天?這篇教程的做法土得掉渣,卻一針見血:先把文件變成可檢索的證據,提問時只把找回的段落交給模型,沒證據就老實說不知道,資料全程不出本機。 ## ② 說清詞 - RAG(檢索增強生成):提問時先從自己的文件裡檢索相關段落,再把段落交給模型作答,不是只靠模型訓練時記住的東西。 - Ollama:在本機跑語言模型的工具,本文用它跑嵌入模型與生成模型。 - 嵌入(Embedding):把一段文字轉成一串數字(向量),意思相近的文字,數字也相近。 - 向量(Vector):本文中每段文字對應 768 個數字,數字本身不可讀,但可以用來算相似度。 - Qdrant:向量數據庫,本文用它的本機持久模式,不用另外架數據庫服務器。 - 切塊(Chunking):把長文件切成可以獨立被檢索的小段落。 - 餘弦相似度(Cosine Similarity):算兩個向量方向有多像,越接近 1 越像,本文用它來排檢索結果。 - 檢索(Retrieval):把問題也轉成向量,去數據庫裡找最像的幾段。 - 生成(Generation):模型根據檢索到的段落寫出答案,本文要求答案標註證據編號。 ## ③ 一個真實例子與一條眼熟的進化路線 例子直接用教程裡的虛構員工手冊:年假 24 天,年度學習預算 30,000 印度盧比,每週最多遠程工作 3 天。跑完索引後問「員工一年有多少天帶薪年假?」,系統先找回寫著 24 天的那段,再由模型答出「員工享有 24 天帶薪年假。[1]」;再問一個手冊裡根本沒有的問題——「首席執行官的電話是多少?」,正確表現不是編一個號碼,而是承認文件裡沒有提供。這條路線你一定眼熟:以前是開卷考試不給書、只准憑記憶寫,現在是開卷考試先把書翻到那一頁、再照著書答——答錯的責任,第一次可以分清到底是沒翻到書,還是照著書還抄錯。 ## ④ 先把話說全:反方適用條件清單 先把話說全,以下情況本地 RAG 不是最優解:第一,文件量很大、查詢量很高時,本文這種把全部資料放內存、每次重建整個集合的做法就不夠用,要換成服務器部署與增量索引;第二,切塊目前是按詞數硬切,不認標題與段落,長文件、表格多的文件容易在邊界處斷句;第三,生成模型的回答是否真的引用了證據,教程只靠提示詞要求,沒有程序去逐項驗證;第四,8B 生成模型要在本機跑得動,機器內存不夠就別硬上;第五,換嵌入模型必須重建全部文件的向量,哪怕新模型的維度碰巧一樣,也不能直接混用。這些先講明,後面再談本地化的好處,才不算把演示當成生產方案賣給你。 ## ⑤ 一句定性金句 沒有證據的流暢,不是能力,是編造被包裝成了自信。 ## ⑥ 正文 ### 第一節:翻車清單 - 問題還沒檢索就先生成:模型憑記憶編答案,答得越順,錯得越難發現。 - 檢索與生成混在一起評:答案錯了,不知道是沒找回證據,還是找回了卻抄錯,改都不知道往哪改。 - 切塊不留重疊:關鍵信息正好卡在兩段之間,兩段各拿一半,檢索時哪段都不像答案。 - 問題與文件用不同嵌入模型:向量不在同一個空間裡,再像的段落也算不出高分。 - 文件改了不重新索引:存著的還是舊版證據,模型一本正經地用舊數字回答新問題。 - 只測能答的問題:從不問無答案問題,系統編造的毛病永遠測不出來。 ### 第二節:替代方案與理由 - 方案一,純靠大模型直接問:最省事,適合公開常識,但公司內部文件、最新制度它根本沒見過,錯了你也看不出來。 - 方案二,上雲端託管檢索服務:省運維、易擴展,適合多人協作與大文件量,但文件要出本機,敏感資料先過一道合規關。 - 方案三,本文的本地 RAG:文件、向量、生成全在本機,理由有三——第一,敏感資料不出本機,合規成本最低;第二,流程只有兩段,索引與問答分開跑,出問題可以分段定位;第三,成本就是一台能跑 8B 模型的機器,不用按次付檢索與生成的雲端賬單。代價是規模與精細度要自己扛,演示版不等於生產版。 ### 第三節:目標形態 目標形態是一個有出處、敢說不知道的本地問答:文件放在 `docs/` 裡,切成每段最多 180 個詞、前後重疊 35 個詞;每段帶著來源文件名、段落編號、嵌入模型名存進 Qdrant 的 `learning` 集合;提問時取最像的 3 段,編號 [1][2][3] 交給模型;模型只准用這些段落作答,標註編號,沒證據就說不知道;文件改了就重新跑索引,舊證據不許繼續作答。 ### 第四節:遷移步驟 1. 準備環境:裝 Python 與 Ollama,建一個隔離環境,教程建議用 Python 3.12,命令如下: ``` mkdir rag-learning cd rag-learning python3 -m venv .venv source .venv/bin/activate pip install qdrant-client==1.15.1 ``` 2. 拉模型:`ollama pull nomic-embed-text` 拉嵌入模型,`ollama pull llama3.1:8b` 拉生成模型;需要時在另一個終端跑 `ollama serve` 保持服務在線。 3. 放文件:在 `docs/` 裡放 `.md` 或 `.txt` 文件,項目結構為 `http://rag.py`、`docs/company-handbook.md`、`storage/`(由 Qdrant 生成)。 4. 寫索引邏輯:按 180 詞切塊、35 詞重疊;每批最多 16 段生成向量,每段向量為 768 個數字;向量用餘弦相似度比較,集合用 `QdrantClient(path=...)` 的本機持久模式打開。 5. 存入數據庫:每批最多 64 個點寫入,每個點包含唯一編號、向量與原文及元數據;寫入前先核對向量數與記錄數一致。 6. 跑問答驗證: ``` python http://rag.py ingest python http://rag.py search "How much can I spend on courses?" python http://rag.py ask "What is the annual learning budget?" python http://rag.py ask "What is the CEO's phone number?" ``` 其中 `search` 只打印找回的段落與分數、不生成答案;`ask` 檢索加生成一起跑;學習預算應答出 30,000 印度盧比並帶證據,首席執行官電話一題應承認文件未提供。 7. 做持久化對照:改一下學習預算,先不重新索引就提問,確認舊答案還在;再跑一次索引,確認新答案替換了舊答案——這一步就是在驗證你的索引流程是不是真的在更新。 ### 第五節:團隊共建分工 - 文件負責人:統一文件放 `docs/` 的格式與命名,文件改了必須通知重新索引,不許靜默改數。 - 索引負責人:管切塊參數與嵌入模型版本,換模型就全量重建,不許新舊向量混在一個集合裡。 - 評測負責人:建一小套評測題,必須同時包含能答題與無答案題,先看檢索對不對、再看生成抄沒抄錯。 - 提示詞負責人:守住生成提示詞的三條——只用提供的上下文、標註證據編號、缺證據就說不知道,缺一條不許上線。 - 上線把關人:演示版要上生產前,先把全量重建、內存佔用、服務器部署三項短板逐項補齊或明確接受。 ### 第六節:官方工具包 - Ollama:本機模型運行工具,嵌入模型 `nomic-embed-text`,生成模型 `llama3.1:8b`,本地接口地址為 `http://127.0.0.1:11434/api/`。 - Qdrant 本機客戶端:`qdrant-client==1.15.1`,用 `QdrantClient(path=...)` 打開 `storage/` 持久模式。 - Python 3.12:教程建議的版本,隔離環境用 `venv` 建立。 - 切塊函數:180 詞、35 詞重疊,每次前進 145 個詞。 - 檢索參數:取最像的 3 段(`k=3`),嵌入時 `truncate=False`,超長輸入直接報錯、不靜默截斷。 - 生成參數:`temperature=0`,`num_predict=400`,系統提示要求只用上下文、標註來源、缺證據說不知道。 ## ⑦ 結尾收束:原則比架構重要 原則只有一句:答案必須先有證據,證據必須能追溯到原文。架構可以換,模型可以換,這句原則換不得。可重複的動作規則是:每次上線一個問答功能,先跑四道題——能答題答對了嗎?證據編號對得上嗎?無答案題敢說不知道嗎?文件改了重新索引了嗎?四道全過再上線,少一道都是在給未來的編造留後門。 ## ⑧ 原文出處 原文鏈接:https://medium.com/@soberdataengineer/build-a-local-rag-application-with-ollama-qdrant-and-python-86a7b59b449a 原文作者:soberdataengineer (由 S1哥 編譯) ## S1哥觀點 站隊就站死這一邊:一個連「不知道」都不會說的問答系統,不是智能,是話術機器——它最大的本事就是把編造說得比真話還順。敢在沒證據時說不知道,恰恰是唯一值得信任的表現;凡是每道題都有答案、每個數字都斬釘截鐵的系統,你都該先懷疑它到底翻沒翻書。你呢?你用的那些所謂智能問答,有幾次是老老實實告訴你「文件裡沒有」?評論區說說,你被流暢的編造坑過幾次。
曝光 258 · 评论 3 · 点赞 0 · 书签 0
查看原帖