7.1 KiB
7.1 KiB
功能介紹
核心概念
TobiichiGPT 將 Open WebUI 這類 AI 對話系統的後端改造成由真人管理員回覆的系統。
基本原理
- API 中間層 - 提供 OpenAI API 相容端點(
/v1/chat/completions) - 訊息轉發 - 將用戶訊息存入資料庫的
reply_queue表格 - 管理員介面 - 使用對話軟體讓真人管理員查看並回覆
- 輪詢機制 - API 等待管理員在資料庫中填入回覆後返回給用戶
技術架構
用戶 → Open WebUI → API (FastAPI) → PostgreSQL ← 管理介面 ← 管理員
↓ ↓
等待回覆 填寫回覆
↓ ↓
返回給用戶 ←──────────────────────────┘
需求分析
Open WebUI 的對話結構
Open WebUI 採用雙層結構來組織對話:
用戶 A (user_id: abc123)
├── 對話 1 (chat_id: chat_001) - "教我 Python"
├── 對話 2 (chat_id: chat_002) - "推薦餐廳"
└── 對話 3 (chat_id: chat_003) - "旅遊攻略"
用戶 B (user_id: def456)
├── 對話 1 (chat_id: chat_004) - "程式問題"
└── 對話 2 (chat_id: chat_005) - "健康諮詢"
關鍵特性:
- 一個用戶(user_id)可以創建多個對話(chat_id)
- 每個對話有獨立的主題和訊息串
- 管理員需要能夠明確追蹤「哪個用戶的哪個對話」
管理後台需求
理想的管理介面應該呈現:
📂 所有對話(按用戶分組)
├── 👤 張三 (User A)
│ ├── 💬 對話: "教我 Python" (3 則訊息)
│ ├── 💬 對話: "推薦餐廳" (5 則訊息)
│ └── 💬 對話: "旅遊攻略" (2 則訊息)
│
└── 👤 李四 (User B)
├── 💬 對話: "程式問題" (1 則訊息) ⚠️ 待回覆
└── 💬 對話: "健康諮詢" (4 則訊息)
核心需求:
- ✅ 用戶分組 - 能看到每個用戶的所有對話
- ✅ 對話追蹤 - 同一對話的多輪訊息要串在一起
- ✅ 多層結構 - 支援「用戶 → 對話 → 訊息」的層級關係
- ✅ 狀態管理 - 清楚標示哪些對話待回覆
Rocket.Chat 整合架構
系統架構圖
┌─────────────┐
│ Open WebUI │
│ 用戶介面 │
└──────┬──────┘
│ 1. Chat Request
│ Headers: X-OpenWebUI-User-Id, X-OpenWebUI-Chat-Id
│ X-OpenWebUI-User-Name
▼
┌─────────────────────────────────────────────────────────┐
│ API (FastAPI - server.py) │
├─────────────────────────────────────────────────────────┤
│ 2. 解析 Headers 提取 user_id, chat_id, user_name │
│ 3. 登入 Rocket.Chat 取得認證 Token │
│ 4. 創建/取得用戶頻道 (#user-{user_id}) │
│ 5. 在頻道中創建執行緒訊息 │
│ 6. 輪詢等待管理員在執行緒中回覆 │
│ 7. 將回覆返回給 Open WebUI │
└──────┬──────────────────────────┬───────────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────────────────┐
│ PostgreSQL │ │ Rocket.Chat + MongoDB │
│ reply_queue │ ├─────────────────────────┤
└─────────────┘ │ 頻道: #user-abc123 │
│ └── 🧵 chat-001 │
│ ├── 用戶訊息 │
│ └── 管理員回覆 │
└─────────────────────────┘
▲
│ 8. 管理員回覆
│
┌─────┴──────┐
│ 管理員瀏覽器│
└────────────┘
資料映射關係
| Open WebUI | Rocket.Chat | 說明 |
|---|---|---|
| 用戶 (user_id) | 頻道 (Channel) | 每個用戶一個專屬頻道 #user-{id} |
| 對話 (chat_id) | 執行緒 (Thread) | 同一對話的多輪訊息在同一執行緒 |
| 訊息 (message) | 訊息 (Message) | 用戶和管理員的對話內容 |
Rocket.Chat 呈現效果
Rocket.Chat 介面:
├── 📂 頻道列表
│ ├── #user-abc123 (張三)
│ │ └── 描述: 用戶: 張三 (ID: abc123...)
│ ├── #user-def456 (李四)
│ │ └── 描述: 用戶: 李四 (ID: def456...)
│ └── #user-xyz789 (王五)
│
└── 📂 #user-abc123 (張三) 的內容
├── 🧵 [對話 chat-001] "如何學習 Python?"
│ ├── 💬 張三: "如何學習 Python?"
│ └── 💬 管理員: "推薦從基礎開始..."
│
├── 🧵 [對話 chat-002] "推薦餐廳"
│ ├── 💬 張三: "台北有什麼好吃的?"
│ └── 💬 管理員: "推薦鼎泰豐..."
│
└── 🧵 [對話 chat-003] ⚠️ 待回覆
└── 💬 張三: "旅遊攻略"
資料庫結構
reply_queue 表格結構:
CREATE TABLE reply_queue (
id SERIAL PRIMARY KEY,
conversation_id VARCHAR(50) UNIQUE NOT NULL,
user_id VARCHAR(255),
chat_id VARCHAR(255),
user_name VARCHAR(255),
user_message TEXT NOT NULL,
admin_reply TEXT,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW(),
replied_at TIMESTAMP,
rocketchat_room_id VARCHAR(100),
rocketchat_thread_id VARCHAR(100)
);
服務列表
| 服務 | 容器名 | Port | 說明 |
|---|---|---|---|
| PostgreSQL | tobiichiGPT-postgres | 5432 | 資料庫(記錄追蹤) |
| MongoDB | tobiichiGPT-mongo | 27017 | Rocket.Chat 資料庫 |
| API | tobiichiGPT-api | 18000 | OpenAI API 相容端點 |
| Open WebUI | tobiichiGPT-ui | 10060 | 用戶對話介面 |
| Rocket.Chat | tobiichiGPT-rocketchat | 13000 | 管理員對話介面 |
技術特點
- 雙層映射 - 完美對應 Open WebUI 的用戶+對話結構
- 執行緒隔離 - 每個對話獨立,不會混雜
- 即時通知 - Rocket.Chat 支援桌面和手機推送
- 輕量部署 - 共 5 個容器(含初始化容器)
- 可擴展性 - 支援多管理員協作回覆