Domino IQ RAG:把 NSF 直接掛上本地 LLM 的內建管線

📚 這篇是 Domino IQ 雙篇系列的「深入篇」。沒看過 Domino IQ 整體架構、安裝流程、與 NotesLLMRequest / NotesLLMResponse 怎麼從應用程式呼叫的,建議先讀 Domino IQ 入門:把 LLM 跑進 Domino server 是什麼概念 再回來看 RAG 怎麼運作。

RAG 在 Domino IQ 是怎麼一回事

Domino 14.5.1 開始支援 RAG(Retrieval-Augmented Generation)—— LLM1 在生成回答前,先從你指定的 NSF 取回語意相關的文件當 context,回應因此「更貼近你的領域、更貼近你的當下資料」。一般 RAG 你可能聽過 OpenAI + Pinecone + LangChain 那條龍,Domino IQ 把這整條全部內建到 server 任務裡。

當你把一個 Command document 設成 RAG 模式,Domino IQ 任務在 server 程序裡會啟動:

  • 一個 llama-server instance 跑 LLM 推論模型
  • 一個 llama-server instance 跑 Embedding 模型2
  • 一個 vector database server
  • 可選:一個 llama-server instance 跑 guard model3

使用者送 prompt 進來時,prompt 先被語意搜尋打到 vector DB,命中的 RAG source NSF 文件被取出,與 prompt 一起送給 LLM —— 全部在你自己的 Domino server 上跑完。

跟一般 RAG 比,三件事不一樣

1. 必須是 Local mode:Domino 14.5.1 的 RAG 支援「在 Domino IQ server 設成 Local mode 時可用」。處理 RAG 內容的 LLM 跑在你 server 上,不打外部 cloud API。對怕資料外流的金融/法務/醫療場景,這條一勞永逸解決資料殘留風險。

2. 原生繼承 NSF 的 ACL 與 Readers field:當一個 DB 被 enable 成 RAG source,LLM command 處理請求時「會用認證 session 中的 Notes DN 同時套用 ACL 跟文件 Readers field」。也就是 — A 使用者問問題時,向量搜尋只會打到 A 看得到的文件,B 的 Readers 限制文件不會被當 context 漏給 A。這個整合一般 RAG pipeline 要做到很費工。

3. DominoIQ task 一條龍:Embedding 模型、vector DB、LLM 推論、向量化全部由 DominoIQupdall 兩個 server task 管理。沒有 Pinecone 帳號要管、沒有 ETL pipeline 要寫。

啟用前的準備

✓ dominoiq.nsf 用 14.5.1 shipped 的 dominoiq.ntf 升級
✓ Domino IQ server 上開啟 transaction logging
✓ RAG source DB 已 replicate 到 Domino IQ server
✓ RAG source DB 已建好 full-text index,且勾「Index attachments」
✓ 選好 GGUF 格式的 embedding model(mxbai-embed-large、bge-me、nomic-embed-text、snowflake-arctic-embed 等)

選 embedding model 時要看你的內容語言、想要的維度大小,以及它必須是 GGUF4 格式(llama.cpp 生態系的標準分發格式)。

設定步驟

Step A:dominoiq.nsf 加 Embedding & Vector DB

dominoiq.nsf → Add Configuration / Edit Configuration:

  • Embedding Model 分頁:選你下載的 GGUF embedding model、status 設 Enabled、必要時改 port、若 model 支援更長的 context 可以從預設 1024 往上調
  • Vector Database 分頁:必要時改 port 或 host(多 partition 環境會用到)

Step B:Command document 設好 RAG 欄位

在 Command document 裡,幾個關鍵 RAG 欄位

欄位用途預設
RAG enabled databaseRAG source DB 路徑(相對於 data dir)
RAG enabled fields哪些欄位要被向量化、寫進 vector DB
RAG threshold語意搜尋取回的最低分數0.7
RAG maximum responses一次最多取幾筆當 context25
Maximum tokensLLM prompt 的 token 上限(RAG 注入後 prompt 會變大,記得拉高)

Step C:啟用 + 向量化

  1. 重啟 Domino IQ server —— 才會把 embedding 跟 vector DB 子任務拉起來
  2. Administrator 客戶端 → Files panel → 右鍵那個 RAG source DB → Domino IQEnable
  3. server console 跑 load updall -w <rag-dbname> —— 把 NSF 文件 ingest 進 vector DB(這個動作叫 vectorization)

規模大的話 vectorization 會跑幾分鐘起跳,文件量越多越久,文件中文/附件內容會抽出來算 embedding。

從應用程式呼叫:LLMReq

設定好後,從應用程式裡用 LotusScript 或 Java 的 LLMReq method 呼叫設好的 AI command。Method 拿到輸入 prompt → 走完 vector 搜尋 → 把 top-N 文件當 context → 餵 LLM → 回字串。對 caller 來說它就是一個普通 method call。

注意:截至 14.5.1 的官方 admin doc 沒有把 LLMReq 的完整 signature 完整列出(在 Designer help 裡),實作 LLMReq 用法時建議先在小資料集跑一遍對照預期。

安全性:ACL + Readers field 自動套用

Domino IQ 安全性的核心是「LLM command 用 authenticated session 的 Notes DN 同時套 ACL 跟 Readers」。一般 RAG 系統裡,「向量搜尋結果該不該給這個 user 看」要靠你在 應用層 自己過濾、極容易出包;Domino IQ 把這事內建成 server-side 強制執行,從架構上規避了「不小心把別人的私文件當 context 餵給 LLM」這種 leakage。

延伸:HCL 也建議你的 LLM 模型「應支援 paraphrase 能力」,讓 RAG 內容在被回應時不被原樣複製出來,進一步降低敏感原文外流風險。

容量與效能調優

RAG 模式下 prompt 變大,預設 LLM 上下文大小不夠用:到 dominoiq.nsf 的 Advanced 分頁,Special parameters 加類似 -c 65000、配合並行請求數量 —— 例如 10 個並行請求 + -c 65000 約等於每個請求 6500 token 的上下文。GPU 卸載參數也在同一頁可調。

「沒命中怎麼辦」也是要設定的:在 Command 對應的 system prompt 文件裡,明確告訴 LLM「找不到相關文件時要回什麼」—— 不寫的話 LLM 會自己編造一個合理但無依據的答案,這正是 RAG 想避免的。

收掉一個 RAG-enabled DB 的標準流程

  1. Command document 把 RAG source DB 欄位清空、存檔
  2. 重啟 Domino IQ server
  3. server console 跑 load updall -w -d <RAG-dbname> 等它跑完 —— 這會清掉 vector DB 裡這個 NSF 對應的 entry
  4. Administrator 客戶端 → Files panel → 右鍵那個 DB → Domino IQDisable

順序不能亂:先動 Command 文件再清 vector entries,不要反過來。

為什麼這比「外接 LLM SaaS」實際

純粹用 OpenAI / Anthropic API + 自己接 vector DB 蓋一條 RAG,技術上可行,但你會撞到:

  • 資料要先 ETL 出 Domino → 違反法規/違反客戶合約常見 case
  • ACL/Readers field 要在 應用層 重做一次過濾邏輯
  • vector DB 帳號 / 流量 / 限額另外管
  • LLM API call 計費跟 token usage 要監控

Domino IQ RAG 的設計把這 4 件事一起處理掉 —— 代價是你要在自己的 server 跑得起 GGUF 模型,也就是要備一張 NVIDIA GPU(最低 compute capability 5.2+,生產建議 8.0+)跑在 64-bit Windows / Linux 上(純 CPU 模式不支援,macOS 跟 ARM 也不行)。對 Domino 既有客戶來說,這個 trade-off 通常划算。

  1. LLM(Large Language Model,大型語言模型)是以海量文字訓練的神經網路模型 — 例如 GPT、Claude、Llama 等 — 能依輸入提示生成自然語言回應。

  2. Embedding 模型把文字轉成固定維度的向量(例如 768 或 1024 維),讓「語意相近」的句子在向量空間中也接近 — RAG 用它把 NSF 文件變成可被語意搜尋的索引。

  3. Guard model 是另一個小型 LLM,跑在主 LLM 之前 / 之後當「過濾層」,攔截可能不適當的輸入(例如越獄提示、敏感問題)或輸出(例如有害內容、敏感原文外流)。

  4. GGUF(GPT-Generated Unified Format)是 llama.cpp 生態系常見的單檔二進位模型格式,把模型權重、tokenizer、metadata 打包成一個檔,可直接 mmap 載入記憶體 — 是 on-device 推論常用的分發格式。

參考來源

← 回到文章列表