Files
tobiichiGPT/INTRO.md
2026-02-01 01:24:56 +08:00

179 lines
7.1 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. **訊息轉發** - 將用戶訊息存入資料庫的 `reply_queue` 表格
3. **管理員介面** - 使用對話軟體讓真人管理員查看並回覆
4. **輪詢機制** - 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` 表格結構:
```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),
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 | 管理員對話介面 |
### 技術特點
1. **雙層映射** - 完美對應 Open WebUI 的用戶+對話結構
2. **執行緒隔離** - 每個對話獨立,不會混雜
3. **即時通知** - Rocket.Chat 支援桌面和手機推送
4. **輕量部署** - 共 5 個容器(含初始化容器)
5. **可擴展性** - 支援多管理員協作回覆