6.8 KiB
QA History & Floating Chat — Implementation Plan
Scope: Split QA dialog from history records. Global floating chat button. Session-based history with pagination.
Placement: Floating button bottom-right (all pages) + QA Records tab (history only)
Part 1 — DB Changes
New: qa_sessions table
id
user_id
title -- auto-generated from first question (1 line)
project_id -- nullable, context project if asked from project page
started_at
last_message_at -- used for session grouping (30min gap = new session)
message_count
created_at
Update: qa_records table
-- add:
session_id -- FK to qa_sessions
turn_index -- message order within session (1, 2, 3...)
Session grouping rule
- Same user, same day, messages within 30 minutes → same session
- Gap > 30 minutes → new session auto-created
- Session title = first question truncated to 30 chars
Part 2 — API Endpoints
Sessions
GET /api/qa-sessions?page=1&page_size=20&date_from=&date_to=— paginated session list, sorted by last_message_at descGET /api/qa-sessions/{id}— full session detail with all messagesDELETE /api/qa-sessions/{id}— delete session + all its records
Records
POST /api/qa-records/{id}/feedback— submit rating (unchanged)GET /api/qa-records/export?date_from=&date_to=&rating=— full export as JSONL, no pagination, admin only
Part 3 — Floating Chat Button
Global, appears on all pages. Bottom-right corner, fixed position.
Button states
Default: ✦ (purple, 48x48px round button)
Unread: ✦ + red dot (new auto-reply from Feishu RAG)
Active: ✦ (darker, drawer open)
Chat drawer
Slides in from right, 420px wide, full page height. Does not cover left nav.
Drawer header:
✦ AI 管家 [历史] [×]
历史button → switches drawer content to session history view (see Part 4)×→ closes drawer
Conversation area:
- Messages listed top to bottom, newest at bottom
- User messages: right-aligned, blue bubble
- AI messages: left-aligned, gray bubble
- Each AI message shows: source citation + response time + 👍 👎 inline
- Retains last 10 turns as context for next question
Input area (fixed at drawer bottom):
┌─────────────────────────────────┐
│ 输入问题... │
└─────────────────────────────────┘
[提问]
On 👍 click (inline, non-blocking):
这条回答对你有多大帮助?
● 完全解决 ○ 部分有用 ○ 可以更好
[跳过] [提交]
On 👎 click (inline, expands below message):
哪里有问题?(可多选)
☐ 答案错误 ☐ 来源错误 ☐ 不完整 ☐ 答非所问 ☐ 其他
正确答案:(选填)
┌──────────────────┐
│ │
└──────────────────┘
[提交]
After feedback submitted: rating badge appears on message, form collapses.
Loading state:
🤖 正在检索知识库...
Shows which domains are being searched (db / docs / feishu / pmflow).
Part 4 — Session History View (inside drawer)
Triggered by clicking 历史 in drawer header. Replaces conversation area, back button returns to current chat.
Two-panel layout inside drawer:
[← 返回对话]
今天
健身项目状态咨询 14:23 3轮 →
开票系统宪章查询 11:05 2轮 →
昨天
信号处理相关问题 09:30 5轮 →
团队负载查询 08:15 1轮 →
更早(点击展开)
[加载更多]
Clicking a session → expands inline to show full conversation thread:
[← 会话列表]
健身项目状态咨询 · 2026-03-02 · 3轮对话
Q: 健身项目目前是什么状态?
A: 活跃状态,但所有任务均未开始...
来源:Project database · 耗时 3.9s · 👍 已评价
Q: 那宪章进度呢?
A: 宪章草稿阶段,0份宪章...
来源:Project database · 👎 已标记问题
Q: 帮我看看信号源
A: 当前有9条有效信号...
来源:Project database · 未评价 [👍] [👎]
- Sessions older than 30 days collapsed under "更早", not auto-loaded
- Each session shows: title / date / turn count / last message time
- Pagination: 20 sessions per page, "加载更多" button at bottom
- No infinite scroll (prevents performance issues with large history)
Part 5 — QA Records Tab (history only, no chat)
Tab in AI Steward page. Only for browsing, rating, and exporting. Chat box removed entirely from this tab.
Top bar:
[ Search questions... ] [ All ratings ▾ ] [ This week ▾ ] [ Export JSONL ]
Session list with pagination:
Each row = one session (not one message):
2026-03-02 14:23 健身项目状态咨询 3轮 👍 2 👎 0 未评价 1 [展开]
2026-03-02 11:05 开票系统宪章查询 2轮 👍 0 👎 1 未评价 1 [展开]
Click 展开 → session expands inline showing all messages with rating controls.
Pagination:
- 20 sessions per page
- Page controls at bottom:
← 上一页 第1页/共8页 下一页 →
Stats bar (top of tab):
总会话 68 总问答 342 已评价 89% 平均帮助度 4.2/5 可导出训练对 156
Export:
Export JSONLbutton → exports ALL records matching current filters, no pagination limit- Admin only
- Format: one JSON object per line, includes session_id, turn_index, question, answer, sources, rating, correct_answer
Part 6 — Session Auto-title Generation
- On session creation, first question is used as title (truncated to 30 chars)
- If first question is very short (<5 chars), wait for second message to generate title
- Title stored in
qa_sessions.title, editable by user (click to rename in history view)
Implementation Order
| Task | Time |
|---|---|
DB: add qa_sessions table, add session_id + turn_index to qa_records |
Day 1 |
| Session grouping logic (30min gap rule) + session auto-title | Day 1 |
| Session list + detail API endpoints | Day 2 |
| Floating chat button + drawer UI (conversation area + input) | Day 3–4 |
| Session history view inside drawer (list + inline expand) | Day 5 |
| QA Records tab: remove chat box, add session-grouped list + pagination | Day 6 |
| 👍👎 inline feedback in drawer (non-blocking forms) | Day 7 |
| Export JSONL with session metadata | Day 8 |
| End-to-end test + performance check (large history load) | Day 9–10 |
Out of scope
- Search within a session
- Session sharing between users
- Session pinning / starring
- Voice input