
現在,我們有 LLM, 有語音轉文字,有文字轉語音。接下來,讓我們來讓系統能看:OCR 功能,以便建一個知識庫。
網域設定:
ocr.iron30.com
rag.iron30.com
ssh 連到 hq,切換到 /opt/claude-working,執行 claude code:
告訴 claude code :
192.168.0.31 上動工。用GPU1。Docker
一、安裝 Qwen3-VL-8B-Instruct-Q4_K_M,OCR 用:
- 綁 ocr.iron30.com。
- 它只負責把圖變成字,不要叫它順便做判斷、也不要叫它整理格式。
- webui:上傳文件,PDF,圖檔,轉成文字檔,可下載。做 login 保護。
二、安裝:Embedding 及 Rerank : BGE-M3 及 BGE-RERANKER.
- Docker, 用 GPU1
- 一個把文字轉成向量的服務,一個把檢索結果重新排序的服務。
- ⚠️ 兩個服務的快取都要設上限。預設是無上限,
它會一路長大到把整台機器的記憶體吃光。
- 者兩項僅提供服務,供呼叫計算用。
- BGE-M3:ctx 8192,output : 1024 維
- RERANKER : cts:16384,reranking 模式
三、192.168.0.30 LLM 加掛 mmproj,提供 OCR。
- 那台現役的文字模型本身就支援看圖,只差一個視覺投影檔,
把對應版本的投影檔放進模型目錄、啟動參數帶上去就好。
- ⚠️ 只多吃 1 GB 左右的顯示記憶體,不要為了這件事把原本的模型停掉重裝。
- 這條線等一下要拿來跟第一條比對同一頁,所以兩邊都要能單獨呼叫。
四、⛔ 第二張卡上現在有三個服務。裝之前先把它們各自要吃多少加起來,
確認裝得下再動手,不要裝到一半才發現。
五、到 NPM,加 ocr.iron30.com,取得憑證。
規則:
- 三個服務都設成開機自動起來。
- 做完把這台的變更補進 machines/voice.md,對外開了什麼寫進 exposure.md。
裝好之後不要急著相信它。這三個服務有一個共同點:出問題的時候都不會報錯,只會給你一個看起來很正常的結果。所以裝完先測,測完再往下走。
告訴 claude code:
幫我驗這三個服務。⛔ 不要只確認「有回東西」就算過。
一、OCR:
- 拿真的掃描頁來測,要有表格、有小字、有頁碼書眉。
⛔ 不要用乾淨的示範圖,那種東西誰跑都會過。
- 同一頁,兩條線各跑一次:專職那個,還有模型機掛了投影檔的那個。
把兩邊講法不一樣的地方列出來給我。⛔ 不要自己決定誰對。
- ⚠️ 覺得糊就提高解析度重掃是白做工:
同一頁用兩種解析度各送一次,如果回應裡的影像單位數量一樣,
就是撞到它的上限了 —— 多出來的像素在進模型之前就被丟掉。
真的看不清楚要切版面:直排切左右、橫排切上下。
- ⚠️ 它會自己「順便整理」:檢查有沒有漏掉頁碼書眉、
有沒有把表格重排、有沒有把原文的異體字改成通行寫法。
- 跑的時候看那張卡的使用率有沒有動。沒動就是根本沒在用它。
二、Embedding:
- 先看形狀:回來是幾維、模長是不是 1。
模長是 1 才能直接拿內積當相似度,不然你還要自己正規化一次。
- 語意測試:準備三句話,兩句同義、一句完全無關,兩兩算相似度。
同義那對必須明顯高過無關那對,否則它沒在做語意。
- 再加一句英文的同義句,看跨語言撐不撐得住 —— 撐得住的話,
英文文件可以直接進來,不必先翻譯。
- ⚠️ 無關的那對不會是 0。⛔ 所以不要拿絕對數字當「有沒有答案」的門檻。
- 長度:送一段明顯超過它上限的文字,看它是報錯還是安靜地截掉後半段。
- 批次:一次送一段、一次送幾十段,各量一次時間。
三、Rerank:
- 一組明顯相關、一組明顯無關,各看分數。
- ⚠️ 它回的不是 0 到 1,是可以為負的分數。
⛔ 不要跟上面那個相似度混用,也不要拿兩者互相比較。
回報:兩條 OCR 線不一樣的地方、embedding 的維度與三組相似度、
超長那次有沒有報錯、批次時間、rerank 的兩個分數。
測出來的東西比預期有用。
先講 embedding 在做什麼:它把一段文字換算成一串數字,意思相近的兩段話,算出來的數字就會很接近。之後「查得到」靠的就是比對這串數字,不是比對字面 —— 所以問句用的詞跟文件裡的詞不一樣,也還是找得到。
這次回來的是每段文字 1024 個數字,而且它已經先把大小調到同一個基準。這件事的實際好處是:要比兩段話像不像,把兩串數字乘一乘加起來就是答案,不用自己再換算一次。
速度更值得記:四段文字 0.122 秒,六十四段 0.179 秒。量多了十六倍,時間只多不到一半 —— 也就是一次多送一點幾乎不用錢。灌資料的時可以一次大量送。
像不像的那三組數字這樣看:兩句意思相同的中文 0.82,把其中一句換成英文還有 0.72,完全無關的那組 0.43。數字越大代表越像。跨語言那個 0.72 很重要 —— 它表示英文手冊可以直接灌進來,不必先翻成中文。但真正要記住的是 0.43:完全不相干的兩句話,分數也不是 0。這條尺不是從零開始的,所以「低於某個分數就當作查不到」這種寫法,那個門檻要拿真實的問題去校,不能憑感覺填一個。
長度那項的結果是:不報錯。送一段遠超過它上限的文字進去,它安靜地回來了,七秒,沒有任何警告。而那段文字結尾多加的一句話,幾乎沒有被算進去。這種失敗最麻煩:你的知識庫會少掉一段,而所有東西看起來都是綠的。
重新排序那個服務給的分數是 +3.26 對上 -9.87 跟 -11.04,一次 0.021 秒。相關的正、不相關的負,分得很開,但它不是 0 到 1 的分數 —— 跟上面那條尺不能混用,也不能互相比較。
OCR 那條也照做了一次:同一頁用一百五十點跟三百點各送一次,回來的影像單位數量都是 4073,一個字都沒差。提高解析度重掃,白做工。
到這裡,這台機器會看圖、也會把文字變成向量了。但它還只是三個各自獨立的服務,彼此不認識。
明天,把它們串起來,變成一個問得到答案的知識庫。