|
|
@@ -0,0 +1,837 @@
|
|
|
+# 用户反馈系统设计文档
|
|
|
+
|
|
|
+## 文档维护规范
|
|
|
+
|
|
|
+0. **先改文档,再动代码** - 新功能或重大修改需先完成文档更新、并完成审阅后,再进行代码实现
|
|
|
+1. **文档分层,链接代码** - 重要或复杂设计可以另有详细文档;关键实现需标注代码文件路径
|
|
|
+2. **简洁快照,日志分离** - 只记录最重要的、与代码准确对应的或者明确的已完成的设计的信息
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 策略总览
|
|
|
+
|
|
|
+> 本节汇总全文的核心设计决策,方便实现前快速对齐。详细说明见各章节。
|
|
|
+
|
|
|
+### 反馈动作语义(`action`)
|
|
|
+
|
|
|
+| 值 | 含义 | 后端处理 |
|
|
|
+|---|---|---|
|
|
|
+| `confirm` | 同意 Agent 评估 | 对应计数 +1,history 追加 `action="confirm"` |
|
|
|
+| `override` | 重新评估,覆盖 Agent 结果 | 按新 `eval_status` 计数 +1,history 追加 `action="override"` |
|
|
|
+| `skip` | 跳过,不确定 | 不做任何操作 |
|
|
|
+
|
|
|
+### 反馈来源语义(`source`)
|
|
|
+
|
|
|
+| 值 | 含义 |
|
|
|
+|---|---|
|
|
|
+| `agent` | 由 Agent 自动评估 |
|
|
|
+| `user` | 由人工在 Trace 前端提交 |
|
|
|
+
|
|
|
+### 知识验证状态语义(`verification.status`)
|
|
|
+
|
|
|
+| 值 | 含义 |
|
|
|
+|---|---|
|
|
|
+| `approved` | 经去重审核自动通过,等待人工验证 |
|
|
|
+| `checked` | 人工已验证通过 |
|
|
|
+
|
|
|
+### UX 原则
|
|
|
+
|
|
|
+- 默认所有知识选中「跳过」,只对有信心的知识反馈,降低参与门槛
|
|
|
+- 「同意 Agent 评估」一键确认,无需额外输入
|
|
|
+- 底部按钮实时显示已反馈数量(跳过不计入)
|
|
|
+- 支持键盘快捷键:Enter 提交,Esc 取消
|
|
|
+
|
|
|
+### 实现优先级
|
|
|
+
|
|
|
+| 优先级 | 内容 |
|
|
|
+|---|---|
|
|
|
+| **P0** | Knowledge Log 反馈弹窗(Trace 前端)、知识验证界面(知识库前端)、API 接口、数据模型扩展 |
|
|
|
+| **P1** | Goal 反馈创建知识、Message 反馈创建知识、批量验证 |
|
|
|
+| **P2** | 反馈统计可视化、知识质量趋势分析、反馈提醒通知 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 背景与目标
|
|
|
+
|
|
|
+### 现状
|
|
|
+- Agent 自动评估知识的可用性(helpful/harmful/unused/irrelevant/neutral)
|
|
|
+- 评估结果记录在 `knowledge_log.json` 中
|
|
|
+- 缺少人类验证和反馈的闭环
|
|
|
+
|
|
|
+### 目标
|
|
|
+1. **Trace 前端反馈**:用户可以对知识使用情况、Goal、执行步骤进行反馈
|
|
|
+2. **知识库前端验证**:用户可以验证自己 owner 的知识,将 `approved` 状态提升为 `checked`
|
|
|
+3. **反馈闭环**:记录反馈来源(trace/人)、支持部分反馈(只对有信心的知识评价)
|
|
|
+4. **溯源能力**:记录反馈人、来源 trace、时间戳等信息
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 前端架构说明
|
|
|
+
|
|
|
+当前 Trace 前端采用 React + TypeScript,主要组件结构:
|
|
|
+
|
|
|
+```
|
|
|
+┌─────────────────────────────────────────────────────────────────────┐
|
|
|
+│ TopBar (顶部工具栏) │
|
|
|
+│ [Trace选择器▼] trace-20260324-abc [📚知识反馈] [刷新] [其他] │
|
|
|
+├──────────────────────────────────────┬──────────────────────────────┤
|
|
|
+│ MainContent (主内容区) │ DetailPanel (详情面板) │
|
|
|
+│ ┌────────────────────────────────┐ │ ┌──────────────────────────┐ │
|
|
|
+│ │ FlowChart (流程图可视化) │ │ │ 节点详情 [×] │ │
|
|
|
+│ │ │ │ ├──────────────────────────┤ │
|
|
|
+│ │ ┌──┐ Goal节点 │ │ │ Goal ID: 2.1 │ │
|
|
|
+│ │ │G1│ │ │ │ 状态: completed │ │
|
|
|
+│ │ └┬─┘ │ │ │ 描述: 定位导出按钮 │ │
|
|
|
+│ │ │ │ │ │ │ │
|
|
|
+│ │ ┌▼──┐ Message节点 │ │ │ 💬 反馈 (新增按钮) │ │
|
|
|
+│ │ │M42│ │ │ │ │ │
|
|
|
+│ │ └───┘ │ │ │ 注入知识: 3条 │ │
|
|
|
+│ │ │ │ │ [知识列表显示...] │ │
|
|
|
+│ │ │ │ │ │ │
|
|
|
+│ │ │ │ │ 消息历史: │ │
|
|
|
+│ │ │ │ │ [消息列表...] │ │
|
|
|
+│ └────────────────────────────────┘ │ └──────────────────────────┘ │
|
|
|
+└──────────────────────────────────────┴──────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**组件说明**:
|
|
|
+- **TopBar**:顶部工具栏,包含 trace 选择器和操作按钮
|
|
|
+- **MainContent**:包含 FlowChart,显示 Goal 和 Message 节点的流程图
|
|
|
+- **DetailPanel**:右侧详情面板,点击节点后显示详细信息
|
|
|
+ - 点击 Goal 节点 → 显示 Goal 详情 + 该 Goal 下的所有 messages
|
|
|
+ - 点击 Message 节点 → 显示该 Message 的详细内容
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、Trace 前端反馈系统
|
|
|
+
|
|
|
+### 1.1 知识使用反馈(Knowledge Log)
|
|
|
+
|
|
|
+#### 界面位置 A:TopBar 添加全局反馈按钮
|
|
|
+
|
|
|
+在 TopBar 右侧按钮组添加「📚 知识反馈」按钮:
|
|
|
+
|
|
|
+```
|
|
|
+┌─────────────────────────────────────────────────────────────────────┐
|
|
|
+│ [Trace选择器 ▼] trace-20260324-abc123 │
|
|
|
+│ [📚 知识反馈] [刷新] [其他按钮] │
|
|
|
+└─────────────────────────────────────────────────────────────────────┘
|
|
|
+ ↑
|
|
|
+ 新增按钮
|
|
|
+```
|
|
|
+
|
|
|
+**实现文件**:`frontend/react-template/src/components/TopBar/TopBar.tsx`
|
|
|
+
|
|
|
+**按钮状态**:
|
|
|
+- 默认:灰色,显示「📚 知识反馈」
|
|
|
+- 有待反馈:橙色,显示「📚 知识反馈 (5)」← 数字表示待反馈数量
|
|
|
+- 已反馈:绿色,显示「✅ 已反馈」
|
|
|
+
|
|
|
+#### 弹窗设计
|
|
|
+
|
|
|
+**触发**:点击 TopBar 的「📚 知识反馈」按钮
|
|
|
+
|
|
|
+**弹窗结构**(实际效果):
|
|
|
+
|
|
|
+```
|
|
|
+┌────────────────────────────────────────────────────────────────────────┐
|
|
|
+│ 知识使用反馈 - trace-20260324-abc123 [×] │
|
|
|
+├────────────────────────────────────────────────────────────────────────┤
|
|
|
+│ 💡 提示:只需对有信心的知识做反馈,不确定的可以跳过 │
|
|
|
+│ 本次执行共注入 5 条知识,Agent 已评估 5 条,待您确认 5 条 │
|
|
|
+│ │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 📚 知识 1/5 │ │
|
|
|
+│ │ ──────────────────────────────────────────────────────────────── │ │
|
|
|
+│ │ ID: knowledge-20260320-a1b2 ⭐ 评分: 4 │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 📍 注入位置: Goal 2.1 "定位导出按钮" (sequence 42) │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 🎯 任务场景: 如何使用 selenium 处理登录验证 │ │
|
|
|
+│ │ 📖 知识内容: 使用 WebDriverWait 等待元素加载... [展开] │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 🤖 Agent 评估: ✅ helpful │ │
|
|
|
+│ │ 理由: "成功应用于登录流程,等待逻辑有效" │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ ─────────────────────────────────────────────────────────────── │ │
|
|
|
+│ │ 👤 您的反馈: │ │
|
|
|
+│ │ ○ 同意 Agent 评估 (一键确认) │ │
|
|
|
+│ │ ○ 不同意,我要重新评估 │ │
|
|
|
+│ │ ● 跳过此条 (不确定) ← 默认选中 │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 📚 知识 2/5 │ │
|
|
|
+│ │ ──────────────────────────────────────────────────────────────── │ │
|
|
|
+│ │ ID: knowledge-20260318-c3d4 ⭐ 评分: 3 │ │
|
|
|
+│ │ 📍 注入位置: Goal 2.1 (sequence 42) │ │
|
|
|
+│ │ 🎯 任务场景: 如何处理 CAPTCHA 验证码 │ │
|
|
|
+│ │ 📖 知识内容: 使用第三方打码平台... │ │
|
|
|
+│ │ 🤖 Agent 评估: ⚠️ unused - "未在执行中使用" │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 👤 您的反馈: │ │
|
|
|
+│ │ ○ 同意 ● 不同意,重新评估 ○ 跳过 ← 用户选了重新评估 │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ ┌────────────────────────────────────────────────────────────┐ │ │
|
|
|
+│ │ │ 📝 重新评估 (展开) │ │ │
|
|
|
+│ │ │ 选择评估结果: │ │ │
|
|
|
+│ │ │ ○ helpful ● harmful ○ unused │ │ │
|
|
|
+│ │ │ ○ irrelevant ○ neutral │ │ │
|
|
|
+│ │ │ │ │ │
|
|
|
+│ │ │ 反馈说明 (可选): │ │ │
|
|
|
+│ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │
|
|
|
+│ │ │ │ 这条知识误导了我,该网站实际没有验证码 │ │ │ │
|
|
|
+│ │ │ └────────────────────────────────────────────────────────┘ │ │ │
|
|
|
+│ │ └────────────────────────────────────────────────────────────┘ │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ ... (其他 3 条知识,折叠显示) │
|
|
|
+│ │
|
|
|
+├────────────────────────────────────────────────────────────────────────┤
|
|
|
+│ [取消] [提交反馈 (已反馈 2/5 条)] │
|
|
|
+└────────────────────────────────────────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**交互细节**:
|
|
|
+1. 每条知识默认折叠,点击可展开/收起
|
|
|
+2. 默认所有知识选中「跳过此条」
|
|
|
+3. 选择「同意 Agent 评估」:直接确认,无需额外输入
|
|
|
+4. 选择「不同意,重新评估」:下方展开评估表单
|
|
|
+5. 底部按钮实时显示已反馈数量(跳过不计入)
|
|
|
+6. 支持键盘快捷键:Enter 提交,Esc 取消
|
|
|
+
|
|
|
+**实现文件**:新建 `frontend/react-template/src/components/KnowledgeFeedbackModal/`
|
|
|
+
|
|
|
+#### 数据结构
|
|
|
+
|
|
|
+**API 请求**:`POST /api/trace/{trace_id}/knowledge_feedback`
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "feedback_list": [
|
|
|
+ {
|
|
|
+ "knowledge_id": "knowledge-20260320-a1b2",
|
|
|
+ "action": "confirm", // confirm | override | skip
|
|
|
+ "eval_status": "helpful", // 仅 action=override 时需要
|
|
|
+ "feedback_text": "这条知识确实有用,但参数版本有点旧", // 可选
|
|
|
+ "source": {
|
|
|
+ "trace_id": "trace-20260324-abc123",
|
|
|
+ "goal_id": "2.1",
|
|
|
+ "sequence": 42,
|
|
|
+ "feedback_by": "user@example.com",
|
|
|
+ "feedback_at": "2026-03-24T10:30:00Z"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**后端处理**:
|
|
|
+- `action=confirm`:knowledge.eval.helpful += 1,记录到 helpful_history
|
|
|
+- `action=override`:根据新的 eval_status 更新 helpful/harmful,记录到对应 history
|
|
|
+- `action=skip`:不做任何操作
|
|
|
+- 所有 history 记录包含 source 信息(trace_id, feedback_by 等)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 1.2 Goal 反馈(创建新知识)
|
|
|
+
|
|
|
+#### 界面位置 B:DetailPanel 中添加 Goal 反馈按钮
|
|
|
+
|
|
|
+当用户在 FlowChart 中点击 Goal 节点后,DetailPanel 显示该 Goal 的详情。在详情面板顶部添加「💬 反馈」按钮:
|
|
|
+
|
|
|
+```
|
|
|
+┌──────────────────────────────────────┐
|
|
|
+│ DetailPanel (右侧详情面板) │
|
|
|
+│ ┌────────────────────────────────┐ │
|
|
|
+│ │ 节点详情 [×] │ │
|
|
|
+│ ├────────────────────────────────┤ │
|
|
|
+│ │ Goal ID: 2.1 │ │
|
|
|
+│ │ 状态: completed │ │
|
|
|
+│ │ 描述: 定位导出按钮 │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ [💬 为此 Goal 创建知识] ← 新增 │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 注入知识: 3 条 │ │
|
|
|
+│ │ [知识列表...] │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 消息历史: 5 条 │ │
|
|
|
+│ │ [消息列表...] │ │
|
|
|
+│ └────────────────────────────────┘ │
|
|
|
+└──────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**实现文件**:`frontend/react-template/src/components/DetailPanel/DetailPanel.tsx`
|
|
|
+
|
|
|
+**按钮位置**:在 Goal 描述下方、知识列表上方
|
|
|
+
|
|
|
+#### 弹窗设计
|
|
|
+
|
|
|
+**触发**:点击 Goal 右侧的 💬 按钮
|
|
|
+
|
|
|
+**弹窗结构**:
|
|
|
+
|
|
|
+```
|
|
|
+┌──────────────────────────────────────────────────────────────────┐
|
|
|
+│ 为 Goal 创建知识反馈 [×] │
|
|
|
+├──────────────────────────────────────────────────────────────────┤
|
|
|
+│ │
|
|
|
+│ Goal 2.1 "定位导出按钮" 状态: completed │
|
|
|
+│ 执行摘要: 使用 XPath 定位到导出按钮并点击 (来自 goal.summary) │
|
|
|
+│ │
|
|
|
+│ ───────────────────────────────────────────────────────────── │
|
|
|
+│ 📝 创建知识 │
|
|
|
+│ │
|
|
|
+│ 知识类型 (至少选一个): │
|
|
|
+│ ☑ strategy ☐ tool ☐ usecase ☐ definition ☐ plan │
|
|
|
+│ │
|
|
|
+│ 任务场景 (Task): │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 在阿里巴巴后台定位导出按钮 ← 预填 goal.description │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ 知识内容 (Content): │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ (请填写有价值的经验) │ │
|
|
|
+│ │ │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ 初始评分: ○ 1 ○ 2 ● 3 ○ 4 ○ 5 │
|
|
|
+│ │
|
|
|
+│ 标签 (可选,如 platform:alibaba action:export): │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+├──────────────────────────────────────────────────────────────────┤
|
|
|
+│ [取消] [创建知识] │
|
|
|
+└──────────────────────────────────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**数据结构**:
|
|
|
+
|
|
|
+**API 请求**:`POST /api/knowledge`(复用现有接口,增加 source 信息)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "task": "在阿里巴巴后台定位导出按钮",
|
|
|
+ "content": "导出按钮的 XPath 为 //button[@data-action='export']...",
|
|
|
+ "types": ["strategy"],
|
|
|
+ "tags": {"platform": "alibaba", "action": "export"},
|
|
|
+ "score": 3,
|
|
|
+ "source": {
|
|
|
+ "name": "user_feedback",
|
|
|
+ "category": "exp",
|
|
|
+ "trace_id": "trace-20260324-abc123",
|
|
|
+ "goal_id": "2.1",
|
|
|
+ "submitted_by": "user@example.com",
|
|
|
+ "timestamp": "2026-03-24T10:30:00Z"
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**后端处理**:
|
|
|
+- 知识状态设为 `pending`,进入去重队列
|
|
|
+- source 中记录完整的溯源信息
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 1.3 执行步骤反馈(Message 级别)
|
|
|
+
|
|
|
+#### 界面位置 C:DetailPanel 中的 Message 列表添加反馈按钮
|
|
|
+
|
|
|
+当用户点击 Goal 节点后,DetailPanel 显示该 Goal 下的所有 messages。在每条 message 右上角添加「💬」按钮:
|
|
|
+
|
|
|
+```
|
|
|
+┌──────────────────────────────────────┐
|
|
|
+│ DetailPanel │
|
|
|
+│ ┌────────────────────────────────┐ │
|
|
|
+│ │ 节点详情 - Goal 2.1 [×] │ │
|
|
|
+│ ├────────────────────────────────┤ │
|
|
|
+│ │ ... Goal 信息 ... │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ 消息历史: 5 条 │ │
|
|
|
+│ │ ┌──────────────────────────┐ │ │
|
|
|
+│ │ │ [user] #41 💬 │ │ │
|
|
|
+│ │ │ 请定位导出按钮 │ │ │
|
|
|
+│ │ └──────────────────────────┘ │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ ┌──────────────────────────┐ │ │
|
|
|
+│ │ │ [assistant] #42 💬 │ │ │
|
|
|
+│ │ │ 我将使用 XPath 定位... │ │ │
|
|
|
+│ │ │ Tool: browser_find(...) │ │ │
|
|
|
+│ │ └──────────────────────────┘ │ │
|
|
|
+│ │ │ │
|
|
|
+│ │ ┌──────────────────────────┐ │ │
|
|
|
+│ │ │ [tool] #43 💬 │ │ │
|
|
|
+│ │ │ 找到元素: button[@data...│ │ │
|
|
|
+│ │ └──────────────────────────┘ │ │
|
|
|
+│ └────────────────────────────────┘ │
|
|
|
+└──────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**实现文件**:`frontend/react-template/src/components/DetailPanel/DetailPanel.tsx`
|
|
|
+
|
|
|
+**按钮位置**:每条 message 卡片右上角
|
|
|
+
|
|
|
+#### 弹窗设计
|
|
|
+
|
|
|
+**触发**:点击消息右上角的 💬 按钮
|
|
|
+
|
|
|
+**弹窗结构**:
|
|
|
+
|
|
|
+```
|
|
|
+┌──────────────────────────────────────────────────────────────────┐
|
|
|
+│ 为执行步骤创建知识反馈 - #42 (Goal 2.1) [×] │
|
|
|
+├──────────────────────────────────────────────────────────────────┤
|
|
|
+│ │
|
|
|
+│ [assistant] #42 │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 我将使用 XPath 定位导出按钮... │ │
|
|
|
+│ │ Tool: browser_find(xpath="//button[@data-action='export']") │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ ───────────────────────────────────────────────────────────── │
|
|
|
+│ 反馈类型: │
|
|
|
+│ ● 创建新知识(记录有价值的经验) │
|
|
|
+│ ○ 报告问题(此步骤有误或可改进,不创建知识) │
|
|
|
+│ │
|
|
|
+│ ── 创建新知识 ──────────────────────────────────────────────── │
|
|
|
+│ 知识类型: ☑ tool ☐ strategy ☐ usecase ☐ definition │
|
|
|
+│ │
|
|
|
+│ 任务场景 (Task): │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 在后台页面定位导出按钮 │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ 知识内容 (Content): │
|
|
|
+│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 导出按钮 XPath: //button[@data-action='export'] │ │
|
|
|
+│ │ 需在页面 DOMContentLoaded 后再查找 │ │
|
|
|
+│ └──────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ 初始评分: ○ 1 ○ 2 ● 3 ○ 4 ○ 5 │
|
|
|
+│ │
|
|
|
+├──────────────────────────────────────────────────────────────────┤
|
|
|
+│ [取消] [创建知识] │
|
|
|
+└──────────────────────────────────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+**数据结构**:
|
|
|
+- 创建新知识:同 Goal 反馈,source 中额外记录 `message_id`、`sequence`、`role`
|
|
|
+- 报告问题:仅记录到 trace metadata 的 feedback 列表中,不创建知识
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、知识库前端验证系统
|
|
|
+
|
|
|
+### 2.1 知识验证界面
|
|
|
+
|
|
|
+> 注:知识库前端为独立系统(KnowHub 管理页面),与 Trace 前端分开部署
|
|
|
+
|
|
|
+#### 整体布局
|
|
|
+
|
|
|
+```
|
|
|
+┌──────────────────────────────────────────────────────────────────────┐
|
|
|
+│ KnowHub 知识库管理 │
|
|
|
+├──────────────────────────────────────────────────────────────────────┤
|
|
|
+│ [全部] [待验证 (12)] [已验证] 筛选: [Owner: 我的知识▼] [类型▼] │
|
|
|
+├──────────────────────────────────────────────────────────────────────┤
|
|
|
+│ │
|
|
|
+│ ☐ knowledge-20260320-a1b2 ⭐ 3/5 💬 3 │
|
|
|
+│ ────────────────────────────────────────────────────────────────── │
|
|
|
+│ Task: 如何使用 selenium 处理登录验证 │
|
|
|
+│ Content: 使用 WebDriverWait 等待元素加载完成...(截断显示) │
|
|
|
+│ │
|
|
|
+│ Owner: user@example.com │ 来源: trace-20260320 > Goal 2.1 │
|
|
|
+│ 创建: 2026-03-20 10:00 │ 使用: helpful 3 / harmful 0 │
|
|
|
+│ │
|
|
|
+│ [查看详情] [✓ 验证通过] [✗ 标记问题] │
|
|
|
+│ │
|
|
|
+│ ────────────────────────────────────────────────────────────────── │
|
|
|
+│ │
|
|
|
+│ ☐ knowledge-20260318-c3d4 ⭐ 4/5 💬 1 │
|
|
|
+│ ────────────────────────────────────────────────────────────────── │
|
|
|
+│ Task: 如何处理 CAPTCHA 验证码 │
|
|
|
+│ Content: 使用第三方打码平台 API...(截断显示) │
|
|
|
+│ │
|
|
|
+│ Owner: user@example.com │ 来源: trace-20260318 > Goal 1.2 │
|
|
|
+│ 创建: 2026-03-18 14:30 │ 使用: helpful 1 / harmful 0 │
|
|
|
+│ │
|
|
|
+│ [查看详情] [✓ 验证通过] [✗ 标记问题] │
|
|
|
+│ │
|
|
|
+│ ... (更多知识) │
|
|
|
+│ │
|
|
|
+├──────────────────────────────────────────────────────────────────────┤
|
|
|
+│ ☐ 全选 (0/12) [批量验证通过 (0)] │
|
|
|
+└──────────────────────────────────────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+#### 「查看详情」展开
|
|
|
+
|
|
|
+点击「查看详情」,知识条目展开显示完整信息:
|
|
|
+
|
|
|
+```
|
|
|
+│ ☑ knowledge-20260320-a1b2 ⭐ 3/5 💬 3 │
|
|
|
+│ ────────────────────────────────────────────────────────────────── │
|
|
|
+│ Task: 如何使用 selenium 处理登录验证 │
|
|
|
+│ Content: │
|
|
|
+│ ┌────────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ 使用 WebDriverWait 等待元素加载完成: │ │
|
|
|
+│ │ element = WebDriverWait(driver, 10).until( │ │
|
|
|
+│ │ EC.presence_of_element_located((By.XPATH, "//input[@id='.."])) │ │
|
|
|
+│ │ 避免直接 find_element 导致 NoSuchElement 异常 │ │
|
|
|
+│ └────────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ 类型: strategy | tool │
|
|
|
+│ 标签: platform=selenium, action=login │
|
|
|
+│ │
|
|
|
+│ 使用历史: │
|
|
|
+│ ┌────────────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ ✅ helpful │ trace-20260322-xxx > Goal 2.1 │ agent@research │ │
|
|
|
+│ │ ✅ helpful │ trace-20260323-yyy > Goal 1.3 │ agent@research │ │
|
|
|
+│ │ 🚨 harmful │ trace-20260324-zzz > Goal 3.2 │ user@example.com │ │
|
|
|
+│ │ │ 理由: "该网站实际无需等待..." │ │
|
|
|
+│ └────────────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+│ [✓ 验证通过] [✗ 标记问题] │
|
|
|
+```
|
|
|
+
|
|
|
+#### 「标记问题」弹窗
|
|
|
+
|
|
|
+```
|
|
|
+┌────────────────────────────────────────────────────────────┐
|
|
|
+│ 标记知识问题 - knowledge-20260320-a1b2 [×] │
|
|
|
+├────────────────────────────────────────────────────────────┤
|
|
|
+│ │
|
|
|
+│ Task: 如何使用 selenium 处理登录验证 │
|
|
|
+│ │
|
|
|
+│ 请选择问题类型: │
|
|
|
+│ ● 内容有误(知识本身不准确) │
|
|
|
+│ ○ 过时(内容曾经正确,现在已不适用) │
|
|
|
+│ ○ 描述模糊(task 或 content 表述不清) │
|
|
|
+│ ○ 重复(与其他知识高度重叠) │
|
|
|
+│ │
|
|
|
+│ 处理方式: │
|
|
|
+│ ● 降低评分(-1 分,保留此知识) │
|
|
|
+│ ○ 标记为需要修改 │
|
|
|
+│ ○ 删除此知识 │
|
|
|
+│ │
|
|
|
+│ 备注: │
|
|
|
+│ ┌────────────────────────────────────────────────────────┐ │
|
|
|
+│ │ WebDriverWait 超时参数应该是可配置的,不应写死 10... │ │
|
|
|
+│ └────────────────────────────────────────────────────────┘ │
|
|
|
+│ │
|
|
|
+├────────────────────────────────────────────────────────────┤
|
|
|
+│ [取消] [确认提交] │
|
|
|
+└────────────────────────────────────────────────────────────┘
|
|
|
+```
|
|
|
+
|
|
|
+#### 验证操作
|
|
|
+- **单个验证通过**:`status: approved → checked`,记录验证人和时间
|
|
|
+- **标记问题**:根据处理方式降分/删除,记录原因
|
|
|
+- **批量验证通过**:勾选多个知识,一键验证
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、数据模型扩展
|
|
|
+
|
|
|
+### 3.1 Knowledge Schema 扩展
|
|
|
+
|
|
|
+在 `helpful_history` / `harmful_history` 中每条记录增加溯源字段:
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "eval": {
|
|
|
+ "score": 3,
|
|
|
+ "helpful": 3,
|
|
|
+ "harmful": 0,
|
|
|
+ "confidence": 0.8,
|
|
|
+ "helpful_history": [
|
|
|
+ {
|
|
|
+ "source": "agent",
|
|
|
+ "trace_id": "trace-20260320-xxx",
|
|
|
+ "goal_id": "2.1",
|
|
|
+ "sequence": 42,
|
|
|
+ "feedback_by": "agent:research_agent",
|
|
|
+ "feedback_at": "2026-03-20T10:05:00Z",
|
|
|
+ "eval_status": "helpful",
|
|
|
+ "feedback_text": "成功应用于登录流程",
|
|
|
+ "action": "auto"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source": "user",
|
|
|
+ "trace_id": "trace-20260322-yyy",
|
|
|
+ "goal_id": "3.1",
|
|
|
+ "sequence": 88,
|
|
|
+ "feedback_by": "user@example.com",
|
|
|
+ "feedback_at": "2026-03-22T15:30:00Z",
|
|
|
+ "eval_status": "helpful",
|
|
|
+ "feedback_text": "该知识有效,但超时参数建议可配置",
|
|
|
+ "action": "confirm"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "harmful_history": []
|
|
|
+ },
|
|
|
+
|
|
|
+ "verification": {
|
|
|
+ "status": "checked",
|
|
|
+ "verified_by": "user@example.com",
|
|
|
+ "verified_at": "2026-03-24T10:30:00Z",
|
|
|
+ "note": "已确认此知识准确有效",
|
|
|
+ "issue_type": null,
|
|
|
+ "issue_action": null
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**`source` 字段说明**:
|
|
|
+| 值 | 含义 |
|
|
|
+|---|---|
|
|
|
+| `"agent"` | 由 Agent 自动评估 |
|
|
|
+| `"user"` | 由人工在 Trace 前端提交 |
|
|
|
+
|
|
|
+**`action` 字段说明**:
|
|
|
+| 值 | 含义 |
|
|
|
+|---|---|
|
|
|
+| `"auto"` | Agent 自动评估(未经人工确认) |
|
|
|
+| `"confirm"` | 用户同意 Agent 评估 |
|
|
|
+| `"override"` | 用户重新评估(覆盖 Agent 结果) |
|
|
|
+
|
|
|
+**`verification.status` 字段说明**:
|
|
|
+| 值 | 含义 |
|
|
|
+|---|---|
|
|
|
+| `"approved"` | 经过去重审核,知识自动通过,等待人工验证 |
|
|
|
+| `"checked"` | 人工已验证通过 |
|
|
|
+
|
|
|
+### 3.2 Trace Metadata 扩展
|
|
|
+
|
|
|
+在 `.trace/{trace_id}/metadata.json` 中添加:
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "trace_id": "trace-20260324-abc123",
|
|
|
+ "task": "登录阿里巴巴后台并导出销售报表",
|
|
|
+
|
|
|
+ "user_feedback": {
|
|
|
+ "knowledge_feedback_submitted": true,
|
|
|
+ "knowledge_feedback_at": "2026-03-24T10:30:00Z",
|
|
|
+ "knowledge_feedback_by": "user@example.com",
|
|
|
+ "knowledge_feedback_count": 3,
|
|
|
+
|
|
|
+ "goal_feedback": [
|
|
|
+ {
|
|
|
+ "goal_id": "2.1",
|
|
|
+ "knowledge_id": "knowledge-20260324-new1",
|
|
|
+ "feedback_at": "2026-03-24T10:35:00Z"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+
|
|
|
+ "message_feedback": [
|
|
|
+ {
|
|
|
+ "sequence": 42,
|
|
|
+ "type": "knowledge",
|
|
|
+ "knowledge_id": "knowledge-20260324-new2",
|
|
|
+ "feedback_at": "2026-03-24T10:40:00Z"
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、重新评估机制
|
|
|
+
|
|
|
+### 4.1 核心前提:消息永远不会丢失
|
|
|
+
|
|
|
+压缩(Compression)**只修改内存 history**,不修改存储。
|
|
|
+原始消息永远保留在 `.trace/{trace_id}/messages/{message_id}.json`。
|
|
|
+
|
|
|
+> 来源:`agent/trace/compaction.py` 顶部注释
|
|
|
+> "压缩不修改存储:原始消息永远保留在 messages/,纯内存操作。"
|
|
|
+
|
|
|
+因此,用户在 trace 执行结束后的任意时刻触发重新评估,都可以从文件系统重建出执行时的上下文。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 4.2 重新评估说明
|
|
|
+
|
|
|
+用户在弹窗中选择 `action=override` 时,将用户的 `eval_status` 写入 `helpful_history` / `harmful_history`,`source="user"`。这是纯数据记录操作,不调用 LLM。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 4.3 完整后端处理流程
|
|
|
+
|
|
|
+```
|
|
|
+用户提交「不同意,重新评估」(action=override)
|
|
|
+ ↓
|
|
|
+1. 记录覆盖评估(立即写入)
|
|
|
+ → 在 knowledge.eval.helpful_history / harmful_history 追加一条记录
|
|
|
+ → source="user", action="override", feedback_by=user_email
|
|
|
+ → 根据 eval_status 决定 helpful 或 harmful +1
|
|
|
+
|
|
|
+2. 更新 trace 的 knowledge_log.json
|
|
|
+ → 将对应 entry 的 eval_result 更新为用户的 eval_status
|
|
|
+ → 额外字段: user_override=true, user_feedback_text=...
|
|
|
+
|
|
|
+3. 返回前端
|
|
|
+ → {status: "ok", updated: N}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、API 接口设计
|
|
|
+
|
|
|
+### 5.1 Trace 相关接口
|
|
|
+
|
|
|
+#### 获取知识使用日志
|
|
|
+```
|
|
|
+GET /api/trace/{trace_id}/knowledge_log
|
|
|
+Response: knowledge_log.json 内容
|
|
|
+```
|
|
|
+
|
|
|
+#### 提交知识反馈(含重新评估)
|
|
|
+```
|
|
|
+POST /api/trace/{trace_id}/knowledge_feedback
|
|
|
+Body: {
|
|
|
+ feedback_list: [
|
|
|
+ {
|
|
|
+ knowledge_id: "...",
|
|
|
+ action: "confirm | override | skip",
|
|
|
+ eval_status: "helpful | harmful | unused | irrelevant | neutral",
|
|
|
+ feedback_text: "(可选说明)",
|
|
|
+ source: {feedback_by, feedback_at}
|
|
|
+ }
|
|
|
+ ]
|
|
|
+}
|
|
|
+Response: {
|
|
|
+ status: "ok",
|
|
|
+ updated: 3
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**后端逻辑**:
|
|
|
+- `action=confirm`:helpful +1,history 追加 action="confirm"
|
|
|
+- `action=override`:按 eval_status 对应计数 +1,history 追加 action="override"
|
|
|
+- `action=skip`:不做任何操作
|
|
|
+
|
|
|
+#### 创建基于 Goal 的知识
|
|
|
+```
|
|
|
+POST /api/knowledge
|
|
|
+Body: {task, content, types, source: {trace_id, goal_id, ...}}
|
|
|
+Response: {knowledge_id, status: "pending"}
|
|
|
+```
|
|
|
+
|
|
|
+#### 创建基于 Message 的知识
|
|
|
+```
|
|
|
+POST /api/knowledge
|
|
|
+Body: {task, content, types, source: {trace_id, message_id, sequence, ...}}
|
|
|
+Response: {knowledge_id, status: "pending"}
|
|
|
+```
|
|
|
+
|
|
|
+### 5.2 知识库相关接口
|
|
|
+
|
|
|
+#### 获取待验证知识列表
|
|
|
+```
|
|
|
+GET /api/knowledge?status=approved&owner={user_email}
|
|
|
+Response: {results: [...], count: 12}
|
|
|
+```
|
|
|
+
|
|
|
+#### 验证知识
|
|
|
+```
|
|
|
+POST /api/knowledge/{knowledge_id}/verify
|
|
|
+Body: {action: "approve", verified_by, note}
|
|
|
+Response: {status: "ok", new_status: "checked"}
|
|
|
+```
|
|
|
+
|
|
|
+#### 批量验证
|
|
|
+```
|
|
|
+POST /api/knowledge/batch_verify
|
|
|
+Body: {knowledge_ids: [...], action: "approve", verified_by}
|
|
|
+Response: {status: "ok", updated: 5}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、实现优先级
|
|
|
+
|
|
|
+### P0(核心功能)
|
|
|
+1. Knowledge Log 反馈弹窗(Trace 前端)
|
|
|
+2. 知识验证界面(知识库前端)
|
|
|
+3. API 接口实现
|
|
|
+4. 数据模型扩展
|
|
|
+
|
|
|
+### P1(增强功能)
|
|
|
+1. Goal 反馈创建知识
|
|
|
+2. Message 反馈创建知识
|
|
|
+3. 批量验证功能
|
|
|
+
|
|
|
+### P2(优化功能)
|
|
|
+1. 反馈统计和可视化
|
|
|
+2. 知识质量趋势分析
|
|
|
+3. 反馈提醒和通知
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、技术实现要点
|
|
|
+
|
|
|
+### 6.1 前端技术栈
|
|
|
+- React + TypeScript
|
|
|
+- UI 组件库:Ant Design 或 Tailwind CSS
|
|
|
+- 状态管理:React Query(API 调用)+ Zustand(本地状态)
|
|
|
+
|
|
|
+### 6.2 关键交互
|
|
|
+1. **弹窗管理**:使用 Modal 组件,支持嵌套和多层级
|
|
|
+2. **表单验证**:必填字段检查、字符长度限制
|
|
|
+3. **批量操作**:复选框选择 + 批量提交
|
|
|
+4. **实时更新**:提交后自动刷新列表,显示最新状态
|
|
|
+
|
|
|
+### 6.3 性能优化
|
|
|
+1. 知识列表分页加载(已有)
|
|
|
+2. 反馈提交防抖(避免重复提交)
|
|
|
+3. 大量知识时虚拟滚动
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、用户体验设计
|
|
|
+
|
|
|
+### 7.1 反馈流程简化
|
|
|
+- 默认「跳过」,只对有信心的知识反馈
|
|
|
+- 「同意 Agent 评估」一键确认,无需额外输入
|
|
|
+- 批量操作减少重复点击
|
|
|
+
|
|
|
+### 7.2 信息透明
|
|
|
+- 显示知识来源(trace、goal、提交人)
|
|
|
+- 显示使用历史(helpful/harmful 计数和详情)
|
|
|
+- 显示验证状态和验证人
|
|
|
+
|
|
|
+### 7.3 错误处理
|
|
|
+- 网络错误时显示友好提示
|
|
|
+- 部分提交失败时显示详细错误信息
|
|
|
+- 支持重试机制
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、测试计划
|
|
|
+
|
|
|
+### 8.1 单元测试
|
|
|
+- API 接口测试(反馈提交、验证操作)
|
|
|
+- 数据模型测试(history 记录、status 更新)
|
|
|
+
|
|
|
+### 8.2 集成测试
|
|
|
+- Trace 前端 → API → 知识库更新
|
|
|
+- 知识库前端 → API → status 更新
|
|
|
+
|
|
|
+### 8.3 用户测试
|
|
|
+- 反馈流程是否流畅
|
|
|
+- 界面是否清晰易懂
|
|
|
+- 批量操作是否高效
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 九、后续优化方向
|
|
|
+
|
|
|
+1. **智能推荐**:根据用户反馈历史,推荐可能需要验证的知识
|
|
|
+2. **协作验证**:多人协作验证同一知识,达成共识后更新状态
|
|
|
+3. **反馈分析**:分析用户反馈模式,优化 Agent 评估算法
|