Files
GraphRAGAgent/docs/product_requirements_document-v1.0.md
plf b02d3378fc GraphRAG Studio — initial commit: multimodal RAG system with KG visualization
Full-stack application for document-to-knowledge-graph pipeline:
- Backend: FastAPI + LangGraph ReAct agent + DeepSeek + MinerU parsing
- Frontend: React 19 + Vite + D3.js + shadcn/ui
- Pipeline: MinerU parsing → LangExtract entity extraction → KG building

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 17:30:04 +08:00

1443 lines
55 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.

# GraphRAG Studio — 产品需求文档PRDv1.0
> 文档类型Product Requirements Document
> 产品名称GraphRAG Studio
> 版本v1.0
> 日期2026-03-05
> 作者:产品设计团队
> 状态草稿Draft
---
## 目录
- [一、产品概述](#一产品概述)
- [1.1 产品背景](#11-产品背景)
- [1.2 核心目标](#12-核心目标)
- [1.3 业务痛点](#13-业务痛点)
- [1.4 核心场景](#14-核心场景)
- [1.5 用户群体](#15-用户群体)
- [1.6 产品边界](#16-产品边界)
- [二、产品流程](#二产品流程)
- [2.1 整体用户旅程](#21-整体用户旅程)
- [2.2 核心流程一:文件上传与知识图谱构建](#22-核心流程一文件上传与知识图谱构建)
- [2.3 核心流程二:知识图谱探索](#23-核心流程二知识图谱探索)
- [2.4 核心流程三Agentic 知识问答](#24-核心流程三agentic-知识问答)
- [2.5 核心流程四:多模式实体搜索](#25-核心流程四多模式实体搜索)
- [2.6 错误与异常处理流程](#26-错误与异常处理流程)
- [三、页面与模块清单](#三页面与模块清单)
- [3.1 全局框架模块](#31-全局框架模块)
- [3.2 Page 1 — Dashboard系统总览](#32-page-1--dashboard系统总览)
- [3.3 Page 2 — Document Manager文档管理](#33-page-2--document-manager文档管理)
- [3.4 Page 3 — KG Explorer知识图谱](#34-page-3--kg-explorer知识图谱)
- [3.5 Page 4 — QA Chat智能问答](#35-page-4--qa-chat智能问答)
- [3.6 Page 5 — Search搜索](#36-page-5--search搜索)
- [四、核心功能交互逻辑](#四核心功能交互逻辑)
- [4.1 文件上传与索引任务管理](#41-文件上传与索引任务管理)
- [4.2 知识图谱可视化交互](#42-知识图谱可视化交互)
- [4.3 多轮对话与推理链展示](#43-多轮对话与推理链展示)
- [4.4 跨页面联动导航](#44-跨页面联动导航)
- [4.5 全局通知与反馈机制](#45-全局通知与反馈机制)
- [五、UI 设计规范](#五ui-设计规范)
- [5.1 整体布局结构](#51-整体布局结构)
- [5.2 配色系统](#52-配色系统)
- [5.3 字体与排版](#53-字体与排版)
- [5.4 组件样式规范](#54-组件样式规范)
- [5.5 响应式断点规范](#55-响应式断点规范)
- [六、后端接口依赖](#六后端接口依赖)
- [七、非功能性需求](#七非功能性需求)
- [八、验收标准](#八验收标准)
---
## 一、产品概述
### 1.1 产品背景
在学术研究、企业知识管理、技术调研等场景中研究人员需要从大量非结构化文档PDF 论文、DOCX 报告、PPT 演示文稿、图片等)中快速提炼关键知识,理解概念之间的语义关联。
传统的 RAG检索增强生成系统采用向量检索方式其结果呈现为零散的文本片段缺乏实体间的结构化关联。用户无法直观感知"某个概念与哪些技术相关""两个实体之间的路径是什么"等图谱层面的知识。
**GraphRAG Studio** 基于知识图谱增强的多模态 RAG 技术,将文档自动解析为结构化知识图谱,并提供图谱可视化、多轮问答、实体搜索等完整工具链,将非结构化文档转化为可交互的知识网络。
### 1.2 核心目标
| 目标 | 说明 |
|------|------|
| **知识结构化** | 将多格式文档PDF/DOCX/PPTX/PNG 等)自动解析并提取实体与关系,构建知识图谱 |
| **知识可视化** | 提供交互式力导向图,直观呈现实体及其语义关联,支持筛选、搜索、节点详情 |
| **知识问答** | 基于 Agentic-RAGReAct 框架),对自然语言问题进行多步工具调用推理,给出有据可查的答案 |
| **知识探索** | 提供实体搜索、路径发现、子图搜索三种探索模式,支持从不同维度切入知识网络 |
| **工程化管理** | 提供完整的文档上传、索引任务管理、任务进度监控、失败重试等工程化能力 |
### 1.3 业务痛点
**P1 — 高优先级痛点(必须解决)**
| # | 痛点描述 | 影响 |
|---|---------|------|
| P1-1 | 文档中知识密度高,人工阅读耗时长,无法快速定位关键概念 | 研究效率低下 |
| P1-2 | 概念之间的关联关系隐含在文字中,难以可视化梳理 | 知识理解片面 |
| P1-3 | 传统 RAG 只能返回文本片段,缺乏结构化推理能力 | 问答质量不稳定 |
| P1-4 | 多份文档的知识无法统一管理和关联查询 | 知识孤岛问题 |
**P2 — 中优先级痛点(应当解决)**
| # | 痛点描述 | 影响 |
|---|---------|------|
| P2-1 | 索引任务耗时长MinerU 解析 + LLM 抽取),用户无法感知进度 | 操作体验差 |
| P2-2 | LLM 推理过程黑箱,用户不知道答案从何而来 | 可信度低 |
| P2-3 | 搜索只能通过全文检索,无法按实体类型或图谱路径搜索 | 搜索精度不足 |
**P3 — 低优先级痛点(后续解决)**
| # | 痛点描述 |
|---|---------|
| P3-1 | 多人协作时知识图谱共享困难 |
| P3-2 | 知识图谱版本管理缺失 |
### 1.4 核心场景
**场景一:论文精读与知识提炼**
> 研究人员上传一篇 GraphRAG 相关的 PDF 论文系统自动提取论文中的技术概念TECHNOLOGY、研究方法CONCEPT、研究机构ORGANIZATION及其关联关系生成知识图谱。研究人员通过图谱可视化快速理解论文核心知识结构并通过 QA Chat 就具体问题进行深度追问。
**场景二:多文档跨文件知识整合**
> 用户批量上传多份研究报告,系统对每份文档独立索引后,将所有实体和关系合并至全局知识图谱。用户可在图谱中筛选特定文档的节点,发现跨文档的共同实体,通过路径搜索追溯概念间的传播关系。
**场景三:快速技术调研问答**
> 产品经理或技术负责人上传若干竞品白皮书,通过 QA Chat 提问"这些文档中提到了哪些核心技术?它们之间的关系是什么?"。系统通过 Agentic-RAG 进行多步工具调用(实体搜索 → 邻居查询 → 描述生成返回结构化答案并展示推理步骤Cited Nodes 直接链接到图谱中对应的节点。
**场景四:知识图谱演示与汇报**
> 教师或讲师上传课程材料,通过 KG Explorer 的全屏图谱视图向学生展示知识体系结构;通过 Demo 模式加载预置数据集,无需实际索引即可演示产品能力。
### 1.5 用户群体
| 用户角色 | 特征描述 | 核心诉求 | 使用频次 |
|---------|---------|---------|---------|
| **研究员 / 学者** | 熟悉 AI/NLP 领域,有文献精读需求 | 快速提取论文概念关联,深度问答 | 高频(每日) |
| **产品经理 / 分析师** | 非技术背景,有竞品调研需求 | 直观图谱展示,简单问答 | 中频(每周) |
| **技术工程师** | 熟悉 API有集成需求 | 完整 API 文档,调试便利 | 中频(按需) |
| **教师 / 讲师** | 有知识可视化展示需求 | 图谱演示,无需深度操作 | 低频(按需) |
| **系统管理员** | 负责部署和维护 | 系统健康监控,日志排查 | 低频(运维) |
**主要设计对象:** 研究员 / 学者(核心用户)、产品经理 / 分析师(次核心用户)
### 1.6 产品边界
**In Scope本版本包含**
- 多格式文档上传与管理PDF/DOCX/PPTX/DOC/PPT/PNG/JPG/HTML
- MinerU 文档解析 + LangExtract 实体抽取自动索引链路
- 全局知识图谱的可视化浏览与交互
- 基于 Agentic-RAGDeepSeek + LangChain的多轮问答
- 实体搜索、路径搜索、子图搜索
- 系统健康监控与任务状态看板
**Out of Scope本版本不包含**
- 用户账号体系与权限管理
- 多人协作与知识图谱共享
- 知识图谱版本历史与回滚
- 流式Stream问答输出
- 自定义实体类型与关系类型配置
---
## 二、产品流程
### 2.1 整体用户旅程
```
进入系统
[Dashboard] ─── 查看系统概览 & 健康状态
├─── 无文档 → [Documents] 上传文件 → 触发索引 → 等待完成
│ │
│ 索引完成 (done)
│ │
├─── 有 KG ──────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────┘
│ │
├────▼─── [KG Explorer] 图谱可视化浏览
│ └─── 点击节点 → 查看详情 → [Ask AI] → Chat
├────────── [QA Chat] 自然语言问答
│ └─── Cited Nodes → KG Explorer 节点定位
└────────── [Search] 实体/路径/子图搜索
└─── View in KG → KG Explorer
└─── Chat → Chat 预填问题
```
### 2.2 核心流程一:文件上传与知识图谱构建
这是系统最核心的数据入口流程,共分为 6 个阶段,涵盖客户端校验、上传、解析、实体抽取、图谱构建、结果呈现。
```
┌──────────────────────────────────────────────────────────────────┐
│ 文件上传与索引完整流程 │
└──────────────────────────────────────────────────────────────────┘
用户操作:拖拽文件 / 点击"Browse Files"
[Stage 0 — 客户端预校验]
检查文件扩展名PDF/DOCX/DOC/PPTX/PPT/PNG/JPG/JPEG/HTML
检查文件大小(≤ 200MB
─── 校验失败 → 文件名标红 + 行内错误说明(不上传)
─── 校验通过 → 进入 Stage 1
[Stage 1 — 文件上传]
POST /api/v1/documents/upload (multipart/form-data)
─── 成功 → 返回 doc_id文档行项目添加到列表status: uploaded
─── 失败 → Toast.error + 终止流程
[Stage 1.5 — 用户确认]
弹出二次确认:
"Start indexing now? [Yes, Start Indexing] [Later]"
─── Later → 保持 uploaded 状态,显示 [▶ Index] 按钮,流程结束
─── Yes → 进入 Stage 2
[Stage 2 — 启动索引任务]
POST /api/v1/index/start { doc_id }
─── 成功 → 返回 job_idstatus 更新为 indexing显示进度条
─── 失败 → Toast.error如"文档已在索引中"
[Stage 3 — MinerU 文档解析parsing]
轮询 GET /api/v1/index/status/{job_id}(每 3 秒)
stage = "parsing"
进度显示:"Stage: Parsing document pages (2/4)..."
progress = parsed_pages / total_pages × 33%
[Stage 4 — LangExtract 实体抽取extracting]
stage = "extracting"
进度显示:"Stage: Extracting entities (18 found so far)..."
progress = 33% + extracted_entities / estimated_total × 33%
[Stage 5 — 知识图谱构建indexing]
stage = "indexing"
进度显示:"Stage: Building knowledge graph..."
progress ≈ 90%
[Stage 6 — 完成done / failed]
─── done:
GET /api/v1/index/result/{job_id} → 获取结果统计
更新状态标记为 ● indexed
展开结果摘要40 nodes · 780 edges · 4 pages · 45 extractions · 42.1s
Toast.success("paper.pdf indexed: 40 nodes, 780 edges")
AppState.kg.loaded = false触发 KG Explorer 下次进入时重新加载)
─── failed:
行内展示错误信息(如 "MinerU failed: timeout after 600s"
显示 [⟳ Retry] 按钮
Toast.error("Indexing failed: paper.pdf")
```
**多文件串行处理规则:**
- 同时拖入多个文件时,依次串行执行上述流程(上传 → 确认 → 索引)
- 每个文件独立显示进度,互不影响
- 任一文件失败不阻塞其他文件的处理
### 2.3 核心流程二:知识图谱探索
```
进入 KG Explorer (#/graph)
[初始化加载]
优先读取 AppState.kg 缓存(避免重复请求)
若无缓存 → GET /api/v1/kg/nodes?page_size=200
GET /api/v1/kg/edges?page_size=500
─── KG 为空code 3002→ 显示空状态引导页面
─── 加载成功 → D3 力导向图渲染
[URL 参数处理]
解析 hash query
?doc_id=xxx → 自动勾选对应文档筛选,其余节点淡化
?node=xxx → 自动选中节点 + 高亮 + 展开 Detail Panel + 平移居中
[用户交互分支]
├─ 节点悬停 → Tooltipname / type / page / confidence / degree
├─ 节点单击
│ GET /api/v1/kg/nodes/{node_id}(获取详情)
│ GET /api/v1/kg/nodes/{node_id}/neighbors?hops=1获取邻居
│ → 右侧 Detail Panel 展开
│ → 点击节点高亮,其余节点 opacity 0.1,相连边 opacity 0.8
├─ 节点拖拽 → pin 到固定位置fx/fy 设置)
├─ 点击空白处 → 取消选中Detail Panel 收起,恢复透明度
├─ Filter Panel 操作
│ 勾选/取消实体类型 → 实时过滤可见节点
│ 选择 Source Doc → 筛选对应文档节点
│ 勾选/取消 Confidence 等级 → 实时过滤
├─ 工具栏操作
│ [+ -] → 缩放
│ [⊡ Fit] → 自适应全部节点
│ [Search] → GET /api/v1/search/entities?q=...(闪烁高亮 + 居中)
│ [PNG] → SVG → PNG 下载
│ [JSON] → GET /api/v1/kg/export → 文件下载
└─ Detail Panel 操作
[💬 Ask AI] → #/chat?q=Tell+me+about+{name}
邻居节点点击 → 切换选中节点
[All neighbors →] → 展开完整邻居列表
```
### 2.4 核心流程三Agentic 知识问答
```
进入 Chat (#/chat)
[初始化]
GET /api/v1/query/history?page_size=20 → 渲染左侧历史列表
若无历史 → 显示欢迎页 + Suggested Prompts
若有 URL 参数 ?q=... → 预填输入框并自动聚焦
[用户输入问题]
输入框(多行)+ Enter 或 点击 [▶] 按钮
[发送请求]
构建 payload:
{ question: "...", history: [ {role:"human",...}, {role:"ai",...} ] }
POST /api/v1/query
立即显示:
- 用户消息气泡(右对齐,蓝色背景)
- "thinking..." 三点跳动动画(左对齐)
输入框禁用(发送中)
[等待 API 响应(超时 60s]
─── 超时 → Toast.warning + 三点动画消失 + 输入框恢复
─── 网络错误 → Toast.error("Network error") + [Retry]
─── API 成功 → 进入渲染阶段
[渲染 AI 回答]
消除 thinking 动画
渲染 AI 消息气泡(左对齐,卡片样式):
├─ answer 文本marked.js 渲染 Markdown
├─ Tool Calls 折叠面板(默认收起)
│ 显示 "▶ Tool Calls (N steps)"
│ 展开后逐步显示每个工具调用:
│ Step 1: search_entities / Input / Output
│ Step 2: get_neighbors / Input / Output
│ ...(等宽字体,代码块样式)
├─ Cited Nodes 标签组
│ [◉ GraphRAG] [◉ LLMs] [◉ knowledge graphs] ...
│ 点击任一标签 → #/graph?node={node_id}
│ hover → 显示 Tooltiptype + page
└─ 耗时信息(⏱ 8.4s
[更新状态]
AppState.chatHistory.push(result)(维护多轮 history
输入框清空 + 恢复可用
左侧历史列表:新会话置顶
```
### 2.5 核心流程四:多模式实体搜索
```
进入 Search (#/search)
[初始化]
解析 URL 参数 ?q=...&type=...&tab=...
预填搜索框,自动触发搜索
┌──────────────────────────────────────────────────────────────┐
│ 三种搜索模式 │
└──────────────────────────────────────────────────────────────┘
├── [Tab 1: Entity Search]
│ 输入实体名称 + 可选类型过滤All / TECHNOLOGY / CONCEPT / ...
│ 点击 [Search] 或 Enter
│ GET /api/v1/search/entities?q=...&type=...
│ ─── 无结果 → 空状态提示 + "Try KG Explorer"
│ ─── 有结果 → 左侧结果列表(实体卡片)
│ 点击结果行 → 右侧 Preview Graph 渲染1-hop 邻居子图)
│ GET /api/v1/kg/nodes/{id}/neighbors?hops=1
│ [View KG] → #/graph?node={node_id}
│ [Chat] → #/chat?q=What+is+{name}
├── [Tab 2: Path Search]
│ 选择起点节点(搜索选择器)
│ 选择终点节点(搜索选择器)
│ 设置最大跳数1-5
│ 点击 [Find Path]
│ GET /api/v1/search/path?from={id}&to={id}&max_hops={n}
│ ─── 无路径 → "No path found between these entities"
│ ─── 有路径 → 路径可视化(线性节点链)+ 文字描述
└── [Tab 3: Graph Search]
输入关键词 + 可选"Include Neighbors"开关
点击 [Search]
GET /api/v1/search/graph?q=...&include_neighbors=true
─── 渲染子图D3 可视化,仅展示匹配节点及其邻边)
─── 列表显示匹配节点摘要name / type / page
```
### 2.6 错误与异常处理流程
```
API 调用失败code ≠ 0
├─ code 1001/1002/1003参数/格式/大小校验)
│ → 行内错误提示(不弹 Toast
├─ code 2001job 不存在)
│ → Toast.error + 刷新任务列表
├─ code 3002KG 为空)
│ → 不弹 Toast页面内空状态引导[Upload & Index →]
├─ code 4001QA 失败)
│ → Toast.error(msg) + 输入框恢复
├─ code 5000服务器内部错误
│ → Toast.error("Server error, check API logs")
└─ 网络不可达fetch 异常)
→ Toast.error("Network error. Is API server running on :8000?")
→ 相关操作显示 [Retry] 按钮
→ Header 右侧健康指示器变红点
```
---
## 三、页面与模块清单
### 3.1 全局框架模块
系统采用 SPA单页应用架构Hash 路由(`#/dashboard``#/documents` 等),全局框架由以下四个固定区域构成:
#### 3.1.1 Header顶部导航栏
- **高度:** 56px`position: sticky; top: 0; z-index: 100`
- **左区:** 汉堡折叠按钮(`[≡]`+ 产品 Logo 文字 "GraphRAG Studio"
- **中区:** 全局搜索框max-width 400px
- 输入 3+ 字符 → 实时调用实体搜索接口debounce 300ms
- 下拉展示最多 5 条建议(名称 + 类型 Badge
- 按 Enter → 跳转 `#/search?q={input}`
- 点击建议项 → 跳转 `#/graph?node={node_id}`
- **右区:** 系统健康指示器(绿点/红点)+ "API: localhost:8000"
#### 3.1.2 Sidebar左侧导航栏
- **宽度:** 220px默认折叠后 72px仅图标
- **导航项列表:**
| 图标 | 标签 | 路由 | 右侧 Badge |
|------|------|------|-----------|
| ◈ | Dashboard | `#/dashboard` | — |
| ▤ | Documents | `#/documents` | 文档总数 |
| ◉ | KG Explorer | `#/graph` | — |
| ◇ | Chat | `#/chat` | 历史查询数 |
| ⊕ | Search | `#/search` | — |
| ☰ | System | — | — |
- **激活状态:** 左侧 2px 蓝色竖线 + 背景 `rgba(88,166,255,0.1)` + 文字变蓝
#### 3.1.3 Status Bar底部状态栏
- **高度:** 32px常驻底部
- **左区:** 当前活跃 Job 进度(如 "Indexing paper.pdf... 65%"),无 Job 时隐藏
- **右区:** API 版本号v1.0.0+ 健康状态点(常驻)
#### 3.1.4 全局状态管理AppState
前端维护内存级全局状态,页面间共享:
| 字段 | 类型 | 说明 |
|------|------|------|
| `currentPage` | string | 当前激活页面 |
| `kg.nodes` | array | 全量 KG 节点缓存(首次加载后复用) |
| `kg.edges` | array | 全量 KG 边缓存 |
| `kg.loaded` | boolean | 索引完成后置 false触发重新加载 |
| `documents` | array | 文档列表缓存 |
| `activeJobs` | object | `job_id → polling timer`(轮询管理) |
| `chatHistory` | array | 当前会话的多轮对话历史 |
| `health` | object | 最近一次健康检查结果 |
---
### 3.2 Page 1 — Dashboard系统总览
**路由:** `#/dashboard`
**目的:** 系统全局状态一览,快速导航到各功能,最近活动监控。
#### 模块组成
**A. Overview 指标卡4 个)**
| 指标 | 数据来源 | 颜色 |
|------|---------|------|
| KG Nodes知识节点数 | `GET /api/v1/system/stats` | 蓝色 `#58a6ff` |
| KG Edges知识关系数 | `GET /api/v1/system/stats` | 紫色 `#8957e5` |
| Documents文档总数 | `GET /api/v1/system/stats` | 绿色 `#3fb950` |
| Queries问答次数 | `GET /api/v1/system/stats` | 黄色 `#d29922` |
每 10 秒自动轮询刷新,数值变化时平滑过渡动画。
**B. System Health 面板**
显示 4 个依赖服务的健康状态,数据来源 `GET /api/v1/health`
| 服务 | 状态指示 |
|------|---------|
| MinerU venv | ● ok / ● error |
| LangExtract venv | ● ok / ● error |
| DeepSeek API | ● ok / ● error |
| Storage | ● ok / ● error |
**C. Recent Documents 列表**
显示最近 5 条文档记录,数据来源 `GET /api/v1/documents?page=1&page_size=5`
- 文件名、格式、页数、状态 Badge、日期
- indexed 状态:显示 [KG] 跳转按钮
- indexing 状态:显示行内进度条 + [✕] 取消按钮
- uploaded 状态:显示 [▶ Index] 按钮
- 右上角 [View All →] 跳转 `#/documents`
**D. Quick Actions 快捷按钮组**
| 按钮 | 操作 |
|------|------|
| [◉ Explore KG] | 跳转 `#/graph` |
| [◇ Start Chat] | 跳转 `#/chat` |
| [⊕ Search] | 跳转 `#/search` |
| [⚡ Demo] | 调用 `GET /api/v1/system/demo`,加载演示数据,跳转 `#/graph` |
**E. Upload & Index 入口**
右上角 `[+ Upload & Index]` 主操作按钮,点击打开 Upload Modal复用 Documents 页上传区),完成后跳转 `#/documents`
---
### 3.3 Page 2 — Document Manager文档管理
**路由:** `#/documents`
**目的:** 文件上传、列表管理、触发/监控索引任务、查看索引结果。
#### 模块组成
**A. 拖拽上传区**
- 虚线边框卡片,居中显示上传图标和说明文字
- 拖拽悬停时:边框变蓝(`#58a6ff`+ 背景 `rgba(88,166,255,0.05)`
- 点击 [Browse Files] 触发文件选择器
- 支持格式说明:`PDF · DOCX · DOC · PPTX · PPT · PNG · JPG · HTML`
- 文件大小限制:`Max 200MB per file`
**B. 文档列表工具栏**
- 格式筛选下拉All / PDF / DOCX / PPTX / PNG / JPG / HTML
- 状态筛选下拉All / indexed / indexing / uploaded / failed
- 关键词搜索框(客户端过滤,实时)
**C. 文档列表(表格)**
每行字段:文件名、格式、页数、状态 Badge、上传日期、操作按钮组
| 状态 | 显示内容 | 操作按钮 |
|------|---------|---------|
| `uploaded` | ● uploaded | [▶ Index] [🗑 Delete] |
| `indexing` | ● indexing动画点 + 进度条 + stage 说明 | [✕ Cancel] |
| `indexed` | ● indexed绿 | [◉ View KG] [🗑 Delete] |
| `failed` | ● failed + 错误摘要 | [⟳ Retry] [🗑 Delete] |
**D. 索引结果展开行**(仅 indexed 状态)
点击展开:
```
40 nodes · 780 edges · 4 pages · 45 extractions · 42.1s
TECHNOLOGY(4) CONCEPT(36)
[◉ View in KG] [≡ Show Extractions]
```
展开 [Show Extractions] 显示抽取记录表text / type / alignment / page最多 50 条,可滚动)
---
### 3.4 Page 3 — KG Explorer知识图谱
**路由:** `#/graph`
**目的:** 全屏交互式知识图谱可视化,节点筛选、详情查看、图谱导出。
#### 模块组成
**A. Filter Panel左侧筛选栏280px**
- Source Docs 下拉:按文档筛选图谱节点
- Entity Types 多选TECHNOLOGY / CONCEPT / PERSON / ORGANIZATION / LOCATION每类显示数量
- Confidence 等级多选exact / greater / lesser / fuzzy
- 图谱导出按钮:[📷 Export PNG] [⬇ Export JSON]
**B. D3 力导向图中央主区flex: 1**
- SVG 全屏渲染,支持 `d3.zoom`scaleExtent 0.1 8
- 工具栏(浮于图谱左上角):[+] [-] [⊡ Fit All] [🔍 Search input]
- 图例(浮于图谱左下角):五种颜色对应五种实体类型
- 空状态KG 无数据):居中提示 + [Upload & Index →] 按钮
**C. Detail Panel右侧详情栏300px点击节点后出现**
- 节点名称H1 样式)
- 实体类型 Badge
- 属性信息Page / Confidence / Degree / Centrality
- 邻居节点列表(最多展示 5 个,[All N →] 查看全部)
- [💬 Ask AI] 按钮 → 跳转 Chat 预填问题
- [× Close] 关闭 Detail Panel
---
### 3.5 Page 4 — QA Chat智能问答
**路由:** `#/chat`
**目的:** 多轮知识图谱问答,展示 Agentic-RAG 推理过程Cited Node 联动跳转。
#### 模块组成
**A. History Sidebar左侧历史栏240px**
- [+ New Chat] 新建会话按钮
- 历史记录列表按时间分组Today / Yesterday / Earlier
- 每条显示问题前 30 字符
- 点击切换历史会话(前端记录,当前版本不持久化多会话)
- 数据来源:`GET /api/v1/query/history?page_size=20`
**B. Chat Area右侧对话区**
- 欢迎界面(无历史时):产品介绍 + Suggested Prompts4 个常用问题)
- 消息时间分隔线
- 用户消息气泡(右对齐,蓝色背景)
- AI 消息气泡(左对齐,卡片样式):
- Markdown 渲染的答案文本
- Tool Calls 折叠面板(默认收起)
- Cited Nodes 标签组(可点击跳转)
- 耗时信息(⏱ N.Ns
- Thinking 动画(三点跳动)
**C. 输入区**
- 多行文本输入框placeholder: "Ask about the knowledge graph..."
- [▶ Send] 发送按钮
- Enter 发送Shift+Enter 换行
- 发送中:输入框禁用,按钮 loading 状态
---
### 3.6 Page 5 — Search搜索
**路由:** `#/search`
**目的:** 多模式实体搜索,支持关键词、路径、子图三种搜索范式。
#### 模块组成
**A. 搜索头区**
- 主搜索框(全宽)
- 类型筛选下拉All Types / TECHNOLOGY / CONCEPT / PERSON / ORG / LOC
- [Search] 搜索按钮
- 搜索状态与 URL 双向同步:`#/search?q=...&type=...&tab=...`
**B. Tab 切换栏**
3 个 TabEntity Search默认 / Path Search / Graph Search
**C. Entity Search Tab**
- 左栏:结果列表(卡片式)
- 实体名称 + 类型 Badge + 页码 + Degree + Confidence
- [View KG] + [Chat] 操作按钮
- 右栏Preview GraphD3 迷你图,展示选中实体的 1-hop 邻居子图)
**D. Path Search Tab**
- From 节点选择器(搜索 + 下拉选择)
- To 节点选择器
- Max Hops 下拉1-5
- [Find Path] 按钮
- 路径结果:线性节点链可视化 + 文字描述
**E. Graph Search Tab**
- 关键词输入框
- [Include Neighbors] 开关
- D3 子图可视化(全宽)
- 匹配节点列表
---
## 四、核心功能交互逻辑
### 4.1 文件上传与索引任务管理
#### 拖拽上传区状态机
```
初始状态idle
├── dragenter → hover 状态(边框蓝,背景浅蓝)
│ └── dragleave → 回到 idle
└── drop / browse → uploading 状态
├── 校验失败 → idle行内错误
└── 校验通过 → 文件加入上传队列
```
#### 进度条渲染规则
| 阶段 | 进度计算 | 展示文字 |
|------|---------|---------|
| parsing | `parsed_pages / total_pages × 33%` | "Parsing document... (2/4 pages)" |
| extracting | `33% + extracted_entities / estimated × 33%` | "Extracting entities... (18 found)" |
| indexing | 固定 80% 95%indeterminate | "Building knowledge graph..." |
| done | 100% | 渐隐,展开结果行 |
#### 索引取消逻辑
- 点击 [✕ Cancel] → 弹出确认弹窗
- 确认后 → `DELETE /api/v1/index/jobs/{job_id}`
- 停止对应 job_id 的轮询 timer
- 文档状态退回 "uploaded",显示 [▶ Index] 按钮
#### 文档删除确认弹窗规范
删除 indexed 状态的文档时,弹窗需展示关联数据影响范围:
```
Delete "paper.pdf"?
This document and all associated KG data will be permanently deleted.
· 40 nodes removed from knowledge graph
· 780 edges removed from knowledge graph
This action cannot be undone.
[Cancel] [Delete →]
```
- [Delete] 为红色危险按钮
- 操作完成后 Toast.success("paper.pdf deleted") + 刷新列表
### 4.2 知识图谱可视化交互
#### 节点视觉映射规则
| 视觉属性 | 规则 |
|---------|------|
| 颜色 | 实体类型 → 5 色方案(蓝/紫/绿/红/橙) |
| 半径 | `r = Math.max(4, Math.log(degree + 1) × 4)`(连接越多越大) |
| 描边 | 正常 1.5px / hover 2.5px 白色 |
| 透明度 | 正常 0.9;高亮模式下非焦点节点 0.1 |
#### 节点高亮逻辑(聚焦模式)
```
点击节点 N
所有节点 → opacity 0.1(淡化)
节点 N 及其直连邻居 → opacity 0.9(保持)
节点 N → 半径 × 1.5(放大)
节点 N 相连的边 → opacity 0.8(清晰)
其余边 → opacity 0.05(几乎隐藏)
点击空白区域:
全部节点恢复 opacity 0.9
全部边恢复 opacity 0.25
Detail Panel 收起
```
#### D3 力参数配置
| 参数 | 值 | 说明 |
|------|---|------|
| `forceLink distance` | 60 | 边长 |
| `forceLink strength` | 0.3 | 弹力 |
| `forceManyBody strength` | -120 | 节点斥力 |
| `forceCollide radius` | `d.r + 4` | 防重叠 |
| `alphaDecay` | 0.02 | 稳定速度 |
#### Tooltip 内容规范
鼠标悬停节点时,在鼠标右下方 8px 处显示:
```
┌─────────────────────────┐
│ GraphRAG [TECH] │
│ Page: 0 │
│ Confidence: match_exact │
│ Degree: 39 │
└─────────────────────────┘
```
### 4.3 多轮对话与推理链展示
#### 多轮 History 维护规则
```javascript
// 每次发送携带完整历史(前端维护)
const payload = {
question: inputText,
history: AppState.chatHistory.flatMap(msg => [
{ role: 'human', content: msg.question },
{ role: 'ai', content: msg.answer }
])
};
```
- 每次问答后将 QAResult 追加到 `AppState.chatHistory`
- 历史条数上限20 轮(超出后丢弃最早的对话)
#### Tool Call 折叠面板展示规范
- 默认收起(▶ Tool Calls (N steps)
- 点击展开 → 逐步展示每个 tool step
- 样式:等宽字体,暗色背景(`--bg-s3`),黄色 tool 名称
- 输入Input/ 输出Output用分隔线区分
#### Suggested Prompts 展示逻辑
| 条件 | Prompts 显示 |
|------|-------------|
| KG 非空 + 无对话历史 | 展示 4 个预设问题 |
| KG 为空 | 提示"先上传文档构建 KG" |
| 已有对话历史 | 不显示 Prompts |
预设问题:
1. "Give me an overview of the knowledge graph"
2. "List all TECHNOLOGY entities"
3. "How does GraphRAG relate to knowledge graphs?"
4. "What is retrieval-augmented generation?"
### 4.4 跨页面联动导航
系统各页面通过 Hash 路由参数实现深度联动:
| 触发位置 | 触发动作 | 目标页面 | URL 参数 |
|---------|---------|---------|---------|
| Dashboard [KG] 按钮 | 点击 | KG Explorer | `#/graph?doc_id={doc_id}` |
| Dashboard [Explore KG] | 点击 | KG Explorer | `#/graph` |
| Dashboard [Demo] | 点击 | KG Explorer | 加载 demo → `#/graph` |
| Dashboard [Start Chat] | 点击 | QA Chat | `#/chat` |
| Documents [◉ View KG] | 点击 | KG Explorer | `#/graph?doc_id={doc_id}` |
| Chat Cited Node 标签 | 点击 | KG Explorer | `#/graph?node={node_id}` |
| KG Detail Panel [💬 Ask AI] | 点击 | QA Chat | `#/chat?q=Tell+me+about+{name}` |
| Search [View KG] | 点击 | KG Explorer | `#/graph?node={node_id}` |
| Search [Chat] | 点击 | QA Chat | `#/chat?q=What+is+{name}` |
| Header 全局搜索框 Enter | 提交 | Search | `#/search?q={input}` |
| Header 全局搜索框建议项 | 点击 | KG Explorer | `#/graph?node={node_id}` |
**URL 参数接收规则KG Explorer**
```javascript
// KG Explorer 初始化时解析
const params = new URLSearchParams(window.location.hash.split('?')[1]);
const docFilter = params.get('doc_id'); // 按文档筛选
const nodeHighlight = params.get('node'); // 聚焦并定位节点
if (docFilter) {
// 自动勾选 Filter Panel 中对应文档,其余节点淡化
}
if (nodeHighlight) {
// 找到节点 → 模拟点击(触发 Detail Panel→ 平移居中 → 高亮
}
```
### 4.5 全局通知与反馈机制
#### Toast 通知系统
**位置:** 右上角 `position: fixed; top: 72px; right: 24px`
**宽度:** 320px
**堆叠规则:** 最多同时显示 3 条,从上向下排列,间距 8px
| 类型 | 背景 | 左边框 | 图标 | 使用场景 |
|------|------|-------|------|---------|
| Success | `#1a3a22` | 3px `#3fb950` | ✓ | 索引完成、删除成功 |
| Warning | `#2d2a16` | 3px `#d29922` | ! | 请求超时、格式警告 |
| Error | `#3b1a1a` | 3px `#f85149` | ✗ | 上传失败、网络错误 |
| Info | `#161f2e` | 3px `#58a6ff` | i | 操作提示、加载状态 |
**生命周期:**
- 出现:从右侧 slide-in200ms ease-out
- 停留4000mshover 时暂停计时器)
- 消失fade-out300ms→ 从 DOM 移除
#### Loading 状态层级
| 层级 | 样式 | 触发场景 |
|------|------|---------|
| Header 进度条 | 2px 高,顶部蓝色横条 | 所有 API 请求期间 |
| Skeleton Loader | 灰色矩形 shimmer 动画 | 列表首次加载 |
| 图谱 Loading | SVG 中央文字 + 三点动画 | KG 数据加载 |
| Chat Thinking | 三点跳动动画(气泡内) | 等待 QA 响应 |
#### 空状态引导设计
| 页面 | 空状态触发条件 | 引导内容 |
|------|--------------|---------|
| KG Explorer | KG 无节点数据 | 图标 + "No knowledge graph yet" + [Upload & Index →] |
| Chat | 无历史对话 | 欢迎语 + Suggested Prompts4 个) |
| Search | 搜索结果为空 | "No entities found for '{query}'" + [Explore KG] |
| Documents | 无文档记录 | 上传区更突出,拖拽提示放大 |
---
## 五、UI 设计规范
### 5.1 整体布局结构
系统采用 CSS Grid 四区布局,高度占满视口(`height: 100vh`
```
┌──────────────────────────────────────────────────────────────────┐
│ HEADER 56px (sticky, z-index: 100) │
├──────────────┬───────────────────────────────────────────────────┤
│ │ │
│ SIDEBAR │ MAIN CONTENT AREA │
│ 220px │ (overflow-y: auto, padding: 24px) │
│ (fixed) │ │
│ │ KG Explorer 例外padding: 0内部自行布局 │
│ │ │
├──────────────┴───────────────────────────────────────────────────┤
│ STATUS BAR 32px │
└──────────────────────────────────────────────────────────────────┘
```
**CSS Grid 骨架代码:**
```css
.app {
display: grid;
grid-template-areas: "header header" "sidebar main" "footer footer";
grid-template-columns: var(--sidebar-w, 220px) 1fr;
grid-template-rows: 56px 1fr 32px;
height: 100vh;
overflow: hidden;
}
```
**KG Explorer 三栏内部布局:**
```
┌─────────────┬────────────────────────────────────┬─────────────┐
│ Filter Panel│ D3 Graphflex: 1 │ Detail Panel│
│ 280px │ │ 300px │
│ │ 全屏 SVG支持缩放/拖拽/pin │ 点击节点后 │
│ │ │ 滑入出现 │
└─────────────┴────────────────────────────────────┴─────────────┘
```
**Chat 双栏内部布局:**
```
┌──────────────┬──────────────────────────────────────────────────┐
│ History │ Chat Area │
│ 240px │ (display: flex; flex-direction: column) │
│ │ 消息列表flex: 1, overflow-y: auto
│ │ 输入区(固定底部) │
└──────────────┴──────────────────────────────────────────────────┘
```
### 5.2 配色系统
采用 GitHub 深色主题Dark配色体系在现有 `index.html` 调色板基础上扩展:
#### 背景层级
| 变量 | 色值 | 用途 |
|------|------|------|
| `--bg-base` | `#0f1117` | 页面底色body background |
| `--bg-s1` | `#161b22` | 主要表面sidebar / header / card |
| `--bg-s2` | `#21262d` | 次级表面hover 态 / input / tag |
| `--bg-s3` | `#1c2128` | 浮层表面tooltip / popover / 代码块) |
#### 边框
| 变量 | 色值 | 用途 |
|------|------|------|
| `--border` | `#30363d` | 主边框 |
| `--border-muted` | `#21262d` | 次级分隔线 |
#### 文字层级
| 变量 | 色值 | 用途 |
|------|------|------|
| `--text-1` | `#f0f6fc` | 主标题、强调文字 |
| `--text-2` | `#c9d1d9` | 正文内容 |
| `--text-3` | `#8b949e` | 辅助信息、Label |
| `--text-4` | `#484f58` | Placeholder、极弱文字 |
#### 功能色
| 变量 | 色值 | 用途 |
|------|------|------|
| `--blue` | `#58a6ff` | 链接 / 激活态 / 聚焦 / 进度条 |
| `--green` | `#3fb950` | 成功状态 / indexed |
| `--green-btn` | `#238636` | 主操作按钮背景 |
| `--green-hover` | `#2ea043` | 主操作按钮 hover |
| `--red` | `#f85149` | 错误 / 危险操作 / failed |
| `--yellow` | `#d29922` | 警告 / indexing 进行中 |
| `--purple` | `#8957e5` | 边数指标 / 特殊强调 |
#### 实体类型颜色(与 D3 图谱一致)
| 实体类型 | 颜色变量 | 色值 | 节点颜色 |
|---------|---------|------|---------|
| TECHNOLOGY | `--type-tech` | `#58a6ff` | 蓝色 |
| CONCEPT | `--type-concept` | `#bc8cff` | 紫色 |
| PERSON | `--type-person` | `#3fb950` | 绿色 |
| ORGANIZATION | `--type-org` | `#ff7b72` | 红色 |
| LOCATION | `--type-loc` | `#ffa657` | 橙色 |
#### 状态 Badge 配色
| 状态 | 背景 | 文字 |
|------|------|------|
| indexed | `#1a3a22` | `#3fb950` |
| indexing | `#2d2a16` | `#d29922` |
| uploaded | `#1c2128` | `#8b949e` |
| failed | `#3b1a1a` | `#f85149` |
### 5.3 字体与排版
**字体族:**
```css
--font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--font-mono: 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
```
**字体层级规范:**
| 层级 | 大小 | 粗细 | 颜色 | 用途 |
|------|------|------|------|------|
| H1页面标题 | 20px | 600 | `--text-1` | 页面大标题 |
| H2区块标题 | 16px | 600 | `--text-1` | 区块标题 |
| H3面板子标题 | 13px | 600 uppercase | `--text-3` | 面板分类标题(字母间距 0.5px |
| Body正文 | 14px | 400 | `--text-2` | 列表内容、说明文字 |
| Small辅助 | 12px | 400 | `--text-3` | 日期、辅助信息、Tooltip |
| Badge标签 | 11px | 600 | — | 状态标记、类型标签 |
| Mono代码 | 13px | 400 | `--text-2` | Tool Call 输入输出、文件路径 |
**行间距:** 正文 `1.6`,代码块 `1.5`
### 5.4 组件样式规范
#### 按钮4 种变体)
| 变体 | class | 背景 | 边框 | 文字颜色 | 用途 |
|------|-------|------|------|---------|------|
| Primary | `.btn-primary` | `--green-btn` | `--green-btn` | `#ffffff` | 主操作Upload / Send / Index |
| Secondary | `.btn-secondary` | `--bg-s2` | `--border` | `--text-2` | 次要操作Cancel / Filter |
| Ghost | `.btn-ghost` | transparent | none | `--text-3` | 图标按钮(内联操作) |
| Danger | `.btn-danger` | `--bg-s2` | `--border` | `--red` | 危险操作Delete |
```css
.btn {
padding: 6px 14px;
border-radius: 6px; /* --r-md */
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 150ms ease;
display: inline-flex;
align-items: center;
gap: 6px;
border: 1px solid transparent;
}
.btn-sm { padding: 4px 10px; font-size: 12px; }
```
#### 卡片Card
```css
.card {
background: var(--bg-s1);
border: 1px solid var(--border);
border-radius: 8px; /* --r-lg */
padding: 16px;
}
```
#### 输入框Input
```css
.input {
background: var(--bg-s2);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-1);
padding: 8px 12px;
font-size: 14px;
width: 100%;
transition: border-color 150ms ease;
}
.input:focus {
outline: none;
border-color: var(--blue);
box-shadow: 0 0 0 3px rgba(88,166,255,0.15);
}
```
#### 进度条
```css
.progress-bar {
height: 4px;
background: var(--bg-s2);
border-radius: 2px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: var(--blue);
border-radius: 2px;
transition: width 300ms ease;
}
```
#### Modal确认弹窗
```css
.modal-overlay {
position: fixed; inset: 0;
background: rgba(0,0,0,0.6);
z-index: 1000;
display: flex; align-items: center; justify-content: center;
}
.modal {
background: var(--bg-s1);
border: 1px solid var(--border);
border-radius: 12px; /* --r-xl */
padding: 24px;
width: 360px;
box-shadow: 0 8px 32px rgba(0,0,0,0.6);
}
```
#### Skeleton Loader骨架屏
```css
.skeleton {
background: linear-gradient(90deg, var(--bg-s2) 25%, var(--bg-s1) 50%, var(--bg-s2) 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: 4px;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
```
#### 阴影规范
```css
--shadow-sm: 0 1px 3px rgba(0,0,0,0.4); /* card 轻阴影 */
--shadow-md: 0 4px 16px rgba(0,0,0,0.5); /* dropdown / tooltip */
--shadow-lg: 0 8px 32px rgba(0,0,0,0.6); /* modal / drawer */
```
#### 圆角规范
```css
--r-sm: 4px; /* badge / tag / 小按钮 */
--r-md: 6px; /* 按钮 / 输入框 / 小卡片 */
--r-lg: 8px; /* 卡片 / 面板 */
--r-xl: 12px; /* Modal / 大弹窗 */
```
### 5.5 响应式断点规范
系统支持 4 个断点,覆盖从 4K 显示器到移动端的使用场景:
| 断点 | 宽度范围 | 目标设备 |
|------|---------|---------|
| Desktop | > 1280px | 台式机、宽屏笔记本 |
| Laptop | 1024 1280px | 普通 13/14 寸笔记本 |
| Tablet | 768 1024px | iPad、竖屏笔记本 |
| Mobile | < 768px | 手机 |
#### 各断点布局变化
**Desktop> 1280px**
- 完整三列布局Sidebar 220px + Main + Detail Panel
- 所有功能面板默认展开
**Laptop1024 1280px**
- Sidebar 折叠为图标模式72px仅显示图标
- 导航文字 LabelBadgeLogo 文字隐藏
- 内容区相应扩展
**Tablet768 1024px**
- Sidebar 完全隐藏`grid-template-columns: 0 1fr`
- 汉堡菜单按钮`[≡]`展开/收起 Sidebar Drawer
- Drawer 覆盖内容区`position: fixed; z-index: 500`+ 半透明遮罩
- KG ExplorerFilter Panel 浮动侧边 DrawerFAB 触发
- ChatHistory Sidebar 顶部 Drawer
**Mobile< 768px**
- 底部 Tab Bar 替代左侧 Sidebar高度 56px5 个图标导航
- Header 精简隐藏全局搜索框仅保留 Logo + 健康状态
- Dashboard 指标卡4 2 列网格
- Documents 列表表格 卡片堆叠隐藏 PagesDate
- KG Explorer三栏 图谱全屏Detail Panel 底部 Sheet滑入高度 60vh
- Search左右双栏 上下堆叠Preview Graph 缩小到 200px
#### CSS 媒体查询关键规则
```css
/* Laptop */
@media (max-width: 1280px) {
.app { --sidebar-w: 72px; }
.nav-label, .nav-badge, .sidebar-logo-text { display: none; }
}
/* Tablet */
@media (max-width: 1024px) {
.app { grid-template-columns: 0 1fr; }
.sidebar {
position: fixed; left: 0; top: 0; bottom: 0;
width: 220px; z-index: 500;
transform: translateX(-220px);
transition: transform 0.2s ease;
}
.sidebar.open { transform: translateX(0); }
}
/* Mobile */
@media (max-width: 768px) {
.app { grid-template-rows: 56px 1fr 56px; }
.sidebar { display: none; }
.bottom-nav { display: flex; }
.metrics-grid { grid-template-columns: repeat(2, 1fr); }
}
```
---
## 六、后端接口依赖
GraphRAG Studio 前端依赖以下 25 FastAPI 后端接口服务地址 `http://localhost:8000/api/v1`统一响应格式 `{code, msg, request_id, data}`
### A 组:文档管理
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 上传文档 | POST | `/documents/upload` | Dashboard Modal, Documents |
| 文档详情 | GET | `/documents/{doc_id}` | Documents |
| 文档列表 | GET | `/documents` | Dashboard最近5条Documents全部 |
| 删除文档 | DELETE | `/documents/{doc_id}` | Documents |
### B 组Indexing Pipeline
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 启动索引 | POST | `/index/start` | Dashboard, Documents |
| 查询任务状态 | GET | `/index/status/{job_id}` | Dashboard轮询Documents轮询 |
| 获取索引结果 | GET | `/index/result/{job_id}` | Documents完成后 |
| 取消任务 | DELETE | `/index/jobs/{job_id}` | Dashboard, Documents |
### C 组:知识图谱
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 节点列表 | GET | `/kg/nodes` | KG Explorer初始化 |
| 边列表 | GET | `/kg/edges` | KG Explorer初始化 |
| 节点详情 | GET | `/kg/nodes/{node_id}` | KG Explorer点击ChathoverSearch |
| 节点邻居 | GET | `/kg/nodes/{node_id}/neighbors` | KG ExplorerDetail PanelSearchPreview |
| 图谱统计 | GET | `/kg/stats` | KG Explorer |
| 导出图谱 | GET | `/kg/export` | KG Explorer工具栏 |
### D 组QA 问答
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 同步问答 | POST | `/query` | Chat发送消息 |
| 批量问答 | POST | `/query/batch` | |
| 批量状态 | GET | `/query/batch/{batch_id}` | |
| 历史查询 | GET | `/query/history` | Chat历史列表 |
### E 组:搜索
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 实体搜索 | GET | `/search/entities` | Header全局搜索KG Explorer工具栏Search Tab1 |
| 路径搜索 | GET | `/search/path` | Search Tab2 |
| 子图搜索 | GET | `/search/graph` | Search Tab3 |
### F 组:系统
| 接口 | 方法 | 路径 | 触发页面 |
|------|------|------|---------|
| 健康检查 | GET | `/health` | DashboardHealth 面板Header健康状态 |
| 系统统计 | GET | `/system/stats` | Dashboard指标卡 |
| 支持格式 | GET | `/system/formats` | Documents格式说明 |
| Demo 数据 | GET | `/system/demo` | DashboardDemo 按钮 |
### 错误码处理规范
| code | 含义 | 前端处理 |
|------|------|---------|
| 0 | 成功 | 正常渲染数据 |
| 1001 | 参数校验失败 | 行内表单错误提示 |
| 1002 | 文件格式不支持 | 文件名标红 + 行内说明 |
| 1003 | 文件超过大小限制 | 同上 |
| 1004 | 文件不存在 | Toast.error |
| 2001 | Job 不存在 | Toast.error + 刷新列表 |
| 2002 | Job 仍在运行 | Toast.warning防重复启动 |
| 2003 | Job 已完成 | Toast.info |
| 2004 | Job 取消失败 | Toast.error |
| 3001 | 节点不存在 | Toast.error |
| 3002 | KG 为空 | 页面空状态引导不弹 Toast |
| 4001 | QA 执行失败 | Toast.error + 输入框恢复 |
| 5000 | 服务器内部错误 | Toast.error("Server error") |
---
## 七、非功能性需求
### 7.1 性能要求
| 指标 | 要求 |
|------|------|
| 页面切换SPA 路由 | < 100ms |
| D3 图谱初始渲染40 节点780 | < 500ms |
| API 请求超时设置 | 普通接口 30sQA 接口 60s |
| KG 节点轮询最小间隔 | 3s |
| Dashboard 刷新间隔 | 10s |
| 全局搜索建议 debounce | 300ms |
| D3 图谱性能阈值 | 500 节点使用 SVG> 500 节点切换 Canvas 渲染 |
### 7.2 兼容性要求
| 维度 | 要求 |
|------|------|
| 浏览器 | Chrome 90+ / Edge 90+ / Firefox 88+ / Safari 14+ |
| 屏幕分辨率 | 最低 1024×768推荐 1440×900 以上 |
| 屏幕像素比 | 支持 1x / 2xRetina |
| JavaScript | 无构建工具,原生 ES2020+(使用 CDN |
### 7.3 可访问性Accessibility
- 所有交互元素支持键盘导航Tab / Enter / Esc
- 图标按钮提供 `aria-label` 说明
- 颜色对比度符合 WCAG 2.1 AA 标准(文字:≥ 4.5:1
- Toast 通知区域添加 `aria-live="polite"`
### 7.4 安全性
- API 请求不包含敏感数据API Key 存于后端 `.env`,不暴露至前端)
- 上传文件客户端预校验格式与大小(后端二次校验)
- XSS 防护Chat 页 AI 答案通过 marked.js 的 sanitize 选项过滤
---
## 八、验收标准
### 8.1 功能验收
| 编号 | 验收项 | 验收标准 |
|------|-------|---------|
| F-01 | 文件上传 | 支持 9 种格式200MB 以内;拖拽和点击均可触发;校验失败行内提示 |
| F-02 | 索引任务 | 启动后每 3s 更新进度stage 文字正确反映当前阶段;完成后展示结果摘要 |
| F-03 | 任务取消 | 点击 [✕] 确认后任务终止,状态回退到 uploaded |
| F-04 | KG 图谱渲染 | 节点颜色、大小按规则渲染;边透明度 0.25;力模拟稳定 |
| F-05 | 节点高亮 | 点击节点后非焦点节点 opacity 变 0.1,相连边 opacity 0.8 |
| F-06 | Detail Panel | 点击节点后出现,显示属性+邻居;点击空白处收起 |
| F-07 | QA 问答 | 发送问题后 thinking 动画出现;响应后 Markdown 渲染正确 |
| F-08 | Tool Call 展示 | 默认收起;展开后每步 tool name / input / output 完整显示 |
| F-09 | Cited Nodes | 显示为可点击标签;点击跳转 `#/graph?node=xxx` |
| F-10 | 实体搜索 | 输入关键词后返回结果;点击结果行渲染 Preview Graph |
| F-11 | 路径搜索 | 选择两个节点后返回路径;路径可视化正确 |
| F-12 | 跨页联动 | 所有 11 条跨页导航路径携带正确 URL 参数且被接收页正确处理 |
| F-13 | Toast 通知 | 4 种类型正确显示4s 后自动消失;最多同时显示 3 条 |
| F-14 | 空状态引导 | KG 无数据时显示引导 UI文档列表为空时上传区突出 |
| F-15 | 响应式布局 | 在 1024px 以上显示完整布局768px 以下切换底部 Tab Bar |
### 8.2 性能验收
- 页面切换动画流畅60fps
- D3 图谱 40 节点 + 780 边在 500ms 内完成初始渲染
- 轮询机制不导致内存泄漏(离开页面时清除所有 timer
### 8.3 API 覆盖验收
所有 25 个后端 API 端点在前端代码中均有明确的调用时机,且均通过 `api.js` 封装层调用,错误统一由 `APIError` 捕获处理。
---
## 附录
### A. 技术栈汇总
| 层次 | 技术 | 版本 | 引入方式 |
|------|------|------|---------|
| 前端框架 | 原生 HTML/CSS/JS | ES2020+ | — |
| 图形渲染 | D3.js | v7 | CDN |
| Markdown 渲染 | marked.js | v9 | CDN |
| 后端框架 | FastAPI | 0.104+ | Python venv |
| ASGI 服务器 | Uvicorn | 0.24+ | Python venv |
| PDF 解析 | MinerU | 最新稳定版 | subprocess |
| 实体抽取 | LangExtract + DeepSeek | — | Direct import |
| 知识问答 | LangChain + DeepSeek | 0.2+ | Direct import |
| 图计算 | NetworkX | 3.x | Python venv |
### B. 文件交付清单
| 类型 | 路径 | 说明 |
|------|------|------|
| 规范文档 | `docs/backend_service_specification-v1.0.md` | FastAPI 后端 25 个接口规范 |
| 规范文档 | `docs/frontend_design_specification-v1.0.md` | 前端 SPA 设计规范5 页面) |
| 规范文档 | `docs/product_requirements_document-v1.0.md` | 本文档(产品需求文档) |
| 前端入口 | `graphrag_pipeline/static/app/index.html` | SPA 主入口(待实现) |
| 前端样式 | `graphrag_pipeline/static/app/css/` | 3 个 CSS 文件(待实现) |
| 前端逻辑 | `graphrag_pipeline/static/app/js/` | 7 个 JS 文件(待实现) |
| 后端服务 | `graphrag_pipeline/api_server.py` | FastAPI 主入口(待实现) |
### C. 词汇表
| 术语 | 说明 |
|------|------|
| GraphRAG | 知识图谱增强的 RAG检索增强生成系统 |
| KG | Knowledge Graph知识图谱 |
| Entity | 实体,知识图谱中的节点,包含名称、类型、页码、置信度等属性 |
| Relation | 关系,知识图谱中的边,当前版本固定为 `CO_OCCURS_IN`(共现关系) |
| MinerU | 文档解析工具,将 PDF/DOCX 等格式解析为结构化文本 |
| LangExtract | 基于 LLM 的实体抽取框架 |
| Agentic-RAG | 基于 ReAct 框架的智能问答LLM 通过多步工具调用推理 |
| ReAct | Reasoning + Acting推理与行动交替的 Agent 模式 |
| Job | 索引任务,一个文档的完整 parsing → extracting → indexing 流程 |
| SPA | Single Page Application单页应用 |
| Hash 路由 | 通过 URL 的 `#` 部分控制页面切换,无需服务端路由 |
| Cited Nodes | QA 答案中引用的知识图谱节点,可点击跳转至图谱 |
| Tool Call | Agentic-RAG 中 LLM 调用的工具函数(如 search_entities |