فهرست منبع

docs(webui): add 4.12 知识体管理需求

- 知识体列表页:创建/删除,显示根目录、文档数、索引状态
- 文件管理标签:目录浏览器、批量加入、PDF 文本提取
- 索引构建标签:BM25 / 向量 / 图谱三种索引,SSE 进度推送
- Wiki 目录标签:LLM 编译 sources/entities/topics,断点续传
- 搜索测试标签:BM25/向量/混合模式在线验证
- 后端 API 设计:9 个新端点 + Job SSE 流
- 整合 qaagent67/scripts/ 中 10 个脚本的对应关系
- 修复所有脚本硬编码路径,统一由 kb_dir 驱动
- Phase 4 交付计划更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
kenny67nju 3 ماه پیش
والد
کامیت
acbb8a8f5f
1فایلهای تغییر یافته به همراه196 افزوده شده و 0 حذف شده
  1. 196 0
      webui/WEB_UI_REQUIREMENTS.md

+ 196 - 0
webui/WEB_UI_REQUIREMENTS.md

@@ -390,6 +390,195 @@ LambdAgent PaaS 目前的使用方式以命令行(CLI)和 YAML 文件为主
 
 ---
 
+### 4.12 知识体管理
+
+**路由:** `/knowledge`、`/knowledge/:kbId`  
+**对应后端:** `GET/POST/PUT/DELETE /api/v1/knowledge`(新增)  
+**关联脚本:** `agentexample/qaagent67/scripts/`(extract_pdfs.py、build_index.py、wiki_compile.py、search_unified.py 等)
+
+#### 背景
+
+现有 QA 智能体(qaagent67、qaagent67wiki、qaagent67lite)已有完整的离线处理流水线:
+- `extract_pdfs.py` — 批量提取 PDF 为纯文本
+- `build_index.py` / `build_vector_index.py` — 构建 BM25 / 向量检索索引
+- `wiki_compile.py` — LLM 逐文档理解 → 生成 sources/、entities/、topics/ 三级 Wiki 页面
+- `search_unified.py` / `search_engine.py` — 跨索引统一搜索
+
+这些脚本的路径(`/home/67/knowledge/maritime/`)目前**硬编码**,缺乏管理界面。本需求将其封装为可通过 Web UI 配置和触发的「知识体」。
+
+---
+
+#### 4.12.1 知识体列表页(`/knowledge`)
+
+**布局:** 卡片网格,每张卡片代表一个知识体。
+
+每张卡片显示:
+| 字段 | 说明 |
+|------|------|
+| 名称 | 用户自定义,如"航运规范"、"法律合同" |
+| 根目录 | 本地文件夹路径(如 `/data/maritime`) |
+| 文档数量 | 已加入的文件数 |
+| 索引状态 | 未索引 / BM25 已就绪 / 向量已就绪 / Wiki 已生成 |
+| 最近更新 | 上次构建时间 |
+
+操作:
+- **新建知识体**(右上角按钮)→ 弹窗填写名称 + 根目录路径
+- **进入详情**(点击卡片)
+- **删除**(卡片菜单)
+
+---
+
+#### 4.12.2 知识体详情页(`/knowledge/:kbId`)
+
+详情页分为四个子标签:**文件管理 / 索引构建 / Wiki 目录 / 搜索测试**
+
+---
+
+##### 标签 1 — 文件管理
+
+**目录浏览器:**
+- 以树形/列表展示根目录下的所有文件(递归)
+- 支持的格式:PDF、TXT、DOCX、MD、HTML、CSV
+- 每个文件显示:文件名、大小、修改时间、**加入状态**(已加入 ✅ / 未加入)
+- 全选 / 按格式批量选择(如"全选 PDF")
+
+**文件操作:**
+- **加入知识体** — 将选中文件登记到知识体(写入后端 DB,暂不解析)
+- **移除** — 从知识体中取消登记(不删除原始文件)
+- **一键加入全部** — 将根目录下所有支持格式的文件批量加入
+
+**文件解析流程(加入时触发):**
+1. PDF 文件 → 调用 `extract_pdfs.py` 逻辑提取纯文本,存入 `processed/` 子目录
+2. TXT/MD/DOCX/HTML → 直接读取文本,存入 `processed/`
+3. 解析进度以进度条实时展示(SSE 流)
+
+---
+
+##### 标签 2 — 索引构建
+
+展示三种索引的构建状态与操作:
+
+| 索引类型 | 说明 | 对应脚本 |
+|---------|------|---------|
+| **BM25 关键词索引** | 轻量、无需 GPU,适合精确关键词检索 | `build_index.py` |
+| **向量语义索引** | 需要嵌入模型,支持语义搜索 | `build_vector_index.py` |
+| **图谱索引** | 实体-关系图,支持关联推理 | `graph_engine.py` |
+
+每种索引的操作面板:
+- **状态指示器**:未构建 / 构建中(带进度)/ 已就绪(文档数、构建时间)
+- **构建** 按钮 — 触发后台 Job,SSE 实时推送进度日志
+- **重建** 按钮(已就绪时显示)— 全量重新构建
+- **增量更新** — 只处理新加入的文件
+
+构建日志:
+- 展示最近一次构建的实时/历史日志(`INFO: 处理 128/1326 ...`)
+- 错误文件高亮显示(带原始报错)
+
+---
+
+##### 标签 3 — Wiki 目录
+
+**Wiki 是什么:** 由 LLM 逐文档阅读后自动生成的结构化知识页面,分三层:
+- `sources/` — 每个原始文档的摘要页(1文档 = 1 页)
+- `entities/` — 抽取出的实体(人名、公司、术语、地名等)
+- `topics/` — 主题聚合页(将多篇文档的相关内容汇总)
+
+**Wiki 构建面板:**
+
+配置项:
+| 配置 | 说明 |
+|------|------|
+| LLM 提供商 | 选择用于 Wiki 编译的模型(建议 32B+ 或 Claude) |
+| 编译模式 | 增量(仅处理未编译文档)/ 全量重建 |
+| 并发数 | 同时处理的文档数(1–8) |
+| 断点续传 | 默认开启,中断后从上次进度继续 |
+
+操作:
+- **开始编译** — 触发后台 Job,对应 `wiki_compile.py` 逻辑
+- **暂停 / 恢复** — 利用 `wiki_compile.py` 的 `.compile_progress.json` 断点机制
+- 进度条:`已完成 / 总文档数`,预计剩余时间
+
+**Wiki 内容浏览器:**
+- 左侧树:`index.md` / `sources/` / `entities/` / `topics/`
+- 右侧:Markdown 渲染预览
+- 搜索框:在 wiki 页面标题/内容中检索
+- 每个页面显示"来源文档"反向链接
+
+---
+
+##### 标签 4 — 搜索测试
+
+提供交互式搜索界面,用于验证知识体质量:
+
+**搜索配置:**
+- 检索模式单选:BM25 / 向量 / 混合(BM25 + 向量 Rerank)/ Wiki 全文
+- Top-K 结果数(1–20)
+- 相关性阈值滑块
+
+**搜索结果展示:**
+每条结果显示:
+- 文档来源(文件名 + 页码/段落)
+- 相关度分数
+- 匹配片段高亮
+- 展开查看原文按钮
+
+**与智能体联动:**
+- "在智能体中测试"按钮 — 将当前知识体绑定到选定的 QA 智能体,跳转至对话界面
+
+---
+
+#### 4.12.3 智能体 ↔ 知识体绑定
+
+在智能体编辑页(4.3.3)的"工具与知识库"标签页中:
+- 新增"知识体"下拉选择框,列出所有已建索引的知识体
+- 选中后自动填充 `mcp.localTools` 中的 `KBSearch`、`KBCreate`、`KBAdd` 工具
+- 并将知识体路径写入智能体配置(`kb_dir` 字段)
+
+---
+
+#### 4.12.4 后端 API(新增)
+
+| 方法 | 路径 | 说明 |
+|------|------|------|
+| `GET` | `/api/v1/knowledge` | 列出所有知识体 |
+| `POST` | `/api/v1/knowledge` | 创建知识体(name, root_dir) |
+| `DELETE` | `/api/v1/knowledge/:kbId` | 删除知识体 |
+| `GET` | `/api/v1/knowledge/:kbId/files` | 列出根目录文件树 |
+| `POST` | `/api/v1/knowledge/:kbId/files` | 加入文件(触发文本提取) |
+| `POST` | `/api/v1/knowledge/:kbId/index` | 触发索引构建 Job(type: bm25/vector/graph) |
+| `POST` | `/api/v1/knowledge/:kbId/wiki` | 触发 Wiki 编译 Job |
+| `GET` | `/api/v1/knowledge/:kbId/wiki/tree` | 获取 Wiki 文件树 |
+| `GET` | `/api/v1/knowledge/:kbId/wiki/:path` | 获取单个 Wiki 页面内容 |
+| `POST` | `/api/v1/knowledge/:kbId/search` | 在线搜索测试 |
+| `GET` | `/api/v1/knowledge/:kbId/jobs` | 查询 Job 状态(索引/Wiki 构建进度) |
+
+Job 进度通过 SSE(`/api/v1/jobs/{job_id}/stream`)实时推送。
+
+---
+
+#### 4.12.5 QA 智能体脚本整合说明
+
+`agentexample/qaagent67/scripts/` 中各脚本的对应关系:
+
+| 脚本 | 对应 UI 功能 | 整合方式 |
+|------|------------|---------|
+| `extract_pdfs.py` | 文件管理 → 加入知识体 | 封装为 `kb_service.extract_file(path)` |
+| `extract_pdfs_v2.py` | 同上(改进版,优先使用) | 同上 |
+| `build_index.py` | 索引构建 → BM25 | 封装为 `kb_service.build_bm25(kb_id)` |
+| `build_vector_index.py` | 索引构建 → 向量 | 封装为 `kb_service.build_vector(kb_id)` |
+| `graph_engine.py` | 索引构建 → 图谱 | 封装为 `kb_service.build_graph(kb_id)` |
+| `wiki_compile.py` | Wiki 目录 → 编译 | 封装为 `kb_service.compile_wiki(kb_id, cfg)` |
+| `search_unified.py` | 搜索测试 | 封装为 `kb_service.search(kb_id, query, mode)` |
+| `search_engine.py` | 同上(BM25 backend) | 被 `search_unified` 调用 |
+| `search_engine_v2.py` | 同上(改进版) | 被 `search_unified` 调用 |
+| `generate_questions.py` | (未来)自动生成测试问题集 | Phase 4 |
+| `analyze_results.py` | (未来)评估检索质量报告 | Phase 4 |
+| `rebuild_index.py` | 索引构建 → 重建 | 封装为 `kb_service.rebuild(kb_id)` |
+
+**硬编码路径修复:** 所有脚本中的硬编码路径(`/home/67/knowledge/maritime/`、`/data/knowledge/`)统一替换为从知识体配置动态读取的 `root_dir`,通过 `--kb-dir` CLI 参数或环境变量传入。
+
+---
+
 ## 五、非功能需求
 
 ### 5.1 本地化部署
@@ -469,6 +658,13 @@ lambdagentpaas/
 11. 版本历史 + 回滚
 12. 暗色模式 + 多语言
 
+### Phase 4 — 知识体管理
+13. 知识体列表 + 创建(设置根目录、文件加入)
+14. BM25 / 向量索引构建(整合 qaagent67 脚本)
+15. Wiki 目录编译(整合 wiki_compile.py)
+16. 搜索测试界面 + 智能体绑定
+17. QA 脚本硬编码路径修复,统一由 kb_dir 配置驱动
+
 ---
 
 ## 八、开放问题(待决策)