主环塑人,子环塑知。双环交织,持续演化。
Dual-Loop Self-Iterating Learning Engine — One loop models who you are, the other models what you know.
BanLea 不是又一个 AI 学习工具。它的核心是一套双层 harness 架构——主 harness 持续建模你的学习人格(怎么教),子 harness 追踪每个领域的掌握状态(教什么)。两层画像通过自迭代闭环不断演化:每一次对话、每一次点击、每一次停留,都化为证据回流画像,让 BanLea 比你自己更早察觉你卡在哪里、下一步该学什么。27 维画像 + 主动推荐引擎,让你不需要决定"学什么"——BanLea 替你猜,而且越猜越准。
BanLea 持续评估并维护你的学习画像,维度覆盖比你想象的多:
主 harness(15 维)——跨学科的人格特质,决定"怎么教": 逻辑推理、抽象思维、学习动机、专注持久、元认知、抗挫韧性、好奇广度、记忆留存、偏好模态、学习节奏、深度偏好、价值取向、沟通风格、时间模式、学习目标取向
子 harness(12 维)——每个学科一份,决定"教什么": 掌握程度、知识盲区、误区卡点、领域思维、学习进度、应用能力、迁移能力、严谨度、兴趣强度、学习速度、领域价值、资料偏好
- 每维独立置信度——低可信度维度 UI 淡化、辅导只作弱提示,避免把"猜的 0.7"和"扎实的 0.7"画成一样
- 版本化管理——每次更新保留历史版本,成长曲线可回溯、可回滚
- 结构化 JSON 输出——由 Claude Structured Outputs 强约束生成,保证一致性
BanLea 的核心引擎,不是一次性评估而是持续演化:
采集证据 → 触发判断 → LLM 局部重评估 → 版本化落库 → 注入辅导/推荐 → (回到采集)
- 证据来源:辅导对话、自评、测验结果、阅读停留、推荐点击/跳过
- 触发节流:累积 N 条证据或出现矛盾信号才触发重算,不每轮烧 token
- 局部更新:只更新被证据触及的维度,慢变人格维度几乎不动 → 大幅省钱
- 可解释:每次重评估要求模型说明"哪些变了、为什么"
┌──────────────┬──────────────────────────┬──────────────┐
│ 对话历史 │ 对话区(中央) │ 待读书单 │
│ (按方向分类) │ │ │
│ ▾ 计算机 │ 提问 → 学习计划 → │ 配套资料 │
│ · k8s 入门 │ 个性化讲解 → 配套资料 │ 自动归入 │
│ · 所有权 │ │ │
│ ▾ 物理 │ 随时复述 / 被出题验证 │ [已读][稍后] │
│ · 量子入门 │ → 形成证据回流画像 │ │
└──────────────┴──────────────────────────┴──────────────┘
- 讲解的深浅、风格、类比来源由双层画像同时注入(主层给"教法",子层给"教什么")
- 对话历史按学科分块归档,随时点回继续
- 验证出题:学完主动复述或被出题检验 → 证据回流画像
解决"不知道学什么"的启动障碍:
- 候选生成:基于画像兴趣 + 邻近主题 + 提过但没学的词 → 轻量模型生成
- 本地排序:多特征加权打分(兴趣匹配 / 邻近度 / 难度匹配 / 新鲜度 / 是否提过)→ 零 token
- 在线学习反馈:点击/停留 → 同时更新画像兴趣维度 + 调整排序特征权重(多臂老虎机式)
- 冷启动:首次引导建档(onboarding 问答)→ 初始化主画像 + 首批方向
- 雷达图多维度展示 + 版本演化时间线
- 用户不能手动改画像 → 只能通过与 AI 对话协商修改(保留可解释性与可信度)
- 数据看板:已读书单统计、学习时长、连续天数、各领域掌握度变化
interface ResourceSource {
id: string;
search(query: string, ctx: PortraitContext): Promise<ResourceItem[]>;
enabled: boolean;
}| 适配器 | 状态 |
|---|---|
| 通用网页搜索(Claude web_search/fetch) | 首选 |
| GitHub(官方 REST API) | 必做 |
| arXiv / 文档站 | 推荐 |
| Bilibili / YouTube | 可选 |
| 知乎(官方 OAuth) | 可选/预留 |
| 指标 | BanLea(Tauri v2) | 等效 Electron 应用 |
|---|---|---|
| 安装包体积 | ~5 MB(Rust 原生二进制) | ~80+ MB(Chromium 捆绑) |
| 内存占用 | ~50 MB 基线 | ~200+ MB 基线 |
| 启动时间 | <1s | 2–3s |
| 核心技术 | Rust 内核 + 系统原生 WebView | Chromium 运行时 |
Tauri v2 将 Rust 仅用作极薄系统外壳(手写 Rust < 50 行),所有业务逻辑在 TypeScript 中,兼顾性能与开发效率。
BanLea 使用用户自己的 Anthropic API Key。以下设计确保高频使用不烧钱:
| 策略 | 节省效果 |
|---|---|
| 模型分层 | 深度画像重评估 / 复杂辅导:Claude Opus 4.8($5/$25 per 1M) 高频轻量任务(分类、出题、推荐候选):Claude Haiku 4.5($1/$5 per 1M) |
| Prompt Caching | 稳定 system 段(角色、画像 schema、长期画像)打 cache_control 前缀 → 重复输入成本降低 ~90% |
| 触发节流 + 局部重评估 | 画像只在证据累积或出现矛盾时重算,且只更新被触及维度。慢变维度几乎不动 → 几乎不花钱 |
| 推荐排序本地化 | 排序在 SQLite + 内存中完成 → 零 token 消耗 |
| 费用可视 | 设置页显示本月预估 API 花费(count_tokens 估算) |
BanLea/
├─ src-tauri/ # Rust 外壳(极薄,~50 行)
│ ├─ src/ # main.rs + commands.rs
│ └─ migrations/ # SQLite 迁移
│
├─ src/ # 主力代码(TypeScript)
│ ├─ core/ # 纯逻辑内核 —— 独立可单测
│ │ ├─ harness/ # 主/子画像引擎
│ │ ├─ recommender/ # 推荐候选 + 本地排序 + 在线学习
│ │ ├─ evidence/ # 证据采集 + 触发器
│ │ ├─ llm/ # Claude 封装(流式/结构化/缓存/重试)
│ │ └─ sources/ # 资料源适配层
│ ├─ features/ # 功能切片(UI + hooks)
│ ├─ db/ # SQLite 仓储层
│ ├─ types/ # 共享类型 + zod schema
│ └─ config/ # 模型分层/触发阈值/排序权重
│
└─ tests/ # core/ 单测
- API Key:存 OS Keychain(Windows/macOS/Linux 原生密钥链),绝不进明文配置或 SQLite
- 学习数据:全部本地 SQLite,不上传任何服务器(除调用 Claude API 必需的对话内容)
- 可导出 / 可删除:一键导出或清空全部画像、证据、书单
- 资料源合规:不内置爬虫;第三方源遵守各自 ToS 与限速
| 层 | 选型 |
|---|---|
| 桌面外壳 | Tauri v2(Rust + 系统 WebView) |
| 前端 UI | React 19 + TypeScript 5.7 + Vite 6 |
| 样式 | Tailwind CSS 4 + 自建设计 token |
| AI 大脑 | Claude API(@anthropic-ai/sdk)Opus 4.8(深度推理)+ Haiku 4.5(高频轻量) |
| 本地存储 | SQLite(tauri-plugin-sql) |
| 密钥存储 | OS Keychain(keyring + 自定义命令) |
| 类型校验 | Zod 4(运行时 schema) |
| 测试 | Vitest 4 |
见
BanLea_开发计划.md完整里程碑。
| 阶段 | 状态 |
|---|---|
| M0 脚手架 | ✅ 基本完成 |
| M1 画像内核 | 🔨 进行中 |
| M2 自迭代闭环 | ⬜ 待开始 |
| M3 提问式辅导 | ⬜ |
| M4 书单 & 看板 | ⬜ |
| M5 推荐引擎 | ⬜ |
| M6 画像可视化 | ⬜ |
| M7 资料源 | ⬜ |
| M8 打磨发布 | ⬜ |
- Node.js ≥ 24 + npm ≥ 11
- Rust 工具链(rustc + cargo ≥ 1.77)
- VS C++ Build Tools(Windows)或 Xcode CLT(macOS)
- Anthropic API Key
# 克隆仓库
git clone <repo-url> && cd BanLea
# 安装依赖
npm install
# 类型检查 + 测试
npm run typecheck
npm test
# 启动开发模式(热更新 + Tauri 窗口)
npm run tauri:dev
# 生产构建
npm run tauri:build- 启动应用后进入「设置」页
- 填入你的 Anthropic API Key
- Key 自动存入 OS Keychain,后续启动自动读取
"不要揣摩功能,不懂就问,尽可能优秀。"
- 本地优先:数据属于你,不在任何服务器上
- 低主动门槛:不需要你决定学什么,BanLea 猜并推荐,靠行为反馈变准
- 自进化:画像随你一起成长,不是静态标签
- 温和教学:用你的方式理解你、教你——类比型、逻辑型、项目驱动型……因人而异
- 可解释:每个画像维度有依据(evidence_ids)、每处变化有说明、每版可回溯