Files
tobiichiGPT/INTRO.md
2026-02-01 08:15:45 +08:00

202 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 功能介紹
## 核心概念
TobiichiGPT 將 Open WebUI 這類 AI 對話系統的後端改造成由真人管理員回覆的系統。
### 基本原理
1. **API 中間層** - 提供 OpenAI API 相容端點(`/v1/chat/completions`
2. **訊息轉發** - 將用戶訊息轉發到 Rocket.Chat 頻道
3. **管理員介面** - 使用 Rocket.Chat 讓真人管理員查看並回覆
4. **輪詢機制** - API 使用時間戳比較等待管理員在 Rocket.Chat 中回覆
### 技術架構
```
用戶 → Open WebUI → API (FastAPI) → Rocket.Chat ← 管理員
↓ ↓
等待回覆 管理員查看訊息
↓ ↓
輪詢檢查 管理員回覆訊息
↓ ↓
返回給用戶 ←─────────┘
(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
- 每個對話有獨立的主題和訊息串
- 管理員需要能夠明確追蹤「哪個用戶的哪個對話」
### 管理後台需求
理想的管理介面應該呈現:
```
📂 所有對話(每個對話獨立頻道)
├── 💬 張三-chat001 (教我 Python)
│ ├── 💬 張三: "Python 怎麼學?"
│ └── 💬 管理員: "建議從基礎開始..."
├── 💬 張三-chat002 (推薦餐廳)
│ ├── 💬 張三: "台北有什麼好吃的?"
│ └── 💬 管理員: "推薦鼎泰豐..."
└── 💬 李四-chat004 (程式問題) ⚠️ 待回覆
└── 💬 李四: "React Hook 怎麼用?"
```
**核心需求**
- ✅ 對話隔離 - 每個對話一個獨立頻道
- ✅ 用戶識別 - 頻道名稱包含用戶名和對話 ID
- ✅ 簡單直觀 - 不使用 Thread直接在頻道內問答
- ✅ 狀態管理 - 清楚標示哪些對話待回覆
## 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_name}-{chat_id[:8]}) │
│ 5. 發送用戶訊息到頻道,記錄時間戳 │
│ 6. 輪詢頻道訊息,用時間戳比較等待管理員回覆 │
│ 7. 將管理員回覆返回給 Open WebUI │
└──────┬──────────────────────────┬───────────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────────────────┐
│ PostgreSQL │ │ Rocket.Chat + MongoDB │
│ reply_queue │ ├─────────────────────────┤
│ (記錄追蹤) │ │ 頻道: ckliu-68a77282 │
└─────────────┘ │ ├── 💬 ckliu: 測試訊息│
│ └── 💬 管理員: ... │
│ │
│ 頻道: ckliu-a8224bcf │
│ ├── 💬 ckliu: 測試訊息 │
│ └── 💬 管理員: ... │
└─────────────────────────┘
│ 8. 管理員直接在頻道回覆
┌─────┴──────┐
│ 管理員瀏覽器│
└────────────┘
```
### 資料映射關係
| Open WebUI | Rocket.Chat | 說明 |
|-----------|-------------|------|
| 對話 (chat_id) | 頻道 (Channel) | 每個對話一個專屬頻道 `{user_name}-{chat_id[:8]}` |
| 訊息 (message) | 訊息 (Message) | 直接在頻道中發送,不使用 Thread |
| 用戶 (user_name) | 頻道名稱前綴 | 用於識別是誰的對話 |
**設計理念**
- 簡化架構,不使用 Thread執行緒
- 每個對話完全獨立,避免複雜的層級結構
- 頻道名稱直接顯示用戶和對話 ID方便識別
### Rocket.Chat 呈現效果
```
Rocket.Chat 介面:
├── 📂 頻道列表
│ ├── ckliu-68a77282 (最近活躍)
│ ├── ckliu-a8224bcf
│ ├── alice-3f91c2e1
│ └── bob-7d4e9a23
└── 📂 ckliu-68a77282 頻道內容
├── 💬 **💬 ckliu:**
│ NPU能吃嗎...
├── 💬 管理員回覆:
│ NPU 是神經處理單元,不能吃喔 😄
├── 💬 **💬 ckliu:**
│ 那有什麼用途?
└── 💬 管理員回覆:
主要用於 AI 運算加速...
```
**特點**
- 每個頻道 = 一個完整對話
- 訊息直接在頻道中,不用點開 Thread
- 管理員看到新頻道就知道有新對話
- 頻道名稱清楚標示用戶和對話 ID
### 資料庫結構
`reply_queue` 表格結構(用於記錄追蹤):
```sql
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), -- 儲存頻道 ID
rocketchat_thread_id VARCHAR(100) -- 保留欄位(目前未使用)
);
```
**說明**
- PostgreSQL 僅用於記錄追蹤,非主要邏輯
- 實際對話內容和回覆檢測都在 Rocket.Chat 中進行
- 使用時間戳比較來判斷是否有新的管理員回覆
### 服務列表
| 服務 | 容器名 | 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 | 管理員對話介面 |
### 技術特點
1. **一對一映射** - 每個 Open WebUI 對話對應一個 Rocket.Chat 頻道
2. **簡化架構** - 不使用 Thread減少複雜度和潛在問題
3. **時間戳比較** - 使用 ISO 格式時間戳判斷新訊息,簡單可靠
4. **即時通知** - Rocket.Chat 支援桌面和手機推送
5. **輕量部署** - 共 5 個容器(含初始化容器)
6. **可擴展性** - 支援多管理員協作回覆