PMFlow/mdproject/qa-history-chat-plan.md

6.8 KiB
Raw Permalink Blame History

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 desc
  • GET /api/qa-sessions/{id} — full session detail with all messages
  • DELETE /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 JSONL button → 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