JSON · 对话 · Markdown — 三种视图,一份数据
Prism 是一个桌面应用,用于浏览和检查 JSONL 格式的 AI 训练/对话数据。就像棱镜将白光分解为光谱,Prism 将每行 JSONL 数据拆解为 JSON 树、对话气泡、Markdown 渲染三种视角,帮助你在海量数据中快速定位和审阅内容。
- 检查 SFT / RLHF 数据集中某条样本的对话质量
- 快速预览大模型的回答中的 Markdown / HTML / 代码块渲染效果
- 在数万条 JSONL 记录中搜索关键词并跳转
| 功能 | 说明 |
|---|---|
| 虚拟滚动 | 数万条记录的流畅浏览,事件委托 + 绝对定位,只渲染可视区域 |
| 三视图切换 | JSON 树(可折叠 + 长文本自动换行缩进)/ 对话气泡 / 原始文本 |
| Markdown + HTML 预览 | 自动提取 assistant 回答中的 Markdown 和 HTML 代码块,iframe 安全沙箱渲染,支持刷新和全屏 |
| 关键词搜索 | 前端本地过滤 + Rust 后端全量内容深度搜索,结果下拉展示 |
| Playground | 粘贴 JSON / Markdown 实时预览,支持编辑,左右分栏,切换后保留状态 |
| 字段映射 | 支持 {messages}(对话)和 {prompt, result}(提示词)两种数据格式,可恢复默认 |
| 深色/浅色主题 | 一键切换(T),首次加载自动跟随系统主题,配置自动保存 |
| 一键复制 | JSON 视图复制整条记录,对话视图复制单条消息,长文本复制原始内容 |
| 快捷键 | Cmd+O 打开,Cmd+F 搜索,↑↓ 导航条目,T 切换主题 |
| 拖放打开 | 直接将 .jsonl 文件拖入窗口 |
| 文件统计 | 状态栏展示解析错误数,错误条目点击后显示原始内容和具体错误 |
┌─ 工具栏 ────────────────────────────────────────────────────┐
│ [打开] sample.jsonl ▾ [搜索...] [</>] [⚙] [☀] │
├────────┬────────────────────────┬───────────────────────────┤
│ 条目列表 │ JSON / 对话 / 原始 │ 渲染预览 / 源码 │
│ │ │ │
│ #1 │ { │ ┌──────────────────┐ │
│ id_001 │ "task_id": "id_001", │ │ ## 回答 │ │
│ 3 msgs │ "messages": [ │ │ │ │
│ │ {role:"user",...} │ │ 这是回答内容... │ │
│ #2 │ ] │ └──────────────────┘ │
│ id_002 │ } │ │
│ ... │ │ │
├────────┴────────────────────────┴───────────────────────────┤
│ 条目 1/1000 3 消息 2.4 KB 12.5 KB │
└─────────────────────────────────────────────────────────────┘
前往 Releases 下载对应平台的安装包。
macOS 用户注意:由于没有 Apple 开发者签名,首次打开可能提示"已损坏,无法打开"。请在终端执行以下命令后重新打开:
xattr -cr /Applications/Prism.app如果尚未安装到 Applications,对下载的 dmg 文件执行:
xattr -cr ~/Downloads/Prism_0.1.0_aarch64.dmg
前置条件
- Rust >= 1.77.2
- Node.js >= 18
- 系统依赖(macOS 一般无需):Tauri 环境配置指南
# 克隆仓库
git clone https://github.com/liufu/prism.git
cd prism
# 安装前端依赖
npm install
# 开发模式启动
npm run tauri dev
# 生产构建
npm run tauri build构建产物位于 src-tauri/target/release/bundle/。
Prism 支持两种 JSONL 格式,通过字段映射设置灵活适配。
每条记录包含一个 messages 数组:
{
"task_id": "conv_001",
"messages": [
{
"role": "system",
"content": "你是一个助手"
},
{
"role": "user",
"content": "你好"
},
{
"role": "assistant",
"content": "你好!有什么可以帮你的?"
}
]
}每条记录包含 prompt 和 result 字段:
{
"task_id": "task_001",
"prompt": "解释什么是 Rust",
"result": "Rust 是一门系统编程语言..."
}如果你的 JSONL 字段名不同(如 id、conversation、answer),可以通过工具栏齿轮按钮修改映射关系。
点击工具栏 </> 按钮可打开 Playground——一个粘贴即预览的沙箱:
- JSON 模式:粘贴 JSON 字符串,使用与主视图相同的树形渲染器展示,含折叠/展开和长文本交互
- Markdown 模式:粘贴 Markdown 文本,实时渲染 GFM(代码高亮、表格、任务列表等)
- 实时编辑:输入 300ms 防抖自动刷新,JSON 解析失败时显示具体错误信息
- 大文件保护:JSON 超 500KB、Markdown 超 200KB 时自动截断并提示
- 状态保留:切换回主视图后再打开,内容和 tab 状态保留
# 代码检查
npm run lint # ESLint
npm run format # Prettier 格式化
npm run format:check # 格式检查
# Rust 测试
cd src-tauri && cargo test| 层级 | 技术 |
|---|---|
| 桌面框架 | Tauri 2 (Rust + WebView) |
| 前端 | Vanilla JavaScript (ES Modules) |
| 构建 | Vite 5 |
| Markdown 渲染 | marked + highlight.js |
| JSONL 解析 | Rust (serde_json + 流式读取) |
prism/
├── src/ # 前端源码
│ ├── main.js # 应用入口,状态管理,EventBus
│ ├── components/
│ │ ├── json-formatter.js # JSON 树形视图(折叠/展开 + 长文本自动换行 + 复制)
│ │ ├── chat-view.js # 对话气泡视图(消息复制 + 展开/收起)
│ │ ├── markdown-preview.js # Markdown 渲染 + HTML iframe 预览(刷新/全屏)
│ │ └── playground.js # 粘贴 JSON/Markdown 实时预览(状态保留)
│ ├── utils/
│ │ ├── event-bus.js # 轻量组件通信
│ │ ├── escape-html.js # XSS 安全转义(textContent + DOM)
│ │ ├── theme.js # 深色/浅色主题切换
│ │ ├── settings.js # 字段映射配置
│ │ ├── history.js # 最近打开文件
│ │ └── resizer.js # 面板拖拽分隔条
│ └── styles/
│ └── main.css # 全局样式(深色/浅色主题变量)
├── src-tauri/ # Rust 后端
│ ├── src/
│ │ ├── lib.rs # Tauri 应用配置
│ │ ├── main.rs # 入口
│ │ ├── commands.rs # 4 个 Tauri 命令
│ │ └── parser.rs # JSONL 解析引擎 + 18 个单元测试
│ └── Cargo.toml
├── .github/workflows/ci.yml # CI:lint + test + build
├── eslint.config.js # ESLint 9 flat config
├── .prettierrc # Prettier 格式化配置
├── index.html # 入口 HTML
├── vite.config.js
└── package.json
欢迎提交 Issue 和 Pull Request。详见 CONTRIBUTING.md。