iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0

https://ithelp.ithome.com.tw/upload/images/20260816/20181284oi0YDOWrJ1.png

現在,我們有 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,一個字都沒差。提高解析度重掃,白做工。

到這裡,這台機器會看圖、也會把文字變成向量了。但它還只是三個各自獨立的服務,彼此不認識。

明天,把它們串起來,變成一個問得到答案的知識庫。


上一篇
D10 讓機器聽話跟講話
系列文
一個人的 IT 部門:用 Claude Code 從裸機到一整座 AI 機房12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言