From 3df580d0e630a00a6bc7d2da42bc7928b0e69f77 Mon Sep 17 00:00:00 2001
From: lusblead <187519937+lusblead@users.noreply.github.com>
Date: Mon, 3 Aug 2026 10:18:56 +0800
Subject: [PATCH] docs: refresh public README
---
README.md | 307 ++++++++++++++++++++++++++++++++++++------------------
1 file changed, 205 insertions(+), 102 deletions(-)
diff --git a/README.md b/README.md
index 6957bda..cbac96d 100644
--- a/README.md
+++ b/README.md
@@ -1,147 +1,250 @@
-# Visualized Exp
+
+
VISUALIZED EXP
+
把复杂问题,展开成可以继续走下去的知识空间
+
+ 一款本地优先的 AI 可视化解释工具。
+ 看清概念关系,沿节点逐层探索,随时选中内容继续追问。
+
+
+
+
+
+
+
+
+
+
+
+ 快速开始
+ ·
+ 首次配置
+ ·
+ 使用指南
+ ·
+ 反馈问题
+
+
+
+---
+
+## 不再被一篇长回答困住
+
+普通 AI 回答把所有信息一次性铺在你面前。Visualized Exp 先呈现当前层最重要的概念和关系,再由你决定下一步往哪里走。
+
+
+
+
+ 01 · 提出问题
+ 输入想真正弄懂的复杂主题
+ |
+
+ 02 · 看清结构
+ 先获得概念总览与当前层解释
+ |
+
+ 03 · 自由深入
+ 进入节点、解释术语或选区追问
+ |
+
+
+
+## ✨ 你可以这样探索
+
+
+
+
+ 🧭 递归语义缩放
+ 每次只聚焦当前层。点击感兴趣的节点进入下一层,不必在一张无限扩张的知识图里迷路。
+ |
+
+ 🕸️ 可缩放概念总览
+ 先看核心概念和它们的联系,再阅读正文;需要时可以打开大图查看关系。
+ |
+
+
+
+ 💬 选中内容继续追问
+ 选中一句话,直接“向 AI 提问”,或让系统围绕这段内容继续“深入”。
+ |
+
+ 🔎 语境化术语解释
+ 单击正文中标出的术语查看说明,双击则进入更完整的深入解释。
+ |
+
+
+
+ 🌐 按需联网
+ 主问题和每轮选区对话分别控制是否搜索;配置搜索服务不会自动把所有问题送去联网。
+ |
+
+ 💾 本地知识记录
+ 自动保存探索会话,随时恢复之前的内容,并可导出 Markdown 或 JSON。
+ |
+
+
+
+
+
+## 🚀 快速开始
+
+> [!IMPORTANT]
+> 完整的一键本地体验目前面向 Windows,因为 API Key 会通过 Windows 凭据管理器保存在当前电脑上。
+
+### 环境要求
+
+| Node.js | Java | Maven | .NET SDK |
+| :---: | :---: | :---: | :---: |
+| 22.13.0+ | 17+ | 3.6.3+ | 10.0+ |
+
+### 安装并启动
-把复杂问题展开成一个可以阅读、追问和继续深入的 AI 可视化解释空间。
+```powershell
+git clone https://github.com/lusblead/Visual-Exp.git
+cd Visual-Exp
+npm install
+npm run dev:local
+```
-Visualized Exp 不把回答一次性压成长文或固定模板。它先生成当前层的解释与概念关系,只预备下一层入口;用户可以沿节点递归探索,也可以选中一句话直接向 AI 提问或继续深入。
+启动完成后,打开 [http://localhost:3000](http://localhost:3000)。按 `Ctrl+C` 可以停止本次启动的所有本地服务。
-
+
+没有 API Key?先打开演示模式
-```mermaid
-flowchart LR
- Q["复杂问题"] --> O["当前层概念总览"]
- O --> R["完整解释"]
- R --> N["点击节点进入下一层"]
- R --> S["选中句子"]
- S --> A["向 AI 提问"]
- S --> D["深入解释"]
- A -. "按本轮设置" .-> W["受控联网搜索"]
+```powershell
+npm install
+$env:EXPLANATION_MODEL_PROVIDER = "demo"
+npm run dev
```
-## 核心体验
+演示模式不会调用真实模型,也不会启动完整本地后端,因此不包含持久化知识记录和选区 AI 对话。
-- 递归语义缩放:根场景只展示 3–6 个高层入口,点击节点进入下一层,并用 `‹ / ›` 沿探索历史移动。
-- 概念先行:开头用 Mermaid 绘制当前层概念关系;可打开大图并在 100%–300% 之间缩放。
-- 渐进生成:只预生成当前入口的直接子场景,避免提前铺开整张知识图谱。
-- 选区双入口:选中正文后可选择“向 AI 提问”或“深入”;左侧对话栏按需打开且可以关闭。
-- 语境化名词解释:仅 AI 标注的名词可点击,解释不会修改主语义文档。
-- 历史会话:Java 后端持久化知识会话和选区对话,支持刷新恢复、切换与删除。
-- 可选联网:主问题提供开/关;选区对话每轮可选关闭、自动或强制。搜索服务已配置不等于已经允许联网。
-- 离线演示:没有模型密钥时仍可使用确定性的演示生成器体验主要浏览流程。
+
-## 模型、协议与搜索服务
+
-“供应商预设”只是可编辑的默认值,不是项目分别实现了每家厂商的私有协议。当前 Java 模型通道实现两种协议:
+## ⚙️ 首次配置
-| 类型 | 当前实现 |
-| --- | --- |
-| 模型协议 | OpenAI Chat Completions、Anthropic Messages |
-| 模型预设 | OpenAI、Anthropic、DeepSeek、Kimi、GLM、Gemini、通义千问、OpenRouter |
-| 自定义模型 | 可配置 Base URL/完整请求 URL、模型 ID、协议和受限认证 Header |
-| 搜索适配器 | Tavily Search、Brave Search |
-
-Tavily 当前只用于搜索(Search),未接入 Extract、Crawl、Map 或 Research。搜索 API Key 属于搜索供应商鉴权,与模型 API Key 相互独立;`web_search` 工具本身并不天然要求某一家供应商或某一种 Key。
-
-语义图生成默认通过本机 DeepSeek companion 使用项目定义的 Pro/Flash 模型路由。选区对话在没有启用模型覆盖时复用该通道;只有用户明确保存并启用模型覆盖后,新对话才改用 Java 中的供应商配置,无需重复配置同一把 DeepSeek Key。
-
-## 系统结构
-
-```mermaid
-flowchart LR
- B["浏览器"] -->|"同源请求"| V["Vinext / TypeScript BFF"]
- V --> L["语义图生成与校验"]
- V -->|"HttpOnly owner cookie"| J["Java 17 / Spring Boot"]
- J --> H["H2 或 PostgreSQL"]
- J --> M["模型供应商"]
- J --> S["SearchProvider SPI"]
- S --> T["Tavily Search"]
- S --> R["Brave Search"]
- V -->|"仅回环地址"| C["Windows .NET companion"]
- C --> D["Windows Credential Manager"]
-```
+打开页面后,点击问题输入框右侧的设置按钮。
-关键边界:
+### 1. 连接默认 AI 服务
-- 语义文档是知识结构的唯一事实来源;节点保存内容、层级、关系和展示建议,不保存像素坐标或 React 组件名。
-- 模型只提交受验证的语义操作或受限的 `web_search(query, freshness?)` 调用,不能指定搜索请求 URL。
-- 供应商 Key 只写不回显。Windows companion 将默认 DeepSeek Key 保存在系统凭据管理器;Java 使用 AES-256-GCM 加密模型覆盖和搜索供应商 Key。
-- Java 对话提交使用稳定的 `clientTurnId`,持久化 `PENDING / COMPLETED / FAILED / UNKNOWN` 状态,无法确认结果时不会盲目重放付费请求。
+在“AI 服务”中填写 DeepSeek API Key,然后点击“保存到本机”。这个服务负责生成可视化解释和深入说明,也会作为选区 AI 对话的默认模型。
-更多设计细节见 [最小视觉对话规范](specs/minimal-visual-conversation.md)、[会话与凭据边界](specs/conversation-source-and-credentials.md)和 [Java 后端说明](backend/README.md)。
+> [!NOTE]
+> 保存模型或搜索配置时会执行一次最小验证请求,可能产生少量供应商用量。
-## 环境要求
+### 2. 可选:更换选区对话模型
-完整的 `dev:local` 本地体验目前面向 Windows,因为它依赖 Windows Credential Manager。
+如果希望“向 AI 提问”使用其他模型,可在“模型覆盖(可选)”中添加并启用配置。模型覆盖只影响之后新建的选区 AI 对话,不会替换默认的可视化解释服务。
-| 依赖 | 最低版本 |
+| 模型预设 | 支持方式 |
| --- | --- |
-| Node.js | 22.13.0 |
-| Java | 17 |
-| Maven | 3.6.3 |
-| .NET SDK | 10.0 |
+| OpenAI、DeepSeek、Kimi、GLM、Gemini、通义千问、OpenRouter | OpenAI Chat Completions 兼容接口 |
+| Anthropic | Anthropic Messages 接口 |
+| 自主设置 | 自定义地址、模型 ID 与认证方式 |
-## 快速开始
+### 3. 可选:连接联网搜索
-安装依赖并启动 companion、Java 后端和网站:
+在“搜索服务”中配置 **Tavily** 或 **Brave Search**,并将它设为当前搜索服务。
-```powershell
-npm install
-npm run dev:local
-```
+- 主问题:开启“允许下一次主问题联网”。
+- 选区对话:发送前为本轮选择“关闭”“自动”或“强制”。
+
+仅保存搜索服务不会自动联网;是否联网仍由对应入口的开关决定。
-默认访问 `http://localhost:3000`。首次使用时打开右侧设置:
+
-1. 在上方保存 DeepSeek Key,用于语义图和默认选区对话。
-2. 如有需要,在“模型覆盖”中配置其他模型供应商。
-3. 如需联网,配置并启用搜索供应商,再在搜索服务区域允许下一次主问题联网;选区对话仍按每轮单独选择。
+## 🧩 30 秒使用指南
-保存模型或搜索配置会发起一次最小验证请求,可能计入供应商用量。
+| 目标 | 操作 |
+| --- | --- |
+| 创建解释 | 在顶部输入问题,按回车或点击 `↑` |
+| 进入下一层 | 点击正文区块或区块右侧的 `→` |
+| 前进或返回 | 使用页面左上角的 `‹` 和 `›` |
+| 查看术语说明 | 单击正文中带标记的术语 |
+| 深入理解术语 | 双击带标记的术语 |
+| 追问一句话 | 选中正文,点击“向 AI 提问” |
+| 深入选中内容 | 选中正文,点击“深入” |
+| 恢复知识记录 | 打开右上角的知识记录面板并选择会话 |
+| 导出当前内容 | 在知识记录面板选择 Markdown 或 JSON |
-只体验不调用真实模型的前端演示:
+### 选择适合你的预生成方式
-```powershell
-$env:EXPLANATION_MODEL_PROVIDER = "demo"
-npm run dev
-```
+| 模式 | 适合场景 | 模型用量 |
+| --- | --- | :---: |
+| **省流** | 只在点击后生成下一层 | 较少 |
+| **平衡** | 提前准备少量可能访问的内容 | 适中 |
+| **深入** | 准备更多下一层内容,减少后续等待 | 较多 |
+
+## 🔐 数据与 API Key
-该模式不会自动启动 Java 后端,因此不包含持久化历史和选区对话。手动拆分进程、PostgreSQL 配置及服务端环境变量见 [backend/README.md](backend/README.md) 和 [.env.example](.env.example)。任何密钥都不得使用 `NEXT_PUBLIC_` 前缀。
+- 完整本地模式会把知识记录保存在当前电脑上。
+- 默认 DeepSeek Key 保存在 Windows 凭据管理器中,不需要写入项目文件。
+- 模型和搜索服务的 Key 保存后不会在页面中回显。
+- 不要把 API Key 写入代码、提交到 Git,或添加到任何以 `NEXT_PUBLIC_` 开头的变量中。
-## 验证
+
+端口被占用
-完整的本地发布门禁:
+可以为网页和后端指定其他端口:
```powershell
-npm run harness:minimal
+$env:PORT = "3001"
+$env:BACKEND_PORT = "18080"
+npm run dev:local
```
-该命令会依次运行 companion 构建、Java 测试、前端构建、Node 测试、TypeScript 类型检查和 ESLint。也可以单独运行:
+然后访问 [http://localhost:3001](http://localhost:3001)。
+
+
+
+
+npm run dev:local 启动失败
+
+先确认依赖都可以从终端执行:
```powershell
-npm test
-npm run typecheck
-npm run lint
+node --version
+java -version
+mvn -version
+dotnet --version
```
-自动化测试不需要真实 API Key,也不应发起真实模型或搜索请求。
+如果某条命令不存在,请安装对应依赖并重新打开终端。首次启动还需要能够访问 npm、Maven 和 NuGet 的依赖下载服务。
+
+
+
+
+页面可以打开,但无法生成真实解释
-## 安全与部署边界
+- 确认不是以 `demo` 模式启动。
+- 打开设置,确认 DeepSeek Key 已验证并保存。
+- 如果刚替换 Key,请重新提交问题。
-本项目当前是本地优先、单用户应用。HttpOnly owner cookie 只用于同一设备上的数据隔离,不是账号登录、强身份认证或多设备同步方案。
+
-不要把当前本地配置直接当作公开多用户生产服务。公开部署前至少需要补齐:
+
+已经配置搜索服务,但回答没有联网
-- 真实的身份认证、授权与租户隔离;
-- 请求速率限制、并发上限、配额和费用预算;
-- HTTPS、服务端 Secret Manager 和密钥轮换;
-- 数据库备份、迁移与恢复演练;
-- 出站网络防火墙或代理、审计日志和运行监控。
+请同时确认:
-请勿提交 `.env`、API Key、Token、数据库文件、日志、个人会话或包含这些内容的截图。安全问题请按 [SECURITY.md](SECURITY.md) 私下报告。
+- Tavily 或 Brave Search 已验证并设为当前服务;
+- 主问题的“允许下一次主问题联网”已开启,或选区对话本轮选择了“自动”或“强制”。
-## 参与贡献
+
+
+## 🤝 参与项目
+
+| | |
+| --- | --- |
+| 🧾 [查看版本记录](CHANGELOG.md) | 🛠️ [阅读贡献指南](CONTRIBUTING.md) |
+| 🐞 [提交问题](https://github.com/lusblead/Visual-Exp/issues) | 🔒 [私下报告安全问题](SECURITY.md) |
-提交代码前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md),并运行完整门禁。行为变更还应同步更新 `docs/feature-flows/` 中对应的流程与可追溯信息。
+Visualized Exp 当前定位为本地优先、单用户应用,暂不提供可直接公开运营的多用户 SaaS 部署方案。
-## 版本与许可证
+---
-- 版本记录:[CHANGELOG.md](CHANGELOG.md)
-- 许可证:[MIT](LICENSE)
+
+
如果 Visualized Exp 对你有帮助,欢迎点一个 Star 或分享你的使用反馈。
+
Local-first · Single-user · MIT License
+