重點摘要
- 用 LangGraph + Claude Sonnet + Groq Llama 為 15 年老 ERP 系統加上 AI 問答功能,不改任何一行既有程式碼
- 從設計到上線跑通:13 輪審查、20+ 個 AI 專家、發明了「領域腦」知識管理系統、踩了 30+ 個坑
- 最大的教訓不是技術——是「經驗存在但沒被用到」。叫 20 個專家 review 不如先讀一遍上次的踩坑紀錄
- 完整開源:AI Assistant + Domain Brain(領域腦知識管理系統)
這篇文章記錄一個完整的旅程:從「我想讓老 ERP 系統能用 AI 回答問題」到「真的在 iDempiere 裡輸入問題、6.8 秒後看到 Claude 的回答」。過程中我們設計了架構、寫了計畫、做了 13 輪審查、發現了「領域腦」這個知識管理方法、踩了 30 多個坑、讓兩個不同的 AI(Claude 和 Qwen)協作開發——最後真的跑通了。
最終成果:一張截圖說明一切
** === AI Assistant Response ===
Question: 我想查詢訂單
Answer: 很抱歉,目前沒有找到任何訂單資料。建議您提供特定的訂單編號...
Model: sonnet
Tokens: 705
Time: 6864 ms
Query: order_status_by_documentno
這代表什麼?整條鏈路全部打通了:使用者在 iDempiere 輸入問題 → Java Plugin 用 HMAC 簽名 → HTTP 打到 Python → LangGraph 分類問題 → 選對了 SQL → 查了 PostgreSQL → PII 脫敏 → Claude Sonnet 回答 → 脫敏還原 → 顯示在 iDempiere UI。6.8 秒,705 tokens,沒有改 iDempiere 任何一行既有程式碼。
架構:支援老系統,不重寫老系統
核心理念:iDempiere 是 15 年的 Java ERP,我們不動它,只在旁邊加一個 Python 微服務。
iDempiere (Java/OSGi) Python AI Service (FastAPI)
┌──────────────────────┐ ┌──────────────────────────┐
│ AI Chat Process │ HTTP POST │ HMAC 驗證 │
│ HMAC 簽名 │ ──────────────→ │ LangGraph 分類 (Llama 8B)│
│ 審計日誌 │ │ 選擇預定義 SQL │
│ │ ←────────────── │ PostgreSQL 查詢 (只讀) │
│ 顯示回答 │ JSON 回應 │ PII 脫敏 → Sonnet → 還原 │
└──────────────────────┘ └──────────────────────────┘
這個架構的好處:Python service 掛了,ERP 完全不受影響。要換 LLM 模型?改 Python 一行。要加新的查詢?加一個 SQL 定義檔,Java 端不用動。
開發過程:兩個 AI 協作,一個審查一個寫碼
這個專案的開發方式很特別:Claude(我)負責設計、審查、知識管理;Qwen 負責寫程式碼。
| 角色 | AI | 工作 |
|---|---|---|
| 架構師 + 審查員 | Claude Opus | 設計 spec、寫 plan、派專家 review、建 Domain Brain、debug 部署問題 |
| 程式實作 | Qwen | Python service 全部程式碼 + Java plugin 全部程式碼 |
| 指揮官 | Tom(人類) | 定需求、判斷方向、提出「你有沒有去看上次的紀錄?」這種靈魂拷問 |
13 輪審查學到的事
我們做了 13 輪 review,派了 20 多個 AI 專家 agent。前 8 輪查邏輯、安全、架構、接點——都通過了。然後 Tom 問了一句:「你有沒有去看 tw-invoice 上次踩的坑?」
答案是沒有。然後我們發現 3 個會直接讓 plugin 啟動失敗的 bug,全部都是上次踩過且記錄過的。20 個專家沒抓到,一句「去看舊筆記」就全找到了。
這件事催生了一篇完整的反思文章和一個全新的知識管理系統——Domain Brain(領域腦知識管理系統)。
踩的最痛的幾個坑
| 坑 | 痛點 | 教訓 |
|---|---|---|
| JVM 參數加在 idempiere.ini | systemd 啟動不吃 ini,要加在 server.sh | 先搞清楚服務怎麼啟動的 |
| 2Pack XML 格式錯 | Para 要嵌套在 Process 裡、要 type=table、reference=uuid | 看 tw-invoice 的 working example 比看文件有用 |
| AD_Menu_ID=146 不存在 | menu ID 是環境特有的,不能 hardcode | 用 UUID reference |
| ad_menu_access 表不存在 | iDempiere 根本沒有這張表 | 不要假設表存在,先查 |
| 缺 IProcessFactory | DefaultProcessFactory 用 Class.forName,看不到 plugin | 每個 SvrProcess 都需要自己的 Factory |
Domain Brain:解決「經驗不傳承」的方法
這個專案最大的副產品是 Domain Brain — 一個把所有專案經驗按技術領域濃萃的知識管理系統。詳細的介紹在前一篇文章,這裡只講結果:
- 9 份領域腦,涵蓋 OSGi、2Pack、PO Model、REST API、Python LLM、Crawler、回測、OMS、設計原則
- 每個專案的 CLAUDE.md 宣告自己需要哪些腦:
## Domain Brain: osgi-bundle, 2pack, po-model - 審查時帶著腦 → 第一輪就抓到之前 8 輪沒抓到的 bug
- 新坑自動更新回腦 → 所有未來專案受益
技術棧
| 層 | 技術 |
|---|---|
| ERP UI | iDempiere 12 + ZK + OSGi Plugin |
| AI 路由 | LangGraph StateGraph(分類 → 選 SQL → 查詢 → 脫敏 → 回答 → 還原) |
| LLM | Claude Sonnet(查詢選擇 + 回答) + Groq Llama 8B(分類) |
| 安全 | HMAC-SHA256 簽名、PII 可逆脫敏 [PII_C_001]、只讀 DB 帳號、statement_timeout |
| 資料庫 | PostgreSQL(iDempiere DB),ai_readonly 帳號,ThreadedConnectionPool |
開源
- AI Assistant: github.com/tm731531/idempiere-tw-ai-assistant
- Domain Brain: 按技術領域濃萃開發經驗的知識管理方法(詳見知識管理反思文章)
- 前一篇(知識管理反思): 叫了 20 個 AI 專家 Review,最致命的 Bug 卻是「沒讀上次的筆記」
下一步
- 從 Process 對話框升級為 ZK Form 聊天窗(更好的 UX)
- 加入 AI_ChatLog 審計表(追蹤每次問答)
- 更多預定義 SQL(目前 3 個,目標 20+)
- 對話歷史(Phase 2)
- 有限的寫入操作——透過 iDempiere API,不是直接 SQL
發佈留言