管理後台
管理員怎麼設定模型連線、管理帳號與角色,以及備份與還原系統設定。
管理後台在左側「管理」選單底下,只有管理員看得到,對應的 API 也只接受管理員。選單裡還有系統狀態、背景作業、Prompt 範本等頁面;這頁說明 LLM 設定、使用者與設定備份三項。
LLM 設定
分析用的每一組模型連線叫做 profile。在「管理 → LLM 設定」可以設定好幾組,再選一個 pool 策略,決定每次呼叫送往哪一組。
| 欄位 | 說明 |
|---|---|
| 名稱 | 辨識用的名字。 |
| Provider | Ollama,或 OpenAI 相容的服務。 |
| Base URL | 服務位址。OpenAI 相容服務的網址可以含 /v1。 |
| API Key | 列表只顯示末四碼;編輯時留空表示不變更。Ollama 通常不需要。 |
| 模型 | 可以按「抓取」列出服務上有哪些模型。 |
| 啟用 | 停用的 profile 不參與分析。 |
| 允許並行請求 | 關閉後,送往這個 profile 的呼叫一次只送一個,其餘在 backend 排隊。 |
| Priority | Fallback 時數字越小越先試,預設 100。 |
| Weight | Load balance 的權重,預設 1。 |
| Timeout(秒) | 單次呼叫的逾時,預設 300。 |
| Temperature、Top P | 留空就用服務的預設值。 |
pool 策略有兩種:
兩種策略都只用啟用中的 profile。一組失敗就換下一組,全部失敗,這次呼叫才算失敗。
設定存檔後立即生效:每次呼叫都重新讀取 profile,不必重啟 backend。列表上的「測試」和編輯視窗的「測試連線」會送一個 ping,顯示連不連得上和延遲。
注意並行量:一份文件最多 4 個任務同時分析,每個任務的逐條件覆核最多 3 個同時呼叫,可以用 ANALYSIS_CONCURRENCY、NODE_REVIEW_CONCURRENCY 調整。一次只能處理一個請求的本機模型,例如單卡的 Ollama 或 llama.cpp,請關掉「允許並行請求」:否則請求會堆在模型那端,逾時照樣計算,最後逾時失敗。
資料庫裡沒有任何啟用的 profile 時,backend 改用環境變數 OLLAMA_HOST、OLLAMA_MODEL 指定的 Ollama。
每個分析階段的 prompt 都在「管理 → Prompt 範本」,存檔的版本會取代內建版本。各階段在做什麼,見分析管線。
使用者與角色
帳號有三種角色:
| 角色 | 可以做什麼 |
|---|---|
| 管理員(admin) | 所有功能,包括整個管理後台,以及解鎖已鎖定的條文。 |
| 審核者(reviewer) | 上傳與分析文件、編輯任務、逐條件審核與整條簽核、修改邏輯、重新分析條件、把已核准的條文退回重審。 |
| 檢視者(viewer) | 文件、條文審核頁和工具頁都看得到,但不能上傳、分析、簽核或修改邏輯。 |
權限由 backend 檢查,不只是隱藏按鈕:除了健康檢查、登入和登出,所有 API 都要先登入,寫入的動作再依角色限制。
在「管理 → 使用者」可以新增帳號、改角色、重設密碼、停用或重新啟用。帳號是 2–64 個英數字或 . _ @ -,密碼 8–128 個字元,新帳號預設是審核者。
帳號不能刪除,只能停用。審核紀錄和簽核都記著是誰做的,刪掉帳號會毀掉這段歷史;停用後無法登入,紀錄全部保留。
不能停用自己的帳號,系統裡也至少要保留一位啟用中的管理員。
停用或改角色不必等對方登出:每個請求都會核對帳號目前是否啟用、角色是什麼。
上線前更換預設管理員:使用者表是空的時候,backend 啟動會建立一位管理員。帳密可以用 SEED_ADMIN_USER、SEED_ADMIN_PASSWORD 指定,沒指定就是開發用的預設值。
登入與鎖定
登入後,登入憑證存在 httpOnly cookie,24 小時後要重新登入。
同一個帳號從同一個 IP 登入失敗,15 分鐘內滿 10 次就會被擋,要等第一次失敗起算的 15 分鐘過去才能再試,畫面會提示還要等幾分鐘。登入成功會清除計數。
計數以帳號加 IP 為單位,有人在猜某個帳號的密碼,不會讓同一個辦公室的其他人登不進去。
每次失敗都寫入 audit_log(auth.login_failed),附上來源 IP。
計數存在 backend 的記憶體裡,重啟 backend 就會歸零。
設定備份
「管理 → 設定備份」把系統設定匯出成一個加密檔,可以在另一台主機、或重建之後還原。備份檔包含:
- 所有 LLM profile 和 pool 策略,含 API Key。
- 所有使用者帳號,含 argon2 密碼雜湊(不是明碼),還原後使用者沿用原本的密碼。
- 其他幾項系統設定。
匯出時設定一組至少 12 個字元的加密密碼,輸入兩次,下載 .cqlbak 檔。檔案以 AES-256-GCM 加密,金鑰由這組密碼經 scrypt 推導;沒加密的部分只有匯出時間、LLM 設定數和帳號數,方便辨認是哪一份。
匯入分兩步,第一步不會寫入任何東西:
- 選擇備份檔,輸入它的密碼,按「解密並預覽」。畫面列出檔案內容,以及匯入後會刪除、停用哪些東西。
- 確認沒問題,輸入 REPLACE,按「確認匯入並覆蓋」。
匯入是覆蓋,不是合併:
| 項目 | 匯入後 |
|---|---|
| LLM profile 與 pool 策略 | 整批取代:現有的 profile 全部刪除,換成檔案裡的;策略也照檔案。 |
| 檔案裡有的帳號 | 沒有就新增,有就覆蓋密碼雜湊、顯示名稱、角色和啟用狀態。 |
| 檔案裡沒有的帳號 | 停用,不刪除,審核紀錄保留。 |
| 其他系統設定 | 照檔案內容覆蓋。 |
| Prompt 範本 | 不在備份裡,匯入不會動到。 |
以下情況會拒絕匯入:
- 檔案裡沒有任何啟用中的管理員。匯入後會沒有人進得了管理後台。
- 密碼錯誤,或檔案損毀、被竄改。解密時兩者無法分辨,一律拒絕。
- 備份檔的版本比目前系統新。
- 帳號缺少密碼雜湊或雜湊不是 argon2 格式,或 LLM profile 缺少名稱、模型或 Base URL。
匯入在同一個資料庫交易裡完成:要嘛全部套用,要嘛全部不變。
妥善保管備份檔:裡面有可用的 API Key 和所有帳號的密碼雜湊。加密密碼不會存在系統裡,遺失就無法還原,請和檔案分開保存。