基于第一性原理的个人决策辅助系统
把复杂问题拆成基本事实与假设,构建可视化的决策逻辑链,再让 LLM 帮你发现盲点。
本项目经历过一次架构调整,当前运行的是 v2:
| v1 | v2(当前) | |
|---|---|---|
| 数据存储 | PostgreSQL | 浏览器 localStorage |
| 后端 | Express 服务(REST API + 仓储层) | 无常驻后端 |
| LLM 调用 | 后端服务代理 | 无状态 Serverless 函数(packages/client/api/llm-proxy.ts) |
| 部署 | 需要服务器 + 数据库 | 纯静态托管 |
为什么改:这是个人决策工具,数据天然是单人、单机、低频的。 为它维护一台服务器和一个数据库,运维成本远大于收益; 用户也未必愿意把自己的决策草稿存在别人的数据库里。
改成本地存储后,部署成本降到零,隐私问题自然消失。 唯一需要联网的是 LLM 调用,用一个无状态函数代理即可—— 它只转发请求并隐藏 API Key,不持有任何用户数据。
v1 的后端代码保留在 packages/server/,但不参与运行,留作架构演进的记录。
它是一套完整的 Express + PostgreSQL 分层实现(路由 / 仓储 / 服务 / 迁移脚本),
如需回到 client-server 架构可以此为起点。
- 可视化决策图 —— 用节点和边构建决策逻辑链(ReactFlow)
- 形式化逻辑系统 —— 基于命题逻辑的节点与关系类型
- 节点:目标、行动、事实、假设、约束、结论
- 关系:依赖、促成、实现、阻碍、导致、矛盾
- 状态系统 ——
baseStatus(用户设定)与computedStatus(系统推导)分离 - 状态传播算法 —— 可插拔推理引擎,自动传播逻辑状态、检测冲突、记录传播历史
- 权重计算 —— 自动计算各决策选项的综合得分(权重与边强度均为 0.1–2.0)
- LLM 智能分析 —— 风险分析、下一步建议、逻辑检查、补全建议,以及自由提问
- 多 LLM 支持 —— 通义千问 / DeepSeek / 任意 OpenAI 兼容接口
- 智能布局 —— 自动分层与径向布局,切换场景时自动保存
- 三种主题 —— 经典(静态专业)、暗夜(霓虹发光)、极光(彩虹流光)
- Node.js >= 18
不需要数据库,也不需要启动后端。
npm install
# v2 架构无常驻后端,只启动前端即可
npm run dev -w @solvechain/client
# 打开 http://localhost:5173首次进入会有一个只读示例项目,可直接查看效果。
不配置也能使用除 AI 分析外的全部功能。
在应用内「设置」中填入 API Key,密钥保存在浏览器本地,不会上传。
| Provider | 说明 |
|---|---|
| 通义千问(DashScope) | 默认 |
| DeepSeek | 价格较低 |
| 任意 OpenAI 兼容接口 | 自填 baseURL |
部署到 Vercel 时也可改为在服务端配置密钥,由 api/llm-proxy 统一代理,
避免密钥出现在浏览器中。
SolveChain/
├── packages/
│ ├── client/ # ← 当前运行的全部代码
│ │ ├── api/ # Vercel Serverless 函数(仅 LLM 代理)
│ │ └── src/
│ │ ├── components/ # 组件(决策图、各类面板)
│ │ ├── pages/ # 页面
│ │ ├── store/ # Zustand 状态 + localStorage 持久化
│ │ ├── services/llm/ # LLM 客户端与提示词
│ │ ├── utils/propagation/ # 状态传播引擎
│ │ ├── themes/ # 主题系统
│ │ └── types/
│ │
│ └── server/ # ← v1 架构存档,不参与运行
│ ├── src/{database,repositories,routes,services}
│ └── schema.sql
│
└── docs/technical-design.md
诚实记录当前状态,便于后续接手:
- 无自动化测试。 约 16,000 行前端代码没有任何测试覆盖,重构风险高。
- 「分析」面板入口已隐藏。 它依赖 v1 后端的两个接口
(
/api/projects/:id/analyze/next-action与/analyze/feasibility), v2 架构下这两个接口不存在,点击会 404。 这两个分析(寻找阻塞点、计算可行性)都是纯图计算,不需要数据库, 应当迁移到前端实现,届时把入口放回即可。 代码保留在components/AnalysisPanel.tsx与api/index.ts。 - 数据仅存于浏览器。 换设备或清除浏览器数据会丢失,需手动导出 / 导入。
- 根
package.json的dev与build脚本仍会带上 server 包, 在没有数据库的环境下会失败,请使用上文的 client 单独启动命令。
LLM 智能分析模块:
- AI 助手面板 - 集成到项目编辑器工具栏
- 4 个预设分析功能:
- 风险分析 - 识别潜在问题和风险点
- 下一步建议 - 基于当前状态推荐行动
- 逻辑检查 - 验证推理链的完整性
- 补全建议 - 发现缺失的节点和关系
- 自由提问 - 支持对当前场景进行任意问答
- Markdown 渲染 - AI 回复支持富文本格式
三种主题风格:
- 经典模式 - 简洁专业的静态设计,适合日常工作
- 暗夜模式 - 毛玻璃质感 + 霓虹发光效果 + 单色扫光动画
- 极光模式 - 深色背景 + 彩虹流光动画 + 玻璃质感节点
技术改进:
- 新增
/api/llm/scene/analyze和/api/llm/scene/chatAPI - 添加 prompts 模块(场景转文本、分析提示词)
- 修复水平/垂直线条显示问题(SVG filter 使用 userSpaceOnUse)
- 优化边线坐标计算(正确的矩形交点算法)
核心改进:
- 状态分离架构 - 将节点状态拆分为用户设置的
baseStatus和系统计算的computedStatus - 每种节点类型独立状态 - 目标(已达成/未达成)、行动(成功/失败/进行中/待执行)、事实(确认/否定/存疑)、假设(假设为真/假设为假/不确定)、约束(已满足/未满足)、结论(成立/不成立/待定)
- 自动状态传播 - ACHIEVES 关系支持从行动和事实节点自动传播状态到约束/目标节点
- 权重系统统一 - 节点权重和边强度统一使用 0.1-2.0 范围,默认1.0
Bug修复:
- 修复节点编辑面板中状态被重置的问题
- 修复导出功能缺少 baseStatus/autoUpdate 字段的问题
- 修复文本导出不显示状态的问题
技术变更:
- 新增
autoUpdate字段控制是否自动接收状态传播 - 边强度从 0-100% 改为 0.1-2.0 范围
- 导出格式版本升级到 2.2
新增功能:
- 可插拔状态传播引擎 - 基于规则的逻辑状态推理
- 支持 6 种关系类型的传播规则:DEPENDS, SUPPORTS, ACHIEVES, HINDERS, CAUSES, CONFLICTS
- 自定义规则:实现
PropagationRule接口,调用registerRule()注册
- 逻辑状态显示 - 节点右上角显示状态指示器(T=真, F=假, !=冲突)
- 传播面板 - 显示传播事件历史、冲突警告、统计信息
- 节点状态编辑 - 在节点编辑面板中手动设置逻辑状态
技术实现:
packages/client/src/utils/propagation/
├── types.ts # LogicState, PropagationRule 接口
├── engine.ts # PropagationEngine 核心引擎
├── rules/ # 各关系类型的传播规则
│ ├── depends.ts # 依赖:A为假 → B为假
│ ├── supports.ts # 促成:软影响置信度
│ ├── achieves.ts # 实现:行动满足目标
│ ├── hinders.ts # 阻碍:降低置信度
│ ├── causes.ts # 导致:A⇒B 逻辑蕴含
│ └── conflicts.ts # 矛盾:双向互斥
└── index.ts # 主入口
重大变更 - 节点和关系类型重构
为支持自动推理和状态传播,将系统从松散的"思维导图"升级为基于命题逻辑的形式化系统。
节点类型变更:
| 旧类型 | 新类型 | 说明 |
|---|---|---|
| GOAL | GOAL | 保持不变 - 最终想要达成的状态 |
| DECISION | ACTION | 重命名 - 可执行的操作 |
| FACT | FACT | 保持不变 - 可验证的事实 |
| ASSUMPTION | ASSUMPTION | 保持不变 - 需要验证的假设 |
| INFERENCE | CONSTRAINT | 新类型 - 必须满足的条件 |
| INFERENCE | CONCLUSION | 新类型 - 从其他节点推导的命题 |
关系类型变更:
| 旧类型 | 新类型 | 符号 | 说明 |
|---|---|---|---|
| PREREQUISITE | DEPENDS | ← | 方向反转:B依赖A |
| SUPPORTS | SUPPORTS | → | 保持 - A促成B成功 |
| - | ACHIEVES | ⊢ | 新增 - 行动实现约束/目标 |
| OPPOSES | HINDERS | ⊣ | 重命名 - A阻碍B |
| LEADS_TO | CAUSES | ⇒ | 重命名 - A导致B |
| CONFLICTS | CONFLICTS | ⊥ | 保持 - 逻辑矛盾 |
| RELATED | (删除) | - | 信息量太低,已移除 |
数据迁移:
- 运行
npx tsx packages/server/src/database/migrate-v2.1.ts自动迁移 - 所有 DECISION → ACTION, INFERENCE → CONCLUSION
- PREREQUISITE 关系方向自动反转为 DEPENDS
-
场景位置独立性修复
- 每个场景的节点位置完全独立存储
- 切换场景时自动保存当前场景布局(保存到
scene_nodes.position_x/y) - 共享节点在不同场景可以有不同位置
-
聚焦布局算法改进
- 新的左右展开布局:聚焦节点在中心,上游节点(原因)在左侧,下游节点(结果)在右侧
- 形成清晰的因果流向:原因 → 聚焦点 → 结果
- 按连接关系排序减少边交叉
- 不相连的节点放在下方
-
智能布局算法
- 无聚焦节点时:使用 Dagre 分层布局算法,最小化边交叉
- 有聚焦节点时:使用聚焦布局(左右展开)
- 力导向微调优化节点间距
-
布局自动保存
- 切换场景时自动保存当前布局
- Ctrl+S 手动保存布局
- 首次进入项目自动布局,后续进入使用保存的布局
MIT