🧭 老工廠 AI 落地筆記 · 系列導覽
1. 看懂工廠脈絡2. 先懂產出配方
3. 逐節點 AI(手冊→RAG)
4. 排落地順序(本篇)
5. 用資產周轉算 ROI
6. MCP 串接 + 飛輪
7. 總結:一條路
重點摘要
- 不要從最貴的地方(採購定價)下手 —— 那是高風險高阻力的坑:1% 上看千萬,配錯也是千萬。
- 第一步做低風險、能發訊號的:分選/儲存/檢驗的「事實面」+ RAG。不替人做高風險的錢決定,只把看不見的變可見。
- 落地分三階段:Phase 0 進場問清楚 → Phase 1 先上不需地基的 → Phase 2 才補資料主鍵。
- 而且第一步的 RAG 真的能純本機、離線跑 —— 不用上雲、不洩密,適合斷網工廠。
前面幾篇看懂了工廠脈絡、產出配方、每個節點能做什麼。這篇談最實際的問題:這些工具怎麼落地、先做哪個?重點是——不是全都做,而是有順序。做錯順序,再好的技術也會死在「pilot 做不出成效、沒人採用」。
別從最貴的地方下手(那是坑)
直覺會想:原料佔成本 80%,那就從採購定價下手,省 1% 就千萬。但這是坑:
- 高風險:AI 推薦的採購價若錯,就是千萬級的損失,不是省。
- 高阻力:採購是老手,不會信一個 AI 算出來的「底價」數字。
- 貢獻有限:定價的核心變數(市場、關係、談判)不是外來顧問能左右的。
先活著、先被信任,才有資格碰大錢。
第一步要選「風險小、貢獻看得到、不威脅現場」的地方 —— 那是分選、儲存、檢驗的事實面 + RAG,不是「該付多少」的定價決策。
第一步要選「風險小、貢獻看得到、不威脅現場」的地方 —— 那是分選、儲存、檢驗的事實面 + RAG,不是「該付多少」的定價決策。
落地順序:三個階段
為什麼第一步選 RAG?因為它真的能離線跑
很多工廠不能上雲(資安、斷網、法規)。好消息是:一個知識 RAG 完全可以純本機、離線跑。我實際用開放模型做了一個分選知識的 RAG 雛形 —— 全部在一台機器上、不連網、不裝一堆套件:
實測問「304 和 316 怎麼分?」,它會答:用手持 XRF 讀鉬(304 沒有、316 有 2–3%),並附上出處。這種「低風險、離線、有出處」的工具,正是進場第一步該做的東西。
動手做:這個離線 RAG 的四個零件
不神秘,拆開就四塊,全用本機開放模型 + Python 標準庫(連 pip 都不用裝):
| 零件 | 用什麼 | 做什麼 |
|---|---|---|
| 嵌入模型 | bge-m3(Ollama) | 把文字轉成向量,能算相似度 |
| 生成模型 | qwen2.5:7b(Ollama) | 根據找到的資料寫答案 |
| 知識庫 | kb/*.md + grades.json | 公開手冊切片 + 結構化牌號表 |
| 串接 | 純 urllib / json / math | 免裝套件,離線可跑 |
① 切片:把手冊按 ## 標題切成一段段知識,結構化牌號表整包當一片:
# kb/*.md 按 "## " 標題切片;每片記住來源檔名
def chunk_kb():
chunks = []
for fp in sorted(glob.glob("kb/*.md")):
for p in re.split(r"\n(?=## )", open(fp, encoding="utf-8").read()):
if p.strip().startswith("## "):
chunks.append({"source": os.path.basename(fp),
"title": p.split("\n", 1)[0][3:].strip(),
"text": p.strip()})
return chunks
② 檢索:問題也轉成向量,用餘弦相似度挑最相關的前 3 段。全程打本機 localhost:11434,不連外網:
def embed(text): # 呼叫本機 bge-m3 取向量
return _post("/api/embeddings", {"model": "bge-m3", "prompt": text})["embedding"]
def cos(a, b): # 餘弦相似度
dot = sum(x*y for x, y in zip(a, b))
na = math.sqrt(sum(x*x for x in a)); nb = math.sqrt(sum(y*y for y in b))
return dot / (na*nb + 1e-9)
def retrieve(q, chunks, k=3): # 取最像的前 k 片
qe = embed(q)
return sorted(chunks, key=lambda c: cos(qe, c["emb"]), reverse=True)[:k]
③ 有據回答:把找到的資料塞進 system prompt,鐵律寫死在裡面 ——「查不到就說查不到、不編造,而且成分真值要靠儀器」:
SYS = ("你是不鏽鋼廢鋼分選/驗料的知識助理。只根據下面的【資料】回答,"
"標出處;資料裡沒有的就說『資料裡查不到』,絕不編造。"
"鐵律:成分真值要靠儀器(XRF/LIBS/OES),你只是判斷輔助,不取代儀器或人。")
def answer(q, k=3):
top = retrieve(q, load_index(), k)
ctx = "\n\n".join(f"[來源 {c['source']}|{c['title']}]\n{c['text']}" for c in top)
d = _post("/api/chat", {"model": "qwen2.5:7b", "stream": False, "messages": [
{"role": "system", "content": SYS},
{"role": "user", "content": f"【資料】\n{ctx}\n\n【問題】{q}"}]})
return d["message"]["content"], [c["source"] for c in top] # 答案 + 出處
整個雛形不到 80 行、零第三方套件。這就是「低風險、離線、有出處」的第一步工具 —— 下一步才是把它包成一個能被別的系統呼叫的 MCP 工具(系列第六篇會拆給你看)。
下一篇:這樣做之後,ROI 怎麼算、怎麼提升——而且不只是「省成本」。
發佈留言